恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

2023电赛E题激光追踪系统:OpenMV与PID云台控制完整方案

  • 首页
  • 资讯中心
  • /
  • 2023电赛E题激光追踪系统:OpenMV与PID云台控制完整方案

相关资讯

JP61陀螺仪在ROS自主导航中的精准航向校准实践 2026/9/16 14:32:55
OptiScaler:3步替换游戏里的DLSS、FSR2与XeSS,免费上采样器切换与帧生成指南 2026/9/16 14:32:55
Xinference 中 Ling-3.0-flash 的规格解析与启动指南:124B/5.1B 混合推理 MoE 模型如何在 Transformers 引擎上落地 2026/9/16 14:32:55

最新资讯

CKEditor 5 图片链接(Linking images)功能深度指南:让图片成为可点击的链接锚点
2026奇点智能技术大会前瞻:从张俊林的RSI到柏佳辰的组织智能
数据飞轮与评估引擎:让「AI越用越强」的两台机器
Python视频混淆工具:CV与音视频处理融合的隐私保护实践
大模型应用开发:程序员转型AI的实用路径
政务预约系统开发:Flask+SSM前后端分离架构实践

今日推荐

IoT-For-Beginners 智能语音计时器:Wio Terminal 基于 DMAC 与 Flash 的音频采集实战
基于MATLAB的CRI显色指数计算:从SPD光谱到Ra的完整流程
JSP+Servlet+MySQL博客系统源码部署与优化全攻略

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

2023电赛E题激光追踪系统:OpenMV与PID云台控制完整方案

