# cartographer性能调优 **Repository Path**: will_sw/cartographer_config ## Basic Information - **Project Name**: cartographer性能调优 - **Description**: No description available - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2021-02-01 - **Last Updated**: 2021-02-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cartographer性能调优 ## 0. 配置说明 * 以处理单个LaserScan, 2D为例 * 参数配置层次 + 最高层参数options,例如backpack_2d.lua的设置 * map_builder = MAP_BUILDER(来自map_builder.lua) + pose_graph = POSE_GRAPH(来自pose_graph.lua) * trajectory_builder = TRAJECTORY_BUILDER(来自trajectory_builder.lua) + trajectory_builder_2d = TRAJECTORY_BUILDER_2D(来自trajectory_builder_2d.lua) + trajectory_builder_3d = TRAJECTORY_BUILDER_3D(来自trajectory_builder_3d.lua) ## 1. cartographer算法流程介绍 ### 1.1 数据预处理 * LaserScan数据的运动补偿 ``` options.num_subdivisions_per_laser_scan = 10 // 一帧scan数据被拆成10部分,每部分按一个TimedPointCloudData消息发送 TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 10 // 然后再把10个点云消息拼接起来(做运动补偿),作为当前帧输入 ``` TRAJECTORY_BUILDER_2D.num_accumulated_range_data也可以用来把多个LIDAR传感器数据汇集在一起。 ### 1.2 前端(Local SLAM,LocalTrajectoryBuilder) 前端的任务是将输入雷达数据与已有子地图做匹配,获得机器人位姿,以及将输入雷达数据更新到已有子地图上,或创建新的子地图。 前端做完后,则可以获得当前帧与相关子地图的相对位姿关系,这个关系将用于后端位姿图优化。 cartographer提供了2种雷达数据与已有子地图匹配算法: 1) CeresScanMatcher:通过迭代优化算法(利用Ceres实现),给定初始位姿,求解最优的位姿使得变换后雷达数据可以与子地图吻合得最好。这个算法相对较快。 2) RealTimeCorrelativeScanMatcher:当TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching设置为true时,将先采用这种匹配算法获得初始位姿, 然后再用CeresScanMatcher优化。 ### 1.3 后端(Global SLAM) 后端优化时, ## 2. 性能优化建议 ### 2.1 纯前端测试 按照目前测试结果看,大部分时间耗在cartographer::mapping:scan_matching::FastCorrelativeScanMatcher2D::ScoreCandidates上, 这个是在后端调用的,用来生成优化所需要的约束项,约束项的生成需要做scan match。 所以先建议按照下面设置彻底关掉后端优化,然后再测试一下,看看是否可以实时。 ``` POSE_GRAPH.optimize_every_n_nodes = 0 POSE_GRAPH.constraint_builder.sampling_ratio = 0 POSE_GRAPH.global_sampling_ratio = 0 ``` * 如果不能实时,说明前端也比较耗时间。看看CPU占用率,然后针对耗时的操作继续进行下一步前端调优。 * 如果可以实时,说明前端所耗时间可以接受,则重心放在后端调优上。 ### 2.2 后端调优 * 设置用于后台匹配和优化的线程数 ``` MAP_BUILDER.num_background_threads = 内核数左右,稍小一点,或稍大一点,看看性能 ``` * 先关掉局部约束生成 ``` POSE_GRAPH.constraint_builder.sampling_ratio = 0 ``` 然后调整全局约束计算频率,和全局优化频率,看看是否可以实时。 ``` POSE_GRAPH.global_sampling_ratio = xx POSE_GRAPH.optimize_every_n_nodes = xx ``` * 然后调整局部约束计算频率 ``` POSE_GRAPH.constraint_builder.sampling_ratio = xx ```