实现纯定位
(1)因为正常的cartographer的建图的map是由cartographer发布的;如下
rostopic info /map
Type: nav_msgs/OccupancyGrid
Publishers:
* /cartographer_occupancy_grid_node
因此需要把map的发布替换成
<node name="map_server" pkg="map_server" type="map_server"
args="/home/lx/carto_ws/map/2d-1.yaml" />
把原来的去掉
<node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
这是在运行cartographer建图的launch文件中修改
(2)开启纯定位
在lua文件的配置参数中修改
TRAJECTORY_BUILDER.pure_localization_trimmer = {
max_submaps_to_keep = 3, //最大保存子图数,存定位模式通过子图进行定位,但只需要当前和上一个子图即可,我这里设置的是2
}
POSE_GRAPH.optimize_every_n_nodes = 20 //每20个有效帧一个子图,子图构建完成要闭环检测一次,这个数越小,
纯定位的原理
纯定位的TF树
图里map到footpint的tf就是机器人实际的位姿
关于纯定位的优化
纯定位至少有两个轨迹
纯本地化不同于映射。首先,我们期望本地和全局 SLAM 的延迟更低。其次,全局 SLAM 通常会在作为地图的冻结轨迹和当前轨迹之间找到非常大量的相互约束。
如果您在 中运行pure_localization,submaps.resolution 则应与.pbstream您正在运行的子图的分辨率相匹配。使用不同的分辨率目前未经测试,可能无法按预期工作。
POSE_GRAPH.optimize_every_n_nodes需要减小,则提高了优化的频率
减小global_sampling_ratio减小了全局的采样频率,减小constraint_builder.sampling_ratio减小了普通约束的采样频率。因此降低了计算量
运行纯定位,submaps.resolution(子图分辨率) 则应与.pbstream的子图的分辨率相匹配。
相关资料
Cartographer的纯定位模式在低性能处理器上的应用适配