基于 ROS 2 Humble 和地平线 RDK X3(J5)平台的智能车自动驾驶系统,实现赛道循线、障碍物避让、二维码识别转向、视觉语言模型行人描述等功能。
┌─────────────────────────────────────────────────────────┐
│ 摄像头 (/jpeg_img) │
└─────────────────────┬───────────────────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│ YOLOv5 检测 │ │ ResNet │ │ 二维码扫描 │
│ (障碍物/锥桶) │ │ (赛道中心) │ │ (QR 转向) │
└──────┬───────┘ └────┬─────┘ └──────┬───────┘
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│ control_yolo │ │control_ │ │ control_ │
│ (避障控制) │ │resnet │ │ master │
│ │ │(循线控制) │ │ (仲裁/决策) │
└──────┬───────┘ └────┬─────┘ └──────┬───────┘
│ │ │
└──────────────┼─────────────┘
▼
┌──────────────┐
│ /cmd_vel │
│ (小车控制) │
└──────────────┘
- 停车信号(P 标志) → 紧急停止
- 二维码转向 → 执行调头/转向机动
- YOLO 避障 → 锥桶绕行(优先级高于循线)
- ResNet 循线 → 默认循线行驶
├── control/ # 控制核心(Python)
│ ├── control/
│ │ ├── control_master.py # 控制仲裁节点
│ │ ├── control_resnet.py # 循线控制节点(PID)
│ │ └── control_yolo.py # 避障控制节点(PID)
│ ├── launch/control.launch.py # 控制启动文件
│ └── setup.py
│
├── racing_track_detection_resnet_go/ # 赛道检测 - 前进方向
├── racing_track_detection_resnet_back/ # 赛道检测 - 后退方向
├── racing_track_detection_resnet_s/ # 赛道检测 - S 弯
├── racing_track_detection_resnet_n/ # 赛道检测 - N 弯
│
├── racing_obstacle_detection_yolo/ # YOLOv5 障碍物检测
│ └── config/yolov5sconfig.json # 模型配置(4类检测)
│
├── qrcode_1080p_720p/ # 二维码识别(pyzbar)
│ └── qrcode_1080p_720p/
│ └── qrcode_1080p_720p.py # QR 解码 → 方向指令
│
├── vision_language_model/ # 视觉语言模型
│ └── vision_language_model/
│ └── vision_language_model.py # 行人检测 + VLM 描述
│
├── racing_control/ # 备用控制(C++ 实现)
├── origincar/ # 小车底层驱动
│ ├── origincar_base/ # 底盘驱动、串口、IMU、EKF
│ ├── origincar_bringup/ # 启动与 WebSocket 显示
│ ├── origincar_description/ # URDF 模型描述
│ ├── origincar_msg/ # 自定义 ROS 消息
│ └── 3rdparty/ # 第三方依赖
│
├── read_image.py # 图像采集工具
└── 启动命令.md # 启动命令参考
四个方向的 ResNet 模型,通过地平线 DNN 推理框架检测赛道中心线,发布 PerceptionTargets 消息到不同话题:
| 包名 | 话题 | 用途 |
|---|---|---|
racing_track_detection_resnet_go |
/racing_track_center_detection_go |
前进方向赛道中心 |
racing_track_detection_resnet_back |
/racing_track_center_detection_back |
后退方向赛道中心 |
racing_track_detection_resnet_s |
/racing_track_center_detection_s |
S 弯赛道中心 |
racing_track_detection_resnet_n |
/racing_track_center_detection_n |
N 弯赛道中心 |
基于 YOLOv5s 的 4 类目标检测:
| 类别 | 用途 |
|---|---|
zt(锥桶) |
避障绕行 |
p(停车标志) |
紧急停车触发 |
qrcode(二维码) |
辅助避障方向判定 |
person(行人) |
触发视觉语言模型描述 |
使用 pyzbar 解码 QR 码内容,发布转向指令:
| QR 内容 | 指令 |
|---|---|
ClockWise |
右转(mode=3,S 弯模式) |
AntiClockWise |
左转(mode=4,N 弯模式) |
| 奇数数字 | 右转 |
| 偶数数字 | 左转 |
- 订阅
/cmd_vel_resnet(循线速度)和/cmd_vel_yolo(避障速度) - 优先级:停车 > 二维码机动 > YOLO 避障 > ResNet 循线
- 二维码机动:停车 3 tick → 倒车 + 原地旋转 37 tick → 恢复
- YOLO 超时机制:200ms 内未收到避障指令则切回循线
- 从赛道中心点计算横向误差
- PID 控制:
angular = error × kp_line(EMA 平滑,α=0.7) - 支持 go/back/s/n 四种赛道模式切换
- 避障时转向增益减半
- 根据锥桶位置判断绕行方向(左绕/右绕)
- 方向判定利用停车标志或二维码作为辅助参考
- 锁定方向持续 5 tick,避免抖动
- EMA 平滑 + PID 控制
- 检测到行人(confidence > 0.8)时,裁剪行人区域图片
- 调用 豆包视觉模型(doubao-vision-lite-32k) 生成行人描述
- 通过火山引擎 API 网关调用
read_image.py — 订阅 /jpeg_img 话题,按 J 键开始/暂停采集,每 5 帧保存一张,图片按 {PREFIX}_{序号}.jpg 命名保存到 image_save/ 目录。
| 依赖 | 说明 |
|---|---|
| 系统 | Ubuntu 22.04 + ROS 2 Humble |
| 硬件 | 地平线 RDK X3(J5),摄像头,串口底盘 |
| Python | 3.10+ |
| 推理框架 | 地平线 DNN Node(dnn_node) |
| 模型 | YOLOv5s、ResNet18(已转换为 .bin) |
pip install pyzbar openai==1.35.9 requests httpx==0.27.2 psutil flask
sudo apt-get install -y libzbar-devrclpy/rclcppai_msgs(地平线感知消息)geometry_msgs、sensor_msgs、std_msgshobot_codec(地平线编解码)dnn_node(地平线 DNN 推理)
cd ~/dev_ws
colcon build --packages-select control qrcode_1080p_720p vision_language_modelros2 launch origincar_bringup usb_websocket_display.launch.pyros2 launch control control.launch.py \
v_line:=0.8 \ # 循线线速度 (m/s)
kp_line:=0.006 \ # 循线 P 增益
v_avoid:=0.8 \ # 避障线速度 (m/s)
kp_avoid:=0.0035 \ # 避障 P 增益
y_zt:=155 \ # 锥桶触发 ROI 下边界
y_p:=435 \ # 停车标志触发 ROI 下边界
y_qrcode:=167 \ # 二维码方向判断参考线
line_bottom_y:=200 # 切换回退模式的障碍线底边阈值python3 read_image.py
# 按 J 键开始采集,再按 J 暂停,Ctrl+C 退出ros2 run teleop_twist_keyboard teleop_twist_keyboard| 参数 | 默认值 | 说明 |
|---|---|---|
v_line |
0.8 | 巡线速度,增大则更快但可能冲出赛道 |
kp_line |
0.006 | 巡线比例增益,增大则转向更激进 |
v_avoid |
0.8 | 避障速度 |
kp_avoid |
0.0035 | 避障比例增益 |
y_zt |
155 | 锥桶检测的有效 ROI 下边界(像素) |
y_p |
435 | 停车标志检测的有效 ROI 下边界(像素) |
y_qrcode |
167 | 二维码辅助避障方向判断的参考线 |
摄像头 → /jpeg_img (CompressedImage)
→ /nv12_img (NV12 共享内存,给 DNN 推理)
YOLOv5 → /racing_obstacle_detection (PerceptionTargets)
├── zt (锥桶)
├── p (停车标志)
├── qrcode (二维码)
└── person (行人)
ResNet → /racing_track_center_detection_{go,back,s,n} (PerceptionTargets)
二维码 → /qrcode_number (Int32)
控制 → /cmd_vel (Twist) → 底盘执行
默认: go 模式 (前进循线)
│
├─ 扫描到二维码 "ClockWise"/奇数 → s 模式 (S 弯)
├─ 扫描到二维码 "AntiClockWise"/偶数 → n 模式 (N 弯)
└─ 二维码后 8 秒 + 障碍线检测 → back 模式 (倒车)
各模块遵循其 package.xml 中声明的许可证,主要为 Apache License 2.0。
- 赛道检测: kairui.wang@horizon.ai
- 障碍物检测 & 控制: nuo.wu@horizon.ai / nuo.wu@horizon.cc
- 底盘驱动: ps-micro