4 · 常见SLAM话题类型

做SLAM调试,说白了就是跟一堆话题打交道。你打开rostopic list,满屏的名字,哪个是传感器数据,哪个是里程计,哪个是地图?我刚开始接触那会儿也晕,后来摸清规律了——其实就三大类:传感器话题、里程计话题、地图话题。今天咱们就把它们彻底捋清楚。

SLAM 话题 传感器数据 /scan /imu /odom 里程计话题 /odom /odometry/filtered 地图话题 /map /map_metadata 🔵 原始观测 🟢 位姿估计 🟠 环境表示

4.1 传感器数据话题 —— 系统的眼睛和耳朵

传感器话题是SLAM最底层的输入。我个人习惯,拿到一个bag先看/scan和/imu有没有数据。为什么?因为后面所有东西都建立在它们之上。

  • /scan:激光雷达的原始数据,sensor_msgs/LaserScan。包含距离、角度、强度。我遇到过好几次雷达被遮挡,/scan频率正常但全是inf,地图直接飘了。
  • /imu:惯性测量单元,sensor_msgs/Imu。角速度、线加速度、姿态四元数。注意,很多廉价IMU的偏置会慢慢漂移,你盯着rostopic echo /imu看一分钟就能发现。
  • /odom(原始轮式里程计):有些机器人直接把轮子编码器数据发成/odom,但注意这跟后面说的里程计话题不是一回事。原始odom通常噪声大,尤其打滑的时候。
💡 我的习惯: 调试时先开三个终端,分别rostopic hz /scan、rostopic hz /imu、rostopic echo /scan | head -20。频率和极值一眼就能看出传感器是否健康。

4.2 里程计话题 —— 机器人到底在哪儿?

里程计话题是SLAM的“脊梁骨”。它告诉你机器人从起点走了多远。但说实话,纯里程计一定会漂,只是时间问题。

  • /odom(融合里程计):很多SLAM框架会发布一个融合后的/odom,比如robot_pose_ekf或者imu_encoder融合的结果。类型是nav_msgs/Odometry,包含位姿和速度。
  • /odometry/filtered:robot_localization包常用的输出。我建议你直接看这个,比原始odom稳得多。
  • /tf 中的 odom→base_link:其实里程计信息也藏在TF树里。你可以用tf_echo /odom /base_link查看相对变换。
⚠️ 我曾经踩过的坑: 有一次机器人原地打滑,/odom还在疯狂往前走,但激光雷达/scan显示周围没动。SLAM直接崩了。后来我学会同时看/odom和/scan的匹配度,一旦偏差超过阈值就报警。

4.3 地图话题 —— 我们建出来的世界

地图话题是SLAM的输出,也是导航的输入。你想想看,没有地图,机器人就是个瞎子。

  • /map:占用网格地图,nav_msgs/OccupancyGrid。每个格子0(空闲)、100(占据)、-1(未知)。我经常用map_server保存后,再用Python脚本检查地图边界,看有没有异常黑色块。
  • /map_metadata:地图的元数据,包括分辨率、宽度、高度、原点坐标。分辨率错了,导航直接撞墙。我记得有一次同事把0.05米写成了0.5米,机器人以为世界很大,结果到处乱撞。
🔍 快速检查地图: rostopic echo /map_metadata 看resolution和origin。再用rostopic echo /map | head -c 500看data数组的前几个值,0代表空闲,100代表障碍。如果全是-1,说明地图没建好。

4.4 一张表总结常见话题

话题名消息类型典型频率调试要点
/scansensor_msgs/LaserScan10~40 Hz检查range_min/range_max,是否有inf或NaN
/imusensor_msgs/Imu50~200 Hz看角速度零偏是否稳定,加速度模值是否接近9.8
/odomnav_msgs/Odometry20~100 Hz对比位移增量与编码器脉冲,打滑时明显异常
/mapnav_msgs/OccupancyGrid低频 (0.1~1 Hz)检查地图原点、分辨率,数据是否全为-1
/map_metadatanav_msgs/MapMetaData随/map发布确认resolution和origin与真实场景一致

4.5 实战小技巧:如何快速定位话题异常

嗯,这里我要分享一个我自己一直在用的三板斧:

  1. 看频率 —— rostopic hz /scan /odom /imu。频率突然掉了一半?大概率是传感器掉线或者CPU过载。
  2. 看极值 —— rostopic echo /scan | grep -E "range_min|range_max"。如果range_max突然变小,可能是雷达被遮挡。
  3. 看时间戳 —— rostopic delay /scan。延迟超过100ms,SLAM基本就废了。我曾经在工控机上遇到过USB带宽不够,/scan延迟飙到300ms,地图直接扭曲。
💡 避坑指南: 如果你发现/odom和/scan的时间戳不同步(比如odom比scan老50ms),可以在启动文件中加~queue_size参数,或者用tf2::TimePoint做近似同步。别问我怎么知道的……调了一整天。