首页 / 资讯中心 / 文章详情

电赛E题云台控制:状态机、视觉闭环与联调排障

电赛E题云台控制:状态机、视觉闭环与联调排障 ★ FEATURED ARTICLE
简介这份2023年全国大学生电子设计竞赛E题参考包面向备赛团队、嵌入式课程学习者与赛前自测人群围绕基于STM32F1的自动追光云台展开兼顾教学演示与竞赛考核场景可用于方案复现、代码研读和赛前演练。压缩包共199个文件、约6.74MB以C源码与头文件为主体配套Keil工程文件、编译中间产物、HEX烧录文件及少量说明与脚本较完整地保留了从外设驱动、工程配置到固件输出的组织方式。已有7810人学习下载具备一定参考热度。读者可从中梳理光敏检测、云台电机控制、PID调节、ADC采样与定时器中断等模块的实现脉络结合工程配置与烧录文件快速验证控制思路也可借源码结构理解STM32F1项目的分层方式、传感器与执行机构的联动关系并从中获取调试排错与性能优化的实践线索。1. 最容易被淘汰的不是算法最弱的那一组电赛E题这类综合测评控制题真正让队伍做不完的往往是“复位”和“归位”这两个不需要算法的动作而不是识别。2023年电赛E题的参考方案里被反复讨论的核心其实是一套可复现的状态机上电复位、沿框走边、随机点追踪、计时归位每一步都能被评委用秒表和尺子量出来。基本要求看动作完成度和 12cm 的静止误差发挥部分看追踪跟不跟得住、目标丢了能不能自己找回来。它考的是嵌入式控制的工程完整度——视觉给坐标、主控算角度、舵机执行、超时自救。适合已经能点亮摄像头和舵机、但一联调就手忙脚乱的人。2. 考点分布一张评分表拆成四段动作2.1 基本要求与发挥部分的分数落点这类题的评分表基本是一个模子基本要求保证“做对”发挥部分奖励“做快、做稳”。把评分表翻译成动作其实只有四件事每一件都能单独练、单独测、单独拿分。动作考的能力典型判据最容易丢分的地方上电复位机械零点与开环一致性规定时间内指向靶纸指定角静止误差 12cm上电瞬间舵机抖一下零点整体偏了沿边线或框线移动像素坐标到角度的映射、轨迹插补光点贴线走偏离线宽不超限拐角冲出去、直线段速度忽快忽慢随机点追踪视觉延迟补偿、闭环收敛目标出现后 12s 内对准超调来回摆越追越远回原点并给声光提示流程完整性计时结束前回位并明确提示提示忘了做做完也没分发挥连续追踪移动目标速度前馈、增益调度中低速跟得住不脱靶只在自己手推的慢速下测过发挥抗短暂遮挡状态机、目标重捕遮挡 12s 后自行找回一丢目标就原地死等或乱扫一圈分值结构通常是基本要求占一半、发挥占一半。看着不起眼的是“复位”和“归位”两项加起来也许只有十几分却是整张卷子里唯一不依赖算法的分。血泪经验是很多组在实验室把追踪调得很漂亮现场上电复位偏了两厘米后面所有动作的基准全歪追踪再准也落在错误的位置上。所以准备顺序应该反过来——先把复位重复性做到 10 次上电 10 次一致再去抠识别。2.2 硬件链路把延迟账算清楚再谈控制调追踪调不动的时候多数人第一反应是算法不行实际上是链路延迟没算过。从目标出现在画面里到舵机真的转过去中间隔着五段耗时每一段的量级都不一样。环节典型耗时能压到压缩手段曝光加出图33ms30fps16ms60fps降分辨率、关自动曝光、固定增益图像传输515ms38ms换并口或高速串口减少拷贝次数图像处理825ms510ms缩到 ROI 区域处理、先降采样再找轮廓指令下发25ms2ms提高波特率、一帧一条指令别拆包舵机执行100200ms取决于型号选快舵机、减小单步转角、加前馈把这五个数字加起来就能看明白识别从 25ms 优化到 5ms对最终对准时间的影响不到 20ms而舵机从 0.2s/60° 换成 0.1s/60°直接省掉一半。所以控制周期应该定死在 20ms由定时器硬性触发视觉结果“取最新一帧”而不是“等这一帧处理完”。中间那几帧用两帧差分估个速度做前馈云台就不会总慢半拍。提示控制周期一旦定了就不要在比赛现场改。周期变了PID 的积分项和微分项全部失效等于重新调参。2.3 状态机五个状态把“稳”写进代码现场最怕的是“程序跑飞了但没人知道”。把整个流程写成显式状态机每个状态带一个超时出问题时至少能看出卡在哪一步。import time RESET, SCAN, LOCK, TRACK, HOMING range(5) class GimbalFSM: def __init__(self): self.state RESET self.t_enter time.ticks_ms() # 进入当前状态的时刻 self.lost_cnt 0 # 连续丢目标帧数 def step(self, target, now): # target 为 (x, y) 像素坐标None 表示本帧没识别到 if target is None: self.lost_cnt 1 else: self.lost_cnt 0 if self.state RESET: self.home_pose() # 回到机械零点 if now - self.t_enter 800: # 800ms 内必须稳住 self.state SCAN elif self.state SCAN: self.sweep() # 小幅度扫描找目标 if target is not None: self.state LOCK self.t_enter now elif self.state LOCK: self.aim(target, use_iFalse) # 先纯比例对准不积分 if now - self.t_enter 300: self.state TRACK self.t_enter now elif self.state TRACK: self.aim(target, use_iTrue) if self.lost_cnt 30: # 连续 30 帧 ≈ 1s self.state SCAN elif self.state HOMING: self.home_pose() if now - self.t_enter 1000: self.beep() # 归位完成给声光提示ticks_ms()换成实际平台的毫秒接口即可。lost_cnt 30这个阈值是按 30fps 折算出来的“1 秒”帧率一变就必须重算否则丢目标的判定会提前或滞后。LOCK 状态故意不做积分是因为起步阶段误差大积分会很快饱和等到对准时反而退不出来抖成一片。RESET 的 800ms 也不是随便写的——它等于“舵机上电到稳定”的实测时间再加上一点余量这个数要在自己的机器上量。2.4 真题演练流程分怎么答问上电后云台没有回到你设定的原点你先查什么答题思路是分层别一上来就说重烧固件。先说机械层——限位有没有装反、云台有没有被线束拽住再说电气层——PWM 零点是不是被上电瞬间的电压跌落带偏、舵机是不是还没走完自检最后才是软件层——零点标定值有没有被初始化流程覆盖、上电顺序里是不是先发指令后等舵机稳定。面试官最想听的是排查顺序顺序对了说明你真调过。问怎么保证 1cm 的复位精度别只说“我用了闭环”。完整答法是三步先用固定机械限位做粗定位让每次上电的起点在同一个物理位置再用固定在靶纸上的基准点做一次视觉校正把残余偏差补掉最后连做 10 次上电记录落点看离散度而不是看单次。离散度大说明是回差或供电问题单次偏说明是标定值错了这两种病因完全不同。问为什么规定时间内要加声光提示这类题常被当送分题忽略。正确理解是评委按秒表看你有没有完成而“完成”必须有可观测的信号。没有提示等于让评委自己判断你有没有到位灰色地带一律按未完成算。答这题时把这层意思说出来比背规则有用。3. 高频考点视觉识别与云台控制的六个必答点3.1 靶纸识别阈值、轮廓、角点三件套控制题里需要的是稳定的坐标不是好看的识别结果。整条链路固定成灰度化、轻度高斯、自适应阈值、找外轮廓、按面积过滤、多边形逼近取四边形、角点排序。哪一步都不复杂难在参数与现场光照的匹配。import cv2 import numpy as np def find_paper(frame): gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray cv2.GaussianBlur(gray, (5, 5), 0) # 抑制靶纸纹理噪点 # 自适应阈值现场灯光不均时比固定阈值稳得多 bw cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 31, 8) cnts, _ cv2.findContours(bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in sorted(cnts, keycv2.contourArea, reverseTrue)[:5]: if cv2.contourArea(c) 3000: # 小连通域一律当噪声 continue peri cv2.arcLength(c, True) approx cv2.approxPolyDP(c, 0.02 * peri, True) if len(approx) 4 and cv2.isContourConvex(approx): return order_corners(approx.reshape(4, 2)) return None参数一个个说清楚blockSize31必须是奇数靶纸在画面里越小就要调越大31 大致对应“像素邻域里能盖住一段边框”C8是偏置光越强越往上加让白色区域更容易被判成前景0.02 * peri是逼近精度边缘毛刺多就放到 0.03取太小会把一条边拆成两段、len(approx)直接变 5。order_corners的作用是把四个角点按左上、右上、右下、左下排好常用做法是用xy的最小最大值加y-x的极值组合顺序定不下来后面算出来的角度全是乱的。3.2 激光点提取与像素到角度的映射激光点比靶纸好找——亮度和饱和度都远高于背景。做法是在 HSV 空间按颜色分离取最大连通域算质心如果激光点被靶纸上的黑线切断先做一次 3×3 的闭运算把断口接上再取质心或者直接取该颜色区域里亮度最高的前 N 个点做加权平均。坐标映射强烈建议用两点标定而不是查镜头参数。让光点打到靶纸上两个已知位置记下像素坐标和实际角度两点连立就能得到“每像素对应多少度”的斜率。这个斜率包含了镜头畸变、安装倾角、云台轴心偏差的全部影响比算内参快而且更贴合你自己的机器。Kp, Ki, Kd 0.9, 0.02, 0.15 # 先只用 P 跑通再补 I 和 D def pixel_to_angle(px, py, calib): # calib 由两点标定得到中心像素 每像素对应角度 ax (px - calib[cx]) * calib[k_deg_per_px] ay (py - calib[cy]) * calib[k_deg_per_px] return ax, ay def pid_step(err, st, dt): st[i] err * dt st[i] max(-200, min(200, st[i])) # 积分限幅防饱和 d (err - st[last]) / dt if dt 0 else 0 st[last] err out Kp * err Ki * st[i] Kd * d return max(-15, min(15, out)) # 输出限幅 单周期最大转角k_deg_per_px是整段代码里最值钱的数换一次镜头、动一次支架就必须重标。输出限幅 15 度对应“20ms 内最多允许转多少”它同时是安全阀和抗超调手段限幅比调 D 更立竿见影。积分限幅 200 是经验值作用是让长时间存在的小偏差不至于把积分顶到天花板导致反向时退不出来。3.3 双轴 PID 的三个现场修正教科书上的 PID 在这里要打三个补丁。第一个是死区补偿小舵机死区常在 35us误差小于死区时输出一个最小步进而不是 0否则云台会永远停在差一点点的地方。第二个是增益调度大误差时用大 Kp 快速接近误差进入 ±2 度后切小 Kp避免在目标附近反复横跳。第三个是分轴调参水平轴和垂直轴的负载完全不同垂直轴要克服重力Kp 和死区补偿量不能用同一套。这三个补丁都不写在题面上但现场调不出来的组八成卡在这里。3.4 真题演练三道答辩常问的识别题问靶纸和背景颜色很接近阈值怎么调都不稳怎么办这题考的是解决问题的层次。正确的答法是先动物理层——加补光、换背景板、镜头前加偏振片压反光再动算法层——换成边缘或角点特征或者用霍夫找直线交点最后才是调参。答辩时说“我先改环境再改代码”比说“我把阈值从 80 调到 120”高一个段位因为前者可复现。问激光点被靶纸上的黑线切断成两段怎么算中心思路是先合并再求心形态学闭运算接断口或按距离把相近连通域归为一组再对合并后的区域求质心。备选方案是取亮度最高的若干像素做加权平均因为激光点中心一定是全图最亮的几个点之一。答这题时补一句“两种都实现按现场光照切换”评委会认为你想过鲁棒性。问目标静止了云台还在小幅抖动怎么消先从误差源讲一是死区二是视觉坐标的量化抖动三是积分项在零误差附近的漂移。对策对应三条加死区补偿、对坐标做滑动平均或卡尔曼、误差小于阈值时冻结积分输出。别答“我把 Kp 调小”调小只是把抖动换成迟钝。4. 高频考点主控、电源与通信的工程细节4.1 主控选型先看启动时间再看算力方案选择上最常见的争论是“要不要上 Linux 单板”。判断标准不是算力而是启动时间与确定性。方案算力冷启动上手成本主要风险通用 MCU 加独立视觉模块中毫秒级低视觉模块固件受限复杂算法改不动带加速器的视觉主控一体高秒级中生态资料少出问题只能自己啃Linux 单板直连摄像头很高2040s中上电窗口被吃掉掉电后恢复慢如果规则给的启动窗口只有几十秒冷启动二三十秒就是在赌。更稳的做法是 MCU 管实时控制、视觉模块只管出坐标两块板子上电即工作谁挂了另一块还能维持基本动作。算力分配同理识别跑 2030fps 就够控制必须 50Hz 稳定把这两件事放在同一颗芯片上互相抢占是很多“明明算法没问题却抖”的根因。4.2 供电与干扰舵机是全场最大的噪声源舵机启动电流能到堵转电流的量级和主控共用一路电源画面花、主控复位、串口丢包就都来了。下面这张表是现场排查时最好用的一张。现象大概率原因对策舵机一动图像就花屏电源跌落导致摄像头复位舵机与主控分路降压各加 470uF 电解云台转到某个角度主控重启地线共阻抗耦合、瞬态压降单点共地、加 0.1uF 瓷片、缩短地线串口偶尔丢一帧波特率偏高加线太长降波特率、加校验和重发激光点坐标突然跳变反光或环境光干扰固定曝光、加遮光罩、限定 ROI布线上的细节比电路图更重要舵机线双绞、和摄像头排线分开走、PWM 信号线远离电源线。这些不是玄学是几十毫安的逻辑信号夹在几安培的脉冲电流旁边的必然结果。4.3 真题演练三道现象排查题问现场调试时画面明显卡顿帧率掉到个位数怎么定位分三步量先单测摄像头出图帧率排除分辨率或曝光时间过长再单测处理耗时在关键函数前后打时间戳看是阈值慢还是轮廓慢最后看是不是内存分配引起的抖动尤其是每帧新建大数组。答题时把“先测量再改”这个顺序讲出来比直接给结论更让人信服。问云台在目标附近持续等幅振荡增大阻尼也没用为什么大概率不是 PID 的问题而是延迟太大——控制周期 20ms 加上舵机 150ms 的响应等效相位滞后已经把相位裕度吃光了。对策是降低整体增益、加死区、只在误差超过阈值时才下发新指令。答这题的关键是能说出“振荡周期和延迟量级对得上”这个判断方法。问两块板子通信偶尔收不到数据你会怎么改协议先讲帧结构帧头、长度、载荷、校验和缺一不可再讲超时重发与序号去重最后讲降级策略连续 N 帧没收到就退回本地扫描而不是原地死等。评委关心的是“断了以后系统还活不活”不是你把波特率调到了多少。5. 易错点五个把分数丢干净的现场坑5.1 只在一种光照下调过阈值错在哪实验室靠窗的工位上午和下午光线完全不一样很多人只在一种条件下把阈值调到刚好觉得识别稳了。为什么错自适应阈值和固定阈值都建立在“前景背景对比度足够”的前提上现场一旦换了灯位或加了遮光板这个前提就没了而现场没有时间重调。怎么答对把曝光和增益全部手动固定阈值跟着固定然后在三种光照下各测 20 次记录成功率同时留一个“一键标定”的入口现场上电后按一下重新取一次背景。5.2 PID 参数在静态目标上调到完美错在哪对着不动的目标调参数调到零超调、零稳态误差一追移动目标就大幅超调甚至自激。为什么错静态调参只考验稳态移动目标考验的是相位裕度延迟和增益的关系在静态下根本暴露不出来。怎么答对调参必须用运动目标哪怕是手动匀速平移靶纸先调 P 到临界振荡再退一半然后加 D 压超调最后用很小的 I 消静差。答辩时能说出“我用的是动态工况调参”比报一串参数更有说服力。5.3 用开环绝对角度打点忽略机械回差错在哪算出目标角度直接换算成 PWM 值发下去正转和反转到位的位置差了一两个毫米。为什么错齿轮间隙和连杆间隙是机械固有属性开环永远补不掉方向不同误差符号也不同。怎么答对在每个关键点位做双向逼近测试量出正反向到达同一位置的 PWM 差值做成一张回差补偿表更彻底的做法是用视觉闭环到位后看一眼实际位置再补一次小步长修正。5.4 主线功能做完了异常分支一条没写错在哪正常流程跑得行云流水一旦目标丢失、云台顶到限位、通信断掉程序就停在原地不动。为什么错状态机没有超时主循环里有一个阻塞等待整个系统被一行代码卡死。怎么答对每个状态都配超时超时进入安全状态主循环里禁止无限等待开独立看门狗超时自动回到 RESET。答题时给出“任何一个状态最多停留多久”的具体数字比说“我做了异常处理”扎实得多。5.5 把计时和提示当成小事错在哪功能都做完了唯独忘了归位后的声光提示或者超时几秒才回到原点。为什么错这类动作在评分表上是独立条目做不到就是零分而且没有任何补救机会。怎么答对把“上电复位、计时、归位、提示”写成一张纸质的流程卡贴在桌上每次完整演练都按卡片走一遍把提示音和归位动作写在同一个函数里让它们在代码层面无法分离。6. 备赛方法一套能复现的联调顺序真正拉开差距的不是谁算法强而是谁的联调顺序对。我后来固定成四步任何控制类赛题都照这个走。第一步单点打通。摄像头只做一件事稳定输出一个坐标舵机只做一件事收到角度就转过去。两块分开测各自达到“连续跑十分钟不出错”才算过。第二步闭环最小化。用最简单的比例控制让光点追上一个静止目标此时不追求快只追求不振荡。第三步加扰动。手动移动靶纸、开关房间灯、拔插一次电源看系统能不能自己回到正常。第四步全流程演练掐表从冷上电开始完整走一遍含提示音的全部动作连做十次记录成功率和耗时。阶段通过标准不通过先查什么单点打通连续 10 分钟无异常供电、线序、驱动初始化闭环最小化静止目标 2s 内对准且不振荡坐标映射斜率、死区加扰动遮挡 1s 后自行恢复状态机超时、重捕逻辑全流程演练10 次里 9 次满分完成复位重复性、计时与提示现场排障也有一套固定顺序别乱试先看电电压、地线、有没有复位再看数串口打印出来的坐标是不是合理再看时序控制周期有没有被别的任务拖长最后才动参数。这个顺序能挡掉八成的“看起来像算法问题”的故障。从那以后我每次上电前都强制走一遍“电压、坐标、周期”三查哪怕前一天刚调好、哪怕只改了一行代码。这套习惯救过我很多次也让我明白这类题拼的从来不是灵光一现而是把每一个不起眼的动作重复到不会出错。这份 2023 年电赛 E 题参考里整理的赛题拆解、状态机骨架和参数标定流程就是按上面这个顺序排的拿过去对着自己的机器一步步跑一遍比从头啃一遍代码快得多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站