1. 从SLAM到纯定位:Cartographer的核心原理
第一次接触Cartographer纯定位功能时,我花了整整三天才搞明白它的工作原理。与常见的AMCL定位不同,Cartographer的纯定位模式实际上是在已有地图基础上运行的SLAM系统。简单来说,它会把预先建好的地图作为"固定参考系",然后在这个框架内持续优化机器人的位姿。
这里有个很形象的比喻:想象你拿着手机在商场里导航。建图阶段相当于商场工作人员用专业设备绘制了完整的室内地图;而纯定位阶段就是你打开手机导航APP,利用已有的商场地图来确定自己当前的位置。Cartographer的纯定位就是这样的过程,只不过它用的是激光雷达数据而不是手机信号。
关键参数pure_localization_trimmer控制着系统保留多少历史数据用于定位。我实测发现,对于TurtleBot3这样的小型机器人,保留3-5个子图(submap)就能获得不错的定位效果。这个参数设置得太小会导致定位不稳定,太大又会增加计算负担。下面是一个典型的配置示例:
lua复制TRAJECTORY_BUILDER.pure_localization_trimmer = {
max_submaps_to_keep = 3,
}
在Gazebo仿真中验证定位精度时,我发现两个常见问题:一是TF坐标系配置错误导致定位完全失效,二是地图分辨率与传感器数据不匹配造成定位漂移。解决方法也很直接:
- 确保
tracking_frame和published_frame与你的机器人URDF定义一致 - 建图和定位时使用相同的分辨率参数(建议0.05m)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Navigation2与Cartographer的集成实战
把Cartographer作为Navigation2的定位源,最让我头疼的是坐标系的转换问题。Navigation2默认使用AMCL,要改用Cartographer需要修改几个关键配置。首先在nav2_params.yaml中,需要禁用AMCL并启用Cartographer的定位话题:
yaml复制amcl:
ros__parameters:
use_amcl: false
localization:
ros__parameters:
use_
