【SLAM】(一)Google Cartographer的初步尝试

来源:互联网 发布:崔走召的网络电影 编辑:程序博客网 时间:2024/05/21 17:55

最近刚定了毕业设计的题目,大概是做SLAM方向,恰好Google不久前开源了他的室内SLAM库Cartographer,我就拿来用实验室的Robot试了一下,总体效果还是很好的。

  • Cartographer的Github: https://github.com/googlecartographer

  • Google的Paper:http://download.csdn.net/detail/jsgaobiao/9678941

  • Cartographer的官方文档:https://google-cartographer-ros.readthedocs.io/en/latest/

Cartographer是Google的开源SLAM库,并且包含了ROS接口,主要依赖的传感器是激光雷达(Lidar)和惯性导航仪(IMU),用于2D和3D的室内SLAM。
它的设计目标是实现低计算资源消耗,实时优化,不追求高精度(可以达到r=5cm级别的精度)
Paper中说了,它主要的贡献并不在算法层面,而是提供了工程上高效率、Robust的代码实现(所以更要把它代码跑起来试一试~)。它的一个关键点在于将branch and bound(分支限界算法)引入到 loop closure的过程中,提高与之前submap比较的效率。

算法的基本思路可以看这个图:

这里写图片描述

Scan是激光扫描的单帧数据,通过累加Scan来构建局部地图(Submap)。Cartographer的实现并没有采用滤波方法,而是采用了类似图优化的模型进行Pose estimation,具体的实现是用了Ceres scan matching(Ceres是Google自家的库) 。
这样构造出来的很多很多submap是会产生累计误差的,最后通过Loop closing来消除这些误差,完成闭环。

Cartographer的官方文档中提供了很多Demo,基本的ROS框架如下图所示:

这里写图片描述

其中,Cartographer_node是它的主要模块,它订阅了很多topic(ROS操作系统中的概念,如果不熟悉ROS可以参考它的tutorial:http://wiki.ros.org/ROS/Tutorials),其中/scan是激光雷达的数据,/imu是IMU的数据,我所做的主要工作就是参考Google的demo实现了Laser publisher和IMU publisher,并做了一些测试。

我们的Robot上使用的是hokuyo的激光雷达,它提供了现成的ROS node,叫做urg_node,可以在ROS wiki上查询使用方法。
IMU的publisher使用了python实现,它publish的数据类型是sensor_msgs/Imu。目前我只输出了orientation,这个publisher还不够完善,不过已经基本能用了。publisher的实现等完善后再放上来。

我分别在室内和室外测试了该算法:
室内测试的视频可以看这里:百度网盘

室内

这里写图片描述

在室外测试的时候很卡,不知道是因为我们的Robot上CPU不太够用还是可视化占用的内存太大,这个我还要继续研究下(因为离线跑Google数据的时候非常流畅),另外接下来还要补充SLAM的理论知识,并继续了解其他的SLAM算法。

2 0
原创粉丝点击