跳转至

OriginCar 竞赛综合控制

Hint

操作环境及软硬件配置如下:

  • OriginCar X3版本机器人
  • PC / 机器人端:Ubuntu (≥20.04) + ROS2 (≥foxy)
  • 控制功能包:origincar_competition
  • 感知输入:目标检测结果话题 origincar_competition
  • 控制输出:速度控制话题 cmd_vel
  • 竞赛场景:黑色引导线巡线、锥桶避障、二维码识别后停车等待遥控接管

功能包/资料包下载链接:(可参考套件资料/资料链接下载)

场景说明

本例程用于 OriginCar 竞赛任务中的综合运动控制。功能包接收视觉感知节点发布的 ai_msgs/msg/PerceptionTargets 目标检测结果,根据检测到的引导线、锥桶和二维码信号控制小车完成巡线、避障和停车等待操作。

该功能包的核心节点为 complete_control_node,主要逻辑如下:

  • 识别到 line 目标时,根据线条中心与图像中心的偏差进行比例巡线控制。
  • 识别到 zt 锥桶目标且高度超过阈值时,进入锥桶避障状态。
  • 避障结束后,如果能重新检测到线条,则恢复巡线;如果暂时丢线,则先向前搜索,再执行恢复转向搜索。
  • 接收到二维码话题 /sign 后,根据二维码数字奇偶判断方向指令,并进入停车等待状态。
  • 接收到 /sign4return 遥控结束信号后,重新恢复巡线。
Attation

本功能包本身不负责训练模型,也不直接完成图像识别。它依赖外部视觉识别节点发布 ai_msgs/msg/PerceptionTargets 类型的目标检测结果。

目标类型需要与程序保持一致:

  • 引导线目标类型:line
  • 锥桶目标类型:zt

如果目标类型名称不一致,车辆将无法进入对应的巡线或避障逻辑。

功能包结构

压缩包中的主要文件结构如下:

origincar_competition/
├── CMakeLists.txt
├── package.xml
├── include/
   └── origincar_competition/
       └── origincar_competition.h
├── launch/
   └── start.launch.py
└── src/
    └── origincar_competition.cpp

其中:

  • origincar_competition.cpp:综合控制节点源码,包含巡线、避障、二维码停车和遥控接管逻辑。
  • origincar_competition.h:节点类、状态机枚举、二维码指令和话题接口定义。
  • start.launch.py:启动相机显示相关 launch,并启动 complete_control_node
  • CMakeLists.txt:C++ 节点编译配置。
  • package.xml:ROS2 功能包依赖描述文件。

通信话题说明

订阅话题

话题名 消息类型 作用
origincar_competition ai_msgs/msg/PerceptionTargets 接收视觉目标检测结果,用于识别线条和锥桶
/sign std_msgs/msg/String 接收二维码原始识别结果
/sign4return std_msgs/msg/Int32 接收遥控接管和遥控结束信号

发布话题

话题名 消息类型 作用
cmd_vel geometry_msgs/msg/Twist 发布底盘线速度和角速度
follower_line std_msgs/msg/Int32 发布当前是否处于巡线状态,1 表示巡线,0 表示非巡线
stop std_msgs/msg/Int32 发布停车信号
/sign_switch origincar_msg/msg/Sign 将二维码方向指令转发给上位机或其他节点

状态机说明

程序内部使用 RobotBehaviorState 枚举管理车辆行为状态:

状态 含义
LINE_FOLLOWING 正常巡线状态
CONE_AVOIDANCE_ACTIVE 正在执行锥桶避障
POST_AVOIDANCE_SEARCH_FORWARD 避障后短时间向前搜索引导线
POST_AVOIDANCE_RECOVERY_TURN 向前搜索失败后,根据上次避障方向恢复转向寻找线条
QR_CODE_WAITING 接收到二维码指令后停车等待

二维码与遥控逻辑

二维码数据通过 /sign 话题传入,消息类型为 std_msgs/msg/String。程序会尝试将字符串转换为整数:

  • 数值范围在 1 ~ 9999 内才认为有效。
  • 奇数二维码:发布 QR_CLOCKWISE = 3,表示顺时针方向。
  • 偶数二维码:发布 QR_ANTICLOCKWISE = 4,表示逆时针方向。
  • 接收到有效二维码后,车辆立即停车,并进入 QR_CODE_WAITING 状态。

遥控接管信号通过 /sign4return 话题传入,消息类型为 std_msgs/msg/Int32

数值 宏定义 作用
5 SIG_START_TELEOPERATION 开始遥控接管,自动巡线暂停
6 SIG_ENDING_TELEOPERATION 结束遥控接管,重新恢复巡线

参数说明

start.launch.py 中已经提供了常用参数,可以在启动时通过命令行覆盖。

