调试环境搭建:VS Code配置、Rviz2可视化、日志系统设置
说实话,调试环境搭得好不好,直接决定了你后面排查问题的效率。我见过太多同事,花了一周时间调一个路径规划的问题,结果发现是日志没开全,或者可视化窗口里少加载了一个topic。嗯,今天我们就来把这套环境彻底捋顺。
VS Code 配置:让代码看得更清楚
我个人习惯用VS Code做Autoware的开发,原因很简单——插件生态好,调试起来顺手。但光装个编辑器可不够,你得把它武装起来。
必备插件清单
| 插件名称 | 用途 | 我的经验 |
|---|---|---|
| C/C++ (ms-vscode.cpptools) | 代码补全、跳转、调试 | 记得装IntelliSense模式,不然跳转会卡 |
| ROS (ms-iot.vscode-ros) | ROS工作区识别、launch文件高亮 | 这个插件能自动识别你的catkin_ws |
| Python (ms-python.python) | Python脚本调试 | 规划模块里很多工具脚本是Python写的 |
| YAML (redhat.vscode-yaml) | 参数文件语法检查 | 我曾经因为YAML缩进问题,找了半天bug |
launch.json 配置示例
调试规划模块时,我一般这样配launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Planning Module",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/install/planning/lib/planning/planning_node",
"args": ["__node:=planning_node"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{"name": "ROS_DOMAIN_ID", "value": "0"}
],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build_planning"
}
]
}
小技巧:如果你用Docker开发,记得把容器的ROS_DOMAIN_ID和宿主机保持一致,不然节点之间通信不上。我踩过这个坑,折腾了一下午。
Rviz2 可视化:让数据说话
Rviz2是Autoware调试的“眼睛”。你想想看,路径规划得好不好,光看log是看不出来的,得在可视化窗口里看轨迹、看障碍物、看代价地图。
我常用的Rviz2配置
每次调试前,我会加载一个专用的.rviz配置文件。这里分享几个关键显示项:
- Path显示:加载
/planning/scenario_planning/trajectory,用绿色线条显示规划轨迹 - Costmap显示:加载
/planning/costmap_generator/costmap,用热力图显示代价分布 - Obstacle显示:加载
/perception/object_recognition/objects,用红色框显示障碍物 - Pose显示:加载
/localization/kinematic_state,显示当前车辆位姿
核心建议:把常用的显示配置保存成
planning_debug.rviz文件,放在项目根目录下。每次启动时用rviz2 -d planning_debug.rviz加载,省得每次重新拖拽。
可视化调试实战
我记得有一次,车辆在路口总是急刹车。看代码看了半天没发现问题,后来打开Rviz2一看——代价地图上有个异常的红色高亮区域,原来是某个障碍物被误检测了。说白了,可视化能帮你发现代码里看不到的问题。
日志系统设置:别让信息淹没你
Autoware的日志系统基于rclcpp,默认输出级别是INFO。但调试规划模块时,INFO级别往往不够用。我建议你这样配置:
日志级别调整
# 在launch文件中设置
<node pkg="planning" exec="planning_node">
<param name="log_level" value="debug"/>
<!-- 或者通过环境变量 -->
<env name="RCUTILS_CONSOLE_OUTPUT_FORMAT" value="[{severity}] [{time}]: {message}"/>
<env name="RCUTILS_CONSOLE_VERBOSITY" value="DEBUG"/>
</node>
日志过滤技巧
DEBUG级别下信息量很大,怎么快速找到关键信息?我一般这样做:
- 按模块过滤:用
grep "behavior_planner"只看行为规划器的日志 - 按时间戳过滤:用
grep "2024-03-15 14:23"定位特定时刻 - 按严重级别过滤:用
grep "ERROR\|WARN"快速抓取异常
注意:生产环境中不要开DEBUG级别,否则日志文件会迅速膨胀。我见过有人开着DEBUG跑了一整天,结果日志文件占了20GB磁盘空间。
知识体系总览
下面这张图,是我自己总结的调试环境搭建的核心逻辑:
避坑指南
最后,分享几个我踩过的坑:
- Rviz2卡死:如果你加载了太多topic,Rviz2会变得很慢。我一般只加载当前调试需要的topic,其他的关掉。
- 日志时间戳不准:检查系统时间是否同步,特别是用Docker时。我曾经因为容器时间和宿主机差了8小时,排查问题对不上时间线。
- VS Code远程开发:如果你在远程服务器上开发,记得用Remote-SSH插件,并且把ROS环境变量传到远程终端。
嗯,这套环境搭好之后,调试效率至少提升一倍。你试试看,有问题随时交流。