基于OpenMV的智能兵乓球拾取小车.docx
《基于OpenMV的智能兵乓球拾取小车.docx》由会员分享,可在线阅读,更多相关《基于OpenMV的智能兵乓球拾取小车.docx(23页珍藏版)》请在冰豆网上搜索。
基于OpenMV的智能兵乓球拾取小车
内容摘要
当我们跟随着现代化科学技术的脚步缓缓向前走去,社会也以一种现代化、高科技、智能时代的姿态向我们走路。
无论是日常刷着微信朋友圈的智能手机、办公室中协助完成工作的台式电脑、物联网控制下的智能家居。
这些无孔不入地高科技产品逐渐成为我们日常生活和工作中的一部分。
说到智能化,就不得不提及人工智能。
而在人工智能研究领域极里面,机器视觉又占据着极其重要的一部分。
一些基于机器视觉系统的智能化机器设备除了很大程度带动了科技社会的发展和进步,也使得人们的工作和生活更加便利。
本文便是设计了一款以Arduino开发板作为主控制器,便利人们在乒乓球比赛和训练中不需要进行人工手动捡球的捡球小车。
该智能兵乓球拾取小车是基于OpenMV机器视觉模块对目标物体进行视觉识别,摄像头获取到的图像通过相关算法检测出目标兵乓球距离以及位置信息,通过TTL串口通讯将数据传递给小车Arduino开发板控制机器运动,机器操作部分则是控制舵机转动将车身前方由亚克力板和弹力绳组成的捕获笼通过定点下落来拾取检测到的地面上固定位置的兵乓球。
用户可以通过ESP8266无线终端模式在移动端发送相关指令控制车身实现捡球小车在一定区域内进行前进、后退、左右转向、遇到障碍物进行躲避、拾取地面上散落的兵乓球功能。
关键词:
OpenMV;Arduino;乒乓球;摄像头;机器视觉
Abstract
Whenwefollowthepaceofmodernscienceandtechnology,thesocietyiswalkingtowardsusinamodern,high-techandintelligentera.Whetherit'sasmartphonewithWeChatcircleoffriends,adesktopcomputerintheofficetohelpcompletethework,orasmarthomeunderthecontroloftheInternetofthings.Thesehigh-techproductshavegraduallybecomeapartofourdailylifeandwork.Whenitcomestointelligence,wehavetomentionartificialintelligence.Inthefieldofartificialintelligence,machinevisionplaysanimportantrole.
Someintelligentmachineequipmentbasedonmachinevisionsystemnotonlygreatlypromotethedevelopmentandprogressofscienceandtechnologysociety,butalsomakepeople'sworkandlifemoreconvenient.Inthispaper,wedesignakindofballpickingcarwhichusesArduinodevelopmentboardasthemaincontroller,sothatpeopledon'tneedtopickuptheballmanuallyintabletenniscompetitionandtraining.Theintelligenttabletennispick-upcarisbasedontheOpenMVmachinevisionmoduleforvisualrecognitionofthetargetobject.Theimageobtainedbythecameradetectsthedistanceandpositioninformationofthetargettabletennisthroughtherelevantalgorithm.ThedataistransmittedtothecarArduinodevelopmentboardthroughTTLserialportcommunicationtocontrolthemachinemovement.Themachineoperationpartistocontroltherotationofthesteeringgearandtheacrylicplateinfrontofthebodythecapturecagecomposedofelasticropeandelasticropepicksupthedetectedping-pongballatafixedpositiononthegroundbyfallingatafixedpoint.ThroughESP8266wirelessterminalmode,theusercansendrelevantinstructionstocontrolthecarbodytorealizethefunctionsofmovingforward,backward,turningleftandright,avoidingobstaclesandpickingupthescatteredping-pongballsonthegroundinacertainarea.
Keywords:
OpenMV;Arduino;Tabletennis;Thecamera;Machinevision
第一章绪论
1.1课题的背景和意义
乒乓球虽然只是比赛当中的一个小球,但却是我们中国的国球。
除了专业的兵乓球手,业余爱好者也是常常会在空闲地时间与二三个志同道合的球友去兵乓球馆内进行对练。
只是每次长时间的训练结束后,地板上都能看到四处散落的兵乓球,给场地工作人员带来困扰的局面。
因此,为了便利人们在日常生活种的需求,同时减少一部分不必要的人力。
专门针对兵乓球进行拾取的捡球机器便由此应运而生。
目前市面上出售的捡球机器参差不齐,有的捡球机器进行兵乓球拾取的效率可以说是相当高效,但是其机器本身的造价也可以说是十分之昂贵,性价比并不高。
市面上也有相对便宜且无需弯腰便能进行拾取的轻便捡球网框。
后者价格虽然相比之前者要来得实惠,然而其仍然需一定的人力来进行拾取,这就相对于前者而言来得没那么便利了。
伴随着机器视觉技术跨过一个个门槛逐步“破冰”,机器视觉领域的逐步发展使得捡球器制造行业迈入新的发展阶段。
简单说来,机器视觉就像是我们自己的眼睛,用摄像头代替我们自己的眼睛来观察这个世界,同时又利用人工智能相关技术对物体进行测量和判断。
结合机器视觉技术,本文设计了基于OpenMV机器视觉模块、Arduino控制模块以及ESP8266通信模块的智能拾取兵乓球小车。
这样就方便了人们在打乒乓球时不用多次进行弯腰拾取,该智能拾取兵乓球小车通过抓取系统中机器视觉模块的标定、目标小球的识别匹配、机器小车对目标小车的定位抓取。
不仅能够简单的检测和识别乒乓球,并能够对多个小球进行拾取。
如此提高了拾取的效率,减轻了工作人员身上的包袱。
1.2智能捡球机在国外发展状况
如果把某种技术的发展史比作人的年龄,那么机器视觉就像是一位迈入而立之年正在逐渐走向成熟的中年男子。
其中智能捡球机可以算是智能制造的一个显著例子,它通过机器代替人工节省了不必要劳动力地浪费,让拾取小球的工作效率更高。
纵观整个发展,机器视觉在其中起到不可替代的作用。
在全球机器视觉市场中,美国和日本不仅占领着大半的份额,并且处于一个相当高的一个水平,像是日本的基恩士、美国的康耐视等都是有名的机器视觉公司。
美国在机器视觉方面已经从最初的实验室阶段步入了工业实际生产的应用阶段。
并且,美国在技术研发、产品生产和实际应用方面,处于一种较为均衡的状态。
像最近的一款自动捡球机器人Teninibot就是来自美国波士顿的团队设计.该机器自带的传感器能帮助其检测散落在周围的网球,通过计算机视觉和人工智能技术自动定位,机器臂就会抓取前方的小球放进后方的收纳篮里。
如果用户相应让Teninibot在规定的区域内捡球,可以在使用手机伴侣APP进行连接上Teninibot之后对其进行相应的设置。
第二章整体方案设计
2.1系统整体方案
项目以智能小车为载体,OpenMV机器视觉模块进行实时图像采集以及兵乓球定位,通过ESP8266实现网页配置。
因此基于OpenMV的智能兵乓球拾取小车一共分为三部分:
第一部分是OpenMV视觉识别的模块数据采集部分,第二部分是Arduino控制的小车行进拾取部分,第三部分是用户使用移动终端通过ESP8266对小车进行网页控制。
如图2.1为各部分功能模块:
图2.1各部分功能模块
OpenMV是以STM32H743II为内核的机器视觉模块,通过对OV5640传感器的控制获取视频信号,然后视频信号经OpenMV分析和处理,判断出乒乓球的位置,进而将视频信号中抽象出的信息通过TTL串口实现通信传递给机械运动控制终端。
同时,通过WiFi接收到的信号来控制数据的采集时间。
WeMosD1控制小车机器部分主要完成功能是:
通过TTL串口通信接收OpenMV发来的数据,判读数据后控制车身前进到对应距离,转动舵机落下捕获笼拾取乒乓球。
该模块主要由SG90舵机控制捕获笼升降、电机控制移动和避障三部分组成,其中避障主要由超声波组成,这样避免小车在寻找乒乓球过程中撞上前方障碍物。
ESP8266网页控制部分就是使用它的无线终端工作模式,作为一个无线终端连接空间内的WiFi路由器,路由器给连接的ESP8266网络设备分配独立的IP地址。
首先的就是将data文件夹相关网页上传到板载Flash,然后需要连接到一个现有的网络,通过查看手机连接热点信息可以看到IP地址,在浏览器输入IP地址可以打开网页在移动终端控制小车。
2.2系统整体框架图
图2.2系统整体框图
外部电源供电部分是通过18650锂电池进行供电,由于供电系统需要提供5V电压。
因此,通过将两节18650电池串联起来以便提供合适的电压电源给主控板以及各子模块。
CMOS摄像头将被拍摄的物体转换成数字化信号传送给OpenMV机器视觉模块,内置程序对这些信号进行相关算法的运算抽取兵乓球的特征,当程序通过面积阈值、颜色阈值匹配到眼前的物体是我们需要的进行拾取的兵乓球时就会通过参照物比例测距来定位兵乓球的位置以获取当前距离数值。
同时机器视觉模块通过PWM端口输出信号到SG90舵机模块,让舵机驱动模块等待执行相应的动作。
WeMosD1主控板与OpenMV建立软串口通讯后获取兵乓球位置信息数据,同样通过条件判断控制小车执行相应的动作,其点击驱动控制由PWM端口进行信号输出到L9110S控制电机驱动模块。
在小车执行相应动作的过程中若是遇到障碍物,超声波模块会接收到之前发送出去遇到障碍物后传回的超声波,主控板识别非接触式距离感测到的数据后会带动舵机转动超声波模块,识别左右方向是否具有空旷区域。
若有,则车身后退一定距离进行转向以躲避前方障碍物。
第三章硬件设计分析
3.1硬件总体设计
基于OpenMV的智能兵乓球拾取小车的整体构成主要硬件是WeMOSD1主控板模块、超声波测距传感器、舵机驱动、L9110S控制驱动电路以及机器视觉模块。
OpenMV的P7、P8、P9口是PWM口,舵机连接机器视觉模块上的PWM端口以及GND端口,由外部电源进行供电。
WeMosD1主控板与机器视觉模块之间通过TTL串口通讯传输数据。
通过相关代码识别数据,设置SG90舵机模块以及L9110S直流电机驱动模块相应输出端口为需要的高低电平,以控制小车执行相应的动作和主动避障。
其硬件功能框如图3.1所示:
图3.1硬件电路功能框图
主控板上有电源切换电路。
如图3.1.1所示:
图3.1.1电源切换电路[1]
运放作为比较器存在,运放输入一端接3.3V,另一端接在两个串联分压电阻中间。
两个电阻上端接外部电源,运放的另一个输入的电压为外部电源的一半。
在运放的输出端接的是PMOS的G极也就是控制端。
PMOS管相当于一个开关。
开门条件为VGS若源极电压固定,那么G极电压上升,则PMOS管就会被关闭。
VIN作为外部电源,在VIN输入小于6.6V的时候使用USBVCC作为5V电源,当VIN大于6.6V的时候切断USBVCC,通过开发板上黑色圆形的电源接口连接外部电源,经过稳压后的5V对芯片进行供电[1]。
3.2WeMosD1开发板介绍
3.2.1低功耗主控芯片介绍
WeMosD1是基于ESP8266物联网芯片的Arduino类开发板。
它与其他ESP8266板是相同的Wi-Fi板,具有D0~D15个口,有IIC、SPI、串口、AD,和板子上带了个CH340的USB转TTL的芯片。
这意味着可以使用ArduinoIDE对其进行编程。
其开发板实物图如3.2.1所示:
图3.2.1WeMosD1主控板实物图
主控板上的物联网芯片ESP8266利用WiFi联网时有三种工作模式。
第一种模式是接入点模式(ACCESSPOINT):
ESP8266建立起一个WIFI网络向外界发送WIFI信号,这个WIFI有名称,也可以设立密码。
而其他移动设备也就是我们平常使用的手机或者笔记本电脑可以通过ESP8266发射出来的WIFI信号与其进行网络连接,从而实现设备之间的通讯。
第二种模式为无线终端模式(WIRELESSSATION):
ESP8266可以作为一个无线终端连接空间内的WIFI路由器,路由器给连接的ESP8266网络设备分配独立的IP地址。
第三种模式则是混合模式:
即ESP8266同时处于接入点模式与无线终端模式的工作模式。
其连接电路图如图3.2.2所示:
图3.2.2ESP8266连接电路图
3.3OpenMV机器视觉模块
OpenMV是一个完全开源的项目,这个项目在github上有完整的硬件以及软件内容。
支持热成像和全局快门的摄像头,就像是一个机器视觉版的Arduino。
OpenMV图像处理的方法包括颜色识别、边缘检测、模块匹配、神经网络模型、特征点检测、测距等。
可以用来检测室内是否有外人随意进入、筛选工业生产中检测到的不合格的产品、对标记物进行跟踪等。
本次设计的基于OpenMV的智能乒乓球拾取小车在对散落在地面上的兵乓球进行识别检测的时候就使用到了颜色形状识别功能。
如图3.3为OpenMV4的PCB以及原理图:
图3.3OpenMV4的原理图以及PCB[2]
根据OpenMV4的原理图,我们可以基本知道部分子模块的作用。
其中USB模块为USB接口与芯片供电电路。
不仅能为芯片提供电源,而且OpenMV固件把内置2MB+外置32MB的FLASH虚拟成U盘,通过电脑上的集成开发环境OpenMVIDE与USB处接口的连接对该机器视觉模块进行代码编写、程序调试和更新固件版本等操作。
SDCARD模块电路是用来读取存储卡信息电路。
它配置了用来插入大容量TF卡存储设备的卡槽,方便用户存放程序和相关视频图片。
LED是电源指示灯模块,能够及时把OpenMV机器视觉模块的情况反映给我们使用者。
接通电源,指示灯亮起。
烧录程序,指示灯闪烁。
MT9V034为图像传感器接头电路模块,机器视觉模块集成了OV5640摄像头芯片,图像视频透过镜头照在感光芯片上把光照的强度和波长等信息转换成为电脑可以识别的数字信号,也就是我们认识的分辨率和像素。
STM32F7XXMCU:
在以STM32H74VIT6芯片为核心的单片机内部集成了一个MicroPython解释器,编写代码的时候其实是拿Python去写代码,然后保存到单片机里面运行代码。
3.4HC-SR04超声波模块工作原理
超声波模块具有四个引脚,使用时在VCC引脚接上5V电源,在GND引脚接上电源负极,然后拉低Trig端口电平后给10微秒脉冲信号,这样传感器模块就会发射超声波,超声波遇到物体返回,传感器接收到返回的超声波。
ECHO端口会有一个持续的高电平输出,持续的时间就是超声波到发射到接收的时间。
通过高电平脉冲时长,我们就可以算出传感器到被测物体之间的距离。
其计算公式为:
距离=高电平持续时间(微秒)÷29微秒/厘米(音速)÷2(来回距离)
此时测试的距离单位为厘米,转换为米则是:
距离=高电平持续时间(微秒)÷340秒/米(音速)÷2(来回距离)
我们用函数pulsen(端口,val)来读取高电平持续的脉冲时长,而这个函数有两个参数和一个返回值,第一个参数是数字端口号,第二个参数是HIGH或者LOW,它的返回值就是持续的时间,单位为微秒。
函数的功能是读取引脚的脉冲信号,被读取的脉冲信号可以是HIGH或者LOW。
例如我们要检测HIGH脉冲信号,模块将在引脚变为高电平时开始计时,当引脚变为低电平时停止计时,并返回脉冲持续时长[11]。
如果在超时时间内没有读到脉冲信号的话将返回零。
超声波测距传感器工作原理以及实物图如图3.4.1所示:
图3.4.1HC-SR04超声波模块工作原理以及实物图[3]
3.5SG90舵机模块的工作原理
在频率固定的情况下,调节脉宽的绝对时长可以控制舵机转动的角度。
一般用0.5-2.5ms的脉宽来控制舵机的角度。
以转动角度为0-180度的舵机为例,当脉宽小于0.5ms时为死区,舵机输出轴转角保持零度或稍小于零度,当脉宽等于0.5ms时,舵机输出轴转角为0度、当脉宽等于1ms时,舵机输出轴转角为45度、当脉宽等于1.5ms时,舵机输出轴转角为90度、当脉宽等于2ms时,舵机输出轴转角为135度、当脉宽等于2.5ms时,舵机输出轴转角为180度。
当脉宽大于2.5ms时为死区脉宽,舵机输出轴转角会保持在180度或稍大于180度。
舵机输出轴转角只跟脉宽时长绝对值有关系。
舵机的工作原理实际很简单,舵机的控制电路中有个脉宽比较器,通过脉宽的比较计算舵机输出轴应该保持的角度,舵机输出轴实际角度用电位器的阻值来反馈。
当实际角度与应保持的角度不一致时,舵机电路驱动电机正转或反转,通过齿轮组把舵机的输出轴调节到应该保持的位置。
如图3.5为转角与脉宽时长关系以及实物图:
图3.5转角与脉宽时长关系以及实物图[4]
3.6L9110S直流电机驱动模块
L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,主要用于小车马达控制驱动。
[5]两个直流电机分别由OA和OB输出控制,它们对应的控制端分别为L9110A的IA、IB和L9110B的IA、IB.当接通VCC和GND时电源指示灯亮起。
当L9110A的IA输入高电平而IB输入低电平时,电机向正方向转动;当L9110B的IA输入低电平而IB输入高电平时,电机向反方向转动。
L9110S直流电机驱动模块原理图以及L9110S实物图如图3.6所示:
图3.6L9110S直流电机驱动模块原理图以及L9110S实物图
第四章软件设计分析
4.1主程序设计
采用ArduinoIDE作为编程软件来进行相关程序的编程。
基于OpenMV的智能兵乓球拾取小车包含HC-SR04超声波模块、SG90舵机拾取模块、L9110S直流电机驱动控制小车运动模块、OpenMV机器视觉模块,通信系统模块等。
由于ESP8266可以作为一个无线终端连接空间内的WIFI路由器,同时路由器给连接的网络设备分配独立的IP地址。
使用前对ESP8266相关初始化设置,首先建立网络服务器对象ESP8266WebServer,该对象用于响应HTTP请求,监听端口80。
设置连接其作为无线终端连接的局域网的名称以及密码。
连接之后打开分配的IP地址,浏览器就会自动请求芯片内存中SPIFFS区域的网页资源。
用户可以在打开的移动端上选择相应的功能将指令发送到小车的主控板上执行相应的动作。
功能分别有前走、后退、左转、右转、停止、避障、捡球。
其中,捡球指令是通过主控板与机器视觉模块之间的双向数据传输实现的。
WeMOSD1板内置的引脚0和2支持串口通信,使用SoftwareSerial库可以与OpenMV进行软串口通讯进行数据传输。
其整个数据传输过程大致为:
主控板发送捡球指令-机器视觉模块开始实时传输数据到主控板上-主控板程序根据数据判断相应动作执行的条件。
总体程序流程图如图4-1所示。
图4.1总体程序流程图
4.2子程序设计
4.2.1小车行进控制子程序
小车在行进过程中,超声波模块遇到障碍物会反射超声波,通过函数读取脉冲时长获得小车与障碍物之间的距离。
当距离过近时,Arduino首先控制电机停止转动,之后舵机控制超声波模块左右转动,比较传感器传回来的左右区域距离数值,区域较为空旷的区域,小车转向,继续前进,流程图如图4.2.1所示:
图4.2.1子程序流程图
4.2.2拾取兵乓球子程序
在这一过程中,OpenMV同时会实时拍摄前方地面图像,图像中出现圆形黄色色块时,通过参照物距离的三角几何函数关系公式的计算,得出与兵乓球相距的距离。
小车一边前进,一边接收从OpenMV传过来逐渐减小的距离数值。
当兵乓球进入抓取范围,距离数值接近小车上方捕获笼到舵机的距离时,OpenMV控制两个舵机同时以相反方向转动一定角度让兵乓球落入捕获笼,流程图如图4.2.2所示:
图4.2.2小车行进控制子程序流程图
实时摄像之前要进行相应的初始化设置。
首先要先清除掉之前摄像头存在的代码对于图片的设置,然后设置图片格式RGB565,这个565是说存储RGB三个通道每个通道存储像素值所对应的二进制位分别是5,6,5[2]。
同时还要设置采集到图片的分辨率,跳过一些刚开始不稳定的时候再开始读取图像。
由于在机器视觉模块中白平衡是默认开启的,所以在颜色识别中,一定要关闭白平衡。
之后就是追踪帧率以及设置串口通讯的波特率[6]。
相关代码如下:
sensor.reset()sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(10)
sensor.set_auto_whitebal(False)
clock=time.clock()
uart=UART(3,115200,timeout_char=1000)
OpenMV通过接收到ESP8266作为无线终端传来的指令执行相应命令,此时机器视觉模块接收到的是字符串数据类型。
因为JSON通常用于在Web客户端和服务器数据交换,即把字符串类型的数据转换成Python基本数据类型或者将Python基本数据类型转换成字符串类型[7]。
若小车前进直到处于拾取兵乓球的范围内,舵机反向转动同样的角度使得捕获笼落下,设定拾取过程持续5秒,之后舵机重新转动返回原位。
相关代码如下:
iflength<=70anda==b'a\r\n':
fori