cartographer:occupancy_grid_node_main
本文分析cartographer
使用二维激光传感器的SLAM, google cartographer的地图生成在occupancy_grid_node_main中实现。先放上生成的地图,走廊约为90m*60m
。左边的range_data_inserter
中的insert_free_space = true
,右边false
。表示是否更新raytracy
中的free
栅格的概率。
系统简介
1. 系统采用local和global的方法来优化位姿 ξ=(ξx,ξy,ξz) ; 在local的方法中,每一帧与submap匹配;使用的是非线性优化将激光和地图对齐。因为在扫描匹配的过程中会累计误差,因此需要全局的方法来回环消除误差。
2. 在local的匹配中,采用的是类似hector_slam
的线性插值的方式,不过为了解决双线性插值的不连续性,采用了双三线性插值; 在global的方法中借鉴了olson的相关性扫描匹配方式,通过全局位姿优化来解决误差累计。
3. 在子图构建完成(已经加入足够的激光数据帧), 会用来做loop closure
,当激光现在的位姿估计和之前的子图足够近的时候(再次访问一个地图),在搜索窗口内,完成类似与olson的相关性扫描匹配,如果匹配结构很好就增加loop closing constraint
。
子图介绍
首先分析的是输出的地图,由次来分析采用的算法结构。这个ROS节点的任务是接受cartographer_node
节点运行计算得到的子图序列和子图内容,拼接成一个大的地图的工作。如下图所示:上面的栅格地图是cartographer
得到的整体的地图,下面的两张是其中两个子图对应的栅格地图。
occupancy_grid_node_main中维护的全局地图数据:
std::map<SubmapId, SubmapSlice> submap_slices_ GUARDED_BY(mutex_);
<