提升cartographer局部全局SLAM实时性,降低cartographer在低性能板上的堵塞

前言

最近鼓捣cartographer比较多,然后现在需要在低性能板子上用cartographer进行长时间的建图,之前在地下停车场开了一下午的车录了近五个小时的纯激光bag(如果需要的话,跟我留言),然后我拿上来喂给rockpi上的cartographer进行测试,前面还好,15分钟之后就出现了延迟了,这个不要紧,然后我的rockpi是4G的,每次都是一个小时左右内存爆了,直接结束运行,我们想办法给rockpi分配了30G的交换空间,到最后用了15G的交换空间,内存这个事也算解决了吧

但是!但是!但是!
因为rockpi毕竟比不上电脑处理器,没办法一下子处理那么多数据,长时间运行导致工作队列的堆积,剩下很多需要优化的,如下

[ INFO] [1660275577.180100974]: I0812 11:39:37.000000 94839 pose_graph_2d.cc:538] Remaining work items in queue: 44702

从昨天12点开始跑bag到现在将近12点了,昨天下午跑完bag的时候堆积了4万多个工作队列,简直了,板子一直在跑还剩下2万个没有处理,地图也一直在优化中。

没办法了,不可能让板子一直跑的,只能想办法提高cartograoher在全局SLAM的实时性,尽量减少cartographer堵塞,然后就有了这篇文章。

优化前介绍

cartographer分为全局SLAM局部SLAM
局部SLAM就相当于前端,进行里程计和子图的输出,将这些进行存储
全局SLAM相当于后端,将字图进行匹配,然后进行全局子图和里程计的优化,可以说cartographer的高性能离不开全局SLAM优化

cartographer的参数系统很繁杂,很多选项都可以调整不同组件的速度,各参数之间存在高度耦合,存在牵一发而动全身的现象,为此一般建议一次只探索一个选项

全局SLAM优化方案

  • optimize_every_n_nodes 减小优化每n个节点
  • MAP_BUILDER.num_background_threads 增加最大核心数
  • global_sampling_ratio减小全局采样率
  • constraint_builder.sampling_ratio 减小约束生成器的采样率
  • constraint_builder.min_score 增加约束生成器的最小得分
  • adaptive voxel filter(s) .min_num_points, .max_range 减小自适应体素滤波器的最小点数、最大范围;adaptive voxel filter(s) .max_length 增加自适应体素滤波器的最大长度
  • voxel_filter_size, submaps.resolution 增加体素滤波规格、子图分辨率;submaps.num_range_data 减小子图范围数据数量
  • .linear_xy_search_window, .linear_z_search_window, .angular_search_window 减小搜索窗口大小
  • global_constraint_search_after_n_seconds 增大n秒后全局约束的搜索
  • max_num_iterations 减小最大迭代次数

上面的参数大部分在cartographer/configuration_files/pose_graph.lua里能找到,自适应体素滤波是属于前端配置,在局部SLAM的lua文件中,也就是cartographer/configuration_files/trajectory_builder_2d.lua和cartographer/configuration_files/trajectory_builder_3d.lua中

局部SLAM优化方案

  • voxel_filter_size 增加体素滤波的规格
  • submaps.resolution 增加子图分辨率
  • adaptive voxel filter(s) .min_num_points, .max_range 减小自适应体素滤波最小点数、最大范围;adaptive voxel filter(s) .max_length 增加自适应体素滤波的最大长度
  • max_range 减小最大范围,特别是当环境噪声比较大时
  • submaps.num_range_data 减小子图范围数据的个数

注意

建图启动的时候有是加载cartographer_roc中的lua,例如revo_lds.lua,然后在revo_lds.lua中再加载其他lua文件,需要注意的是,多个lua可以多次对同一个参数进行加载的,而参数会保留父文件的数值。
例如再revo_lds.lua中

TRAJECTORY_BUILDER_2D.max_range = 25.

而trajectory_builder_2d文件中又写着

TRAJECTORY_BUILDER_2D.max_range = 35.

那么最后max_range,也就是采样范围是25,不会是35!类似的,其他参数也是这个规则,在改参数的过程中先看一下加载这个文件的父文件中或者爷爷文件是不是对这个参数进行定义

其他

目前我还没有自己进行测试,把不准哪几个参数对于速度的影响比较大,后续再进行更新,这些内容都是参照 官网手册写的

你可能感兴趣的:(SLAM,ROS,c++,人工智能,自动驾驶)