1. Autoware调试基础:调试环境搭建、日志系统解析、常用调试工具介绍

各位同学好,我是老张。在自动驾驶这行摸爬滚打了七八年,踩过的坑比走过的路还多。今天咱们聊聊Autoware调试的基础——这部分看似简单,但说实话,我见过太多人卡在环境搭建这一步就放弃了。

调试环境搭不好,后面全是白费功夫。你想想看,连日志都打不出来,你怎么定位问题?

1.1 调试环境搭建

先说环境。Autoware的调试环境,我建议你分三步走。

1.1.1 基础依赖安装

我个人习惯用Ubuntu 20.04 + ROS Galactic。为什么选这个组合?因为稳定。我在项目中遇到过用最新版Ubuntu结果驱动不兼容的情况,折腾了两天才搞定。

# 安装ROS Galactic
sudo apt update
sudo apt install ros-galactic-desktop

# 安装Autoware依赖
sudo apt install python3-pip
pip3 install -r requirements.txt
注意: 千万别跳过依赖检查。我曾经图省事,直接跑编译,结果报错报了一屏幕。老老实实跑一遍 rosdep install 能省你半天时间。

1.1.2 工作空间配置

工作空间我建议用colcon来管理。为什么?因为catkin_make在大型项目里编译太慢了。

mkdir -p autoware_ws/src
cd autoware_ws
colcon build --symlink-install

这里有个小技巧:加上 --symlink-install 参数,这样你修改Python脚本后不用重新编译。嗯,这个我吃了不少亏才发现的。

1.1.3 调试模式编译

调试嘛,肯定要开Debug模式。不然你连个堆栈信息都看不到。

colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug
我的习惯: 平时用Release模式跑,出问题了切Debug重新编译。别一直开着Debug,那编译出来的二进制文件大得吓人。

1.2 日志系统解析

日志是调试的眼睛。Autoware的日志系统基于ROS 2的rclcpp日志,但做了不少封装。

1.2.1 日志级别

级别 宏定义 使用场景
DEBUG RCLCPP_DEBUG 开发阶段,打印变量值
INFO RCLCPP_INFO 正常运行时,打印状态信息
WARN RCLCPP_WARN 非致命异常,比如传感器短暂掉线
ERROR RCLCPP_ERROR 功能异常,但系统还能跑
FATAL RCLCPP_FATAL 系统崩溃,必须停机

说白了,INFO和WARN用得最多。DEBUG我一般只在定位具体bug时才开,不然日志刷屏刷得你眼花。

1.2.2 日志配置

Autoware的日志配置文件在 ~/.ros/autoware_logging.yaml。你可以在这里控制每个节点的日志级别。

# 示例配置
logging:
  node_name: "/perception/object_recognition/detection/cluster_based"
  level: "DEBUG"
  file: "/tmp/autoware_debug.log"

关键点: 日志文件默认存在 ~/.ros/log/ 下。我建议你改到 /tmp/ 或者单独挂个盘,不然日志文件能把你的home目录塞爆。别问我怎么知道的...

1.2.3 日志分析技巧

拿到日志后,别傻乎乎地从头看到尾。我一般这么干:

  • 先看时间戳:找到第一个异常时间点
  • 再看节点名:哪个节点报的错?
  • 最后看堆栈:错误发生在哪一行代码

举个例子,有一次车在路口突然急刹。我翻日志发现 planning/motion_velocity_optimizer 节点在某个时间点输出了 WARN: No feasible trajectory found。顺着这个线索,我找到了参数配置问题。

1.3 常用调试工具介绍

工具不在多,在于精。我常用的就这几个。

1.3.1 rviz2 - 可视化调试

rviz2是Autoware调试的标配。你可以在上面看到激光雷达点云、摄像头图像、规划轨迹等等。

我个人习惯把rviz2的配置保存下来:

# 保存当前配置
File -> Save Config As -> my_debug_config.rviz

# 下次直接加载
rviz2 -d my_debug_config.rviz
小技巧: 调试感知模块时,我一般同时打开PointCloud2和MarkerArray两个显示。一个看原始数据,一个看处理结果。对比着看,问题一目了然。

1.3.2 ros2 topic - 话题监控

命令行工具虽然简陋,但关键时刻比GUI靠谱。

# 查看所有话题
ros2 topic list

# 查看话题频率
ros2 topic hz /perception/object_recognition/objects

# 查看话题内容
ros2 topic echo /planning/trajectory

我曾经用 ros2 topic hz 发现某个话题频率从10Hz掉到了2Hz,顺藤摸瓜找到了CPU过载的问题。

1.3.3 ros2 bag - 数据回放

这个工具太重要了。路测数据录下来,回放调试,比在路上反复跑省事多了。

# 录制
ros2 bag record -a -o my_bag

# 回放
ros2 bag play my_bag

# 查看bag信息
ros2 bag info my_bag
注意: 录制时别用 -a 参数录所有话题,那文件大得吓人。我一般只录需要的几个话题,比如 /sensing/lidar/points 和 /perception/object_recognition/objects。

1.3.4 gdb - 崩溃定位

当Autoware直接崩溃时,gdb是你的救命稻草。

# 启动带调试的节点
gdb --args ros2 run my_package my_node

# 在gdb中运行
(gdb) run

# 崩溃后查看堆栈
(gdb) bt

说实话,gdb用起来有点麻烦。但遇到段错误(Segmentation Fault)时,没有它你根本不知道代码死在哪。

1.4 知识体系总览

下面这张图是我自己总结的调试知识体系,你照着这个框架学,不会走偏。

Autoware调试知识体系 调试环境搭建 日志系统解析 常用调试工具 基础依赖安装 工作空间配置 调试模式编译 日志级别(DEBUG~FATAL) 日志配置文件 日志分析技巧 rviz2可视化 ros2 topic监控 ros2 bag回放 gdb崩溃定位 调试核心思路:先看日志 → 定位节点 → 回放数据 → 修复验证 环境是基础,日志是线索,工具是手段

好了,这一章的内容就这些。环境搭好了,日志会看了,工具会用了一一剩下的就是多练。调试这东西,说白了就是经验活。你踩的坑越多,下次遇到问题就越淡定。

可可精品资料库