2、地图基础与SLAM算法选型:栅格地图原理、Gmapping与Cartographer对比、SLAM Toolbox介绍

做机器人导航,第一关就是地图。没有地图,机器人就是个瞎子。

我刚开始接触ROS2导航时,也踩过不少坑。最典型的就是——明明SLAM跑出来了,地图看着也挺漂亮,但导航就是撞墙。后来才发现,问题出在地图本身。嗯,这一章我们就来聊聊地图的底层逻辑,以及怎么选SLAM算法。

2.1 栅格地图原理:机器人眼中的世界

机器人怎么理解环境?它不像我们人眼一看就懂。它靠的是传感器数据,比如激光雷达。

激光雷达扫一圈,得到一堆点云。这些点云怎么变成地图?

说白了,就是栅格地图(Occupancy Grid Map)。

核心思想:把环境切分成一个个小格子。每个格子存一个概率值,表示这个格子被障碍物占据的可能性。

  • 0 表示完全空闲(自由空间)
  • 100 表示完全占据(障碍物)
  • -1 表示未知(没探测到)

为什么用概率而不是0/1?因为传感器有噪声。激光打过去,可能反射回来,也可能没反射回来。直接二值化太粗暴了。

我记得在做一个仓储机器人项目时,仓库里有很多金属货架。激光打到金属上,偶尔会漏掉几个点。如果用二值化地图,那些漏掉的地方就成了“空洞”,导航时机器人会一头撞上去。后来改用概率栅格,通过多次扫描累积置信度,才解决了这个问题。

避坑指南:我曾经遇到过地图分辨率设置太高(比如1cm),结果地图文件巨大,导航计算也慢。后来我习惯用5cm分辨率,平衡了精度和性能。你想想看,对于大多数室内场景,5cm足够了。

2.2 Gmapping vs Cartographer:两个时代的产物

SLAM算法选型,是很多新手纠结的地方。我直接说结论:

对比项 Gmapping Cartographer
算法类型 基于粒子滤波 基于图优化
传感器要求 必须要有里程计 可纯激光,也可融合IMU
计算资源 低,树莓派也能跑 高,建议有GPU或强CPU
回环检测 弱,容易漂移 强,自带闭环优化
建图质量 小场景不错,大场景容易飘 大场景稳定,精度高
ROS2支持 需要自己移植 官方支持ROS2

我个人习惯这样选:

  • 小房间、实验室、家庭环境 → 用Gmapping。轻量、快速、够用。
  • 工厂、仓库、商场、长走廊 → 用Cartographer。闭环能力强,不会跑着跑着地图就歪了。

为什么会这样?

Gmapping是粒子滤波,说白了就是撒一把粒子,让它们去猜机器人的位置。粒子越多越准,但计算量也越大。小场景粒子少一点也能收敛。大场景嘛……粒子容易发散,地图就飘了。

Cartographer用的是图优化。它把每一帧激光数据当成一个节点,节点之间建立约束。一旦检测到回环(比如转了一圈回到原点),就全局优化一次,把累积误差拉回来。我在一个5000平米的仓库里测试过,Cartographer跑完一圈,地图闭合误差不到10cm。Gmapping的话……嗯,我不太想回忆。

注意:Cartographer虽然强,但配置参数非常多。我第一次用的时候,光调参数就花了两天。建议先从官方给的示例配置开始,不要自己瞎改。

2.3 SLAM Toolbox:新一代的救星

如果你觉得Gmapping太老,Cartographer太难配,那SLAM Toolbox就是为你准备的。

SLAM Toolbox是ROS2社区推出的官方SLAM库。它基于图优化,但比Cartographer更“开箱即用”。

它的几个亮点:

  • 异步模式:建图和定位可以分开。你可以先建好一张地图,然后只做定位,不用再跑SLAM。
  • 地图持久化:建好的地图可以保存、加载、编辑。我经常在仿真里建好地图,直接部署到真机上。
  • 生命周期管理:SLAM节点可以按需启动和停止,不浪费资源。

启动一个SLAM Toolbox非常简单:

ros2 launch slam_toolbox online_async.launch.py

就这么一行。它会自动订阅激光话题,开始建图。

我个人建议:如果你是新手,或者项目时间紧,直接上SLAM Toolbox。它把很多底层细节封装好了,你只需要关心地图质量就行。

小技巧:SLAM Toolbox支持“地图序列化”。你可以把建好的地图保存为 .posegraph 文件,下次直接加载,不用重新建图。这在调试导航时特别有用——地图固定了,你只需要调导航参数。

2.4 本章知识体系

下面这张图,是我自己总结的SLAM选型逻辑。你可以把它当成一个决策树:

SLAM算法选型决策流程 开始选型 场景大小?计算资源? 小场景 / 低算力 大场景 / 高精度 推荐:Gmapping / SLAM Toolbox 推荐:Cartographer / SLAM Toolbox

嗯,这张图很直白。你只要问自己两个问题:场景大不大?算力够不够?答案就出来了。

2.5 总结

这一章我们聊了三件事:

  • 栅格地图的原理——说白了就是概率格子,别用二值化。
  • Gmapping和Cartographer的对比——小场景用Gmapping,大场景用Cartographer。
  • SLAM Toolbox——如果你不想折腾,就用它。

我个人经验是:不要迷信某个算法。工具是死的,场景是活的。你想想看,一个扫地机器人用Cartographer,那不是杀鸡用牛刀吗?反过来,一个自动驾驶叉车用Gmapping,那地图早就飘到外太空了。

下一章,我们会真正动手,在ROS2里跑一个完整的SLAM建图流程。到时候你会看到,地图是怎么从激光数据里“长”出来的。

核心要点:

  • 栅格地图用概率表示占据状态,不是简单的0/1
  • Gmapping适合小场景,Cartographer适合大场景
  • SLAM Toolbox是ROS2官方推荐,开箱即用
  • 选算法前先评估场景和算力

可可精品资料库