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

这两天在学习movebase的一些内容,不得不感概movebase的体系是很庞大的。下面我用turtlebot3完成了movebase中goal的实现。即使零基础都可以做出来,内容不多但肯定能实现。下图是效果图:在这里插入图片描述
现在我们在终端下执行这个命令:

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 

在这里插入图片描述
再在另一个终端输入:

roslaunch turtlebot3_gazebo turtlebot3_world.launch

在这里插入图片描述
现在我们可以加入关于movebase的c++小程序了。代码如下:

#include <ros/ros.h>
#include <move_base_msgs/MoveBaseAction.h> //move_base的操作规范,这是一个将高级别接口暴露在导航堆栈中的 ROS 操作。
#include <actionlib/client/simple_action_client.h>

typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> 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里。

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值