cartographer安装以及环境配置相关
相关库安装脚本:
cartographer优化调参相关
一、优化方向
算法分析
该算法主要分为两个部分,第一个部分称为Local SLAM, 该部分通过一帧帧的Laser Scan建立并维护一系列的Submap,而所谓的submap就是一系列的Grid Map。当再有新的Laser Scan中会通过Ceres Scan Matching的方法将其插入到子图中的最佳位置。但是submap会产生误差累积的问题,因此,算法的第二个部分,称为Global SLAM的部分,就是通过Loop Closure来进行闭环检测,来消除累积误差:当一个submap构建完成,也就是不会再有新的laser scan插入到该submap时,算法会将该submap加入到闭环检测中。闭环检测的本质也是一个优化问题,该优化问题被表达成了一个pixel-accurate match的形式,解决优化问题的方法是Branch-and-Bound Approach.
1. 提高子图大小阈值,减少子图数量。这会减少优化问题规模和内存占用。
具体操作:调整trajectory_builder_2d.lua配置中trajectory_builder_2d.submaps.num_range_data参数
增加这个参数的值,会直接增加每个子图的大小,从而减少子图的总数量。
例如,默认配置中这两个参数的值分别为90如果计算资源受限,可以将它们改为更高的值,如150,就会直接减少子图的数量,降低内存和计算需求。
但是需要注意,过度增加子图大小也有负面影响:
- 每次子图优化计算量会增大
- 增加优化时的距离外推误差
- 减少全局优化的频率
所以最好多次调整测试,找到一个平衡的子图大小。具体值需要根据传感器配置和运动速度确定。
除此之外,还可以调整优化频率相关参数来进一步减少优化计算。但都需要权衡精度和效率
2. 增大子图优化间隔,减少优化频率。每次优化计算量会减小。
POSE_GRAPH.optimize_every_n_nodes 插入的节点数大于optimize_every_n_nodes时执行一次优化
3. 降低扫描匹配过程的分辨率。这会加速匹配过程。
4. 使用更简单的优化算法,如增量优化而不是全优化。
5. 剔除冗余扫描点云数据,只保留特征点,减少数据规模。
6. 适当增加匹配和优化的容差,降低精度要求。
7. 在线生成地图时,及时保存并清除历史子图数据,减少内存占用。
8. 在离线模式下,使用关键帧稀疏地表示轨迹与地图。
9. 利用GPU加速矩阵运算、点云处理等计算密集模块。
目前小车是否支持GPU还得再看(BL板卡就不用考虑此项)
10. 屏蔽非必要Ros的topic和service发布订阅
11. 调参数
- num_accumulated_range_data 目前该参数表示用几帧雷达数据合并
是否考虑调大次参数,减少直线提取频率
12. 减少拷贝
RangeDataCollator::AddRangeData() 和 RangeDataCollator::CropAndMerge()函数优化,只用一个传感器建图时,可以下图位置减少id_to_pending_data_数据的拷贝和删除
13. 加载和保存地图时优化
二、具体调整参数
----调整参数降低cpu影响较大的
--绑定qslam_c为大核 降低100cpu
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching=false --false 关闭暴力匹配结果初值
TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 3 --1 5 降低雷达数据采样频率
POSE_GRAPH.constraint_builder.sampling_ratio = 0.15 --0.3 0.2 降低采样频率
TRAJECTORY_BUILDER_2D.motion_filter.max_distance_meters=0.25 --0.2 0.3 增大运动滤波距离
----以下参数可根据现场实际情况调整
POSE_GRAPH.global_constraint_search_after_n_seconds = 12 --10
--适当降低线程数
MAP_BUILDER.num_background_threads=2 --8 4
POSE_GRAPH.constraint_builder.ceres_scan_matcher.ceres_solver_options.num_threads=2 --8 4
POSE_GRAPH.optimization_problem.ceres_solver_options.num_threads=2--8 4
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.ceres_solver_options.num_threads=2 --1 4