ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

电赛控制类题目核心解析:从“小钢球”看感知-决策-执行闭环系统设计

电赛控制类题目核心解析:从“小钢球”看感知-决策-执行闭环系统设计 这类问题最值得先看的不是“小钢球”本身而是它背后代表的电赛控制类题目的通用出题思路和准备逻辑。很多人一看到“小钢球”就去找机械结构、PID调参但更关键的是理解题目如何把一个物理实体小球抽象成一系列传感器测量、算法处理、执行器控制的闭环任务。如果你在准备2026年电赛尤其是控制类H题、G题等这篇文章会帮你拆解“小钢球”这类元素可能出现的场景、需要提前储备的核心能力以及从零到一的备赛实操路径。我建议先别急着搜具体题目而是把“小钢球”当成一个信号与系统的综合载体。电赛控制题的核心是“测、算、控”测量小球状态位置、速度、角度通过算法PID、滤波、状态估计计算控制量再驱动执行器电机、舵机、电磁铁去影响小球。题目千变万化但拆解问题的框架和需要练手的模块是相对固定的。1. 先拆解“小钢球”可能出现的三类典型场景“小钢球”在电赛里很少是孤立出现的它通常被嵌入一个需要感知、决策、执行的物理系统中。根据历年题目和常见赛题套路你可以从下面三个方向去准备。1.1 场景一位置跟踪与定点控制——最基础的“稳、准、快”这是最经典的入门题。给你一个平台比如平板、轨道、摆杆上面放个小球要求你控制平台倾斜或移动让小球停在指定位置或者沿着指定轨迹运动。典型题目联想类似2024年电赛H题小球摆动、2023年H题视觉跟踪的变体。核心是位置伺服。你需要练什么测量怎么知道小球在哪常用方案有摄像头OpenMV/OpenART处理图像用颜色识别或二维码识别小球中心坐标。这是目前的主流要练图像二值化、轮廓查找、坐标映射。线性CCD/激光测距在轨道一侧布置测量小球遮挡位置。精度高但安装调试麻烦。电阻式/电容式触摸板小球作为导体触发不同位置。简单但分辨率低。控制知道了位置怎么驱动平台执行器最常用的是舵机控制平台角度或步进/直流电机控制平台位移。算法PID是必考项。这里不是背公式而是要能在板子上写出来、调出来。位置式PID用于定点增量式PID用于速度控制。要理解P快速响应、I消除静差、D抑制振荡的实际物理效果。调试怎么知道调好了要有自己的判断标准比如“小球从任意位置到目标点稳定时间小于3秒超调量小于5%稳态误差小于2毫米”。1.2 场景二轨迹规划与路径跟踪——从“静态”到“动态”比定点更难一步。要求小球不是停在某处而是按照给定轨迹比如画圆、走“8”字、走斜坡运动。典型题目联想2017年M题滚球控制系统的进阶版或者2026年可能出的“小球迷宫”、“小球绘图”题。你需要练什么上位机规划轨迹一组目标位置点通常由电脑生成通过串口发给下位机STM32等。要练串口通信协议自定义帧头帧尾CRC校验确保数据不丢不乱。下位机跟踪单片机收到轨迹点后需要以一定频率比如50Hz依次作为PID的目标值。这里的关键是速度前瞻不能等到小球到了A点才把B点设为目标要有提前量否则会剧烈抖动。抗干扰与滤波小球在运动中会有惯性、抖动。传感器数据特别是摄像头会有噪声。必须加数字滤波器比如一阶低通滤波简单有效或卡尔曼滤波高大上但电赛里能用好就是亮点。不要一上来就调PID参数先确保你读到的位置数据是平滑、可靠的。1.3 场景三多球协同或复杂交互——拉开差距的“系统思维”这是可能出现在H题或G题决赛阶段的难点。比如控制两个小球避免碰撞、让小球撞击目标物、或者小球作为一个“笔尖”完成复杂绘图。典型题目联想可以看作是前两个场景的叠加但引入了多目标、动力学、任务调度。你需要练什么多传感器融合可能同时需要摄像头看全局局部再用一个传感器精确定位。要处理数据同步和坐标系统一。状态机设计程序不能是简单的主循环。必须用状态机比如switch-case或函数指针来管理不同任务阶段初始化、寻球、跟踪、绘图、结束。这是让代码不乱的核心。控制算法进阶PID可能不够用了。可能需要模糊PID适应不同速度区间或者更高级的**模型预测控制MPC**思路虽然电赛里完整实现难但可以有这个意识。重点是理解“为什么这里用PID调不好”——可能是因为系统非线性太强或者延迟太大。2. 备赛环境与核心模块的实战准备清单知道了可能考什么接下来就是准备“弹药”。电赛不是从看到题目那一刻才开始大量的基础工作必须提前做做成一个个可复用的模块。2.1 硬件平台选择与最小系统搭建不要纠结于用最贵的板子要用你最熟、资料最多的。主控STM32系列如F103、F407、H743是绝对主流。原因很简单资料多、库函数HAL/LL成熟、社区问题好查。如果你学校实验室或自己常用的是ESP32、K210带AI加速也可以但要确保它的外设PWM、定时器、ADC、串口和计算能力能满足控制频率要求至少100Hz以上。核心外设必须提前调通定时器用于产生精确的PWM波控制电机/舵机以及为PID控制、数据采样提供稳定的时间基准。把定时器中断配熟。PWM输出驱动舵机50Hz和直流电机频率更高。会计算ARR和PSC寄存器设置占空比。ADC采样如果用到电位器、某些距离传感器需要ADC。要会校准、滤波。串口UART重中之重。用于调试打印printf重定向、和上位机通信、和视觉模块通信。必须稳定。准备好自己的串口收发函数带环形缓冲区。供电与电机驱动单独准备一个电机驱动模块如TB6612、DRV8833、L298N。单片机IO口绝不能直接驱动电机电源要分开电机用大电流电源如18650电池组单片机用稳压模块如LM2596。这是稳定性的基础。2.2 传感器与执行器模块化测试把每个可能用到的部件单独写一个.c/.h文件封装成函数。比如Motor.cServo.cEncoder.cCamera.c。摄像头模块OpenMV/OpenART测试目标上电能识别红色小球并通过串口稳定输出其中心坐标(x,y)。关键步骤在IDE里写识别代码找色块、算重心。设置串口输出格式例如$123,456\n帧头$x和y用逗号隔开帧尾\n。在单片机端写一个串口协议解析函数能稳定地从数据流中提取出123和456这两个整数。避坑摄像头帧率FPS直接影响控制频率。如果识别算法太复杂导致FPS很低如低于30控制效果会差。先保证识别速度。舵机/电机模块测试目标给一个目标角度如45度或速度舵机/电机能平稳、准确地转动到位。关键步骤校准中位和极限位置。对于舵机500-2500us的PWM脉宽对应0-180度但不同舵机有差异需要实测。编写Set_Angle(angle)或Set_Speed(speed)函数内部完成PWM占空比计算。避坑电机启动瞬间电流大可能引起电源电压跌落导致单片机复位。要在电源输入端加**大电容如470uF以上**缓冲。2.3 算法模块的“白盒”实现与调试PID等算法不要只会调用库。要自己手写一遍并留出丰富的调试接口。手写PID函数typedef struct { float Kp, Ki, Kd; // PID参数 float integral; // 积分项 float prev_error; // 上次误差 float integral_limit; // 积分限幅 float output_limit; // 输出限幅 } PID_Controller; float PID_Calculate(PID_Controller *pid, float setpoint, float measurement, float dt) { float error setpoint - measurement; pid-integral error * dt; // 积分限幅防止饱和 if (pid-integral pid-integral_limit) pid-integral pid-integral_limit; if (pid-integral -pid-integral_limit) pid-integral -pid-integral_limit; float derivative (error - pid-prev_error) / dt; pid-prev_error error; float output pid-Kp * error pid-Ki * pid-integral pid-Kd * derivative; // 输出限幅 if (output pid-output_limit) output pid-output_limit; if (output -pid-output_limit) output -pid-output_limit; return output; }如何调试这个PID先P后I再D先把Ki和Kd设为0调Kp让系统能快速响应但有稳态误差或振荡。加Ki消静差慢慢增加Ki观察稳态误差是否减小注意积分饱和输出卡在极限值不动。加Kd抑振荡如果系统振荡加入Kd但D项对噪声敏感必须先滤波。关键技巧把setpointmeasurementoutput这三个变量通过串口实时发送到电脑上位机如SerialChart、匿名上位机、自己写的Python脚本画成曲线看。调参不看曲线就是瞎调。3. 从零构建一个“小球平衡”demo的完整流程理论说了很多我们用一个最小化的“小球平衡”任务串起所有环节。假设任务用摄像头识别小球控制舵机转动平板让小球保持在平板中心。3.1 第一步硬件连接与基础通信测试这个阶段的目标是“所有部件能单独说话”。搭建机械平台一个舵机作为转轴连接一块平板亚克力板或轻木板平板要有围栏防止小球掉落。舵机安装要稳固。连接电路单片机STM32的PWM引脚 - 舵机信号线。单片机串口1USART1的TX/RX - USB转TTL模块接电脑用于调试打印。单片机串口2USART2或3的RX - 摄像头模块的TX。注意共地单片机、舵机电源、摄像头电源地线GND必须接在一起。分步测试测试1舵机写程序让舵机在-30度、0度、30度三个位置来回转动。肉眼观察是否顺畅、准确。测试2摄像头用USB线直接连摄像头到电脑用官方IDE看识别效果调整颜色阈值确保在比赛环境光照下也能稳定识别小球。测试3串口通信让摄像头通过串口输出坐标用单片机接收并原样转发给电脑串口助手。确保坐标数据能完整、无误地传到单片机。3.2 第二步数据获取与滤波处理拿到摄像头数据后不能直接扔给PID。坐标转换摄像头读到的(x, y)是像素坐标比如0-320。你需要映射到平板的物理坐标比如-150mm到150mm。做一个简单的线性映射函数。数据滤波图像识别难免有抖动或偶尔丢帧。// 一阶低通滤波示例 float filtered_x 0; // 滤波后的x坐标 float alpha 0.3; // 滤波系数0alpha1越小越平滑但延迟越大 void update_filter(float new_x) { filtered_x alpha * new_x (1 - alpha) * filtered_x; }每次收到新的x坐标调用update_filter后续PID计算使用filtered_x。异常值处理如果某次读到的坐标突然为0或超出范围很可能是识别失败。这时应该保持上一次的有效坐标或者使用预测值而不是把这个错误值送给控制器。3.3 第三步闭环控制程序整合这是最核心的一步把传感器、控制器、执行器连起来。定时中断服务程序在定时器中断比如1ms或10ms触发一次里执行控制循环。这是保证控制周期固定的关键。// 在定时器中断函数中 if (control_flag 1) { // 控制使能标志 // 1. 读取最新滤波后的球位置 ball_position_x // 2. 计算误差 error target_position - ball_position_x // 3. 调用PID计算 output PID_Calculate(pid, target_position, ball_position_x, dt) // 4. 将output转换为舵机角度 servo_angle output * scale_factor // 5. 驱动舵机 Set_Servo_Angle(servo_angle) control_flag 0; // 等待下次中断置位 }主循环主循环里只做非实时性工作比如检查串口是否有新的目标指令。更新调试数据并发送。处理按键或状态切换。将control_flag置1通知中断函数可以进行下一次控制计算。3.4 第四步调试与性能评估系统能跑起来只是开始调好才是目的。上位机波形观察如前所述将目标值、球位置、控制器输出三个数据打包通过串口发送到电脑用绘图软件观察。理想曲线球位置曲线应快速、平滑地跟随目标值曲线超调小稳态误差小。振荡说明P太大或D太小。响应慢说明P太小。静差大说明I不够。改变测试条件把小球放在平板不同初始位置。轻轻敲击平板施加干扰。观察系统能否自己稳定回来。这是鲁棒性的测试。量化指标记录下“从最边缘回到中心稳定时间多少秒”、“最大超调量多少毫米”、“稳态误差多少毫米”。这些数据就是你报告里的“性能指标”。4. 备赛过程中必须避开的五个“天坑”根据带赛和评审的经验很多队伍不是输在想法而是输在这些基础环节。4.1 坑一电源问题——一切玄学问题的根源现象程序偶尔跑飞、舵机抽动、摄像头重启、测量值跳动。排查第一个怀疑对象就是电源。用万用表量单片机供电引脚电压在电机启动瞬间看电压是否跌落如从5V跌到4.5V以下。摸一下稳压芯片如7805、LM2596是否烫手。解决电机电源与逻辑电源分离用两组电池或两个独立的稳压模块。加大滤波电容在电机驱动模块的电源输入端并联多个大容量电解电容如1000uF和若干小容量瓷片电容0.1uF吸收瞬时大电流。走线要粗电机供电的导线要足够粗比如AWG18以上减少线损。4.2 坑二软件架构混乱——第三天改不动代码现象功能加着加着就冲突了改一个BUG引出三个新BUG最后只能通宵重写。解决开赛第一天就要定好软件框架。模块化每个硬件电机、传感器对应一个.c/.h文件。状态机主程序用switch-case清晰划分“初始化、校准、就绪、运行、暂停、错误”等状态。全局变量管理定义清晰的结构体来存放系统状态避免散落各处的全局变量。版本管理哪怕只用U盘备份也要每天、每完成一个功能就备份一个版本命名为Project_DAY1_FINAL、Project_DAY2_WITH_PID。4.3 坑三传感器数据不靠谱——垃圾进垃圾出现象PID参数怎么调都调不好系统表现随机。排查先别调PID把传感器原始数据打印出来画图看。摄像头数据是否跳动剧烈——加滤波。编码器计数是否偶尔反向跳变——检查硬件连接软件上做四倍频和计数边界处理。电压测量是否受干扰——ADC采样多次取平均并做软件滤波。原则相信你的控制器之前先百分之百相信你的传感器数据。花半天时间把传感器数据调稳比花两天调PID参数值得多。4.4 坑四盲目追求复杂算法——基础不牢地动山摇现象一上来就想用卡尔曼滤波、模糊控制、神经网络结果连最基本的PID都没调明白。建议电赛获奖方案绝大多数核心控制部分就是一个精心调试的PID加上稳健的滤波和逻辑处理。高级算法是锦上添花不是雪中送炭。评审老师首先看系统是否稳定、指标是否达标。一个用PID实现90分指标的作品远胜于用模糊控制但只能勉强工作的作品。先把PID吃透。4.5 坑五报告与调试脱节——最后一天编不出来现象四天三夜前三天半都在调硬件和程序最后半天突击写报告结果原理图、流程图、数据图全都没有。解决报告不是写出来的是“攒”出来的。每天写一点每天调完一个模块就把这个模块的电路连接图用Fritzing或手绘拍照、程序流程图、测试数据截图保存到报告文件夹。实时截图调PID时把上位机的波形曲线截图命名好“Pxx_Ixx_Dxx_响应曲线”。记录参数每版能用的参数记在报告里。最后选择效果最好的一组作为“最终参数”。整理错题本把遇到的问题、分析思路、解决方法记录下来这就是报告里“调试分析”章节的素材。5. 针对2026年电赛的备赛时间线与资源规划从现在假设是2025年到2026年比赛时间还算充裕但必须有节奏。5.1 第一阶段基础夯实期现在 - 2025年底目标精通一个主控STM32掌握核心外设GPIO、定时器、PWM、ADC、UART、I2C、SPI。任务找一个靠谱的教程比如正点原子、野火把每个外设的例程自己动手敲一遍不是看一遍。完成一个综合小项目例如用STM32OLED按键蜂鸣器做一个简易电子琴或游戏。这能串联多个外设。吃透PID在MATLAB/Simulink里仿真一个电机模型用PID控制理解参数影响。然后在实物一个直流电机带编码器上实现速度闭环。资源开发板、万用表、示波器如果实验室有、基础传感器套件。5.2 第二阶段模块训练期2026年1月 - 4月目标针对控制类题目练熟关键模块。任务视觉模块玩转OpenMV或OpenART。实现颜色跟踪、二维码识别、AprilTag定位。做到能稳定输出坐标。电机控制模块用带编码器的直流电机实现精确的位置控制和速度控制。舵机控制模块校准多个舵机实现多关节协调运动比如云台。上位机通信用C#、Python或LabVIEW写一个简单的上位机能发送指令、接收数据并绘图。产出一个封装好的“代码库”里面有你调试好的Motor.cServo.cPID.cVision.cUart_Protocol.c。5.3 第三阶段真题模拟与团队磨合期2026年5月 - 赛前目标模拟真实比赛环境提升系统集成和调试效率。任务做往年真题找2023、2024年的控制类题目不看现成方案自己组队在周末或假期进行48小时模拟。重点不是做出完美作品而是体验时间分配、团队协作、文档记录。角色分工明确硬件电路、机械、软件下位机、算法、报告文档、图表的主要负责人并互相备份。制定流程形成团队习惯比如第一天上午确定方案、画框图下午分头焊电路、写基础驱动晚上必须完成最小系统联调。资源准备一个“比赛箱”里面装好所有常用模块、线材、工具、备用芯片、打印好的数据手册。回到最初的问题“这小钢球到底会用在哪里”它可能出现在平衡台上、迷宫里、绘图仪中也可能作为触发其他动作的开关。但无论外壳怎么变内核都是那套“感知-决策-执行”的闭环。你的备赛重心不应该放在猜测2026年具体是什么球、什么题而应该放在构建一个能快速适配任何“球”的通用能力平台上。这个平台包括稳定的硬件基础、模块化的代码、熟练的调试手段和清晰的团队协作流程。当题目公布时你要做的只是把练过无数次的“摄像头找球”、“PID稳球”、“电机动球”这几个模块像乐高一样按照新题目的规则组装起来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进