机器人上线后,最让人头疼的是“现场出了问题,回来却复现不了”。ROS 2 提供了日志和诊断两套机制,用好它们能大大缩短排查时间。

一、日志基础
1. ROS 2 节点日志同时输出到控制台、本地日志文件(默认在 ~/.ros/log)和 /rosout 话题;
2. 日志级别分为 DEBUG、INFO、WARN、ERROR、FATAL,可以在启动时通过 --ros-args --log-level 设置,也可以针对单个节点设置;
3. 现场默认使用 INFO,排查问题时临时调高个别节点的级别,排查完要恢复,避免日志量暴涨。

二、日志写法建议
1. 关键状态变化(模式切换、任务开始/结束、故障进入/退出)必须有日志,并带上任务 ID、设备 ID 等上下文;
2. 高频回调(如每帧传感器数据)中不要打印 INFO 日志,可以使用节流(throttle)类日志宏;
3. 错误日志要写清“发生了什么、当前值是多少、期望值是多少”,不要只写“error”。

三、diagnostics 机制
1. diagnostic_updater 让节点按固定频率发布自身健康状态(OK、WARN、ERROR、STALE)到 /diagnostics;
2. diagnostic_aggregator 按子系统汇总,例如“传感器”“驱动”“导航”,便于上层统一显示;
3. 适合放进 diagnostics 的内容:传感器数据频率是否正常、驱动器温度、电池状态、定位置信度等。

四、与现场告警打通
1. 将汇总后的诊断状态转发到车队监控或运维平台,ERROR 级别触发告警;
2. 区分“需要立即处理”和“需要关注”的告警,避免告警过多被忽略;
3. 告警信息附带最近一段时间的日志片段或 rosbag 片段的位置,方便远程分析。

五、日志保留与回传
1. 设备本地存储有限,要设置日志轮转和保留天数;
2. 发生故障时自动保存故障前后一段时间的关键话题录包(环形缓冲录制),比事后补录有用得多;
3. 回传日志时注意网络带宽,优先回传摘要和故障片段。

欢迎分享你们在 ROS 2 项目中使用的日志采集和可视化方案。