调试环境搭建: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磁盘空间。

知识体系总览

下面这张图,是我自己总结的调试环境搭建的核心逻辑:

调试环境搭建核心逻辑 VS Code 配置 Rviz2 可视化 日志系统设置 插件安装 · launch.json配置 Path/Costmap/Obstacle显示 级别调整 · 过滤技巧 高效调试规划模块 三者协同工作,缺一不可

避坑指南

最后,分享几个我踩过的坑:

  • Rviz2卡死:如果你加载了太多topic,Rviz2会变得很慢。我一般只加载当前调试需要的topic,其他的关掉。
  • 日志时间戳不准:检查系统时间是否同步,特别是用Docker时。我曾经因为容器时间和宿主机差了8小时,排查问题对不上时间线。
  • VS Code远程开发:如果你在远程服务器上开发,记得用Remote-SSH插件,并且把ROS环境变量传到远程终端。

嗯,这套环境搭好之后,调试效率至少提升一倍。你试试看,有问题随时交流。

可可精品资料库