使用move_base进行路径规划

本文所实现的效果来自《ROS入门实例》,对初学者会有一定帮助。

move_base是ROS环境下一个重要的功能包,可以使机器人在指定框架内移动到目标位置,是实现后续导航功能的基础,很多人想学习gmapping在ROS下的使用,那么,可以先看看move_base这个包的使用方法,此处使用模拟机器人turtlebot在仿真环境下测试move_base包的功能,不需要实体机器人。

1、确保catkin空间中有rbx1这个包。

git clone https://github.com/pirobot/rbx1.git

turtlebot机器人的仿真需要用到rbx1这个功能包,这个包中包含了需要设置的所用文件。其中,路径规划需要配置的相关文件在rbx1/rbx1_nav/config/turtlebot目录中,包含4个文件

base_local_planner_params.yaml
costmap_common_params.yaml
global_costmap_params.yaml
local_costmap_params.yaml

这四个文件里有很多设置参数,直接影响路径规划的结果,后期有必要熟悉一下里面的参数,这里先采用默认设置,上述4个文件一个都没改。

2、启动turtlebot机器人。

roslaunch rbx1_bringup  fake_turtlebot.launch

3、以空白地图启动move_base节点
move_base节点需要一张周围环境的地图,这里只需要一张空地图即可(别担心,rbx1里都准备好了)。rbx1/rbx1_nav/maps这个目录中就有所需要的空地图。运行一个launch文件,就能帮你做到这些事。该文件为rbx1/rbx1_nav/launch目录下的fake_move_base_blank_map.launch文件。

roslaunch rbx1_nav fake_move_base_blank_map.launch

4、发布一条前进指令

rostopic pub /move_base_simple/goal  geometry_msgs/PoseStamped \ '{header: {frame_id: "map"},pose: {position:{x: 1.0,y: 0,z: 0},orientation: {x: 0,y: 0,z: 0,w: 1}}}'

需要解释一下:
(1)这条指令是发布在/move_base_simple/goal话题上的,消息类型为geometry_msgs/PoseStamped
(2)geometry_msgs/PoseStamped消息包含header、pose、orientation三部分
(3)pose的含义:位置,以米为单位,此处pose: {position:{x: 1.0,y: 0,z: 0}就是指目标位置在(1,0,0)处
(4)orientation:方向,使用四元数表示,表示机器人到达目的地后的姿态,此处orientation: {x: 0,y: 0,z: 0,w: 1}表示机器人到达(1,0,0)点后,姿态(朝向)保持不变,为啥这个四元数长相为(0,0,0,1)?文章最后再详细说一下。
(5)上述命令中有一个“\”,这个”\”在linux命令行中意味着换一行再写,手动输入命令时,回车换行会出现续行提示符”>”,《ROS入门实例》里是这样写的,这里完全复制就行并回车执行就行,你也可以不写这个\,不影响命令的执行。
(6)写参数时,比如x: 0,注意冒号和0之间有一个空格。

5、使用rviz观察

rosrun rviz rviz -d `rospack find rbx1_nav`/nav.rviz

使用move_base进行路径规划_第1张图片

6、再发一个返回起点的指令

rostopic pub /move_base_simple/goal  geometry_msgs/PoseStamped \ '{header: {frame_id: "map"},pose: {position:{x: 0.0,y: 0,z: 0},orientation: {x: 0,y: 0,z: 0,w: 1}}}'

使用move_base进行路径规划_第2张图片

7、运行rqt_reconfigure,可以用可视化的方法调节各个参数
还记得之前说的那些配置参数的文件吗?这里其实也可以用对话框的方式调节,好神奇。

rosrun rqt_reconfigure rqt_reconfigure

使用move_base进行路径规划_第3张图片

最后,一起来探讨一下刚才的四元数。
为什么刚才的四元数参数设置为orientation: {x: 0,y: 0,z: 0,w: 1}

四元数可以向欧拉角一样表示旋转变换,这里表示的是机器人到达目的地后和出发时相比姿态的变化。四元数的本质是用一个向量和绕该向量的旋转来表示位姿变换,这个向量暂且记为v=(vx,vy,vz),这个旋转角度记为θ,下面看一下四元数的计算式:
这里写图片描述
看了这个公式就明白,要想根据四元数自己推算出旋转角度和旋转轴,还是有些麻烦的,一般我们需要将四元数转为为指定旋转顺序的欧拉角,才能看出姿态到底发生了怎样的变化,因此,千万别误以为每一个旋转方向的四元数表达形式都如此简洁,从四元数里读取旋转角和旋转轴还是有点计算量的。

我们可以用Matlab来验证一下quat=(0,0,0,1)这个四元数转换为欧拉角后的结果:

>> quat = [1 0 0 0];     //这里默认的四元数顺序为 w,x,y,z,与ros下顺序有点区别
>> eulZYX = quat2eul(quat)   //四元数转欧拉角函数,需要注意欧拉角转动顺序

eulZYX =

     0     0     0

输出结果也是绕各个轴的旋转角度都为0,即不旋转。
我们再来小小实验一下:我想让机器人到达目的地后调转180度,看看四元数应该怎么写。
调转180度,即绕着机器人z轴转180度,使用matlab中的函数算一下这个四元数:

>> eul = [pi 0 0];       //这个欧拉角的顺序是与输出顺序保持一致的,下面的函数转换输出顺序为ZYX,因此,绕z轴旋转pi就写为[pi 0 0]
>> qZYX = eul2quat(eul)

qZYX =

    0.0000         0         0    1.0000

注意这里的四元数是(w,x,y,z)的顺序,我们输入到ROS下时,应该调整为(x,y,z,w)顺序,即写为(0,0,1,0)。

好了,结果算出来了,将ros下那条命令中orientation改为 {x: 0,y: 0,z: 1,w: 0},再次运行,得到的结果如下图:
使用move_base进行路径规划_第4张图片
自己脑补动画,这就是向前走1米再原地掉头180度,和我们的预期是一样的,因此,掌握了四元数的输入规律,结合move_base的用法,你就不但能控制机器人去哪,还能控制机器人最终的姿态了。

你可能感兴趣的:(机器人,linux,ROS,ROS程序开发自学笔记)