摘要:针对本题目的各项要求,本研究采用软硬件结合的方法设计了一套运动目标控制与自动追踪系统。该系统由OpenMV嵌入式计算机视觉平台、STM32单片机控制模块、摄像头模块、显示屏模块、人机交互系统以及二轴舵机云台和激光笔构成一个闭环控制系统。摄像头模块用于采集图像信息,经由OpenMV进行图像数据处理,并通过PID精确算法调节舵机,从而控制激光笔的光斑在屏幕上按照设定程序进行移动。本系统实现了以激光笔的光斑作为运动控制目标的自动追踪系统,包括复位功能、沿屏幕运动、沿A4纸边缘运动以及自动追踪光斑等功能。系统在完成任务要求的同时表现出良好的鲁棒性。此外,本系统还具备人机交互界面,各参数及测试模式可由按键输入,并通过显示屏直观地显示,具有智能性和快速的反应速度。
关键词:嵌入式计算机视觉、运动目标控制、目标检测、目标追踪
Abstract: In view of the requirements of this topic, this system adopts a combination of software and hardware to design a motion target control and automatic tracking system. The closed-loop control system consists of OpenMV embedded computer vision platform, STM32 microcontroller control module, camera module, display module, human-computer interaction system, two-axis steering machine gimbal and laser pointer. The camera module collects image information, processes the image data through OpenMV, and adjusts the servo through the PID precision algorithm to control the spot of the laser pointer and move on the screen according to the set program. This system realizes the functions of reset, movement along the screen, movement along the edge of A4 paper, automatic tracking of the spot and other functions of the automatic tracking system with the spot of the laser pointer as the motion control target, and can accurately complete the task requirements with good robustness. In addition, the system has a human-computer interaction interface, each parameter and test mode can be entered by the button and displayed through the display screen, good intelligence, fast response.
Keywords: Embedded Computer Vision, Motion Target Control, Object Detection, Object Tracking.
目 录
目录
一、 系统方案... 1
1、 嵌入式视觉平台的论证与选择... 2
2、 单片机的论证与选择... 2
2、电机的论证与选择... 2
3、控制算法的论证与选择... 3
二、理论分析与计算... 3
1、矩形位置检测... 3
2、二轴云台控制分析... 4
3、控制算法分析... 4
4、斜线运动控制... 4
三、 电路与程序设计... 5
1、 电路设计... 5
(1)系统总体框图... 5
(2) 硬件连接图... 5
四、 测试方案与测试结果... 6
1、测试方案... 6
2、测试条件与仪器... 6
3、测试结果与分析... 6
1、测试结果... 6
2、测试分析和结论... 8
五、 结论与心得... 8
六、 参考文献... 8
附录:核心源程序... 9
运动目标控制与自动追踪系统(E题)
【本科组】
系统方案主要描述了针对研究的要求,采用软硬件结合的方法设计了一个运动目标控制与自动追踪系统。该系统由多个模块组成,包括OpenMV嵌入式计算机视觉平台、STM32单片机控制模块、摄像头模块、显示屏模块、人机交互系统、二轴舵机云台和激光笔,构成一个闭环控制系统。摄像头模块负责采集图像信息,然后通过OpenMV进行图像数据处理。处理后的图像数据用于控制PID算法调节舵机,从而实现对激光笔光斑在屏幕上按照设定程序进行移动的控制。下面分别论证这几个模块的选择。
方案一:采用OpenMV嵌入式计算机视觉平台
OpenMV是一个基于MicroPython的嵌入式计算机视觉平台,使用ARM微控制器。开发者可以使用Python语言编写图像处理和计算机视觉应用,无需深入了解底层硬件编程。它专注于图像处理和计算机视觉任务,提供丰富的图像处理库和示例代码。OpenMV配备了图像传感器和其他传感器,可以直接连接摄像头、显示屏、Wi-Fi模块等设备。
方案二:采用K210嵌入式计算机视觉平台
K210是一种由中国公司寒武纪(Kendryte)开发的系统级芯片(SoC)。它采用RISC-V架构,是一种开源的指令集架构,支持低功耗和高性能。K210芯片主要用于机器学习和人工智能应用,如物体识别、语音识别等。它在物联网设备、智能摄像头、智能家居等边缘计算设备中广泛应用。
总结:
OpenMV作为一个简单易用的嵌入式计算机视觉平台,适合初学者和快速原型开发。它的重点是图像处理和计算机视觉任务,并提供丰富的库和示例,使得开发者能够更快速地实现各种视觉应用。而K210则更适用于专业机器学习和边缘计算领域,具备更高的计算性能和灵活性。因此本设计采用OpenMV嵌入式视觉平台。
方案一:采用STC51单片机
STC51是一种基于Intel 8051核心的单片机,采用CISC架构。它在嵌入式系统中有着广泛的应用,历史悠久,生态丰富。STC51单片机相对较为简单,易于学习和使用,适合入门级开发者。它拥有一些基本的外设和功能,但在计算能力和性能方面相对较弱。对于较简单的控制任务和低性能要求的应用,STC51可以是一个经济实惠的选择。
方案二:采用以ARM Cortex-M3为内核的STM32F1系列控制芯片
STM32是一种基于ARM Cortex-M核心的单片机,采用RISC架构。它具有强大的计算能力和丰富的外设,适用于复杂的嵌入式应用。STM32单片机有多个系列,不同系列的芯片有着不同的性能和功能,满足不同需求。它支持多种编程语言,包括C和C++,也支持RTOS系统,适合中高级开发者。STM32单片机在性能、功耗、稳定性等方面都有优势,适用于较复杂的控制任务和性能要求较高的应用。
综合考虑,选择使用STM32单片机控制舵机云台是更合理的选择,因为它提供了更好的性能,所以本设计选择方案二。
2、电机的论证与选择
方案一:采用带编码器的直流减速电机
直流电机是一种最常见的电机类型,它的工作原理是通过直流电流在电磁场中产生力矩,从而驱动电机转动。直流电机在没有反馈控制的情况下,不容易实现精确的位置控制。
方案二:采用舵机
舵机是一种特殊类型的直流电机,它与普通直流电机相比具有额外的反馈控制回路,通常是一个位置反馈传感器(如编码器)。舵机可以精确地控制电机的位置,通过控制脉宽信号来实现精确的角度调节,通常具有较高的角度分辨率。舵机适用于需要精确位置控制的场景,如机器人、摄像云台、航模等。舵机的结构也相对简单,成本较低,但由于加入了反馈控制,相比普通直流电机稍微贵一些。
选择使用舵机作为云台电机是较为合理的选择。舵机具有精确的位置控制能力和较低的成本,在实现云台旋转和角度调节时具有优势。
3、控制算法的论证与选择
方案一:采用开环算法
开环控制是一种简单的控制方法,其中输出信号不受系统反馈信息的影响。在开环控制中,输入信号直接作为控制器的输出信号,用于云台电机控制。开环控制没有对输出信号进行监测和调整的机制,因此无法纠正外部干扰和内部误差,导致系统的稳定性和精确性较差。在开环控制中,系统的性能高度依赖于模型的准确性和环境条件的稳定性。对于复杂系统或存在不确定性的环境,开环控制的性能可能会受到较大影响。
方案二:采用闭环控制
闭环控制是一种基于反馈的控制方法,其中输出信号受系统反馈信息的影响。在闭环控制中,输出信号被反馈给控制器,并与期望信号进行比较,然后根据误差来调整控制器输出,以实现对输出信号的精确控制。闭环控制可以实时纠正外部干扰和内部误差,提高系统的稳定性和精确性,使系统能够更好地适应不确定性和变化的环境条件。在闭环控制中,采用合适的控制算法(如PID控制算法)可以优化系统的性能,使系统更快地响应控制信号,减少超调和稳态误差。PID控制算法按比例、积分、微分的函数关系,进行运算,将其运算结果用以输出控制。优点是控制精度高,是控制系统非常普遍的运算方法。对于本系统的控制已足够精确。
综上所述,选择使用闭环控制,并采用PID算法控制激光笔是较为合理的选择。闭环控制能够实时纠正误差,提高系统的稳定性和精确性,而PID算法能够优化系统的性能,使激光笔具有快速响应和灵活性,适用于实现精确的运动控制。
二、理论分析与计算
1、矩形位置检测
OpenMV为开发者提供了Python API和丰富的图像处理库,这使得实现矩形检测变得相对简单和高效。通过结合OpenMV的强大功能和易用性,可以轻松地实现矩形检测功能。
OpenMV对采集到的图像进行预处理,例如灰度化、二值化等。这些预处理步骤有助于减少图像中的噪声并简化后续的图像处理。在预处理后的图像上执行边缘检测算法,例如Canny边缘检测,以识别矩形的边缘。基于边缘检测的结果,进行轮廓检测,找出图像中的所有轮廓。对检测到的轮廓进行筛选,通过设置阈值和条件来排除不符合矩形特征的轮廓。对经过筛选的轮廓进行拟合,找出最接近的矩形。OpenMV通常使用旋转矩形(rotated rectangle)来拟合,因为它可以适应旋转的矩形。
二轴云台是一种常见的云台类型,它可以在两个轴(通常是水平和垂直方向)上进行转动。二轴云台广泛应用于摄像机、激光雷达、传感器等设备的定向控制,以及机器人、无人机等需要精确转动的系统中。
水平轴通常用于实现云台在水平方向上的转动。垂直轴通常用于实现云台在垂直方向上的转动。
3、控制算法分析
采用PID算法来光斑在屏幕的位置。开始工作后,实时检测屏幕上光斑的位置,并与设定的目标位置比较,进行PID控制。其PID结构原理如图1,PID分别表示光斑的位置比例(P)、位置误差(I)、位置积分(D)。
P:对目标位置与当前位置偏差e(t)进行调整,系数越大调节速度越快,减小误差,但是过大的比例,会造成舵机速度状态的突变,从而导致云台状态不稳定
I:加入积分调节,可以消除系统的稳态误差,提高无误差度。系统的稳定性下降,动态响应变慢。
D:微分调节反应的是光斑的角速度,可以预见偏差变化的趋势具有可预见性因而可以产生超前调节,加入微分调节可以改善系统的动态性能。
PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其PID控制器的传递函数为:
其中,KP, KI 和KD为PID控制器的比例,积分和微分参数。
(1)系统总体框图
自己用VISIO画
图1 系统总体框图
图2 硬件连接图
2、程序结构与设计
控制二轴云台控制激光笔在屏幕上精准移动时,程序结构如下:
初始化: 在程序开始时,进行系统初始化,包括初始化OpenMV、舵机、传感器、Stm32单片机和通信接口等。
设定目标位置:在程序中设定激光笔在屏幕上的目标位置。目标位置通过OpenMV识别到矩形后,通过插值法计算获得。
主循环: 进入主循环,程序会不断执行以下步骤:
a. 获取传感器反馈: 读取舵机或电机的位置信息,获取当前云台的姿态。
b. 计算误差: 将目标位置与当前位置进行比较,计算出误差。即,目标位置与实际位置之间的差距。
c. PID控制器计算: 将误差输入PID控制器,根据PID算法计算出控制信号。PID控制器会根据比例系数Kp、积分系数Ki和导数系数Kd对误差进行加权计算,得到控制信号。
d. 控制信号输出: 将PID计算得到的控制信号转换为PWM信号,并发送给舵机,控制云台的转动。
e. 限制和安全检查: 对于舵机或电机的控制信号,进行范围限制,确保云台不超出安全转动范围,并避免碰撞。
f. 重复运行: 以上步骤会在循环中不断运行,直到激光笔移动到设定的目标位置。在运动到目标位置后,控制器可以进入静止状态或继续接收新的目标位置。
优化和调试: 进行系统调试和优化,根据实际情况调整PID参数(Kp、Ki、Kd)以及采样频率等参数,使云台运动更加稳定和精确。
中断程序: 当按下中断按钮时,程序会进行中断,舵机停止运动。
1、测试方案
2、测试条件与仪器
3、测试结果与分析
1、测试结果
(1)基本要求的测试
1)设置运动目标位置复位功能。执行此功能,红色光斑能从屏幕任意位置
回到原点。光斑中心距原点误差≤2cm
表B-1 基础部分1测试结果
次数 |
1 |
2 |
3 |
4 |
5 |
距离(cm) |
1.1 |
1.3 |
0.9 |
0.7 |
1.5 |
2)启动运动目标控制系统。红色光斑能在 30 秒内沿屏幕四周边线顺时针
移动一周,移动时光斑中心距边线距离≤2cm。。
次数 |
1 |
2 |
3 |
4 |
5 |
转动用时间(s) |
6.2 |
6.4 |
5.8 |
5.5 |
6.5 |
表
B-2 基础部分2测试结果
3)用约 1.8cm 宽的黑色电工胶带沿 A4 纸四边贴一个长方形,构成 A4 靶纸。将此 A4 靶纸贴在屏幕自定的位置。启动运动目标控制系统,红色光斑能在30 秒内沿胶带顺时针移动一周。超时不得分,光斑完全脱离胶带一次扣 2 分,连续脱离胶带移动 5cm 以上记为 0 分。
表B-3 基础部分3测试结果
次数 |
1 |
2 |
3 |
4 |
5 |
转动用时(s) |
2.1 |
2.2 |
2.3 |
2.6 |
3.0 |
4)将上述 A4 靶纸以任意旋转角度贴在屏幕任意位置。启动运动目标控制
系统,要求同(3)。
表B-4 基础部分4测试结果
次数 |
1 |
2 |
3 |
4 |
5 |
转动用时(s) |
2.8 |
3.5 |
3.4 |
2.5 |
2.5 |
(2)发挥部分的测试
1)运动目标位置复位,一键启动自动追踪系统,控制绿色光斑能在 2 秒
内追踪红色光斑,追踪成功发出连续声光提示。此时两个光斑中心距离应≤3cm。
表B-5 发挥部分1测试结果
次数 |
1 |
2 |
3 |
4 |
5 |
追踪用时(s) |
1.2 |
1.1 |
1.3 |
1.4 |
14 |
距离(cm) |
2.0 |
1.6 |
1.4 |
1.4 |
1.8 |
2)运动目标重复基本要求(3)~(4)的动作。绿色激光笔发射端可以放置在其放置线段的任意位置,同时启动运动目标及自动追踪系统,绿色光斑能自
动追踪红色光斑。启动系统 2 秒后,应追踪成功,发出连续声光提示。此后,追踪过程中两个光斑中心距离大于 3cm 时,定义为追踪失败,一次扣 2 分。连续追踪失败 3 秒以上记为 0 分。
表B-6 发挥部分2的任务1测试结果
次数 |
1 |
2 |
3 |
4 |
5 |
追踪用时(s) |
1.2 |
1.2 |
1.0 |
1.8 |
1.1 |
距离(cm) |
2.1 |
1.5 |
1.4 |
1.5 |
1.4 |
表B-7 发挥部分2的任务2测试结果
次数 |
1 |
2 |
3 |
4 |
5 |
追踪用时(s) |
1.2 |
1.2 |
1.0 |
1.8 |
1.1 |
距离(cm) |
2.1 |
1.5 |
1.4 |
1.5 |
1.4 |
自由发挥
在完成题目规定要求后,对系统做了进一步加强,实现了双系统使用激光笔在屏幕上高频闪烁,用摩斯码进行可见光通信。
2、测试分析和结论
根据上述测试数据,可以得出以下结论:
(1)能够很好的完成基本功能和发挥功能。
(2)完成任务的时间较快。
综上所述,本设计基本达到设计要求。
此次电子设计大赛我们收获颇丰,在整个过程中,我们不仅在通力合作中体会到了团结的重要性。还将理论与实践结合了起来,培养了一定的科研能力,拓宽了知识面。一步一步的解决相应的任务;逐步的实现了任务需求。展望未来,智能车技术必将在更广阔的领域广泛应用,
在这比赛的最后,要感谢学校和学院老师的给力的后勤工作,使我们能够在不被烦扰的情况下,用最充足的时间完成比赛。感谢全国大学生电子设计大赛的组委会,提供这样优秀的平台和机会给我们充足的锻炼。
[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2012.
[2]黄智伟.全国大学生电子设计竞赛训练教程.北京:电子工业出版社,2005.
[3]王福瑞等.单片微机测控系统设计大全[M].北京航空航天大学出版社,1998(331-337).
[4]童诗白. 模拟电子技术基础 第三版. 北京:高等教育出版社,2001.1.
附录:核心源程序
主函数:
from machine import Pin
import sensor, image, time
import pyb
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA) # 设置图像大小为160*120
sensor.set_auto_whitebal(True) # 设置自动白平衡
sensor.set_brightness(3000) # 设置亮度为3000
sensor.skip_frames(time = 20) # 跳过帧
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# -----矩形框部分-----
# 在图像中寻找矩形
for r in img.find_rects(threshold = 10000):
# 判断矩形边长是否符合要求
if r.w() > 20 and r.h() > 20:
# 在屏幕上框出矩形
img.draw_rectangle(r.rect(), color = (255, 0, 0), scale = 4)
# 获取矩形角点位置
corner = r.corners()
# 在屏幕上圈出矩形角点
img.draw_circle(corner[0][0], corner[0][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
img.draw_circle(corner[1][0], corner[1][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
img.draw_circle(corner[2][0], corner[2][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
img.draw_circle(corner[3][0], corner[3][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
# 打印四个角点坐标, 角点1的数组是corner[0], 坐标就是(corner[0][0],corner[0][1])
# 角点检测输出的角点排序每次不一定一致,矩形左上的角点有可能是corner0,1,2,3其中一个
corner1_str = f"corner1 = ({corner[0][0]},{corner[0][1]})"
corner2_str = f"corner2 = ({corner[1][0]},{corner[1][1]})"
corner3_str = f"corner3 = ({corner[2][0]},{corner[2][1]})"
corner4_str = f"corner4 = ({corner[3][0]},{corner[3][1]})"
print(corner1_str + "\n" + corner2_str + "\n" + corner3_str + "\n" + corner4_str)
# 显示到屏幕上,此部分会降低帧率
# 打印帧率
print(clock.fps())