ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
来源:互联网 发布:淘宝网企业店铺标志 编辑:程序博客网 时间:2024/06/09 23:50
原文链接:http://blog.csdn.net/heyijia0327/article/details/41831529
在这一篇文章中,将主要介绍如何将DSP上采集到的速度转化为Odom,即左右轮速度转化为机器人离起点的x,y坐标和机器人的朝向角yaw,让move_base可以订阅到这个信息并做出相应的路径规划。在wiki论坛上有一个很详细的例程是关于如何发布Odometry信息的,希望大家先仔细阅读。在这个程序里,它把转化好的Odom信息发布到了两个地方,第一个是广播了tf关系,即每次机器人移动以后,/odom坐标系和/base_linke的关系,(关于为什么要发布这tf关系,见第三篇博文);第二个是将消息发布到odom topic上。这两个东西都将是move_base需要的。
但是它的那段演示程序里,将机器人x轴方向的速度,y轴方向速度,以及旋转速度设置为常数了,实际中肯定是变化的。因此我们只需要将两轮的速度转化为x轴的速度(即前进方向的速度)和绕z轴旋转的速度,再套用到那个程序里去,就能发布机器人的位姿给move_base了。
下面这段程序就是我的转换方法:
程序中20ms为速度采样的周期。在这个转换关系,我是把y轴速度设为0,左右轮速度的平均就是前进速度(即x轴速度),左右轮速度的差转化为旋转速度。请注意:将y轴速度设为0这种转换时可行,也就是假定20ms内,机器人没有在垂直于轮子的方向上发生位移。
将左右轮速度转化完以后,就可以用官网的例程发布Odom消息了。
下面总结下思路,再贴出这段的完整源程序。在我的程序中,也就是前面所说的中间通信层程序,首先用pyserial监听串口,一旦收到左右轮的速度信息,马上将左右轮的速度信息转化为x轴方向的前进速度,和绕z轴的旋转速度,然后将这个信息发布到一个主题上(我程序中为car_speed主题)。对官网那段程序进行改进,订阅这个car_speed消息,一旦收到各轴速度,由其速度转化机器人的坐标以及航向角yaw,这些信息作为Odom topic发布。
首先看如何将左右轮速度值转变为前进速度linear.x和转向速度angular.z的程序,有了linear.x和angular.z以后再来考虑发布odom:
注意这段程序里用了自己定义的msg:Num 和 carOdom。这两个msg文件存放于beginner_tutorials/msg文件夹下。如果不知道怎么创建msg,可以看官网的教程或者我的另一篇博文。
这里贴出我定义的消息的内容:
Num.msg:
carOdom.msg:上面程序发布的/car_speed topic就包含了车子的linear.x和angular.z,运行这个节点以后,我们可以使用rostopic指令来监控这个主题发布的频率:
看主题发布的频率是否和期待的一致。
现在已经将左右轮速度转化为x轴速度和旋转速度了,下面贴出我改进的官网教程代码,教大家如何发布Odom信息和odom与base_link之间的tf转换关系。官网教程里的vx,vy,vth为常数,我们这里先订阅自己上段程序发布的car_speed主题,也就是订阅机器人实时的前进速度x和旋转速度。把官网程序由常数改为机器人实际速度就行了。下面程序为C++写的,在beginner_tutorials/src文件夹下创建空白文档,命名为your_filename.cpp,把下列代码复制进去:
这段程序首先订阅car_speed这个主题,一旦收到机器人的x轴速度和转向速度,就调用callback去发布消息,让move_base可以订阅到。
注意:这段程序要能运行,必须在你的beginner_tutorials这个包里添加对tf,nav_msgs的依赖。
要添加对这两个包的依赖,需要修改在package.xml和CMakeLists.txt进行修改:
在package.xml中添加:
和然后在CMakeLists.txt中 find_package(...)里添加 tf 和 nav_msgs就行了,最终得到:
最后还要为了使得你的C++程序能够运行,在CMakeLists.txt中最后或者相应位置,还要添加上如下指令:
完成这些以后,编译一下你的catkin_ws工作空间,在新终端中输入如下指令:
现在,有了这两个节点程序,dsp到move_base和move_base到dsp这条路通了,只要建立地图,发布坐标转换就可以用了。在下一篇文章中,我们将介绍几个与导航有关的 tf 坐标转换,再在一个空白地图上使用move_base进行导航。
最后,关于这种左右轮速度转化为Odom的程序,ros论坛里有,如这个链接。ros自己写好的教程里也有如arbotix_driver 这个节点程序里有一句,你可以在你的文件系统里搜索arbotix_driver:
你在文件系统里搜索diff_controller这个文件,打开它就可看到相应的转换程序,楼主和他们的其实相差无几。
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)
- ros的navigation之———move_base(导航框架)
- ROS Navigation的move_base类实现方法
- ROS Navigation-----move_base简介
- (ros/move_base) 怎样终止正在进行的导航navigation
- ROS之move_base分析
- ROS 教程之navigation: 用程序设定导航目标点
- ROS::用摇杆控制你的机器人(准备篇)
- ROS::用摇杆控制你的机器人(实现篇)
- 基于ROS平台的移动机器人-2-小车底盘控制
- 【ROS】移动机器人运动控制的层次
- 用Matlab通过ROS控制实际机器人
- ROS 机器人控制APP
- JS的 escape、encodeURI 、encodeURIComponent 编码与解码
- spring加密properties文件
- iOS开发系列--通知与消息机制
- IOS之UITabBarController
- Formale System-BDD
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
- android中的空指针异常NullpointExcepiton
- 毕业设计
- 利用ecache实现自定义缓存框架
- hdu 1238 Substrings (最长相同连续子序列)
- R Sprache
- 影响页面浏览性能的css属性
- iOS 怎样切换横竖屏
- SDWebImage原理及使用