发布时间:2026/9/16 14:37:56
2023电赛E题激光追踪系统:OpenMV与PID云台控制完整方案 简介这是一套面向电子设计竞赛的2023年E题完整项目资料适合正在备战电赛的参赛队伍、嵌入式系统与机器视觉方向的学生以及对单片机开发和图像识别感兴趣的进阶学习者能帮助读者快速理解赛题要求并搭建可运行的原型代码。压缩包共包含五个文件其中两个工程压缩包分别对应主控逻辑与舵机伺服控制模块两个Python脚本用于视觉采集与数据交互另附一份PDF参赛报告梳理了设计思路、硬件连接和调试过程整个资源仅23.67MB便于下载部署目录划分清楚可快速定位所需代码与文档。该资料目前已有412人学习属于具备真实使用反馈的赛题项目。所有源码均经过测试可以正常运行省去大量环境配置和底层排错时间可直接运行验证预期效果上手门槛较低。在此基础上读者可沿用清晰的工程分层完成参数调整、控制策略更换、视觉追踪或自动循迹等二次开发并保留作者交流渠道使用中遇到的问题能得到及时解答让学习与实战过程更加顺畅。1. 2023年电赛E题一套红绿激光追踪系统的完整源码包真正在2023年电赛E题赛场上待过的人对这套题的第一印象往往是“方案谁都想得出来但让两个光点在A4纸上安安稳稳地互相咬住才是噩梦”。E题要求用两个二维云台分别控制红色和绿色激光笔先让绿色光点按矩形或圆形轨迹移动再让红色光点实时追踪绿色光点。这个zip包就是当时一支参赛队留下的完整工程两个OpenMV脚本、两套舵机控制封装、一份参赛文档PDF。它适合正在备赛电赛、想复现激光追踪项目、或者刚接触OpenMV视觉闭环控制的人。源码已经跑通过直接烧进去就能看到两个舵机云台跟着色块转动接下来要做的就是理解它为什么这样设计。2. 赛题到底考什么追踪误差、双云台和坐标系2.1 从题目要求反推系统设计2023年电赛E题“运动目标控制与自动追踪系统”核心指标不是“能不能看见”而是“红绿两个光点的距离误差”。基础部分要求绿色光点按给定路径运动时红色光点能持续跟随发挥部分往往增加路径复杂度或运动速度。也就是说这是一个典型的伺服跟踪问题难点集中在三个环节视觉定位是否准确、云台角度解算是否正确、控制闭环是否收敛。从题目反推系统结构完整的信号链应该是两个独立的二维云台每个云台至少两个舵机分别控制偏航和俯仰。一个摄像头观察A4纸区域识别色点坐标。一个控制核心读取视觉坐标计算误差输出舵机PWM。两只激光笔固定在云台前端随云台转动改变光点位置。从压缩包内容看first_openmv.py和第二套Second_Servo.zip明显对应两个独立闭环一套负责绿色光点的轨迹产生一套负责红色光点的追踪。这样拆分的好处是调试时互不干扰先让绿点跑起来再专心调红点跟丢的问题。2.2 为什么OpenMV是多数队伍的第一选择很多第一次接触这个题的人会问为什么不用树莓派加USB摄像头或者用K210从实际比赛场景看电赛只有四天三夜树莓派启动要几十秒Python生态虽然全但写驱动、处理摄像头、接舵机每一步都可能耗掉宝贵的调试时间。K210能跑色块识别但OpenMV IDE的阈值调节工具、内置的find_blobs接口、以及MicroPython环境下直接操作PWM引脚的能力让OpenMV在色块追踪这个细分场景里几乎是最低上手成本的选择。另一个关键点是OpenMV可以脱机运行。比赛现场不允许一直连电脑而OpenMV插上电池就能跑遇到问题再用USB连电脑打印坐标。项目里两个OpenMV脚本分别烧录到两个摄像头各自承担自己的视觉任务比单摄像头加双云台的主从结构少一条通信链路可靠性更高。2.3 硬件选型与接线要点这份项目能跑起来硬件上并不需要昂贵设备。常见配置如下部件型号参考数量说明视觉核心OpenMV H7 Plus2一个负责轨迹侧一个负责追踪侧舵机SG90小扭矩或MG996R4每个云台两个舵机分别控制水平和垂直激光笔650nm红色、532nm绿色各1光点越小识别越稳云台结构件3D打印或金属云台支架2舵机叠起来构成二维自由度供电5V/3A以上稳压模块1舵机启动电流大不能直接用USB供电纸张A4白色卡纸若干哑光纸反光更轻接线时最容易被忽略的是共地。OpenMV、舵机和稳压模块的地必须连到一起否则舵机转动时的噪声会让色块检测出现跳动。舵机电源要单独从稳压模块供不能和OpenMV共用同一路5V否则舵机堵转瞬间能把电压拉到4V以下OpenMV直接重启。3. 视觉坐标提取first_openmv.py和second_openmv.py的分工3.1 色块检测的核心LAB阈值和形态学过滤OpenMV识别激光点本质是在RGB565图像上做颜色阈值分割。激光颜色很纯但环境光和纸张反光会把一个光点扩散成一个大色斑。所以在写识别代码前先把摄像头固定到云台上用OpenMV IDE打开“阈值编辑器”工具对着A4纸上的红色和绿色光点调出合适的LAB阈值。LAB色彩空间把亮度、红绿、蓝黄分量拆开比RGB抗光照变化能力强很多。一个轨道上常见的绿色光点识别代码结构如下import sensor, image, time sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time2000) sensor.set_auto_whitebal(False) # LAB阈值分别对应 L通道、A通道、B通道的范围 GREEN_TH (30, 80, -40, -15, -5, 40) while True: img sensor.snapshot() blobs img.find_blobs([GREEN_TH], pixels_threshold15, area_threshold15, mergeTrue) if blobs: # 选面积最大的色块过滤噪点 b max(blobs, keylambda x: x.area()) img.draw_cross(b.cx(), b.cy(), color(255, 0, 0)) print(gx%d gy%d area%d % (b.cx(), b.cy(), b.area()))这段代码先关闭白平衡因为自动白平衡会自动调节颜色分量导致同一个激光点在不同环境光下阈值失效。find_blobs里的pixels_threshold和area_threshold用来过滤只有几个像素的随机噪点mergeTrue表示把相邻的同一颜色区域合并成一个整体。取面积最大的色块是按最大概率锁定真实光点因为激光点通常会比反光点更亮更大。3.2 双OpenMV的协作逻辑从项目命名可以看出first_openmv.py和second_openmv.py分别承担不同任务这种拆分方式很符合电赛的调试节奏。3.2.1 轨迹侧脚本让绿点按路径移动first_openmv.py负责绿色激光笔所在的云台。一种常见做法是开环轨迹规划把矩形或圆形的路径离散成一系列舵机角度按时间逐帧输出。开环控制的好处是逻辑简单不依赖识别结果现场定位不准时微调几个角度系数就能改轨迹。缺点是没有反馈舵机机械误差会累积所以这块代码通常还会在关键节点加延时或隔帧视觉校正。另一种做法是把轨迹侧也做成闭环OpenMV识别绿色点在A4纸上的位置与目标路径点比较偏差经PID换算为舵机转角。这种方式比开环稳定但调试量也会翻倍。从这套项目只放了一个first_openmv.py来看开环加简单校正的可能性更大。3.2.2 追踪侧脚本锁定绿色光点second_openmv.py的核心逻辑是追踪。摄像头固定在红色云台上视野中心基本就是红色激光指的位置。OpenMV持续寻找绿色色块求出绿色点与画面中心的坐标偏差这个偏差就是控制云台转动的输入信号。当绿色点出现在画面右侧说明云台需要向右转绿色点偏上云台需要向上抬。这套逻辑可以表述为error_x green_cx - img.width() // 2 error_y green_cy - img.height() // 2这里的error_x和error_y是像素误差不能直接当舵机角度用需要经过比例换算和PID整形后才能输出。3.3 像素坐标不是最终答案很多第一次调的人会把像素误差直接乘以一个系数就给舵机结果发现绿点明明在画面左边舵机却转到右边或者原地抖动。原因是像素坐标和物理角度不是线性关系。OpenMV的镜头是广角画面边缘的像素对应更大的角度变化而且激光笔固定在云台上时光点移动量还取决于A4纸到镜头的距离。最稳的做法是先在几个固定位置记录“像素偏移对应舵机角度偏移”的实测值拟合出一个近似映射系数。更精细的做法是用单应性矩阵做坐标变换把图像坐标映射到A4纸平面坐标再做角度换算。4. 云台控制从像素误差到舵机角度的完整链路4.1 舵机控制基础PWM与角度映射OpenMV控制舵机通常有两种方式直接用内置的Servo对象或者用定时器输出PWM。电赛环境下内置Servo对象更省事但自定义PWM能控制更多参数尤其方便统一两个云台的行为。舵机控制信号是50Hz的方波脉宽1.0ms到2.5ms对应0°到180°中间值1.5ms对应90°。常见初始化代码如下from pyb import Timer, Pin # 定时器2频率50Hz对应舵机控制信号周期20ms tim Timer(2, freq50) ch tim.channel(1, Timer.PWM, pinPin(P7)) def set_angle(ch, angle, min_us1000, max_us2500): # 将0~180度映射到1000us~2500us us min_us angle / 180.0 * (max_us - min_us) ch.pulse_width_us(int(us)) set_angle(ch, 90)pulse_width_us设置的是单个PWM周期里的高电平时长。舵机内部有一个电位器反馈电路高电平宽度决定了它转动位置。写好这个函数后云台转角就是纯粹的数学问题不用再关心底层寄存器。对于两个云台可以封装一个类分别绑定不同定时器通道避免互相干扰。4.2 像素-角度映射与PID调参4.2.1 比例系数怎么定假设图像宽度是320像素镜头水平视场角约60°那么每个像素对应的角度近似60/3200.1875°。如果绿点偏离画面中心40像素云台就需要转约7.5°。但在实际项目中云台距离A4纸大概30cm到50cm这个近似值要现场实际测量校准。控制代码里的比例项Kp代表“一个像素误差输出多少舵机角度”。Kp过小云台反应慢绿点跑出视野Kp过大云台在平衡点附近来回震荡光点画圈。一般从Kp0.1起步观察追踪误差变化再按0.05步进调整。4.2.2 微分项和惯性补偿云台带着激光笔转动舵机自身有惯性和机械延迟如果只靠比例控制红色光点会滞后绿色光点一个固定的相位差。微分项Kd根据误差变化率提前减速或加速能明显抵消滞后。Ki积分项用在静态误差场景比如当红色光点和绿色光点距离较近但一直差一点点时积分项会慢慢补上这个差值。但积分项非常容易导致震荡必须加输出限幅。可以把PID参数和输出范围做成一张调参卡方便现场记录参数建议初始值调整方向Kp0.1增大可提高响应速度过大会震荡Kd0.02增大可抑制超调过大会抖动Ki0只在静态误差明显时使用输出上限±20°防止舵机突然转到位4.3 把PID写进OpenMV循环一个完整的追踪控制循环应该包含采样、计算、输出三步并且控制频率保持稳定。下面这段是追踪侧的核心结构import sensor, image, time from pyb import Timer, Pin # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time2000) # 初始化两个舵机通道 tim_yaw Timer(2, freq50) yaw tim_yaw.channel(1, Timer.PWM, pinPin(P7)) tim_pit Timer(3, freq50) pit tim_pit.channel(1, Timer.PWM, pinPin(P8)) kp, ki, kd 0.1, 0.0, 0.02 last_err_x, last_err_y 0, 0 def clamp(v, limit): return max(-limit, min(limit, v)) while True: img sensor.snapshot() blobs img.find_blobs([GREEN_TH], pixels_threshold10, mergeTrue) if not blobs: continue b max(blobs, keylambda x: x.area()) err_x b.cx() - img.width() // 2 err_y b.cy() - img.height() // 2 # 对偏航通道做PID计算 p kp * err_x d kd * (err_x - last_err_x) delta_yaw clamp(p d, 20) yaw_us yaw_us delta_yaw yaw.pulse_width_us(int(yaw_us)) last_err_x err_x # 俯仰通道相同省略 time.sleep_ms(20)这个循环把绿色点的像素偏差转换为舵机脉宽增量而不是绝对角度。使用增量式PID的好处是即使初始角度设置有偏差只要每一帧都在修正系统也能自动收敛到目标位置。clamp函数把单次修正量限制在±20°防止绿点特别偏时舵机猛转引起机械冲击。5. 标定、曝光与延迟E题翻车率最高的三个地方5.1 激光光点的曝光和阈值激光点打到白纸上往往因为过曝变成一个白斑颜色信息丢失。过曝后的白斑在LAB颜色空间里接近中性色红色阈值和绿色阈值都识别不准确。建议在OpenMV里关闭自动曝光手动设定曝光时间sensor.set_auto_exposure(False, exposure_us12000)具体曝光值要根据现场光线微调。眼睛看激光点感觉不明显但OpenMV的感光芯片动态范围有限适当压低曝光能明显改善色块面积稳定性。另外A4纸要是顺滑的铜版纸激光光晕会很大换成哑光卡纸效果更好。5.2 云台零点与机械回差舵机中位标定是调通项目的第一道坎。先把绿色激光云台的舵机调到90°手动转动舵机臂让激光光点落在A4纸中心再固定舵机臂。这个过程必须在安装云台支架时完成否则代码里所有角度都会叠加一个固定偏差。机械回差是舵机齿轮组的固有间隙表现为从左边转过来和从右边转过来同一个角度指令落点不同。常见处理办法是在PID输出加上一个固定的方向补偿或者让云台追踪方向保持单向逼近。如果红点在绿点左边就让它从左边慢慢靠近不要来回穿插。5.3 串口调试与远程观察电赛现场不能一直连屏幕最有效的调试手段是串口打印坐标。OpenMV默认的USB口就是串口可以用print输出绿点坐标、误差和PWM值。但高频打印会阻塞主循环建议每10帧打印一次并且只打印关键量frame_count 1 if frame_count % 10 0: print(err_x%d err_y%d pwm_yaw%d % (err_x, err_y, yaw_us))拿到串口数据后观察误差应该呈现收敛趋势。如果误差来回振荡优先降低Kp增加Kd如果误差恒定在一个小范围再考虑加一点Ki。这种调试路径比盲目改参数高效得多。6. 把源码变成自己的复现清单与扩展方向6.1 按顺序复现的检查清单拿到这个zip包后建议按照下面的顺序操作不要一上来就烧录全部代码压缩包文件作用复现时的注意点first_openmv.py轨迹侧视觉/轨迹控制先单独跑这个脚本确认绿点能否画出矩形或圆形second_openmv.py追踪侧识别和PID控制先用手拿着绿激光在纸面移动测试红点是否跟随First_Servo.zip轨迹云台舵机控制封装直接导入后检查舵机接线顺序是否和代码一致Second_Servo.zip追踪云台舵机控制封装追踪异常时先检查云台零点和PWM频率E2023241039_*.pdf项目报告里面记录了现场调参过程和最终误差先读再改单舵机测试通过后才开始联调。联调时把绿色轨迹速度调到最低让红色追踪稳定后再逐级加速。6.2 向更高性能扩展的路线这套项目最值得改的地方是把追踪侧从“当前帧误差”升级为“对目标轨迹的预测”。可以在PID前面加一个简单的线性预测用最近三帧的绿色点坐标拟合出一个速度再把未来50ms的目标位置作为控制目标。绿点移动越平滑这个预测效果越好。更进一步可以在OpenMV上接九轴IMU把云台姿态角引入反馈弱化机械回差的影响。如果想要更通用可以把两个OpenMV的数据都通过串口发到一块STM32或树莓派上由上位机做单应性变换和轨迹规划OpenMV只当传感器。这样项目就从“两个独立追踪器”变成“一个完整的视觉伺服系统”拿来改造成课程设计或毕设的底子也更厚实。最后说一个实际技巧把second_openmv.p里的积分项Ki先保持为0用KD值把云台调到轻微抖动的边界再往回退20%这个微调点往往是追踪效果最好的甜点区。改完参数后把整个项目导出成可烧录的工程留给后续复用。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号