ROS下用gmapping 来实现构建实验室地图
由于move_base类已经配置好,可用了,所以就来尝试用gmapping构建地图了,看看效果。下面来说下具体的过程。
Gmapping 构建地图需要里程计的信息的,所以配置了下move_base.xml文件。像hector_slam ,也尝试用了来构建地图,这个不用里程计的信息,手持便可以做到,但是有了会更准确。因为用hector_slam构建地图时,机器人的位置很容易偏移,导致扫描得到的地图有部分是重复的,而且是歪斜的。关于如何用hector_slam 构建地图,这个在Yuboshe前辈写的一篇博文中可以看到,可供参阅。
构建地图的总体思路是:
软硬件的准备工作:首先是用到的传感器,hokuyo或者其他的rplidar,安装上驱动,保证计算机能够识别;装入navigation 和gmapping等package。
tf变换关系:将里程计的信息传给/odom,通过/odom发布出来并广播变换,这样坐标系/odom和/base_link之间就建立的联系。这步是关键,如果变换关系没有理清楚,各个节点之间无法建立连接,没有消息进行通信,数据不能向下传输,再下面的努力是白费的。
move_base的配置:将/odom坐标系的位姿作为输入到move_base ,然后配置一系列的move_base.xml文件,其中包括全局和局部的代价地图等。
使用gmapping构建地图:运行gampping,控制小车进行实验室地图构建,用rviz可以进行地图过程构建的显示。
在这个过程中,为了操控机器人,使用了joystick来控制,就像遛狗一样,走一圈,然后地图就建好了,要控制速度。
硬件平台:p3-dx,用到了激光测距仪hokuyo,camera,joystick
针对我的电脑上的程序,我所用的命令是下面几条。
1.开机,用Ctrl+alt+T打开一个终端,配置端口。
$sudo chmod a+wr dev/ttyUSB0
$sudo chmod a+wr /dev/ttyACM0
$sudo chmod a+wr /dev/video0
$sudo chmod a+wr /dev/input/js0
2.运行nav_step1.xml
$roscd rr_nav/../launch
$roslaunch nav_step1.xml
3.运行gmapping_test.launch
$roscd dm_localization/../rr_nav
$roslaunch gmapping_test.launch
4.移动小车,构建地图。
按下小车上的白色按钮,用joystick 来控小车走动。
下面将具体的操作过程分为四个部分来讲述。
第一部分:配置端口。
由于我没有用可以在不论插拔的情况下连接上的端口都能识别的设置,在每次使用时首先是进行端口设置。使用的端口有四个:/dev/ttyUSB0 机器人平台与电脑连接的端口,通过这个建立上位机与底层的通信
/dev/ttyACM0 hokuyo 的端口,这是hokuyo的默认设置
/dev/video0 camera 的端口
/dev/input/js0 joystick 的端口
使用的命令是:
$sudo chmod a+wr dev/ttyUSB0
$sudo chmod a+wr /dev/ttyACM0
$sudo chmod a+wr /dev/video0
$sudo chmod a+wr /dev/input/js0
了解各个端口,可以判断是在使用哪种传感器,初学者最好不要忘记端口的配置。这里可以看作是对外部接入的装置的一种了解,首先是安装该设备的驱动程序,这样电脑才能够识别该设备,然后端口号是这个设备的ID ,是唯一的,当有不同的该种同类型的设备接入时,可以作为区别。再之后就是通过端口读取传感器的信息,接下来对这些信息进行处理,作为上层算法可用的。这是传感器与电脑之间的通信接口。
第二部分:启动平台,输出位置信息。
下面从step1.xml文件开始分析。
Step1.启动p2os,这布是建立与机器人平台的通信,通过p2os可以在上层与底层之间进行通信,p2os发布了很多topic。
$ rosrun p2os_driver p2os_port:=/dev/ttyUSB0 _pulse:=1.0
在hydro下的命令稍微有不同,$ rosrun p2os_driver p2os_driver _port:=/dev/ttyUSB0 _pulse:=1.0
_port:=/dev/ttyUSB0 设置的端口
_pulse:=1.0 脉冲
Step2. 启动hokuyo激光测距仪,发布/base_link 和/laser 的静态变换base2laser。
$rosrun hokuyo_node hokuyo_node
$rosrun tf base2laser static_transform_publisher --args="0.2 00.25 0 0 0 base_link laser 100"
Step3. 启动摄像头进行二维码定位,发布定位的信息,将混合位姿作为后面move_base的输入。
$roslaunch dm_localizationusb_cam_only.launch
$roslaunch dm_localization dm.launch
$roslaunch pose_hybrid hybrid.launch
第三部分:配置move_base.xml文件,运行gmapping。
首先看下gmapping_test.launch。
Step1:进行move_base的配置
加载了move_base.xml文件,那么我们看下move_base.xml里面都有什么东西,一步步进行分解。
move_base.xml:
我们可以看到启动了move_base_node ,设置参数,然后加载一些列关于局部和全局地图的.yaml 文件。
那么我们再看看这些.yaml 文件中都有什么,那些参数可以进行设置。
(1)costmap_common_params.yaml ns="global_costmap"
这个文件中包含了obstacle_range: 2.5 max_obstacle_height: 1.7 laser_scan_sensor等
(2)costmap_common_params.yaml "local_costmap" 同上(1)
(3)local_costmap_params.yaml
这个文件中包含了global_frame: /odom
robot_base_frame: /base_link
map_type: costmap
(4)global_costmap_params_amcl.yaml
这个文件包含了 global_costmap:
global_frame:/odom #/map
robot_base_frame:base_link
(5)navfn_params.yaml
NavfnROS:
allow_unknown: true
recovery_behavior_enabled: false
(6)base_local_planner_params.yaml
这个文件包含了:
max_vel_x: 0.6
min_vel_x: 0.15
max_rotational_vel: 0.8
min_in_place_rotational_vel: 0.2
acc_lim_th: 1.7
acc_lim_x:1.5
acc_lim_y: 1.5
escape_vel: -0.15
这些文件都配置好了,关系到小车走的时候走的是否平稳,是一个关键之处,需要不断的尝试。
Step2. 启动gmapping,来构建地图。因为用到了该功能包,所以直接调用就可以,直接运行节点,订阅/scan。
用rviz来显示构建的过程,加载的topic 是/map,然后就可以看到激光扫描的点了,也可以看到地图构建的过程,是一个实时的过程。
第四部分:用joystick来控制机器人,进行地图构建。
在构建的过程中,需要注意两点,否则会影响到地图的准确性。构建完地图之后,保存参数和图,以后可以进行加载。
1.运行速度不宜过快,由于激光扫描有一定的频率,速度低时可以扫描到的点多,构建的地图准确,不会出现漏掉的现象。如下图红色线部分所示:
2.由于用到的是里程计的信息来进行定位的,是相对小车的,所以尽量沿直线行走,原地转弯,这样得到的地图不会倾斜,不会有重复的偏移的地图出现。
如下图的红色和绿色线的标注。
3.比较准确的图如下图所示:
在图中可以看到,有些点飞出。飞出的点可能是由于物体的表面不平或者有空隙,激光在扫描的时候只能扫到很小的一部分,然后不能根据大量的点去判断是否是一个障碍物或者墙面。
实验室外的走廊建立的地图,如下图所示:
我把它放大之后我们仔细分析一下:
走廊环境简单,没有障碍物,两边是墙壁。绿色线的部分,是实验室的走廊,墙壁特征比较明显,建立的地图比较准确;红色线部分,激光扫描仪的积累数据较少,才会出线这样的现象,所以要有旋转来保证扫到足够的数据;蓝色线部分,是一扇门开了缝,所以激光扫描时透过缝扫到了实验室内的环境,出现飞点。
在构建地图时,要注意速度要慢,走一段距离旋转一周,这样得到的数据准确。
关于地图构建的参数问题,可以参考网网上的:http://wiki.ros.org/navigation/Troubleshooting
当程序运行起来时,扫描时的CPU使用率是50%左右,构建地图时到70%左右,最高到达78%.
关系图分析
可以通过rqt进行分析。$rosrun rqt_gui rqt_gui (在不同的ROS 版本上这条命令有些不同,如在hydro上是:$rosrun rqt_graph rqt_graph)
(1)完整的tf变换关系图,可以进行查看。
$rosrun tf view_frames
$evince frames.pdf
(2)node关系图:
(3)活动node/topic 关系图
(4)所有node/topic 关系图
(5)运行$rosrun rqt_plot rqt_plot,可以画图。添加topic的信息,就可观察小车运动过程中的位置 速度 等信息。注意:添加时要按照它的提示一步步来,可以进行坐标轴的设置。在rqt界面里可以做到很多,是一个不错的监测工具。