{"code":1,"msg":"成功","time":"1789816292","data":{"title":"26电赛H题——车载平衡滚球运动控制系统","content":"# 26电赛H题——车载平衡滚球运动控制系统\r\n\r\n本文介绍 2026 年电赛 H 题“车载平衡滚球运动控制系统”的开源工程。工程最初基于两块立创·天猛星（MSPM0G3507）双板方案完成，赛后整体移植到星火1号（STM32F407ZG），作为 RT-Thread 的练习，并整理开源。\r\n\r\n## 开源仓库\r\n\r\n| **内容** | **地址** |\r\n| -------- | -------- |\r\n| 完整源码（车端 RT-Thread 工程 + K230 视觉程序 + 检测模型） | [26-H-TI-rtt](https:\/\/github.com\/LiquoriceHy\/26-H-TI-rtt) |\r\n| 赛题原文 PDF | 仓库 `docs\/H题_车载平衡滚球运动控制系统.pdf` |\r\n\r\n## 题目简述\r\n\r\n设计制作一辆载有平衡滚球运动控制装置的循线小车：小车沿黑色环形路线行驶，行驶过程中钢球需在带凹槽的摆杆内保持相对稳定。摆杆左端用铰链固定，右端连接角度控制机构，通过控制摆杆倾角使钢球稳定在指定位置。各项要求与分值如下所示：\r\n\r\n| **要求** | **内容** | **分值** |\r\n| -------- | -------- | -------- |\r\n| 1 | 安装摆球位置监测图传装置，实时显示钢球滚动画面并完整记录回放 | 6 |\r\n| 2 | A 点按键启动，沿黑线顺时针行驶一圈停回 A 点，计时停止并显示总时间；总时间 ≤ 20s，停车偏差 ≤ 2cm | 16 |\r\n| 3 | 小车静止，控制小球从摆杆中心 O 运行到 +5cm 处再折返，最终稳定在 −5cm 处附近；运行时间 ≤ 5s，最大误差绝对值 ≤ 1cm | 13 |\r\n| 4 | A 点出发，钢球置于中心 O，循线行驶通过 B 位（AB 段 ≤ 8s），行驶过程中钢球稳定在中点附近，误差绝对值 ≤ 1cm | 20 |\r\n| 5 | A 点出发整圈行驶，总时间 ≤ 30s，行驶过程中钢球稳定在中点附近，误差绝对值 ≤ 1cm | 20 |\r\n| 6 | A 点出发整圈行驶，总时间 ≤ 30s，钢球稳定在摆杆上任意指定位置附近，误差绝对值 ≤ 1cm | 20 |\r\n| 7 \/ 8 | 其他 \/ 设计报告 | 5 \/ 20 |\r\n\r\n方案上，循迹采用 8 路红外光电模块（山东赛区不指定使用红外灰度模块），钢球位置检测采用摄像头方案（K230），显示与计时使用板载 240×240 LCD。\r\n\r\n## 系统方案\r\n\r\n系统由“循迹小车 + 摆杆控制机构 + 视觉检测”三部分组成，视觉独立成一块主控：\r\n\r\n\r\n![屏幕截图 2026-09-17 214736.png](https:\/\/oss-club.rt-thread.org\/uploads\/20260917\/36c0fa1e51380b99a7dc6cec032114ef.png.webp)\r\n\r\n车端与视觉端经 USART2 连接，协议为每帧一行 ASCII 文本；车端全部实时控制以 10ms 为一个控制拍。\r\n\r\n![小车实物图.jpg](https:\/\/oss-club.rt-thread.org\/uploads\/20260917\/4e9cbd3fc9934cc73468d602f1b12a72.jpg.webp)\r\n\r\n## 硬件连接\r\n\r\n| **外设** | **接口 \/ 引脚** | **说明** |\r\n| -------- | --------------- | -------- |\r\n| 8 路红外灰度 | PG0 \/ PG2 \/ PG4 | 模拟开关地址线 S0\/S1\/S2，分时选通 8 路 |\r\n| K230 视觉模块 | USART2（PA2=TX，PA3=RX），115200 | ASCII 文本行协议 |\r\n| 摆杆云台驱动器 | USART3（PD8=TX，PD9=RX），115200 | Modbus RTU，JC 系列闭环驱动器 |\r\n| 直流减速电机 ×2 | PWM + 编码器设备 | 双轮差速驱动 |\r\n| 直流电机驱动板 | — | 轮趣科技成品驱动板 |\r\n| 板载 LCD | SPI（drv_lcd） | 240×240 RGB565，运行 LVGL |\r\n\r\n## 软件框架\r\n\r\n软件基于 RT-Thread 设备框架开发（编码器走 encoder 设备、云台走串口设备），业务代码集中在 `applications\/`，按功能拆成 `tracking`（控制环）、`dir`（循迹）、`ptz`（云台）、`ball`（控球）、`comm`（视觉通信）等模块，实时任务划分为控制、采样、UI 三个线程。\r\n\r\n## 思路一：小车循迹\r\n\r\n循迹行驶由灰度采样、循迹误差计算、转向 PID、轮速 PI 与停车线检测五个环节组成，数据流如下所示：\r\n\r\n```text\r\n8路灰度 ──> 加权误差 e ──> 转向控制 ──> 差速项 Δv ─┐\r\n                                                 ├──> 轮速PI ──> PWM\r\n停车横线 ──> 缓停请求 ────────────────────────────┘\r\n```\r\n\r\n### 循迹误差计算\r\n\r\n8 路红外对管沿车头横向排布，每路输出 0~255。误差计算对 8 路配置固定权重（±40~±10，符号对应偏离方向），只统计灰度值高于阈值的见线路，按读数做加权平均，得到连续的横向偏差 e：车在线中央时 e≈0，偏离越大幅值越大。相比取“最黑一路”的开关量判断，连续误差使 PID 在两次采样之间始终有平滑的修正量。\r\n\r\n丢线处理也在这一层：8 路全无见线时误差置零并做防抖计数，持续丢线超过阈值即置丢线标志，由控制环执行停车。\r\n\r\n### 转向控制\r\n\r\n转向环将横向偏差 e 映射为左右轮差速项 Δv。误差先经一阶低通滤波再参与计算；控制量采用分段比例（P）结构：误差较小时为线性 P 输出，进入深误差区（弯道）后切换到更陡的增益，保证弯中有足够的差速可用。转向环不含积分与微分项。\r\n\r\n### 轮速 PI 与增益调度\r\n\r\n转向环输出的差速项只作用于内侧轮：外侧轮保持基准速度，内侧轮按转向量降速，转向量限幅为基准速度的 0.85 倍。两轮各自做轮速 PI 闭环（编码器反馈）。\r\n\r\n> [!NOTE]\r\n> 轮速 PI 增益按工况调度：纯循迹与行驶+控球各用一套标称值；缓启\/缓停段（基速低于目标速度）再按基速比例衰减——低速时控制目标只有一两个编码器脉冲，反馈在 0\/1 之间量化跳变，标称增益下每拍输出大幅波动，会造成车轮极限环抖动。参数整定主要围绕过弯进行：直道上 PI 参数并不敏感，入弯丢线、出弯摆振主要与转向 D 和差速限幅相关。\r\n\r\n### 停车线识别与缓停\r\n\r\nA 点停车线是垂直于环路的横线，因此起步后约 1 秒内不启用停车线检测（启动时通过停车线不停），之后持续检测；命中横线特征即确认停车。\r\n\r\n确认后的停车由提前减速保证：纯循迹任务行驶到设定时刻（17s）后，目标速度逐档降到低速巡航；命中停车线时车速已经很低，直接刹停即可满足题 2 停车偏差 ≤ 2cm 的要求，计时同步冻结。（比赛时原来用的是编码器读取距离停车，测试场地的赛道长度和实验室的不一致，这是我们被扣分的地方，这里改成时间可调以便在比赛时有抢救的机会）\r\n\r\n## 思路二：摆杆控球\r\n\r\n控球链路由视觉检测、双层 PID 与云台驱动组成，K230 输出球心像素坐标，主控完成控球计算并经 Modbus RTU 控制摆杆角度。\r\n\r\n### 两层 PID 控制\r\n\r\n控球采用两层 PID：一层控制小球的速度，使小球停止；一层控制小球停止的位置。两层各自负责一个量，参数分别整定，便于调参。\r\n\r\n调参方式是先调小球的速度，让小球尽快停下来，然后调整控制小球停止的位置的pid。\r\n\r\n具体到实现，每个控制拍（10ms）完成如下计算：\r\n\r\n- 位置层：以几何校正后的中点 426 像素为基准，位置误差为目标与球心的像素差。比例项给出坡度趋势；积分项消除稳态偏差，并配带外清零、带内死区与积分限幅，防止长距离滚动把积分撑爆；\r\n- 速度层：球速由球心位置的环形历史缓冲差分得到（8 帧缓冲、跨 5 帧差分），速度阻尼项与球速反向；行驶类任务的参数组还按球速分档调度阻尼——低速阻尼小、高速阻尼大，分档之间线性过渡。球滚得越快，反向压坡度越强，这一层负责把球“停下来”；\r\n- 输出：两项合成后限幅，经几何反解换算为云台电机角度，经机械限位钳制后由 Modbus RTU 下发。控球关闭时摆杆回中位并复位参数；每次任务启动时重新初始化 PID，避免上次任务的积分与历史残留。\r\n\r\n### 图像的几何补偿\r\n\r\n**图像补偿**：摄像头固定俯拍摆杆，摆杆倾斜时滚道在画面中的投影被压缩，同一物理位置对应的像素坐标随杆角变化。每个控制拍按当前杆角计算滚道的投影缩放比，把球心像素折算回“摆杆水平时”的等效像素（以铰链侧画面边缘 800 像素处为基准），再交给位置层。补偿后，杆角变化不再表现为球的虚假位移（这个效果有限，最好的结构是镜头和水管一起运动）。\r\n\r\n### 视觉反馈与卡尔曼滤波\r\n\r\nK230 端的 YOLOv8 检测模型在板端可跑到约 57 FPS，检测帧率与 10ms 控制拍同一量级，球速由相邻帧差分得到时不会明显丢帧。K230 对球心做卡尔曼滤波：一方面平滑逐帧检测抖动，另一方面依据运动模型预测小球当前位置，补偿图像处理与串口传输带来的延迟，控制环使用预测后的球心坐标。\r\n\r\n主控与 K230 之间每帧只传输一行文本 `cx\\n`，`cx` 为球心 X 像素坐标（画面宽 800，左 0 右 799），无球时为 −1。主控侧行解析后供控制环读取；连续无球时冻结 PID 输出，保持最后有效角度。\r\n\r\n### 行驶中的控球\r\n\r\n当前车速下，行驶过程中小球基本保持不动，因此控球环与循迹环并行运行，未引入两环之间的耦合补偿。\r\n\r\n使小球产生明显运动的是停车瞬间的减速度。停车采用按剩余距离线性降速的缓停策略，停车过程小球保持稳定，这是行驶类任务（题 5 \/ 6）稳球的主要保障。\r\n\r\n## 题目实现步骤\r\n\r\n目前完成题 2 \/ 3 \/ 5 \/ 6 的核心问题。各项要求的题目原文与完成情况如下所示：\r\n\r\n| **要求** | **题目原文（摘要）** | **分值** | **完成情况** |\r\n| -------- | -------------------- | -------- | ------------ |\r\n| 2 | 小车置于 A 点，按键启动后沿黑线顺时针行驶一圈并停到 A 点，计时停止并显示行驶总时间；行驶总时间 ≤ 20s，停车偏差 ≤ 2cm | 16 |  已完成 |\r\n| 3 | 小车静止，控制小球从中心点 O 往 +5cm 处运行，到达后折返，再运行到 −5cm 处并稳定在该点附近；运行时间 ≤ 5s，最大误差绝对值 ≤ 1cm | 13 |  已完成 |\r\n| 4 | 小车置于 A 点，钢球置于中心点 O，按键启动后沿黑线顺时针行驶并通过 B 位置，AB 间行驶时间 ≤ 8s，行驶过程中钢球稳定在摆杆中点附近，误差绝对值 ≤ 1cm | 20 | — |\r\n| 5 | 小车置于 A 点，钢球置于中心点 O，按键启动后沿黑线顺时针行驶一圈并通过 A 位置，整圈行驶总时间 ≤ 30s，行驶过程中钢球稳定在摆杆中点附近，误差绝对值 ≤ 1cm | 20 |  已完成 |\r\n| 6 | 小车置于 A 点，钢球置于摆杆任意指定位置，按键启动后沿黑线顺时针行驶一圈并通过 A 位置，整圈行驶总时间 ≤ 30s，钢球稳定在指定位置附近，误差绝对值 ≤ 1cm | 20 |  已完成 |\r\n\r\n计时从任务启动开始，到停止或丢线冻结，精度 1ms，成绩与球位、摆杆角度同屏显示在板载 LCD 上。\r\n**第二题**\r\n![第一题](https:\/\/oss-club.rt-thread.org\/uploads\/20260917\/9cd80cbd282329438b8b525b282163b1.webp)\r\n**第三题**\r\n![第三题](https:\/\/oss-club.rt-thread.org\/uploads\/20260917\/c3c4a44771a8308ad3f09dd85430b931.webp)\r\n**第五题**\r\n![第四题](https:\/\/oss-club.rt-thread.org\/uploads\/20260918\/77f44fe69a65b3af420746e091250fa9.webp)\r\n**第六题**\r\n![第六题](https:\/\/oss-club.rt-thread.org\/uploads\/20260918\/edc2f76c3343f38118d0adcba66f557d.webp)\r\n\r\n因为电赛的实验室没开，借的智能车的实验室，赛道下面有碎瓷砖，抖动会比较大。","updatetime":"2026-09-18 16:57:40","author":"LiquoriceHy"}}