news 2026/10/20 2:51:11

2023电赛E题:运动目标控制与自动追踪系统高分冲刺指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2023电赛E题:运动目标控制与自动追踪系统高分冲刺指南

简介:2023年电赛E题参考是一份面向全国大学生电子设计竞赛参赛者的完整技术方案,核心聚焦于使用意法半导体公司生产的STM32F1系列微控制器来构建自动追光云台系统,涵盖光敏传感器检测、微控制器编程、电机驱动控制、PID算法调节以及电源管理等多个关键环节,适合正在备赛或希望提升嵌入式系统实战能力的电子类专业学生和工程爱好者。整个压缩包共收录199个文件,总体积约6.74MB,内容以C语言源文件、头文件以及Keil工程配置为主,同时也包含编译过程中生成的中间文件和少量辅助脚本,目录结构完整,便于按模块对照学习。目前已有7803人学习下载,这份参考为参赛团队提供了从光敏信号采集到云台角度控制的完整代码框架,并包含硬件连接说明与调试思路,读者可据此快速搭建样机,深入理解传感器数据采集、脉宽调制波形生成、闭环控制等核心技术,也可在此基础上针对追光精度与响应速度进一步优化。

1. 2023年电赛E题:先搞懂它到底在考什么、怎么拿分

2023年电赛E题很多人第一眼看到是“运动目标控制与自动追踪系统”,下意识以为是纯算法题,结果一上场才发现,真正卡人的不是目标追踪,而是“激光笔怎么稳稳停在屏幕的指定位置”。这道题的本质是把视觉识别、云台控制、坐标标定、PID闭环四条线串在一起:摄像头看到目标,换算成云台角度,再驱动激光笔去点那个位置,最后还要在时间限制内完成画方形、画三角形和追踪红点。拿分顺序非常直接:基础部分画得好,省奖稳一半;发挥部分能追着红点跑,才是冲国奖的区分点。这篇就按高频考点、真题拆解、易错点、冲刺调试顺序,把这套题从“看着会”讲到“现场能答”。

2. 高频考点:云台系统、视觉识别、串级PID的完整链路

2.1 机械与硬件链路:云台选型和固定方式决定代码上限

E题的硬件链路并不复杂,核心是“屏幕—摄像头—MCU—云台—激光笔”五件套。但很多队栽在一个小地方:摄像头和激光笔不装在同一个刚性结构上。摄像头装在云台支架顶部,激光笔装在舵机臂下方,二者角度不一致,每次识别出的目标点转到云台坐标系时都要做额外的补偿。如果云台和摄像头之间还有机械松动,测出来的像素坐标每次都不一样,后面PID调得再好也白搭。

建议第一步不是写代码,而是把云台、摄像头、激光笔固定成一个整体。云台最好选择两轴金属舵机架,俗称“两自由度云台”,水平方向负责偏航角,俯仰方向负责高度角。激光笔尽量贴近摄像头的轴线,这样从“目标点像素位置”到“云台角度增量”之间的换算是一个近似线性关系,后续标定简单很多。MCU侧一般用官方指定系列,编译环境、时钟配置和PWM输出通道数都要提前确认,激光笔的开关一般用一个MOS管或三极管驱动,别直接让MCU引脚去带负载。

真正容易被忽略的是屏幕坐标方向。电赛E题的屏幕通常是一块白色背板,图像坐标系是“左上角为原点、x向右、y向下”,而云台的俯仰角向上为正。同一个目标点,像素y越大说明位置越靠下,云台俯仰角应该往负方向走。很多队伍直接把像素差当角度差用,最后画出来的图形上下颠倒,这就是方向符号没处理好的典型错误。

正确的做法是建立一个统一坐标系,把像素坐标、屏幕物理坐标、云台角度三者做映射。最简单的方式是“中心点标定法”:把云台调到激光点落在屏幕正中心的那个角度,记为(pan_center, tilt_center),然后手动把云台往已知方向转一定角度,测量激光点在图像中的像素偏移量,得到“每像素对应多少度”。这一步不要求高精度标定,但一定要做,因为后续所有自动画图都建立在这个映射之上。

