ROS2 生产落地案例
五、生产落地案例
案例一:AGV 多传感器融合与导航上线
背景:一台差速 AGV 上有单线激光雷达、IMU、轮式编码器,需要稳定的里程计与定位,之前直接拿轮式里程计做输入,跑几分钟就偏。
怎么做:用 robot_localization 的 EKF 节点做融合,输入轮式里程计和 IMU,输出 odom 到 base_link 的变换;激光定位模块负责 map 到 odom;所有传感器用静态变换挂到 base_link 下;导航栈全部设 use_sim_time=false。
关键配置:EKF 的输入话题频率必须与传感器实际频率一致,配置里把不用的传感器项关掉;IMU 的轴向和协方差按实际安装方向配好;所有节点的 TF 发布时间戳必须来自同一时间源(都用系统时间或都用仿真时间)。
效果:直线行走 20 米的位置误差明显下降,导航过程中的震荡消失。
坑与解决:第一个坑是 TF 树出现过两个父节点,导致 map 到 base_link 查询时断时续——原因是另一个节点也在发布同一个变换,去掉多余的那个就好了。第二个坑是雷达 best_effort、融合节点 reliable,数据全被丢弃,但日志里一点提示都没有,最后靠 ros2 topic info -v 对比 QoS 才找到。
案例二:用录包复现现场问题
背景:现场反馈「某些路段会突然停车」,实验室复现不了,工程师也不可能天天去现场。
怎么做:在现场机器人上加一个后台录包进程,只录雷达、里程计、TF 和速度指令;问题复现后把包拿回来,用 ros2 bag play --clock 配合算法离线重放,逐步调试。
ros2 bag record -o field_case /scan /odom /tf /tf_static /cmd_vel /local_costmap/costmap
ros2 bag play field_case --clock --rate 0.3
关键配置:录制时用 --qos-profile-overrides-path 把高频传感器录成 best_effort,避免因 QoS 不兼容丢帧;回放速度放慢,方便在关键帧上加断点。
效果:定位到是某段地面上玻璃反光导致雷达出现大量虚假点,把局部代价地图糊住,进而触发急停。
坑与解决:录包文件非常大,跑一整天能写满硬盘;解决办法是只录必要话题并限制单文件大小与保留时间。另外忘记 --clock 会让所有节点按墙上时间跑,回放出来的行为与现场完全不同。

