3、日志查看工具:rqt_console图形化工具、ros2 run命令行日志、ros2 bag录制与回放、log4cxx配置文件
日志这东西,说白了就是系统的「黑匣子」。车在路上跑,传感器数据哗哗流,算法模块咔咔转,一旦出了故障,你总不能指望拍脑门猜问题吧?我个人的习惯是——先看日志,再看代码。日志不会骗人,它只会忠实地记录下每一行输出、每一个警告、每一条错误。
这一章,我们就来聊聊 Autoware 里最常用的几个日志查看工具。嗯,都是实战中高频使用的,你最好记下来。
3.1 rqt_console:图形化日志查看器
如果你用过 ROS 1,对 rqt_console 应该不陌生。它是个图形化工具,能实时显示所有节点的日志消息。我个人觉得,调试阶段用它最方便——不用开终端,不用 grep,一眼就能看到日志的等级、节点名、消息内容。
启动方式:
rqt_console
启动后,你会看到一个窗口,左边是日志列表,右边是过滤选项。你可以按节点名、日志等级(DEBUG、INFO、WARN、ERROR、FATAL)来筛选。
我在项目中遇到过一个问题:某个激光雷达节点偶尔报错,但频率不高,手动翻终端根本抓不到。后来我开着 rqt_console,把日志等级设为 WARN 以上,挂了一下午,终于抓到了那条一闪而过的 ERROR 日志。嗯,这种「大海捞针」的场景,rqt_console 就是你的捞针神器。
小技巧:你可以把 rqt_console 的日志保存到文件。点击窗口右上角的「保存」按钮,选个路径就行。这样即使你关掉了工具,日志也不会丢。
3.2 ros2 run 命令行日志
如果你不想开图形界面,或者你是在远程 SSH 连的车载电脑,那命令行日志就是你的主力。说白了,就是 ros2 run 启动节点时,终端里直接打印出来的那些信息。
默认情况下,ROS 2 的日志等级是 INFO。也就是说,INFO、WARN、ERROR、FATAL 级别的日志都会显示,DEBUG 级别的会被隐藏。为什么?因为 DEBUG 日志太多了,刷屏刷到你怀疑人生。
调整日志等级:
ros2 run <package_name> <node_name> --ros-args --log-level debug
把 debug 换成 warn、error 也行。我个人习惯在调试阶段用 debug,上线后切到 warn 或 error。
你想想看,如果某个模块出了问题,你直接调高日志等级,就能看到更详细的信息。我曾经有一次排查定位漂移问题,就是靠把 ndt_scan_matcher 节点的日志等级调到 DEBUG,才发现是点云匹配的迭代次数不够。这种细节,INFO 等级根本不会告诉你。
注意:DEBUG 日志会显著增加输出量,影响性能。不要在正式路测时长时间开启 DEBUG 等级,否则日志文件会膨胀得很快。
3.3 ros2 bag:录制与回放
ros2 bag 是 ROS 2 的「行车记录仪」。它能把话题数据录下来,然后离线回放。你想想看,路测时出了问题,车都开回来了,你总不能让人家再跑一遍吧?用 bag 录下来,回办公室慢慢分析,这才是正经做法。
录制所有话题:
ros2 bag record -a -o my_bag
录制指定话题:
ros2 bag record /tf /lidar_points /vehicle_status -o my_bag
回放 bag 文件:
ros2 bag play my_bag
我在项目中遇到过一种情况:某次路测,车辆在某个路口突然急刹车,但所有传感器看起来都正常。后来我把那一段 bag 回放出来,配合 rviz 可视化,才发现是地图上那个路口的 stop line 标注位置偏了 20 厘米。嗯,这种问题,没有 bag 回放,你根本复现不了。
小技巧:回放 bag 时,可以用 --rate 参数控制播放速度。比如 --rate 0.5 就是半速播放,方便你仔细观察每个时刻的数据。
3.4 log4cxx 配置文件
log4cxx 是 ROS 2 底层用的日志框架。说白了,它决定了日志怎么输出、输出到哪里、输出什么格式。Autoware 里很多核心模块(比如 planning、control)都用了 log4cxx 来管理日志。
配置文件通常是一个 XML 文件,放在 ~/.ros/ 或者 config/ 目录下。你可以通过修改它来控制日志的行为。
一个典型的 log4cxx 配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%c] %m%n"/>
</layout>
</appender>
<appender name="FileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/var/log/autoware/autoware.log"/>
<param name="MaxFileSize" value="10MB"/>
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%c] %m%n"/>
</layout>
</appender>
<root>
<priority value="info"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="FileAppender"/>
</root>
</log4j:configuration>
这个配置做了两件事:一是把日志打印到终端,二是把日志写入文件。文件按 10MB 滚动,最多保留 5 个历史文件。我个人习惯把日志文件路径设到 /var/log/autoware/ 下,方便统一管理。
注意:日志文件会占用磁盘空间。如果 MaxFileSize 设得太大,或者 MaxBackupIndex 设得太多,长时间运行后可能会把磁盘撑爆。我曾经见过一台车载电脑因为日志文件把根分区写满了,导致系统崩溃。嗯,从那以后,我每次部署都会检查日志配置。
3.5 本章小结
日志查看工具,说白了就是你的「第二双眼睛」。rqt_console 适合实时监控,命令行日志适合远程调试,ros2 bag 适合离线分析,log4cxx 配置则决定了日志的「后勤保障」。四者配合使用,你就能在故障发生时快速定位问题。
我个人建议你养成一个习惯:每次路测前,检查一下日志配置;路测中,开着 rqt_console 或者至少把日志等级调到 WARN;路测后,把 bag 文件归档好。这样,即使出了问题,你也有据可查。
一句话总结:日志不会骗你,但前提是你要会看、会录、会配。