
室内导航系统 04:2D 激光 SLAM 不难跑起来,难的是交付一张可运营的地图
2D 激光 SLAM 是室内导航最成熟的路线之一。运行 slam_toolbox、遥控机器人走一圈、保存地图并不难;真正困难的是保证地图在长走廊、玻璃、人群和多次回环下仍可用于稳定定位,并能被现场持续维护。
2D SLAM 的三层计算
扫描匹配
当前激光帧与局部地图或上一帧对齐,估计相对位姿。匹配依赖足够的几何变化。长直走廊中,沿走廊方向约束弱;圆形空间或重复货架也会产生歧义。
轮速和 IMU 不负责替代匹配,而是提供较好的初值,让搜索不容易落到错误极值。
位姿图
每个关键帧是节点,相邻里程计和扫描匹配形成边;识别到旧位置时加入回环边。优化器调整所有节点,使约束整体一致。
回环会修正长期漂移,也可能在错误匹配时把整张图“拉坏”。所以回环不是越多越好,需要有几何一致性和人工验证。
占据栅格
位姿图决定每束激光从哪里发出,栅格更新决定空间是占据、空闲还是未知。常用 log-odds 形式累计观测:
L_t(m_i) = L_(t-1)(m_i) + inverse_sensor_model(z_t, x_t)
地图分辨率越高,细节越多,内存与噪声也越大。室内 AMR 常从 0.05 m 栅格起步,再根据最窄通道和定位精度调整。
建图前先把输入做对
至少验证:
/scan频率稳定、角度顺序正确、无大量零值;odom → base_link连续,直行尺度和转圈角度合理;- LiDAR 外参正确,旋转时墙面不分层;
- 时间戳代表采样时刻;
- 机器人 footprint 与实际外形一致;
- 遥控速度足够慢,不产生明显运动畸变。
用 RViz 看起来“差不多”不够。建议先录一段包含静止、直线、原地旋转和闭环的 bag,离线反复调试。
建图路线要设计
一个好的采集顺序是:
- 从几何特征丰富、容易重定位的位置开始;
- 先走外环,建立整体框架;
- 再进入房间和支路;
- 每隔一段回到已知区域形成闭环;
- 最后复走关键主通道做验证。
避免快速旋转、紧贴动态人群、在玻璃正前方长时间采集。门最好以运营时的典型状态建图;经常变化的门不应永久固化成不可穿越墙体。
slam_toolbox 的工程价值
slam_toolbox 不只是在线生成栅格。它支持保存序列化位姿图、继续建图、定位和长期地图更新。推荐同时保存:
栅格地图:供 AMCL/Nav2 和运营工具使用
序列化 pose graph:供继续建图、修图和长期维护使用
原始 rosbag:供问题复现
只保存 PGM,后续发现局部错误时只能重建或做图片编辑,失去了图优化层的约束。
地图验收不是看墙直不直
几何一致性
- 已知长度走廊的尺度误差;
- 同一面墙在多次经过后厚度;
- 闭环区域是否出现双墙;
- 门宽、通道宽是否符合实测;
- 原点和楼层坐标是否符合约定。
定位可用性
用独立验证轨迹启动定位,检查:
- 冷启动重定位时间;
- 全局位置误差和方向误差;
- 长走廊中的协方差;
- 动态人群下的稳定性;
- 被搬动后能否恢复;
- 错误初始位姿是否会被错误吸附。
导航可用性
将真实 footprint 膨胀后,关键通道是否仍可通行;玻璃、低矮障碍和禁行区是否由其他图层补足;地图边界是否会让全局规划走入未验证区域。
地图产品需要版本和语义
建议目录结构:
building_a/
floor_01/
geometry/map.yaml
geometry/map.pgm
graph/posegraph.data
semantic/zones.geojson
routes/route_graph.geojson
qa/validation.json
manifest.yaml
manifest 记录地图版本、建图日期、适用机器人、传感器与标定版本、分辨率、坐标原点、已知缺陷和回滚版本。
禁行区、限速区、停靠点、门和电梯不要直接画死在几何图里,应作为可单独更新的语义层。
哪些场景不该坚持 2D
出现以下条件时,应加入 3D 感知或换地图表达:
- 悬空货架和桌板决定碰撞;
- 需要识别台阶、坡度和负障碍;
- 机器人高度或姿态变化明显;
- 多层空间在平面投影中重叠;
- 玻璃与镜面占比高;
- 轮足机器人要评估落脚地形。
2D SLAM 的优势是简单、稳定和生态成熟。把它用好,不是追求更复杂的算法,而是把输入、采集、验证和地图生命周期都工程化。