在做导航的过程中,目的地都是通过RViz界面手动设置的,很麻烦。那么能否通过程序设置目标点,让机器人自动在几个目标点之间来回循环呢?答案是肯定的,《Ros by Example volumn1》8.5.3节中也给出了答案。但是,本文给出一个更简单的例子,在机器人前方1m处设定目标点,文章内容几乎来自ROS navigation 官方wiki文档。

在进行下面的试验之前,希望你已经在自己的机器人上完成了使用move_base进行控制的任务。

       第一步:创建用于发布目标点的package,包名称为simple_navigation_goals:

$ catkin_create_pkg simple_navigation_goals move_base_msgs actionlib roscpp

如果你不想创建一个包,而是在已有的package下创建一个节点,那必须修改这个package的package.xml文件:

在相应位置处添加上如下几行:

<bulid_depend>move_base_msgs</bulid_depend>
<bulid_depend>actionlib</bulid_depend>      

以及:

<run_depend>move_base_msgs</run_depend>
<run_depend>actionlib</run_depend>   

        第二步:在这个package下的src文件下用文本编辑器创建一个cpp文件send_goal.cpp。如果还没有src文件夹,自己手动创建一个。将下列代码复制进去:

#include <ros/ros.h>
#include <move_base_msgs/MoveBaseAction.h>
#include <actionlib/client/simple_action_client.h>typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;int main(int argc, char** argv){ros::init(argc, argv, "simple_navigation_goals");//tell the action client that we want to spin a thread by defaultMoveBaseClient ac("move_base", true);//wait for the action server to come upwhile(!ac.waitForServer(ros::Duration(5.0))){ROS_INFO("Waiting for the move_base action server to come up");}move_base_msgs::MoveBaseGoal goal;//we'll send a goal to the robot to move 1 meter forwardgoal.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);ac.waitForResult();if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)ROS_INFO("Hooray, the base moved 1 meter forward");elseROS_INFO("The base failed to move forward 1 meter for some reason");return 0;
}

代码解读:

1. 注意代码中用的是action,不是服务service。ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息。action也有服务的概念,但是它不一样的地方是不是一问一答,而多了一个反馈,它会不断反馈项目进度。如这里,你设定了目标点,反馈信息可能是机器人在规划路径上的即时位姿,直到机器人到达目标点,返回SUCCEEDED消息。有关actionlib的具体知识请参加ROS官方wiki。
    2.这段程序的目的是是移动机器人前进1m。注意程序中:

goal.target_pose.header.frame_id = "base_link";
goal.target_pose.pose.position.x = 1.0;

这里设定目标点goal所在的坐标系base_link,因此目标点位姿position.x = 1 的含义是在当前base_link中前进1m。当然你可将目标点设定在绝对坐标系中,如在map坐标系。至于在map坐标系中,具体的目标点参数如何得到?可以使用RViz中的navigation goal,点击地图中相应点进行查看。

第三步:编译并运行

要使得上述程序会生成可执行文件,还需要对package的CMakeList.txt文件进行修改:

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

接下来可以编译了:

$ cd ~/catkin_ws
$ catkin_make

运行:

注意,如果你程序中使用的是map坐标系,和定位导航一样,应该在RViz中设定机器人初始位姿以后,才开始执行这个发送目标点的节点,这样做的目的是满足机器人的定位要求,使得amcl包能正确运行。如果是base_link坐标系则关系不大,因为目标点是相对机器人的,运行程序以后,你将看到机器人前进1m。

