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 目录下,例如:
将 origincar_competition 功能包复制到当前目录后,返回工作空间根目录进行编译:
如果需要每次打开终端自动加载工作空间,可以将下面命令加入 ~/.bashrc:
启动步骤
本示例完整运行通常需要开启三个终端,分别用于启动底盘、启动视觉感知、启动综合控制节点。
第一步:启动底盘驱动
通过 SSH 连接 OriginCar,在第一个终端中输入如下指令,启动机器人底层驱动:
启动后可以检查底盘速度话题是否存在:
第二步:启动相机与图像显示
在第二个终端中输入如下指令,启动 USB 摄像头和图像显示相关节点:
也可以直接使用本功能包提供的 launch 文件,它内部会包含上述相机显示 launch:
Attation
start.launch.py 只包含 usb_websocket_display.launch.py 和综合控制节点。如果你的目标检测节点没有被其他 launch 启动,需要单独启动能够发布 origincar_competition 话题的视觉识别节点。
第三步:启动视觉识别节点
在第三个终端中启动目标检测节点,使其发布 ai_msgs/msg/PerceptionTargets 类型的识别结果。
识别结果话题名需要与控制程序一致:
可以使用如下命令检查话题是否存在:
检查话题类型:
正常情况下,话题类型应为:
第四步:启动综合控制节点
如果第二步没有使用 start.launch.py,可以单独运行节点:
推荐使用 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:
选择相机图像话题后,即可观察摄像头画面。如果目标检测节点提供了带框的调试图像,也建议订阅对应的 debug image 话题进行观察。
常用调试命令
查看当前话题:
查看速度输出:
查看巡线状态输出:
模拟二维码输入:
模拟开始遥控接管:
模拟结束遥控接管并恢复巡线:
运行效果
启动底盘、相机、视觉识别节点和综合控制节点后,车辆将根据视觉检测结果自动执行以下流程:
- 检测到引导线后开始巡线。
- 检测到锥桶靠近后进入避障。
- 避障结束后自动寻找引导线并恢复巡线。
- 检测到二维码后停车等待遥控或后续任务指令。
- 遥控结束后通过
/sign4return信号恢复自动巡线。
