2023年电赛E题全国一等奖方案解析:基于步进电机云台与滤光视觉的运动目标追踪系统
2023年电赛E题全国一等奖方案解析:基于步进电机云台与滤光视觉的运动目标追踪系统
最近有不少同学在准备电赛,后台收到很多关于运动控制类题目的咨询。正好,去年我们团队(南京邮电大学“遇到困难睡大觉”队)在2023年全国大学生电子设计竞赛中,针对E题“运动目标控制与自动追踪系统”做了一套方案,最终拿到了全国一等奖。今天,我就把这个项目的核心思路、关键技术和我们踩过的“坑”掰开揉碎了讲给大家听,希望能给正在备赛的你一些启发。
这个题目的核心,简单说就是让一个红色激光点(模拟目标)在屏幕上按规则运动,同时让一个绿色激光点(追踪器)去自动追踪这个红点。听起来像是两个激光笔在屏幕上“捉迷藏”。要实现高精度、高稳定性的追踪,难点主要集中在控制精度和视觉识别上。下面,我就从方案选择、硬件设计、算法实现到系统集成,一步步带大家复盘我们的实现过程。
1. 核心方案选择:为什么放弃舵机,选择步进电机?
拿到题目,第一个要决定的就是用什么来驱动激光笔转动。大部分队伍的第一反应可能是用舵机,因为它控制简单,PWM信号一给就能转。我们一开始也是这么想的,但仔细一算,发现舵机这条路走不通。
问题的核心是精度。题目要求激光笔距离屏幕1米,要实现光斑在屏幕上的毫米级移动。这意味着云台的转动角度必须非常非常小。我们来算一笔账:
假设要让光斑移动1毫米,在1米距离上,云台需要转动的角度大约是arctan(0.001) ≈ 0.0573度。
市面上常见的舵机,精度一般在0.5度到1度左右,远远达不到0.057度的要求。用舵机的话,光斑一跳就是好几厘米,根本谈不上“精准追踪”。
提示:在涉及距离和角度的系统里,一定要动手算一算理论精度需求,这是硬件选型的根本依据,千万别想当然。
所以,我们果断放弃了舵机方案,选择了步进电机。步进电机的特点是可以通过脉冲精确控制转动的角度,其最小步距角(比如1.8度)可以通过驱动器进行细分来进一步提高分辨率。
我们选用的是带32细分驱动的步进电机。一个1.8度的步进电机,经过32细分后,每步的转动角度为1.8° / 32 = 0.05625°。
看,这个数值0.05625°非常接近我们计算出的理论需求0.0573°。这意味着,我们每给电机驱动器一个脉冲,屏幕上的光斑理论上就能移动大约1毫米。毫米级控制的硬件基础就这样奠定了。
为了承载这套精密的控制系统,我们用铝型材搭建了一个稳固的框架平台,把步进电机云台、控制器、树莓派等都牢牢固定在上面,最大限度减少了机械振动带来的误差。
2. “火眼金睛”的打造:滤光片视觉识别方案
硬件精度解决了,下一个难题是:如何让摄像头在红绿两个激光点完全重合时,也能准确分辨出谁是谁?
如果只用普通的摄像头,当红绿光斑重叠成一个黄点时,算法就很难区分了,这会直接导致追踪系统“失明”。我们的解决方案非常巧妙——给摄像头戴上“有色眼镜”,也就是滤光片。
我们制作了一个简单的滤光片转轮装置,上面安装了两种滤光片:
- 650nm带通滤光片:只允许红色激光(波长约650nm)通过,强烈滤除绿光。
- 530nm带通滤光片:只允许绿色激光(波长约530nm)通过,强烈滤除红光。
这样,在程序控制下,摄像头可以轮流透过红色滤光片和绿色滤光片看屏幕:
- 透过红色滤光片时,屏幕上只有红点是亮的,绿点几乎看不见。
- 透过绿色滤光片时,屏幕上只有绿点是亮的,红点几乎看不见。
(示意图:左图为透过红色滤光片看到的画面,右图为透过绿色滤光片看到的画面)
这样一来,视觉处理的难度就大大降低了。我们只需要对获取到的图像进行简单的二值化和边缘检测,就能非常鲁棒地提取出红色光斑和绿色光斑的像素坐标,完全不用担心颜色混淆的问题。
经验分享:这个滤光片方案是我们项目的关键创新点之一。它用很低的成本(滤光片很便宜)解决了复杂的颜色识别问题,体现了“用硬件简化软件”的嵌入式设计思想。
3. 大脑与四肢:树莓派+单片机的系统架构
整个系统的控制架构我们采用了“树莓派 + 单片机”的经典组合,让它们各司其职。
树莓派(大脑):负责“看”和“想”。
- 看:驱动摄像头,控制滤光片切换,完成图像采集、二值化、边缘检测,最终计算出红、绿两个光斑在屏幕上的像素坐标。
- 想:将两个光斑的像素坐标差值,通过算法(后面会讲)转换成云台需要转动的角度指令,通过串口发送给单片机。
单片机(四肢):负责“执行”。
- 接收树莓派发来的角度指令。
- 将角度转换成步进电机所需的脉冲数和方向信号。
- 驱动步进电机驱动器,精确控制两个步进电机(X轴和Y轴)旋转。
- 处理按键输入、蜂鸣器提示等人机交互功能。
这种架构的优势很明显:树莓派擅长复杂的图像处理和浮点运算,单片机则擅长实时、精准的电机控制。两者通过串口通信,分工协作,稳定性很高。
4. 从像素到角度:非线性坐标映射算法
这是整个项目的算法核心,也是一个容易踩坑的地方。很多人会想当然地认为,屏幕上的像素移动和云台的转动角度是线性关系,但事实上,它们之间是强烈的非线性关系。
你可以把激光笔想象成固定在云台上的一个点,它照射在1米外的屏幕上。当云台转动时,光斑在屏幕上的移动轨迹近似一条双曲线,而不是直线。直接用简单的比例系数去换算,在屏幕边缘会产生巨大的误差。
我们必须建立正确的几何模型。假设:
- 激光笔到屏幕的垂直距离为
L(已知,约1米)。 - 云台在水平方向(X轴)转动角度为
θ_x,在垂直方向(Y轴)转动角度为θ_y。 - 光斑在屏幕上的坐标为
(X, Y)。
根据几何关系,可以推导出:
X = L * tan(θ_x) Y = L * tan(θ_y) / cos(θ_x) // 注意,Y坐标受X轴转角影响反之,已知目标像素坐标(X, Y)和像素与实际尺寸的换算关系后,可以反解出需要转动的角度:
θ_x = arctan(X / L) θ_y = arctan( Y / sqrt(L^2 + X^2) ) // 或使用更精确的模型我们在代码里实现了这个映射函数。树莓派计算出红绿光斑的像素坐标差(Δx, Δy)后,先转换成实际距离差,再通过上述反解公式,计算出需要补偿的角度(Δθ_x, Δθ_y),最后发送给单片机。
踩坑记录:我们最初用了线性模型,结果发现光斑在屏幕中心区域还能跟踪,一到角落就飞了。调试了很久才发现是几何模型不对。大家在做类似项目时,一定要先把坐标变换的数学关系搞透彻。
5. 稳定运行的基石:硬件电路设计
一个精密的系统离不开稳定可靠的电路。我们的电路核心主要包括电源管理和电机驱动。
电源管理:系统总电源是一块12V的锂电池。但树莓派、单片机、摄像头等模块需要5V供电。我们选用了SY8303这款DC-DC降压芯片。它效率高、开关频率高、体积小,能提供稳定干净的5V电压,是整个系统的“能量心脏”。
电机驱动与控制集成:为了提升稳定性和抗干扰能力,我们没有使用现成的开发板,而是自己设计制作了一块集成控制板。这块板上集成了:
- STM32单片机:作为主控制器。
- 步进电机驱动电路:用于产生脉冲和方向信号,驱动外置的步进电机驱动器。
- 激光笔驱动电路:提供稳定的电流驱动激光笔。
- 声光提示电路:蜂鸣器和LED,用于系统状态指示。
- 按键输入电路:用于模式切换、校准等手动操作。
将核心控制电路集成在一块板上,大大减少了连线,降低了噪声干扰,提高了系统的整体可靠性。
6. 让系统“活”起来:PID控制与程序流程
对于绿色激光的追踪,我们采用了经典的增量式PID控制算法。为什么用增量式而不是位置式?因为我们的控制对象是步进电机,我们每次关心的是“需要再转多少角度(多少个脉冲)”,而不是“要转到哪个绝对位置”。增量式PID的输出正好是控制量的增量,非常契合。
控制流程如下:
- 视觉反馈:树莓派通过滤光片方案,获取当前红色目标光斑和绿色追踪光斑的坐标
(X_red, Y_red)和(X_green, Y_green)。 - 计算误差:计算两者在屏幕上的距离偏差
E_x = X_red - X_green,E_y = Y_red - Y_green。 - PID运算:将
E_x和E_y分别送入两个独立的PID控制器(一个控制X轴,一个控制Y轴)。PID控制器的输出不再是直接的角度,而是步进电机需要运动的脉冲数增量。// 伪代码示例:增量式PID计算 float PID_Calc(PID_TypeDef *pid, float error) { float increment; pid->error = error; increment = pid->Kp * (pid->error - pid->last_error) // 比例项:误差变化量 + pid->Ki * pid->error // 积分项:当前误差 + pid->Kd * (pid->error - 2*pid->last_error + pid->prev_error); // 微分项:误差变化趋势的变化 pid->prev_error = pid->last_error; pid->last_error = pid->error; return increment; // 返回控制增量(脉冲数) } - 电机执行:单片机将PID输出的脉冲增量,转换成实际的脉冲信号发送给步进电机驱动器,驱动电机转动,带动绿色激光向减小误差的方向移动。
- 闭环循环:上述过程以几十毫秒为周期不断循环,实现实时、精准的追踪。
对于红色激光的开环控制(如走矩形框),流程就更简单了:单片机根据预设的轨迹坐标,通过前面讲到的坐标反解模型,计算出每一步电机需要转动的角度序列,然后按顺序执行即可。
7. 调试心得与注意事项
最后,分享几点实战中总结的经验:
- 校准是关键:系统上电后,必须进行严格的校准。包括云台的机械零点校准、摄像头像素坐标与实际屏幕位置的映射关系校准(我们通过让激光点打中屏幕四个角的已知标记来完成)。我们专门设计了一个“校准模式”,通过按键操作来完成这些步骤,并将校准数据保存下来。
- 机械结构要稳固:铝型材框架的投入非常值得。任何微小的晃动在1米距离上都会被放大,导致光斑抖动。确保所有连接处紧固,电机安装牢靠。
- PID参数整定:PID的
Kp,Ki,Kd参数需要耐心调试。可以先从纯P控制开始,让系统能基本跟上,然后加入I项消除静差,最后加入D项抑制超调和振荡。X轴和Y轴的参数可能不同。 - 抗干扰处理:步进电机是强干扰源。确保电机电源线与信号线、控制板电源线分开走线。在单片机电源入口处加磁珠和大电容滤波。我们的集成板设计很好地解决了这个问题。
- 功能模块化调试:不要试图一下子把整个系统调通。先调通步进电机基本转动,再调通摄像头识别单个光斑,然后调通串口通信,最后再联调PID追踪。分步走,问题更容易定位。
回过头看,这个项目获奖的关键在于对“精度”二字的深刻理解和不妥协:用步进电机细分满足角度精度,用滤光片方案保证识别精度,用非线性坐标映射保证算法精度,用集成电路和稳固结构保证系统精度。希望这套从硬件到软件的全栈解析,能帮助你理解如何攻克一个复杂的嵌入式控制项目。电赛之路不易,但把每个技术点钻透的过程,本身就是最大的收获。
