摘要
通过前面的基础学习,本章进入最为激动的机器人自主导航的学习。在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命。本章将围绕机器人SLAM建图、导航避障、巡航、监控等内容展开。本章内容:
2.google-cartographer机器人SLAM建图
1.在机器人上使用传感器
SLAM建图需要用到底盘、激光雷达和IMU,所以这里详细介绍如何在机器人上使用这些传感器。要使用这些传感器也很简单,就是在机器人上开启相应传感器的ROS驱动节点,在设置合适的可配参数就行了。
需要注意的是,底盘、激光雷达、IMU这三个传感器都使用串口与树莓派通信,为了防止每次开机这三个设备的串口号发生变动,需要将串口号进行绑定与重映射,操作方法在前面已经介绍过了,如果还没有绑定直接前往前面相关内容参考。
这里将建立一个叫catkin_ws的ROS工作空间,专门用于存放机器人传感器相关的ROS驱动功能包。关于创建ROS工作空间的操作,请参考前面相应部分内容,这里就不做讲解。
1.1.使用底盘
在机器人上只需要使用miiboo这个驱动包就可以驱动底盘了。将miiboo这个驱动包拷贝到~/catkin_ws/src/中,编译后就可以使用了。miiboo驱动包文件结构,如图1。miiboo驱动包中含有两个ROS功能包miiboo_bringup和miiboo_description,驱动miiboo底盘、底盘PID整定、里程计标定这些功能包含在miiboo_bringup中,miiboo底盘urdf模型包含在miiboo_description中。
(图1)miiboo驱动包文件结构
底盘控制可配参数:
关于底盘控制可配参数都放在miiboo_bringup/launch/minimal.launch中,如图2。
参数com_port是底盘控制的串口号,由于前面已经做了绑定,所以直接填入绑定好的名称/dev/miiboo就行了;
参数speed_ratio是里程计走直线标定值,这个值通过标定得到。
参数wheel_distance是里程计转角标定值,这个值通过标定得到。
其余参数一般不需要修改,如有需要可以结合阅读源码来了解参数含有和做相应修改。
(图2)底盘控制可配参数
驱动miiboo底盘:
其实很简单,一条命令启动miiboo底盘控制。
roslaunch miiboo_bringup minimal.launch
底盘PID整定:
我们的miiboo机器人底盘的stm32控制板中已经内置了整定好的PID参数,如果选用我们提供的控制板和电机,一般情况下是不需要整定PID的。
对于想体验一下PID参数整定过程或将我们的miiboo机器人底盘的stm32控制板应用到其他地方的朋友,这里给出了整定PID的整个操作过程和思路,方便大家学习和更深层次的研究。这里主要讲解PID整定的操作,关于原理性的东西可以参考前面相关内容进行了解。
由于底盘PID整定是非必须的功能,所以没有对底盘PID整定的串口(DEBUG-uart1)做绑定,需要先手动插入该串口到树莓派3,然后手动查看该串口的设备号,并修改该设备号的可读写权限。然后将该设备号填入miiboo_bringup/launch/pid_set.launch中的com_port参数中。然后,需要启动底盘控制节点、底盘调试节点、键盘控制节点。键盘控制节点teleop_twist_keyboard需要通过apt-get命令来安装,rqt_plot是ROS提供的绘图工具。
#打开终端,启动底盘控制节点 roslaunch miiboo_bringup minimal.launch #再打开一个终端,启动底盘调试节点,按提示输入命令 roslaunch miiboo_bringup pid_set.launch #安装键盘控制工具 sudo apt-get install ros-kinetic-teleop-twist-keyboard #再打开一个终端,启动键盘控制节点, source ~/.bashrc rosrun teleop_twist_keyboard teleop_twist_keyboard.py #再打开一个终端,用rqt_plot对底盘速度曲线进行绘制,指定曲线数据来源的topic rosrun rqt_plot rqt_plot
ROS提供的绘图工具rqt_plot用法很简单,在rqt_plot界面中,在Topic栏输入曲线数据来源,我们这里为左、右轮速度,然后点击旁边的“+”将曲线加入绘制界面,人如图3。
(图3)用rqt_plot显示速度曲线
然后,通过在启动teleop_twist_keyboard节点的终端通过I/</J/L四个按键来控制底盘前进/后退/左转/右转控制,并观察速度曲线的变化,根据PID整定规则对PID参数进行整定,在启动 pid_set.launch的终端下按相应提示输入PID参数实现对整定参数的编辑。直到得到一个比较好的速度曲线,就可以结束整定过程了。实时速度曲线显示,如图4。
(图4)实时速度曲线显示
里程计标定:
机器人底盘运行的精度是衡量底盘的重要指标。底盘精度受里程计的走直线误差和转角误差影响。因此,需要对里程计的走直线和转角进行标定,尽量减小误差。miiboo机器人底盘的ROS驱动中已经写好了相应的标定程序,跟里程计标定有关的文件主要有:
.../miiboo_bringup/launch/check_linear.launch为里程计走直线标定启动文件
.../miiboo_bringup/launch/check_angular.launch为里程计转角标定启动文件
.../miiboo_bringup/launch/minimal.launch为设置标定参数及底盘控制启动文件
下面是标定步骤过程。
由于标定过程在前面已经讲解过了,请直接前往相应内容参考。
miiboo底盘urdf模型:
urdf模型描述了机器人底盘的形状、传感器之间的安装关系、各个传感器在tf tree中的关系。其实,miiboo底盘urdf模型的主要作用是提供各个传感器在tf tree中的关系,这些关系将在SLAM和导航算法中被使用。
(图5)miiboo机器人底盘中各个传感器tf关系
图5是miiboo机器人底盘中各个传感器tf关系,base_footprint是底盘的运动中心,base_laser_link是激光雷达的中