Cartographer Algorithm walkthrough for tuning
本文章有后续更新版本,csdn排版和插入图片有点麻烦,我更新在我的个人站点了,欢迎阅读!
@author 薛轲翰
@email1 kehan.xue@gmail.com
@email2 17795832478@mail.nwpu.edu.cn
本文参考cartographer官方文档.
cartographer基本思路简介
cartographer的主要贡献不是算法,而是工程的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RRJBw89-1607313168606)(/home/kehan/Documents/V5PP文档/技术文档/Cartographer/Cartographer_Algorithm_Walkthrough_for_Tuning/Cartographer_Algorithm_Walkthrough_for_Tuning-pics/high_level_system_overview.png)]
cartographer 可以看做两个独立但相关的子系统, Local SLAM 和 Global SLAM.Local SLAM可以被看做是前端(local trajectory builder), 任务是建立一个个的submap. 各个submap是本地一致的, 但是会慢慢的漂移.Golbal SLAM是后端, 用于作 loop closure constraints(回环).通过scans(集合成nodes)与submaps进行matching的方法来工作.并且可以结合其他传感器的数据来进一步提高精度,来确定一致性最强的Global optimization 方案. 3D SLAM中还会使用加速度计提供的重力的方向.
总的来说,Local SLAM 的主要工作是生成更好的 submaps, Global SLAM的工作是将这些 submaps 更好的结合起来.
其中,Local SLAM的配置文件主要为 trajectory_builder_2d.lua 和 trajectory_builder_3d.lua. Global SLAM的配置文件为pose_graph.lua
Input Process
首先是雷达扫描数据的距离范围.参数为下面两个,单位为m
TRAJECTORY_BUILDER_nD.min_range
TRAJECTORY_BUILDER_nD.max_range
如果将 3D 雷达用在 2D SLAM的话,提供一个"截断"的参数,就是把一定高度范围内的扫描点映射到 2D 的一个平面上.
TRAJECTORY_BUILDER_2D.max_z
TRAJECTORY_BUILDER_2D.min_z
如果 scan 中的点的 range 大于 max_range 时,会在 max_range 外面生成一个长度为TRAJECTORY_BUILDER_2D.missing_data_ray_length
的空白区域.(?不太明白)
TRAJECTORY_BUILDER_nD.num_accumulated_range_data
的作用及意义比较麻烦,会在下文range data标题下说到.
较近的表面(如路面)经常扫描得到更多的points,而远处的物体的points经常比较稀少. 为了降低计算量, 需要对点云数据进行下采样, 简单的随机采样仍然会导致低密度区的点更少,而高密度区的点仍然比较多.因此cartographer 采用 voxel_filter (体素滤波)的方法. 即将raw points(如何定义raw points? TODO) 为中心做一个边长为TRAJECTORY_BUILDER_nD.voxel_filter_size
的立方体,然后只取立方体的形心.如果立方体较小的话会导致更密集的数据,而较大的话可能会导致数据丢失但是速度会更快.
不仅使用了定大小的 voxel_filter, Cartographer还用了 adaptive_voxel_filter, 该 adaptive_voxel_filter 可以在最大长度TRAJECTORY_BUILDER_nD.*adaptive_voxel_filter.max_length
的限制下确定最佳的voxel_filter_size
来实现目标的points数TRAJECTORY_BUILDER_nD.*adaptive_voxel_filter.min_num_points
.
关于IMU数据的作用以及是否使用IMU数据的问题
IMU 数据用于观测精确的重力方向以及机器人的姿态.IMU 数据噪声较大但是整体的方向还是正确的.cartographer 内部有一套它自己处理IMU数据的流程.cartographer 并未使用 sensor_msgs/Imu 消息中的四元数信息,而是直接使用三轴线加速度与角速度.由于 2D SLAM 可以做到无外界信息来源而实时处理数据,所以 2D SLAM 可以选择是否使用 IMU 的消息.但是在 3D SLAM 中需要提供 IMU 数据作为扫描方向的初始猜测,可以大大降低 scan 匹配的复杂性.
cartographer中关于时间的参数单位均为s(秒).
TRAJECTORY_BUILDER_nD.use_imu_data = true
TRAJECTORY_BUILDER_nD