4 · 常见SLAM话题类型
做SLAM调试,说白了就是跟一堆话题打交道。你打开rostopic list,满屏的名字,哪个是传感器数据,哪个是里程计,哪个是地图?我刚开始接触那会儿也晕,后来摸清规律了——其实就三大类:传感器话题、里程计话题、地图话题。今天咱们就把它们彻底捋清楚。
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 一张表总结常见话题
| 话题名 | 消息类型 | 典型频率 | 调试要点 |
|---|---|---|---|
| /scan | sensor_msgs/LaserScan | 10~40 Hz | 检查range_min/range_max,是否有inf或NaN |
| /imu | sensor_msgs/Imu | 50~200 Hz | 看角速度零偏是否稳定,加速度模值是否接近9.8 |
| /odom | nav_msgs/Odometry | 20~100 Hz | 对比位移增量与编码器脉冲,打滑时明显异常 |
| /map | nav_msgs/OccupancyGrid | 低频 (0.1~1 Hz) | 检查地图原点、分辨率,数据是否全为-1 |
| /map_metadata | nav_msgs/MapMetaData | 随/map发布 | 确认resolution和origin与真实场景一致 |
4.5 实战小技巧:如何快速定位话题异常
嗯,这里我要分享一个我自己一直在用的三板斧:
- 看频率 ——
rostopic hz /scan /odom /imu。频率突然掉了一半?大概率是传感器掉线或者CPU过载。 - 看极值 ——
rostopic echo /scan | grep -E "range_min|range_max"。如果range_max突然变小,可能是雷达被遮挡。 - 看时间戳 ——
rostopic delay /scan。延迟超过100ms,SLAM基本就废了。我曾经在工控机上遇到过USB带宽不够,/scan延迟飙到300ms,地图直接扭曲。
💡 避坑指南: 如果你发现
/odom和/scan的时间戳不同步(比如odom比scan老50ms),可以在启动文件中加~queue_size参数,或者用tf2::TimePoint做近似同步。别问我怎么知道的……调了一整天。