参数名 默认值 作用
line_following_speed 0.65 巡线时的前进速度,单位 m/s
line_kp 0.003225 巡线比例控制系数,越大转向越灵敏
cone_avoidance_speed 0.4 锥桶避障时的基础前进速度,单位 m/s
cone_detection_y_threshold 130.0 锥桶高度触发阈值,单位 px
cone_critical_y_threshold 250.0 锥桶危险高度阈值,单位 px
cone_avoidance_steering_gain 0.5 锥桶避障和恢复转向的角速度增益
cone_lateral_offset_threshold 30.0 判断锥桶是否位于正前方的横向偏差阈值,单位 px
post_avoidance_forward_search_duration 0.5 避障后向前搜索引导线的持续时间,单位 s
post_avoidance_recovery_turn_duration 0.0 恢复转向搜索最大持续时间,0.0 表示不限制
recovery_turn_linear_speed_ratio 0.3 恢复搜索时的线速度比例
search_swing_frequency 0.3 无明确恢复方向时的摆动搜索频率
Attation

参数过大容易导致车辆转向过猛或冲出赛道。建议先降低速度,例如将 line_following_speed 设置为 0.25 ~ 0.35,确认识别稳定后再逐步提高速度。

编译步骤

将功能包放入 ROS2 工作空间的 src 目录下,例如:

cd ~/dev_ws/src

origincar_competition 功能包复制到当前目录后,返回工作空间根目录进行编译:

cd ~/dev_ws
colcon build --packages-select origincar_competition
source install/setup.bash

如果需要每次打开终端自动加载工作空间,可以将下面命令加入 ~/.bashrc

echo "source ~/dev_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

启动步骤

本示例完整运行通常需要开启三个终端,分别用于启动底盘、启动视觉感知、启动综合控制节点。

第一步:启动底盘驱动

通过 SSH 连接 OriginCar,在第一个终端中输入如下指令,启动机器人底层驱动:

ros2 launch origincar_base origincar_bringup.launch.py

启动后可以检查底盘速度话题是否存在:

ros2 topic list | grep cmd_vel

第二步:启动相机与图像显示

在第二个终端中输入如下指令,启动 USB 摄像头和图像显示相关节点:

ros2 launch origincar_bringup usb_websocket_display.launch.py

也可以直接使用本功能包提供的 launch 文件,它内部会包含上述相机显示 launch:

ros2 launch origincar_competition start.launch.py
Attation

start.launch.py 只包含 usb_websocket_display.launch.py 和综合控制节点。如果你的目标检测节点没有被其他 launch 启动,需要单独启动能够发布 origincar_competition 话题的视觉识别节点。

第三步:启动视觉识别节点

在第三个终端中启动目标检测节点,使其发布 ai_msgs/msg/PerceptionTargets 类型的识别结果。

识别结果话题名需要与控制程序一致:

origincar_competition

可以使用如下命令检查话题是否存在:

ros2 topic list | grep origincar_competition

检查话题类型:

ros2 topic info /origincar_competition

正常情况下,话题类型应为:

ai_msgs/msg/PerceptionTargets

第四步:启动综合控制节点

如果第二步没有使用 start.launch.py,可以单独运行节点:

ros2 run origincar_competition origincar_competition

推荐使用 launch 方式启动,并根据现场情况调整参数:

ros2 launch origincar_competition start.launch.py \
  line_following_speed:=0.35 \
  line_kp:=0.003225 \
  cone_detection_y_threshold:=130.0 \
  cone_critical_y_threshold:=250.0

启动成功后,终端会打印如下类似信息:

CompleteControl Node started.
Centered cone avoid bias: 1.0 (1=Left, -1=Right)
Post-Avoidance Forward Search: 0.50s

第五步:上位机可视化显示

为了便于观察识别结果和调试现场效果,可以在同一网络下的 PC 端启动 rqt_image_view

ros2 run rqt_image_view rqt_image_view

选择相机图像话题后,即可观察摄像头画面。如果目标检测节点提供了带框的调试图像,也建议订阅对应的 debug image 话题进行观察。

常用调试命令

查看当前话题:

ros2 topic list

查看速度输出:

ros2 topic echo /cmd_vel

查看巡线状态输出:

ros2 topic echo /follower_line

模拟二维码输入:

ros2 topic pub --once /sign std_msgs/msg/String "{data: '3'}"

模拟开始遥控接管:

ros2 topic pub --once /sign4return std_msgs/msg/Int32 "{data: 5}"

模拟结束遥控接管并恢复巡线:

ros2 topic pub --once /sign4return std_msgs/msg/Int32 "{data: 6}"

运行效果

启动底盘、相机、视觉识别节点和综合控制节点后,车辆将根据视觉检测结果自动执行以下流程:

  1. 检测到引导线后开始巡线。
  2. 检测到锥桶靠近后进入避障。
  3. 避障结束后自动寻找引导线并恢复巡线。
  4. 检测到二维码后停车等待遥控或后续任务指令。
  5. 遥控结束后通过 /sign4return 信号恢复自动巡线。

图片1