(转载请注明作者和出处:http://blog.csdn.net/heyijia0327 未经允许请勿用于商业用途)

ROS 教程之navigation: 用程序设定导航目标点相关推荐

  1. ROS之用程序设定导航目标点

    一. 参考:ROS 教程之navigation: 用程序设定导航目标点 在做导航的过程中,目的地都是通过RViz界面手动设置的,很麻烦.那么能否通过程序设置目标点,让机器人自动在几个目标点之间来回循环 ...

  2. ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin

    在做机器人导航的时候,肯定见到过global_costmap和local_costmap.global_costmap是为了全局路径规划服务的,如从这个房间到那个房间该怎么走.local_costma ...

  3. ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)

    前言: 相信大家在用<ROS by example>学习ROS的过程中,基本上都是使用书本中的例程,在终端输入几行别人已经写好的代码,看看仿真效果.可是这样一来,笔者在跟着书本初略过了一遍 ...

  4. ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)

    在这一篇文章中,将主要介绍如何将DSP上采集到的速度转化为Odom,即左右轮速度转化为机器人离起点的x,y坐标和机器人的朝向角yaw,让move_base可以订阅到这个信息并做出相应的路径规划.在wi ...

  5. ROS 教程之 network:多台计算机之间网络通信(2)

    在上一篇文章中我们已经搭建好了两台计算机间通信的条件,但是每次都需要在新的终端里输入一长串export ROS_MASTER_URI之类的.实际弄起来的时候也不方便,因此在本文中,我们更进一步,简化两 ...

  6. ROS 教程之 vision : 用各种摄像头获取图像

    可能有很多人想在ROS下学习视觉,先用摄像头获取图像,再用opencv做相应算法处理,可是ROS下图像的采集可不像平常的read一下那么简单,需要借助外部package的使用.而摄像头即可以用笔记本自 ...

  7. ROS 教程之 vision: 摄像头标定camera calibration

    在上一个ROS教程视觉文章中,我们使用usb_cam包读入并发布了图像消息,但是图像没有被标定,因此存在畸变.ROS官方提供了用于单目或者双目标定的camera_calibration包.这个包是使用 ...

  8. ROS 教程之 network:多台计算机之间网络通信(1)

    LZ在实验室环境下要实现一台台式主机和移动机器人上的笔记本通信.台式机作为主机,用rviz监控和无线操作移动机器人,笔记本上通过ROS实现移动机器人的自主定位和路径规划等程序.主机上用的虚拟机装的ub ...

  9. Nowa Flutter开发教程之 08 在屏幕之间导航

    如何实现导航 要实现屏幕之间的导航功能,我们首先需要一个触发移动到另一个屏幕的事件(如果您不知道事件是什么,请查看Nowa Visual Programming 的工作原理). 您可以使用带有事件的小 ...

  10. ROS Navigation Tuning Guide(导航调试指南)

    ROS Navigation Tuning Guide 导航调试指南 准备工作 距离传感器 里程计 定位 速度与加速度的设置 获得最大速度 获得最大加速度 设置最小值 XY方向的速度 Global P ...

最新文章

  1. cuda安装教cudnn安装显卡问题
  2. hive mysql 不兼容_Hive+mySql遇到的问题和解决办法
  3. Spring中的Controller ,Service,Dao是不是线程安全的?
  4. R语言message函数、warning()函数和stop()函数输出程序运行健康状态信息实战
  5. 如何找到Kafka集群的吞吐量极限?\n
  6. java使用Calendar类获取常用简单工具类
  7. asp.net中@page指令的属性Inherits、Src、CodeBehind区别
  8. Html 教程 (8)表单
  9. GDCM:DICOM文件转储飞利浦ECHO的测试程序
  10. 6款英雄主题fcpx标题字幕插件:Hero Shot Titles for Mac
  11. (89)FPGA除法器设计
  12. 计算机组成原理pd指令是什么,计算机组成原理期中考试(DOC).doc
  13. java doget 返回json_HttpClient调用doGet、doPost、JSON传参及获得返回值
  14. 编译安装imagick出错:make: *** [imagick_class.lo] Error 1
  15. svn插件下载地址(用于eclipse、myeclipse的svn插件)
  16. java 邮件接收端程序_java邮件收发功能实现代码
  17. 腾达无线路由器怎么建立服务器,如何在腾达建立无线路由器 | 192.168.1.1手机登陆...
  18. 矢量网络分析仪VNA的校准之SOLT方法
  19. Creo/ProE自定义零件外观库保存使用
  20. word里双横线怎么打_如何在word中画线 怎么在word中输入横线[图文]

热门文章

  1. 深度学习教程(1) | 深度学习概论(吴恩达·完整版)
  2. maven下载与安装教程
  3. 蒸汽管道图纸符号_管道设备表常用符号.ppt
  4. 计算机视觉应用培训心得体会,三维计算机视觉学习感想
  5. 双线性对在密码学中的应用(上)
  6. 【Python】numpy库和scipy库的安装与使用
  7. java dht 爬虫_python开发的 dht网络爬虫
  8. 分布式电源选址定容与优化配置MATLAB程序基于多目标粒子群算法
  9. Zigbee 协议栈
  10. GPS里集成的指南针一般叫做外置罗盘是1#,飞控里面的指南针叫内置罗盘是2#