ROS学习笔记:movebase下goal(一个点到另一个点)基于C++的实现

这两天在学习movebase的一些内容,不得不感概movebase的体系是很庞大的。下面我用turtlebot3完成了movebase中goal的实现。即使零基础都可以做出来,内容不多但肯定能实现。下图是效果图:ROS学习笔记:movebase下goal(一个点到另一个点)基于C++的实现_第1张图片
现在我们在终端下执行这个命令:

sudo apt-get install turtlebot3-*

然后在设置环境变量:

echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

在两者环境变量中选一个export TURTLEBOT3_MODEL=burger或者export
TURTLEBOT3_MODEL=waffle
此时便可以在终端下输入:

roslaunch turtlebot3_gazebo turtlebot3_world.launch 

ROS学习笔记:movebase下goal(一个点到另一个点)基于C++的实现_第2张图片
再在另一个终端输入:

roslaunch turtlebot3_gazebo turtlebot3_world.launch

ROS学习笔记:movebase下goal(一个点到另一个点)基于C++的实现_第3张图片
现在我们可以加入关于movebase的c++小程序了。代码如下:

#include 
#include  //move_base的操作规范,这是一个将高级别接口暴露在导航堆栈中的 ROS 操作。
#include 

typedef actionlib::SimpleActionClient MoveBaseClient;
//简单操作操作创建方便的键入字,使我们能够与粘附在 MoveBase 行动操作界面的操作进行通信。
int main(int argc, char** argv){
  ros::init(argc, argv, "simple_navigation_goals");
  
  MoveBaseClient ac("move_base", true); // //构建一个操作客户端,我们将用它来与坚持 MoveBase 行动界面的名为"move_base"的操作进行通信。它还告诉行动客户端启动一个线程来调用 ros::spin(),以便通过传递"真实"作为 MoveBase 客户端构造的第二个参数来处理 ROS 回调。

  while(!ac.waitForServer(ros::Duration(5.0))){
    ROS_INFO("Waiting for the move_base action server to come up");
  } //等待操作服务器报告它已出现并准备开始处理目标

  move_base_msgs::MoveBaseGoal goal;
  
  goal.target_pose.header.frame_id = "base_link";
  goal.target_pose.header.stamp = ros::Time::now();

  goal.target_pose.pose.position.x = 1.0;
  goal.target_pose.pose.orientation.w = 1.0;

  ROS_INFO("Sending goal");
  ac.sendGoal(goal); //在这里,我们创建一个目标,使用move_base_msgs发送给move_base::移动BaseGoal消息类型,该消息类型自动包含在移动基础操作.h标题中。我们只需告诉基地在"base_link"坐标框架中向前移动1米。呼叫ac.sendGoal实际上会通过电线将目标推送到move_base节点进行处理。

  ac.waitForResult();

  if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
    ROS_INFO("Hooray, the base moved 1 meter forward");
  else
    ROS_INFO("The base failed to move forward 1 meter for some reason"); //现在唯一要做的就是等待目标使用ac.等待目标完成,等待目标完成,这将阻止,直到完成move_base操作处理我们发送的目标。完成后,我们可以检查目标是否成功或失败,并相应地向用户输出消息。

  return 0;
}

现在这个cpp文件写好了,加上依赖并写一个launch文件就可以用了。依赖项如下:

add_executable(simple_navigation_goals src/simple_navigation_goals.cpp)
target_link_libraries(simple_navigation_goals ${catkin_LIBRARIES})

加在CMakeLists里。

你可能感兴趣的:(ros)