2.2 视觉识别:红色激光点的提取与抗干扰

视觉识别部分考的不是深度学习,而是“在简单背景下准确提取红色激光点”。常见的做法是使用摄像头模块采集RGB图像,将颜色空间从RGB转换到LAB或HSV,红色的区分度会明显好于直接比较RGB分量。E题的现场光线存在较大的不确定性,有些场地灯偏暖黄,激光点打在屏幕上的颜色会偏粉或偏橙,如果只写死一个红色阈值,换个场地就抓不到点。建议采集几组不同光照条件下的红色像素样本,取H通道的区间范围,同时保留S和V的上下限作为辅助判断条件。

激光点提取还有另一个陷阱:激光头照在屏幕上会产生光晕,中心亮、边缘暗,直接取所有红色像素的均值,中心点会被光晕拉偏。正确做法是先二值化,再做连通域分析,取面积最大的连通域,然后对这个区域的轮廓求质心,甚至可以用椭圆拟合得到中心点坐标。质心坐标的稳定性直接影响后续画正方形的直线度。如果想进一步提高鲁棒性,可以在激光笔上做调制,比如让激光笔以固定频率开关,摄像头的曝光时间选短一些,帧与帧之间做差分,动态光点会被保留,屏幕上的杂散反光会被滤掉。这个方法在发挥部分的追踪任务里非常管用。

2.3 控制闭环:定位靠角度闭环,画线靠速度连续

E题的输出是让激光点走直线、走折线,而不是单纯从A点跳到B点。这里要分清两个控制层级:一是“到位控制”,当激光点离目标点有一定距离时,云台快速转过去,接近目标后减速停住;二是“轨迹控制”,激光点要在屏幕上匀速画出边线,不能走走停停。很多队伍只写了第一层,导致画出的正方形每段边线都像分段函数,拐角处明显停顿。面试官和评委喜欢看到的是一个连续、平滑的轨迹。

比较稳妥的方案是两个嵌套的PID,内环是云台速度环,外环是位置环。位置环的输入是“屏幕像素误差”,输出是期望角速度;内环拿着期望角速度去调PWM增量。没有内环时,外环直接控制PWM会出现一个问题:误差小的时候PWM增量很小,舵机还没动到位就停了,肉眼看起来就是激光点慢慢蹭到目标点,反应慢。加上内环之后,速度能保持一致,激光画出来的线才不至于“前快后慢”。

现场调试时不要直接上双闭环,先只保留比例项,把云台的响应调到“不振荡、不啸叫”,再逐渐加微分项抑制超调。积分项在E题里使用要谨慎,舵机本身有摩擦力死区,积分用得过大,停住之后还会缓慢爬行,反而把正方形的顶点弄歪。更实用的做法是给位置环加一个死区,当误差小于某个像素阈值时,认为目标已经到位,直接锁存PWM,不继续积分。

3. 真题拆解:画正方形和画三角形的高频考点与答题模板

3.1 画正方形的坐标映射与到位判断

基础部分画正方形,一般要求在屏幕上画出一个边长为固定值的红色正方形,起始点可能从某个指定角点或屏幕中心开始。拿到这道题先别急着让激光笔“走四条边”,先做一件简单的事:让激光笔依次点亮正方形的四个顶点,并记录四个顶点对应的云台角度。确认四个点都能准确打中之后,再把顶点之间拆成若干插值点,让激光笔按顺序走一遍。这样处理的好处是,调试时能分清问题出在“定位不准”还是“连线不平”。

四个顶点怎么算?如果屏幕的物理尺寸已知,屏幕中心和云台初始角度已知,那么正方形的每个顶点都能从中心点加上固定像素偏移得到。再把像素偏移通过第2章里的像素-角度映射转成目标角度。这一段代码的核心就是坐标变换:

