Skip to content

Repository files navigation

智能车自动驾驶系统 (Autonomous Racing Car)

基于 ROS 2 Humble 和地平线 RDK X3(J5)平台的智能车自动驾驶系统,实现赛道循线、障碍物避让、二维码识别转向、视觉语言模型行人描述等功能。

系统架构

┌─────────────────────────────────────────────────────────┐
│                     摄像头 (/jpeg_img)                     │
└─────────────────────┬───────────────────────────────────┘
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│ YOLOv5 检测  │ │ ResNet   │ │ 二维码扫描    │
│ (障碍物/锥桶) │ │ (赛道中心) │ │ (QR 转向)    │
└──────┬───────┘ └────┬─────┘ └──────┬───────┘
       │              │             │
       ▼              ▼             ▼
┌──────────────┐ ┌──────────┐ ┌──────────────┐
│ control_yolo │ │control_  │ │  control_    │
│ (避障控制)   │ │resnet    │ │  master      │
│              │ │(循线控制) │ │  (仲裁/决策)  │
└──────┬───────┘ └────┬─────┘ └──────┬───────┘
       │              │             │
       └──────────────┼─────────────┘
                      ▼
               ┌──────────────┐
               │   /cmd_vel   │
               │  (小车控制)   │
               └──────────────┘

控制仲裁优先级

  1. 停车信号(P 标志) → 紧急停止
  2. 二维码转向 → 执行调头/转向机动
  3. YOLO 避障 → 锥桶绕行(优先级高于循线)
  4. 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                             # 启动命令参考

功能模块详解

1. 赛道检测(ResNet)

四个方向的 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 弯赛道中心

2. 障碍物检测(YOLOv5)

基于 YOLOv5s 的 4 类目标检测:

类别 用途
zt(锥桶) 避障绕行
p(停车标志) 紧急停车触发
qrcode(二维码) 辅助避障方向判定
person(行人) 触发视觉语言模型描述

3. 二维码识别

使用 pyzbar 解码 QR 码内容,发布转向指令:

QR 内容 指令
ClockWise 右转(mode=3,S 弯模式)
AntiClockWise 左转(mode=4,N 弯模式)
奇数数字 右转
偶数数字 左转

4. 控制模块

control_master(仲裁节点)

  • 订阅 /cmd_vel_resnet(循线速度)和 /cmd_vel_yolo(避障速度)
  • 优先级:停车 > 二维码机动 > YOLO 避障 > ResNet 循线
  • 二维码机动:停车 3 tick → 倒车 + 原地旋转 37 tick → 恢复
  • YOLO 超时机制:200ms 内未收到避障指令则切回循线

control_resnet(循线控制)

  • 从赛道中心点计算横向误差
  • PID 控制:angular = error × kp_line(EMA 平滑,α=0.7)
  • 支持 go/back/s/n 四种赛道模式切换
  • 避障时转向增益减半

control_yolo(避障控制)

  • 根据锥桶位置判断绕行方向(左绕/右绕)
  • 方向判定利用停车标志或二维码作为辅助参考
  • 锁定方向持续 5 tick,避免抖动
  • EMA 平滑 + PID 控制

5. 视觉语言模型

  • 检测到行人(confidence > 0.8)时,裁剪行人区域图片
  • 调用 豆包视觉模型(doubao-vision-lite-32k) 生成行人描述
  • 通过火山引擎 API 网关调用

6. 图像采集工具

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

Python 依赖

pip install pyzbar openai==1.35.9 requests httpx==0.27.2 psutil flask
sudo apt-get install -y libzbar-dev

ROS 2 依赖

  • rclpy / rclcpp
  • ai_msgs(地平线感知消息)
  • geometry_msgssensor_msgsstd_msgs
  • hobot_codec(地平线编解码)
  • dnn_node(地平线 DNN 推理)

快速开始

1. 构建

cd ~/dev_ws
colcon build --packages-select control qrcode_1080p_720p vision_language_model

2. 启动底盘驱动

ros2 launch origincar_bringup usb_websocket_display.launch.py

3. 启动控制(带参数)

ros2 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   # 切换回退模式的障碍线底边阈值

4. 采集图像

python3 read_image.py
# 按 J 键开始采集,再按 J 暂停,Ctrl+C 退出

5. 键盘遥控(调试用)

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。

维护者

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors