【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算法。
- 【SLAM】(一)Google Cartographer的初步尝试
- 【SLAM】(一)Google Cartographer的初步尝试
- SLAM cartographer
- google cartographer的论文《real-time loop closure in 2D LIDAR SLAM》翻译
- Google开源SLAM软件cartographer中使用的UKF滤波器解析
- google源码cartographer分析一
- 谷歌开源SLAM库cartographer的学习
- ROS slam-google cartographer编译和demo运行
- 如何使用 Google Cartographer SLAM 演算法來建地圖
- springmvc 快速突破(一)---初步尝试
- 【SLAM】(二)Cartographer的原理探究——GraphSLAM理论基础
- SLAM 的初步学习(一)--ubuntu14.04 下安装 opencv3.2
- 谷歌开源SLAM库cartographer在Turltlebot的应用
- Spark 的初步尝试
- Ajax的初步尝试
- Cartographer 源码分析(一)
- 使用Google Cartographer算法在Turtlebot等移动平台上跑SLAM
- slam的初步学习(二)--PCL点云库的安装
- doxygentoolkit.vim 安装及使用
- lua实现ipairs、pairs的功能
- Python进阶-面向对象编程
- .NET软件加壳混淆以及去壳教程
- 常用的SQL语句
- 【SLAM】(一)Google Cartographer的初步尝试
- IO监控:select
- Java递归删除文件
- ITester接口测试框架 (一) :接口基础知识
- restful服务端无法获取post参数的解决方法
- 密钥交换算法DH(Java实现)
- iOS面试题
- ASP.NET 验证码案例
- Error receiving broadcast Intent { act=ACTION_UPDATE_FAVORITE_IMAGE flg=0x10 (has extras) } in