# 正方形四个顶点按顺时针排列,边长 length_pix,中心点 center import math center = (320, 240) # 图像中心 length_pix = 120 # 边长,根据实际屏幕尺寸换算 vertices = [ (center[0] - length_pix / 2, center[1] - length_pix / 2), (center[0] + length_pix / 2, center[1] - length_pix / 2), (center[0] + length_pix / 2, center[1] + length_pix / 2), (center[0] - length_pix / 2, center[1] + length_pix / 2), ] # 像素偏移转云台角度增量 pan_per_pix = 0.08 tilt_per_pix = 0.08 for idx, (x_pix, y_pix) in enumerate(vertices): dx = x_pix - center[0] dy = y_pix - center[1] pan_angle = -dx * pan_per_pix # 图像x方向与云台方向反向 tilt_angle = dy * tilt_per_pix # 图像y向下为正,俯仰角向下为负 print(f"Vertex {idx}: pan={pan_angle:.2f}, tilt={tilt_angle:.2f}")

这段代码里最容易错的是符号。摄像头看到的“右边”对应云台应该向左转还是向右转,取决于云台安装方向,必须实测确认。建议在代码里加一个调试模式:手动设置目标角度,让激光笔指向屏幕中心,然后手动输入一个像素偏移,观察激光点实际移动方向。方向不对就把乘法系数取反,这一步省得后面整体图形反转。

连线的时候不要直接设置目标角度就完事,云台从一个角度转到另一个角度需要时间,如果角度变化太快,舵机响应不过来,画出来的边会变成弧线。通用做法是把起点和终点之间按时间或按像素距离等分成多个小段,每一小段设置一个临时目标,循环执行,直到到达终点。步长越小线条越平滑,但太小的步长会让云台频繁进行小角度调整,反而出现抖动,一般取5到10像素一个插值点比较合适。

3.2 画三角形的角度闭环与顶点处理

三角形比正方形更暴露控制问题,因为三角形的斜边不是水平或垂直的,云台必须同时变化水平和俯仰两个角度。如果两个轴的响应速度不一致,斜边就会往外弯。解决办法是为两轴分别设置不同的PID参数,而且在插值前先算好每个插值点对应的pan角和tilt角,保证两条边的角度是同步变化的。

画三角形另一个考点是“从哪条边开始”。基础部分通常会指定从屏幕底边的某个位置开始,或者从某个三角形顶点开始。如果起始点在屏幕边缘,云台的初始俯仰角可能已经在极限位置附近,云台可能还没动就被机械限位挡住。答题思路是提前把云台回中,然后让激光笔快速跳到最近的顶点,再从顶点开始画边。回中动作不会扣分,反而是“跳变到指定起始点”这一下,评委重点关注的是速度。

三角形顶点处最容易出现“过头”现象:云台到顶点后由于惯性继续往前走一小段,三条边闭合时形成一个圆角。处理方式分两步,第一步在接近顶点前提前减速,比如当离顶点还剩10像素时,把比例增益降低一半;第二步是到位后再做一次静态修正,等激光点稳定了再开始画下一条边。实际调试中,这种“画完一条边、停10毫秒、再走下一段”的写法,比连续画三条边更稳。

3.3 高分答题模板:先跑点,再跑线,最后跑形

从拿分策略来看,不建议一上来就追求“一次连续画完整个图形”。比较稳妥的现场答题顺序是三段式:第一步让激光笔快速依次点亮各顶点,向评委证明视觉和定位链路是通的;第二步在相邻顶点之间用插值连线,每画完一条边就做一个短暂的静止;第三步把静止时间压缩到极限,形成连续的图形。这样一个阶段一个阶段往上加,即使某个阶段出了问题,也能快速定位到是定位问题还是连线问题。

现场演示时还有一个隐藏加分点:“画完图形后激光笔自动回到起点并保持不动”。这个动作能证明控制闭环有较好的稳定性,也能避免评委在测量图形边长时激光点还在移动影响测量。代码实现上就是保存第一个顶点的角度,图形画完后设置该角度为最终目标,并保持PID持续输出不进入休眠状态。

4. 易错点:视觉标定、PID死区、时间超限这三类常见错误

4.1 摄像头标定偷懒,现场换屏直接崩

错在哪:有的队伍在实验室把像素-角度映射系数调好了,到现场发现屏幕尺寸比例变了、摄像头架设高度变了,激光点总是整体偏上或偏下,画出来的正方形不在屏幕中心。

