目录(获取原文及完整代码进入主页)
摘要:
作品选用STM32F401最小系统为核心板,用舵机搭建二维云台,选用OpenMV、L10雷达测距模块测量目标物的形态尺寸以及与装置的距离,测量结果从串口输出显示在OLED屏上。
本作品能精准识别出正方形、正三角形、圆形并计算出的目标物体所对应边长,测量尺寸误差大致在±5cm左右。此外该作品还能在较短时间内识别出排球、篮球、足球的类别并测距,测距的误差约为±5cm左右。
关键词:非接触式测量,机器视觉,激光测距,人机交互
一、系统方案论证与比较
1.1 系统结构
该系统主要由STM32F4系列单片机,机器视觉模块,激光测距模块,人机交互模块以及二维云台组成。机器视觉模块识别物体形状和尺寸,激光测距测量被测物与该测量装置的距离。两者所测数据返回给单片机,单片机控制云台完成指定任务后将测量数据显示在人机交互模块上。
图1 系统结构图
1.2 方案选择与比较
1.2.1方案一
采用OpenCV识别测量物体形状尺寸距离,组态屏显示测量数据。
优点:机器视觉部分摄像头选择范围较广,成像清晰,对测距模块要求较低。人机交互界面 清晰,字体较大视觉效果好。
缺点:机器视觉程序编写耗时更多,组态屏面积较大,占用空间更多。
1.2.2 方案二
用OpenMV测形状尺寸,L10模块测量距离,用OLED显示测量数据。
优点:机器视觉开发参考资料丰富编写耗时短,测距精度更高,布局精简。
缺点:摄像头像素较低且无法更换,识别误差偏大,对后期调试要求较高。
1.2.3 方案选择及论证
小组最终选用方案二。经讨论,小组决定采用OpenMV测形状尺寸,在保证精度尽可能高的情况下,降低分辨率不断调试阈值即可。与方案一相比,小组在方案二上花费的时间预计更少,最终呈现效果也能达到题目要求。
二、理论分析与计算
2.1 图形识别分析
OpenMV已经将图片处理封装成各类模块供我们使用,要完成本作品必需对所涉及的模块使用方式有所了解。
圆形识别所需的函数为image.find_circles其使用方法如下:
image.find_circles([roi[,x_stride=2[,y_stride=1[, threshold=2000[, x_margin=10[,y_margin=10[,r_margin=10[,r_min=2[,r_max[,r_step=2]]]]]]]]]])
# Circle对象有四个值: x, y, r (半径), 和 magnitude。
# x_stride 是霍夫变换时需要跳过的x像素的数量。若已知圆较大,可增加 x_stride 。
# y_stride 是霍夫变换时需要跳过的y像素的数量。若已知圆较大,可增加 y_stride 。
# roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。
# threshold 控制从霍夫变换中监测到的圆。只返回大于或等于 threshold 的圆。
# r_step 控制如何逐步检测半径。默认为2
# r_min 控制检测到的最小圆半径。增加此值可以加速算法。默认为2
正方形形识别所需函数使用方法:
image.find_rects([roi=Auto, threshold=10000])
#threshold 小于 threshold 的矩形会从返回列表中过滤出来
#roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。
正三角形识别所需函数使用方法:
image.find_line_segments([roi[,merge_distance=0[,max_theta_difference=15]]])
#merge_distance 指定两条线段之间的可以相互分开而不被合并的最大像素数。
#max_theta_difference 是上面 merge_distancede 要合并的的两个线段的最大角度差值。
2.2 激光测据原理分析
本装置测距采用的是基于TOF技术的高速单线激光雷达L10。TOF是“time of flight”的简称,TOF相机是一种深度成像相机,通过3D sensor 向目标物体发射已到光束,,通过测量光在镜头和物体之间的传输时间来测距,从而通过多光纤实现深度图,达成3D立体深度感应,从而获取3D图像。激光器发射一个激光脉冲,并由计时器记录下出射的时间,回返光经接收器接收,并由计时器记录下回返的时间。两个时间相减即得到了光的“飞行时间”,而光速是一定的,因此在已知速度和时间后很容易就可以计算出距离。
图2 测距原理示意图
三、电路与程序设计(完整代码私聊我获得)
3.1 系统总体设计
系统框图如图3-1-1所示。12V直流稳压电源通过5V和3.3.V稳压模块分别向单片机和OpenMV供电;目标物体的水平距离通过激光测距模块读取,并转化为距离数字量传回单片机中;目标物体的几何形状以及坐标通过OpenMV的颜色识别读取,并转化为位置数字量传回单片机中;单片机将激光测距模块读取的距离数据处理后传给OpenMV,OpenMV经比例计算后返回物体边长的数字量;最后单片机将目标物体的形状、边长和距离数据传给OLED显示;进入自动寻找目标时,单片机根据OpenMV传回的坐标数据控制云台舵机转动角度;当测量结果稳定后启动声光提示,表示当前测量任务完成;单片机的电平信号可控制由发光二极管和有源蜂鸣器组成的声光提示部分。
图三 系统整体设计图
3.2 最小系统拓展板
图4 最小系统拓展板原理图
图5 最小系统拓展板PCB图
3.3 声光提示电路
当测量任务完成时,PB2输出高电平。因为本装置选用的是有源蜂鸣器,故PB2输出高电平蜂鸣器启动,LED灯点亮。
图6 声光提示电路图
3.4 程序设计
使用STM32F401单片机。题目的不同任务由相同控制模块组合完成,故程序设计说明通过介绍各功能模块说明。
图7 激光测距流程图
图8 水平控制流程图
激光测距流程图如图7所示,获取距离数据后返回单片机,单片机再返给OpenMV做边长估算。水平位置控制流程图如图8所示。
四、测试方案与测试结果
4.1 测试方案
在保证目标物体的中心与测量装置测量中心在同一水平线的情况下,重复测量同一平面图形形状、边长、距离数据取平均值,并计算测量精度。更换目标图形后重复上述实验内容。
让目标物体出现在规定测量范围内任意位置,重复上述测试方案:记录距离、形状、边长,激光定位点与中心点的直线距离,计算测量精度。
4.2 测试结果记录
中心点对齐情况下测量精度测试数据详见表4-2-1。分别在距离装置2米、2.5米、3米的情况下,目标物体的形状、尺寸、距离。
表4-2-1 中心点对齐时精度测试记录表
次数 | 参考值 | 测量值 | ||||
形状 | 边长(cm) | 距离(cm) | 形状 | 边长(cm) | 距离(cm) | |
1 | 正方形 | 36 | 200 | 正方形 | 34 | 197.9 |
2 | 30 | 250 | 正方形 | 32 | 247.7 | |
3 | 38 | 300 | 正方形 | 40 | 296.1 | |
4 | 圆形 | 35 | 200 | 圆形 | 36 | 202.2 |
5 | 40 | 250 | 圆形 | 40 | 253.6 | |
6 | 36 | 300 | 圆形 | 34 | 293.4 |
自动跟随精度测试:
测试所得数据详见4-2-2。中心点不固定对齐,在允许范围内任意放置目标物体重复上述操作。
表4-2-2 自动跟随测量精度测试记录表
次数 | 参考值 | 测量值 | |||||
形状 | 边长(cm) | 距离(cm) | 形状 | 边长(cm) | 距离(cm) | 中心偏差(cm) | |
1 | 正方形 | 36 | 200 | 正方形 | 37 | 201 | 5 |
2 | 30 | 250 | 正方形 | 33 | 248.1 | 4 | |
3 | 38 | 300 | 正方形 | 34 | 301.2 | 6 | |
4 | 圆形 | 35 | 200 | 圆形 | 34 | 204.4 | 3.8 |
5 | 40 | 250 | 圆形 | 40 | 253.9 | 4.3 | |
6 | 36 | 300 | 圆形 | 34 | 301.9 | 3 | |
7 | 三角形 | 32 | 200 | 三角形 | 33 | 203.8 | 2.1 |
8 | 34 | 250 | 三角形 | 34 | 253.1 | 3.2 | |
9 | 39 | 300 | 三角形 | 39 | 299.4 | 1.8 | |
10 | 篮球 | 200 | 篮球 | 196 | |||
11 | 排球 | 250 | 排球 | 248 | |||
12 | 足球 | 250 | 足球 | 244.6 |
五、设计总结(获取原文及代码可主页联系获取)
5.1 特色创新
我们作品的特色在于,在前期调试过程中,我们把一些有用的参数通过oled显示出来,通过按钮微调参数,实现更加精准与便捷的调参过程。并且我们设计了一个舵机占空比函数,通过角度调整占空比,从而使舵机的角度位置调节更加精确。我们最后的发挥部分,通过双舵机配合,通过正逆运动学解算出了所需转动角度。
5.2 误差分析
作品误差一是来自于环境光线的影响,调试的时间不是固定的,光线有所变化,不同光线下机器所捕捉的颜色会有差别,极易造成误判。二来是OpenMV模块自带像素较低,对尺寸的估计比较粗略,偏差必然是存在的。再者是装置搭建时存在结构误差,导致中心点的偏离。前两者的误差都能通过软件调节
5.3 心得总结
在本次电赛G题中,我们组程序采用的是市面上最流行的HAL库编程,在做比赛的过程中,我们遇到了非常多的困难,在这期间也见过比赛中途退赛的同学,但我们坚持下来了,通过比赛学到了非常多的知识。在第一天,我们控制oled显示数据,根据自己所掌握的知识和网上的资料,我们试了无数次程序,每一次都不能成功,第一天就差点崩溃,甚至一度怀疑自己的能力,直到第二天,竟然发现我们新开封的oled竟然是个坏的,简直不敢相信会遇到这种事。在后面的几天中,也遇到莫名其妙的bug,比如头天晚上能成功运行的程序,到了第二天早上,却神奇的发现不能指示目标点中心,后来仔细检查发现,云台在经过多次旋转后,其中的一根导线虚短了,浪费了我们很多时间。通过这次比赛我们进行了一次为期四天的科研经历,确实学习到很多知识,熬夜通宵是常态,明白了在科研面前不能放弃,坚持下来,就一定能把实物做出来,最后,希望能够收获到不错的成绩!