采用16线激光雷达调用cartographer室内定位
之前进行了16线激光雷达调用cartographer包进行室内建图,这方面很多朋友都知道,cartographer是google的一个开源SLAM算法,那么它能够用来定位吗?
我在网上查到的解释是可以,首先,什么是SLAM?
SLAM全称是simultaneous localization and mapping,中文名称是即时定位与地图构建。那么可以看到,地图构建就是我们之前说的建图,那么即时定位不就是定位吗。
事实就是如此,cartographer也提供了定位功能,先介绍一下cartographer的纯定位模式。
cartographer的纯定位模式与建图类似,它也需要通过建立子图,然后将子图与事先建立好的先验地图匹配上进行定位。这里会有一个问题,就是它需要建立子图,这个子图会覆盖先验地图,可能会对定位有影响,所以我们需要将cartographer里面发布子图的节点给注释了,那么另外一个问题就来了,发布子图的节点注释了,那么我们没有子图怎么定位呢。
这里就涉及到另外一个知识点了,我们采用map_server包发布子图,这样就可以防止先验地图被覆盖,具体的步骤如果小伙伴们不懂的话可以评论留言或者私信我。
接下来介绍一下怎么配置cartographer的定位。
首先就是cartographer有一个demo_backpack_2d_localization.launch这个launch文件,我们要做的就是去修改它(记得修改前备份一个)。
这里要修改的几点都写好了,其中第二点是加载我们自己的机器人模型,第3点的lua文件也是根据自己的机器人模型写的,后面的pbstream地图文件也要加载,这个地图文件是先通过cartographer建图保存得到的,后面的remap这里我也写了,我写的是然后第5点那个-pure localization 1,这里是采用纯定位模式。
而且后面的修改文件是修改cartographer_ros里面的文件occupancy_node_main.cc,这里参考
https://github.com/lllray/file/blob/master/occupancy_grid_node_main.cc
或者直接复制这个,大致就是这样,然后其中的几个文件都是需要根据自己的机器人来写的,比如my_backpack_2d.urdf、my_backpack_2d_localization.lua,map.pbstream也是自己保存好的地图。
最后写好了launch文件后(姑且称之为localization.launch),要启动的文件就有雷达驱动文件(启动雷达的,比如rs_lidar_16.launch)、机器人驱动文件(用来启动launch文件里加载urdf文件的)、以及我们写的launch文件。
这里不建议将启动urdf的文件写在我们这个localization.launch里。
最后启动的rviz里面应该有建好的地图以及激光雷达实时扫描到的点云数据,起初的时候这些点云数据与地图是不匹配的,需要动一下机器人,一会儿后如果点云数据与地图匹配了,说明定位成功。
点云数据与地图不匹配
点云数据与地图匹配
室外纯激光定位
这里要注意两个问题:
1 cartographer如果纯激光定位最好场景稍微复杂些,不能像马路那样重复度比较高的场景,因为这样的话建图会建不好(纯激光建图),实际机器人运动时rviz里面的模型是不动的,这个也称为长廊效应;
2 另外一点是在定位的时候机器人速度不能过快。