为什么错:像素到角度的映射关系依赖于摄像头到屏幕的距离、屏幕物理尺寸、摄像头画幅比例三者。换一个环境,云台同样的角度,激光点落在屏幕上的物理位置不变,但它在画面里的像素位置变了,映射系数就失效了。

怎么答对:现场开机后第一件事是做“三点击标定”。让激光笔分别打屏幕中心、屏幕左边缘、屏幕上边缘三个点,在图像中记录这三个点的像素坐标,用实际角度差除以像素差重新计算pan和tilt的每像素角度值。整个过程不到两分钟,但能消除百分之八十的坐标偏移问题。这种“现场快速标定”的流程一定要提前写成固定函数,调试时一键调用,不要每次都手动算。

4.2 死区设太大或直接不设,图形抖动或停不住

错在哪:许多队伍为了追求“稳定”,把位置环死区设成10像素,结果正方形四个顶点每个都偏差好几毫米,边长误差直接超限;另一种极端是不设死区,激光点在目标点附近来回抖动,评委测量时很难读数。

为什么错:死区本质上是“允许的误差范围”,它必须小于题目要求的允许误差,否则控制精度不达标。而完全不设死区,云台永远在尝试消除微小误差,舵机不停微调,视觉上就是抖动。

怎么答对:先把死区设为2到3像素,再慢慢增大,观察现场评委测量边长时能否稳定读数。如果云台到目标点附近之后还在慢慢爬,可能是速度环参数没调好,而不是死区问题。另外在代码里加入到位标志,误差进入死区后停止位置环更新,输出保持当前PWM,这样既能防抖动又能防爬行。这招在画三角形顶点时尤其有用,顶点歪不歪就看这一下。

4.3 发挥部分超时:只测“结果时间”,不测“过程时间”

错在哪:基础部分画图形没有严格时间限制,很多队伍就忽略了单步执行时间。到了发挥部分,系统要求在限定时间内完成巡航或追踪,一加上超时判定,程序就乱了,云台还没走完指定路径时间已经到了。

为什么错:云台转动的实际时间和理想时间差很多。舵机在轻负载下做一个大角度转动可能需要几百毫秒,如果代码里把每个插值点都当作瞬时完成,循环到一半就已经超时。屏幕上的路径速度规划完全是黑匣子,不实测就会翻车。

怎么答对:把每个动作的执行时间打印出来,格式是“动作名—起始时间—结束时间—总耗时”。调成这个习惯之后,你会发现最大的时间开销往往不是云台转动,而是摄像头帧率太低导致的等待。视觉刷新率只有15帧左右时,每帧间隔约66毫秒,如果每个插值点都在等新图像,一圈走下来可能多出好几秒。优化方式是视觉线程和控制线程分离,云台按预定角度运动,不依赖每帧反馈,每走完一个点再获取一次最新坐标。

4.4 光点目标丢失:只识别红色,不处理“红点被手挡住”的情况

错在哪:追踪目标时,红点移动到屏幕边缘或者被手短暂遮挡,程序直接输出“目标未找到”,云台停在原地。等目标重新出现时,激光笔离目标已经很远,追踪失败。

为什么错:没有做目标丢失预测,把视觉当作唯一信息来源。实际追踪任务中目标短暂被遮挡非常常见,属于正常工况。程序一旦丢失目标就死死等到下一帧出现,而不采取任何保持或外推动作,现场表现就是激光笔“发呆”。

怎么答对:设计一个“丢失容忍时间”,比如连续5帧没有找到目标点,才判定为真正丢失。在容忍时间内,用上一帧的目标位置加上一阶速度外推,预测目标当前可能在哪,让云台继续朝这个点运动。代码上就是保存目标的上一帧坐标和当前帧坐标,算出速度向量,把速度乘以丢失帧数,加到当前坐标上,作为云台的临时跟踪目标。这个方法在发挥题里属于常规操作,但却是很多队伍没提前准备的盲区。

5. 发挥题:追踪移动红点与自动巡航的答题套路

5.1 运动目标追踪:用连续帧坐标差分替代瞬时判断

