
简介面向2023年全国大学生电子设计竞赛E题的完整工程包内容为基于STM32F1的自动追光云台系统适合参赛团队、嵌入式学习者及电子设计爱好者用于赛前准备与方案参考。资源共199个文件以C语言源码、H文件、编译生成的目标文件及调试相关文件为主另含工程配置文件与辅助脚本整体压缩包约6.74MB结构清晰便于直接查阅代码逻辑与硬件配置。目前已有7735人学习下载。包内方案覆盖光敏传感器采集、电机驱动、PID闭环控制及云台姿态调节等关键环节同时包含完整STM32标准外设库工程便于理解从传感器数据读取到执行机构动作的完整链路。读者可借助该资源快速搭建追光云台原型对比代码细节梳理控制流程并结合机械结构与电源管理设计形成可落地的竞赛作品有效提升针对E题的实战效率。 2023年电赛E题“运动目标控制与自动追踪系统”应该是当年最热闹的一道题不少队伍在它面前翻了车。这道题表面上是“用激光笔照个正方形、让摄像头跟着红色光点跑”实际上是把机械结构、视觉识别、运动控制、坐标变换全串在了一起。我花了大概三天时间从零搭完了整套系统也交了不少学费这篇就把完整的思路和踩坑过程写出来给后面做这道题的同学一个参考。题目本身不算复杂硬件核心就三样一个能转动的激光笔云台、一个能捕捉画面的摄像头、一块做逻辑决策的主控板。但真正动起手来你会发现几乎所有时间都花在“怎么让云台转得准”和“怎么让摄像头认得出光点”这两件事上。尤其是云台画正方形的那部分光是调好四个角的位置、让轨迹不畸变就够你折腾一整晚。1. 赛题解读与破题思路1.1 题目到底考什么E题全称是“运动目标控制与自动追踪系统”核心任务分两大块。第一块是让固定在二维云台上的激光笔在指定区域内自动画出一个边长约50cm的正方形要求轨迹尽量平整、边长误差尽量小。第二块是让摄像头识别并锁定场景中一个移动的红色光点控制云台持续对准它光点怎么动激光笔就跟到哪。别被“运动目标”“自动追踪”这些词唬住拆到最底层系统想要的无非是两个闭环。第一个闭环是角度闭环主控通过云台角度变化推算光点位置属于开环打靶和视觉反馈的结合第二个闭环是图像闭环摄像头作为传感器把“目标在哪”反馈给主控主控再修正云台角度。想拿高分前一个闭环考验机械装配和运动控制的精度后一个闭环考验图像处理速度和PID参数的手感。1.2 两种技术路线怎么选当时我们队里纠结过两套方案。第一套是完全伺服化用步进电机加驱动器给云台加上绝对编码器每一个目标角度都靠闭环伺服实现。优点是精度高、重复性好缺点是结构复杂、调试周期长而且步进电机带载云台时的高频振动会把图像抖到没法看。第二套是低成本舵机加摄像头反馈用普通金属齿轮舵机驱动云台依靠摄像头识别目标位置形成闭环修正。结构和程序都简单很多缺点是舵机线性度一般、云台会有机械回程差。但电赛比的不是工业级精度它比的是在有限时间里做出一个稳定的系统。我们最终选了第二套事实证明这套方案拿到国奖的队伍数量远比第一套多。核心思路就是别追求硬件绝对精准用软件反馈去补偿机械误差。2. 硬件选型与系统搭建2.1 云台结构怎么设计双轴云台是标配水平轴偏航和俯仰轴各用一个舵机。这里有两个容易被忽略的坑。第一是舵机选型千万别用几块钱的SG90扭矩太小激光笔加上固定座之后会有抖动特别是俯仰轴重心稍微偏移一点就会低频振荡。我用的是MG996R扭矩够大虽然舵盘虚位明显但能靠算法补救。第二个坑是激光笔固定。很多队伍直接把激光笔用热熔胶粘在舵机上射出去的光线角度跟云台法线方向不一致会导致画的图形弯曲。正确做法是用3D打印一个固定座把激光笔轴线校准到云台转动轴交点附近。这样云台转动时激光点才不会画弧线。摄像头我放在云台正下方的支架上视线大致平行于激光笔出光方向。这么做的好处是简化坐标映射坏处是遮挡风险大布局时要让摄像头略微领先于云台减少对激光路径的遮挡。2.2 主控与视觉处理方案主控我们用了一块STM32F407开发板图像处理单独用了OpenMV。OpenMV负责识别红色光点并输出像素坐标STM32负责所有运动控制和逻辑调度两者通过UART串口通信。这个分工很明确视觉算法在MicroPython上迭代快运动控制跑在裸机C语言上实时性有保障。如果手头没有OpenMV用树莓派加普通USB摄像头也行但要注意延迟问题。树莓派跑OpenCV做颜色识别大约有50ms到100ms的延迟反馈到舵机控制上会发现追踪总慢半拍。OpenMV的帧率可以到50fps延迟低很多追踪体验完全不一样。2.3 供电和走线的经验舵机启动瞬间电流能到1A以上三个舵机同时动作时峰值轻松超过3A。如果直接用单片机的USB口供电按下复位键那一刻就会掉电RGB灯瞬间就跑马灯。稳压芯片选LM2596或者MP1584输入7.4V锂电池输出6V给舵机供电5V单独给主控和传感器两地共地但电源通路要分离。走线时舵机线要远离摄像头排线否则图像上会出现周期性噪点这个我们排查了很久才发现。3. 核心算法拆解坐标标定与运动控制3.1 像素坐标系到云台坐标系的映射摄像头看到的画面是像素坐标云台要转的是角度坐标这两者之间必须建立一个映射关系。最简单的方式是线性标定把云台转到已知角度记录画面中激光点的像素位置采集多个点后拟合出两个方向的比例系数。我实际操作时在墙上贴了网格纸横竖每隔10cm贴一个标记点。通过串口发送指令让舵机依次对准每个标记点同时记录OpenMV输出的光点中心像素坐标。最后用最小二乘法拟合出angle_x (pixel_x - center_x) * kx angle_y (pixel_y - center_y) * ky其中kx和ky就是每个像素对应的角度变化量。这里有个细节如果摄像头固定不动kx和ky基本是常数如果摄像头跟着云台一起转就要在每次转动后重新计算偏移量不能用同一组系数。我们的摄像头是固定的所以这套线性映射已经完全够用。3.2 用参量分解法画正方形轨迹画正方形听起来简单但直接让云台走连续的坐标插值会出问题舵机从一个点线性运动到另一个点到了目标点会停一下再转方向导致正方形四个角有明显的圆弧过渡边也画不直。采用“参量分解法”可以规避这个问题。思路是正方形轨迹按时间拆分成四个独立的一维运动段每个运动段只控制云台的一个轴匀速运动。比如从(0,0)到(1,0)只让水平轴从角度A匀加速到角度B俯仰轴不动再从(1,0)到(1,1)水平轴不动俯仰轴动作。这样四条边都是单轴匀速直线运动画出来的轨迹最接近理想正方形。关键参数是每一条边的运动时间要一致。通过调整PWM输出频率和步进角度增量让云台在800ms内精确走完一条边四边总耗时3.2秒加上转角停顿误差实际一圈约3.5秒。再用PID实时修正边上光点的偏差视觉反馈纠偏和开环走轨迹是并行执行的。3.3 自动追踪的PID控制追踪环节我用的是增量式PID。目标值是OpenMV传来的光点像素坐标当前值就是画面中心坐标(160,120)两者误差输入PID输出云台角度的增量再叠加到当前角度上。error_x target_x - center_x delta_angle_x kp * error_x ki * integral_x kd * (error_x - last_error_x) angle_x delta_angle_x调试的时候把kp从小往大加先调水平轴再调俯仰轴。观察光点在画面中的位置如果光点来回振荡说明kp太大或kd太小如果光点总是追不上滞后半个身位说明kp太小或积分太弱。我们最终的参数是水平轴kp1.8、ki0.02、kd0.6俯仰轴kp1.5、ki0.01、kd0.4实际追踪时红色光点能稳定保持在画面中心±5像素以内。3.4 开环打靶和闭环修正的关系有一个容易犯的错误就是把画正方形的运动和视觉修正混在一起做。前期调试阶段最好先做纯开环只发角度指令不读摄像头先把正方形画出一个大致形状。等开环轨迹基本成型再叠加视觉修正只修正边缘位置偏差。这样分层调试出问题时能快速定位是机械层、运动层还是视觉层的问题。4. 实操过程与关键参数调试4.1 完整的调试流程我们的调试顺序是这样的先单独测试云台转动范围和PWM角度对应关系确认舵机能转到指定角度且回中准确。然后把激光笔固定好开启摄像头标定程序通过串口助手手动发送角度指令采集像素坐标和角度坐标的对应关系。标定完成后先用固定坐标测试开环画正方形不断调整四角的角度值直到轨迹接近正方形。最后开启视觉修正把PID参数粗调一遍再用移动红色光点测试追踪效果。整个流程看似清晰实际上每个环节都有反复。最耗时的是标定环节我们采集了16个标定点但一开始拟合出来的系数在画面边缘区域误差很大。后来发现是因为摄像头镜头有畸变画面边缘的像素和角度的线性关系变差。解决办法是放弃全画面线性拟合改为在画面中心区域做分段线性或者直接手动测量几个关键位置的角度值作为查表依据。4.2 PID参数整定的实战记录画正方形时的PID和追踪时的PID要分开整定参数差异还挺大。画正方形时我们期望的响应是快速到位且不振荡因此比例系数偏小、微分偏大我记录了一组调试数据供参考参数初值调试后现象说明水平轴P1.01.8过小响应慢过大云台抖动水平轴I0.010.02积分太大导致超调明显水平轴D0.30.6增加阻尼抑制边角过冲俯仰轴P1.01.5俯仰轴负载轻参数略低俯仰轴I0.0050.01俯仰方向重力影响积分补偿很重要俯仰轴D0.20.4防止垂直方向低频振荡调试PID最忌讳的是同时改好几个参数一次只改一个记录现象变化这样才清楚每个参数到底在起作用。另外提醒一点PID参数和机械装配有很强耦合如果你的云台装配偏松或者说舵机虚位很大再好的PID参数也救不回来。装配环节一定要仔细舵机固定螺丝拧紧后要检查有没有框量有框量就加垫片或者重新打印固定件。4.3 图像阈值分割的调参技巧OpenMV识别红色光点用的是LAB色彩空间阈值分割。LAB空间比RGB更符合人眼对颜色的感知对光照变化的鲁棒性也更好。实际调试时要根据现场灯光条件采集一组“纯背景”和“有光点”的样本找到L、A、B三个通道的阈值范围。我遇到的一个实际问题是比赛场地里光线比较杂空调出风口的光线反射会被误识别成光点。后来在代码里加了一个面积过滤和色块圆形度判断只保留面积在30到300像素之间、且圆形度大于0.7的色块。这一招非常有效误判率从30%降到了接近零。OpenMV端的识别代码大致如下关键点在于色块筛选和目标坐标提取import sensor, image, time sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(20) sensor.set_auto_whitebal(False) red_threshold (30, 100, 40, 80, 30, 80) while True: img sensor.snapshot() blobs img.find_blobs([red_threshold], pixels_threshold30, area_threshold30) max_blob None for blob in blobs: if blob.area() 100 and blob.roundness() 0.6: if max_blob is None or blob.area() max_blob.area(): max_blob blob if max_blob: x max_blob.cx() y max_blob.cy() img.draw_cross(x, y, color(0, 255, 0)) print(x:%d,y:%d % (x, y))5. 常见问题与排查技巧实录5.1 追踪时云台高频抖动这是最常见的故障。表现是云台对准红色光点后舵机在小范围内来回抖动声音尖锐刺耳。原因通常是PID的微分项在高频噪声上放大了误差或者舵机死区导致零位附近振荡。解决方法是加死区控制当误差小于某个阈值比如5像素时不输出角度增量。同时在代码里对像素坐标做滑动平均滤波减少单帧噪声带来的抖动。加了这两个措施后追踪的稳定性几乎提升了一个档次。5.2 画正方形时一边直一边弯我们在调试时发现正方形四条边质量不一致两条水平的边明显比垂直的边直。排查下来原因是水平方向舵机带动的负载重、转动惯量大运动终点有过冲而垂直方向舵机的负载轻过冲小。解决办法是给水平轴的轨迹规划加S型加减速在边起点和终点附近放慢速度中间保持匀速。S型加减速可以有效抑制过冲但实现起来代码量会增加不少时间紧张的话可以只加梯形加减速。5.3 摄像头标定漂移问题标定完的映射系数用了一会儿之后发现激光点位置和预期偏差越来越大。这个多半是舵机发热导致的。舵机连续工作十几分钟后内部电位器阻值受温度影响转角精度会漂移。解决办法是定期重新标定或者在程序里加入开机自校正逻辑每次启动时云台自动对准两个基准点重新计算偏差量并修正系数。5.4 常见问题速查表问题现象可能原因排查与解决激光点轨迹画圈激光笔轴线偏离云台转动轴重新固定激光笔校准轴线图像识别闪绿点红阈值范围太宽缩小LAB阈值范围加面积过滤追踪滞后严重PID响应太慢或帧率低提高OpenMV帧率增加比例系数串口通信丢包波特率不匹配或线材干扰统一波特率缩短杜邦线加滤波电容光点识别偶发丢失红色光点被障碍物遮挡加卡尔曼预测短暂丢失时保持上一位置5.5 现场翻车抢救经验我们比赛现场遇到过两次几乎崩溃的情况。第一次是云台在画正方形过程中突然卡住不动排查发现是舵机堵转原因是PWM信号受干扰导致角度指令突变舵机直接撞到机械限位。紧急处理是把机械限位换成软限位在代码里限制角度输出范围杜绝程序层面撞限位。第二次是比赛前一天发现追踪时激光笔总是慢半拍怎么调参数都改善不大。后来发现是电池电压从7.4V掉到了6.8V舵机供电不足响应速度变慢。换了一块满电电池后问题立刻消失。所以大赛前一定要备好两块充满电的电池并且在测试时全程监测电压变化。个人经验补充这道题真正熬人的不是算法复杂度而是所有环节都是环环相扣的。机械结构有一点虚位标定就多一份误差标定误差大PID就得用更大的参数去硬拉反而把系统推向振荡边缘。光电赛这几年越来越考验系统的整体设计能力单点突破已经很难见效了。如果时间充裕建议把代码模块化舵机控制一个文件、视觉识别一个文件、逻辑调度一个文件。我们就是因为最开始把全部代码写在一个main文件里调PID和调视觉互相干扰浪费了大半天时间。后来重构代码结构把接口定好两边同时推进效率一下子提上来了。最后提一个加分项很多人忽略了对追踪轨迹的记录。我们的代码里加了一个历史轨迹存储功能把目标位置和实际位置每隔20ms记录一次通过串口发到上位机画成曲线。这样做的好处是评委问起来的时候你能直观展示追踪误差有多小而且你自己调试的时候也能清晰看到PID参数调整前后的响应变化。就这一点当年答辩的时候给评委留下了很深的印象也算是个隐藏的提分技巧。本文还有配套的精品资源点击获取