发挥部分的追踪任务,常见要求是让激光笔始终照射一个移动的红色光点,红点可以由现场人员手持激光笔在屏幕上移动,速度时快时慢。直接使用单帧视觉坐标作为目标有一个天然问题:摄像头帧率有限,两个坐标点之间目标已经移动了一段距离,云台一直在追“上一个位置”,肉眼看去激光点总是滞后于红点半个身位。

更稳的做法是在PID位置环前面加一个目标预测,利用最近几帧的目标位置估算运动速度,再乘以云台机械延时(约一帧到两帧的时间),得到一个前馈补偿量,把预测点作为新的控制目标。代码结构大致如下:

# 目标预测:用最近两帧差分外推位置 frame_dt = 0.066 # 约15帧,具体用实测帧间隔 x_dot = (current_x - last_x) / frame_dt y_dot = (current_y - last_y) / frame_dt predict_x = current_x + x_dot * frame_dt predict_y = current_y + y_dot * frame_dt

这段代码的本质是“用速度外推补偿系统延迟”。实际调试时,预测步长不要一开始就设成一整帧,可以从0.3帧开始,慢慢加大,观察激光点是否从“落后”变成“震荡”。预测过大,激光笔会在目标点附近反复震荡,这是典型的“过度补偿”现象。现场答题时,如果感觉追不上,优先调整的不是PID的Kp,而是预测系数,这一条经验能省下大量调参时间。

追踪任务还有一个反向考点:当目标突然停住时,预测位置还会继续往前冲一点,导致激光笔冲过头。解决办法是把预测值限制在一个合理范围内,比如预测位置距离当前实际位置的像素差不能超过某个上限,超过就按上限处理。这个限制同样适用于目标突然转向的场景,能防止云台猛甩过头。

5.2 自动巡航与计时:路径分段、速度规划、超时兜底

自动巡航任务一般是让激光笔从指定起点出发,沿屏幕底边移动,或者沿屏幕边缘走一圈,并在规定时间内停在终点。这道题的本质不是“画直线”,而是“限时走直线”,对速度规划有要求。

一种高效的答题策略是“分段定速”:将整段路径按方向不同分成若干段,每段独立设定运动速度。水平段用固定pan角速度,垂直段用固定tilt角速度,转角处单独做一个减速段。这样比全局使用一个PID参数更符合舵机的响应特性。速度规划的核心不是算得多精确,而是给每段留出10%到15%的余量,防止云台偶发卡顿导致超时。

如果现场时间允许,建议在程序里加一个“软超时保护”:当前动作接近规定时间仍未完成时,增大速度环的输出上限,强制云台快速冲向终点。这个兜底逻辑不会让图形非常标准,但至少能保证“到达终点”这个得分点在超时前完成。评委对“差一点超时但到达终点”的容忍度,远高于“完全没走完”的容忍度。

5.3 现场演示话术:先跑再调,别在评委面前调Kp

发挥部分测试时,评委不会等你在现场慢慢调PID。比较推荐的现场策略是准备两套参数:一套慢速稳定型的KS,适合基础部分画图和低速追踪;另一套快速激进型的KF,适合发挥部分快速巡航和高速追踪。当评委说“现在开始追踪画点”,再判断目标大概运动速度,快速切换参数。

切换参数的方式建议做成一键切换,而不是在调试器里改代码。现场测试时间紧张,重新编译上电很容易错过测试窗口。调试经验是,所有PID参数、预测系数、死区阈值都放在一个配置文件里,程序启动时读取,切换参数时用按键或串口命令调用,整个过程在1秒内完成。这个细节不直接加分,但能明显提升现场演示的成功率,很多队伍都是在评委面前调参把心态调崩的。

6. 答题技巧:三天冲刺E题的现场调试顺序

E题的准备完全可以压缩成一个三天冲刺方案,核心顺序是“先跑通视觉坐标,再做云台定位,最后做轨迹连续”。第一天上午什么都别做,先把摄像头画面接到屏幕上,确认红色光点能够被稳定识别并显示质心坐标。这个环节最大障碍是环境光干扰,解决办法是调整曝光和颜色阈值,不要急着写云台控制。第一天下午开始做像素-角度标定,让激光笔能快速打到屏幕上任意指定点,实现“指哪打哪”。

第二天集中调画正方形和三角形。记住一个调试口诀:先看顶点准不准,再看边线直不直,最后才看整体完成快不快。顶点不准,问题98%出在标定或机械回差;边线不直,问题出在插值步长或两轴PID参数不一致。第三天上午专门跑发挥部分的追踪和巡航,把前馈预测系数调出来,再记录每种场景下的完成时间。第三天下午按比赛流程完整模拟,从开机上电、一键标定到基础部分、发挥部分连续跑三遍,每遍之间只做参数切换,不做代码改动。

整套流程走下来,你会发现最气人的往往不是算法不会写,而是某个舵机线松了、激光笔电池没电、摄像头支架螺丝松了这些机械隐患。所以冲刺阶段每次做全流程演练之前,先花三分钟逐项检查机械连接:云台螺丝是否紧固、激光笔是否夹紧、摄像头的固定支架有没有被线缆带动。这一点是很多队伍的血泪教训,特别是比赛前一天搬动设备之后,连接件松动的情况非常常见。

从那以后我每次准备类似的电赛项目,都强制自己先走一遍“坐标系标定—点位点亮—插值连线—PID微调”的固定顺序,不再一上来就写满整段控制逻辑。省下来的时间拿来反复模拟现场流程,比多写几百行代码划算得多。希望这篇2023年电赛E题的考点拆解和答题思路能帮到你,照着这个思路把每个环节都提前跑通,现场拿分就不会慌。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 2:50:56

STC8G I2C从机模式实战:寄存器配置、状态机与中断处理

简介:STC8G系列单片机I2C从模式实现代码资源,面向嵌入式开发者和单片机学习者,解决在中断模式下实现I2C从机通信的编程问题。压缩包仅1个文件,为i2c.c源程序,大小仅1KB,但完整覆盖I2C从模式关键环节&#x…

作者头像 李华
网站建设 2026/10/20 2:50:55

大语言模型实战体验:从本地部署到API调用的踩坑指南

大语言模型这个词,过去两年几乎被各大科技媒体写成了“万能神药”。但真正有意思的事,不是看它的宣传片,而是把它拉下神坛,亲手跑一遍、调一次、甚至让它“翻车”一次。最近我花了几周时间,把市面上几种常见的开源权重…

作者头像 李华
网站建设 2026/10/20 2:50:26

list remove下标为何总踩坑?从位移原理到批量删除最优解

很多写了几年代码的人,看到“list remove下标”这个需求,第一反应是:这有什么好说的?一行代码的事。可我每次在面试或者帮人排查代码的时候,都能碰到在这个简单操作上翻车的案例。这不是段子,是真实发生的事…

作者头像 李华
网站建设 2026/10/20 2:48:38

大模型Agent设计五级阶梯:从模型直调到多Agent协作的避坑指南

凌晨两点被电话吵醒,群里十几条告警刷下来,原因很简单:Agent在多个工具之间来回切换,把库存模块的数字写进了订单备注,订单模块又当真了,一路传播下去成了脏数据。这种事故我这一年见了不止一次&#xff0c…

作者头像 李华
网站建设 2026/10/20 2:48:24

AI辅助论文写作全流程:四款工具组合用法与避坑指南

说句实话,我以前对“AI写论文”这事是有点抵触的,总觉得机器写出来的东西带着一股模板味,没法用。直到有一回赶着一篇课程综述,文献堆了三十多篇,框架改了四版,开头憋了俩小时还停在第一段,实在…

作者头像 李华
网站建设 2026/10/20 2:46:53

MapReduce核心原理与实战:从Shuffle调优到数据倾斜排查

1. 为什么MapReduce是一个需要系统理解的“分布式计算范式”1.1 从单机处理到分布式处理的分水岭先说一个很实际的问题:同样一份数据,在一台机器上跑一个脚本可能只需要几分钟,为什么到了Hadoop生态圈里,几乎所有离线计算的实现都…

作者头像 李华