姚贵发 YAO Gui-fa;殷睿新 YIN Rui-xin;李金乘 LI Jin-cheng
(广东岭南职业技术学院,清远 511500)
环保是近几年来一直热议的话题,针对环保而衍生出来的技术也不在少数,其中水面漂浮物的治理是近年来备受关注关注的话题,在浅海区域、江河湖泊水面漂浮物问题越发严重。因为吞食垃圾造成死亡的海洋生物、淡水生物不计其数。该现象的产生主要是由于人类随意排放垃圾造成。其中塑料类水面漂浮垃圾既难清理,也不易降解。漂浮在水面日积月累后将对水域形成灾难性的破坏。针对水面漂浮物治理的办法,国内外都做过不少研究,提出的治理方案不在少数。
水面漂浮类大多以塑料垃圾为主,有着体积小、移动快、难以清理的特性。目前解决水面漂浮物的办法主要有人力打捞、清理船打捞、划分区域治理等措施。对于小规模的采用人力打捞,比如城市河道、公园等,但这种方式工作效率低,打捞过程容易遗漏不能全面清洁,且无法长时间工作,实时预防,可针对的水域也较少;清理船打捞可用于在大面积水域的清理工作,但这种方式能耗大,同样需要人员操作船只;划分区域治理是目前效率较高的,具有效率高、清理效果好,还可利用太阳能为自身进行能源供给等优点,但划分区域治理设置相对固定成本高,适用于海洋治理。对小湖泊、内陆河道来说无法开展治理工作。
设计研究一款基于OpenMV的水面漂浮物清理系统的水上清洁卫士,其能够实现无人化远程控制,快速收集水面漂浮垃圾的自动装置。取代人力打捞、大型设备清理等方法。具备灵活投放、随时站岗、自动清洁等功能。
水上清洁卫士主要以Arduino、OpenMV垃圾收集器、巡航船、船体支架、水下推进器、船体支架、监控摄像头、电池电源等结构组成。
水上清洁卫士有两种模式:
自动模式的时候OpenMV负责识别水面漂浮物,当识别到水面上有垃圾时,就会向Arduino发送信号,Arduino接收到之后就会驱动无刷直流电机,无刷直流电机带动涡轮旋转,使水上清洁卫士前往漂有垃圾的水域进行收集;
手动模式下,可以通过手机对水上清洁卫士进行操控,利用手机APP操控设备进行移动;如图1所示。
图1 工作流程图
Arduino是基于ATmega328的主控开发板。Arduino是采用USB接口的核心电路板。本文主要用其对无刷直流电机进行操控,和连接JDY-18蓝牙模块。
当OpenMV识别到水上漂浮物,并要让水上清洁卫士前往清理,首先需要将识别到的信息通过串口发送给Arduino,由于Arduino串口有限,其还需要向无刷直流电机输出信号,无法同时做到接受和发送,因此要想实现与OpenMV进行通讯,还需要设置模拟串口用来接受OpenMV发送过来的信息。
Arduino与OpenMV进行通讯需要准备3根线:TX、RX、GND。TX为发送端,RX为接收端,GND为接地线,接线时只要将Arduino与OpenMV的TX和RX交叉接线即可。此种设计下的传输速度是可控的,可以设置两者的通信传输速率为9600波特率或者4800波特率,具体数值可根据实际情况灵活选择[1]。
OpenMV是一个以STM32F765VI ARM Cortex M7处理器为核心,集成了OV7725摄像头芯片的机器视觉模块,其搭载了Micro Python解释器,可用Python语言高效地实现核心机器视觉算法[2]。OpenMV机器视觉算法包括物体检测、寻找色块、人脸检测、颜色跟踪等功能,可以用来实现产品的分类、残次品筛选、非法入侵检测、跟踪固定的标记物等,具有稳定性高、传输效率高等特点[3]。
OpenMV采用的是单目摄像头,单目摄像头要想实现测距,需要选择一个参照物,利用参照物大小的比例来计算距离。
假设在单目摄像头前放一个小球,根据小孔成像原理,小球距离摄像头越远,摄像头里的小球则越小。
其中的Ap(Apix)表示摄像头图像的像素;Bp(Bpix)表示被测小球的直径的像素;α为视场角;Lm为被测目标物体与摄像头的距离;f为相机焦距,焦距f的长短决定了相机所拍摄的目标物体的成像大小、视场角大小、景深大小,以及画面的透视强弱。当对同一物距的同一目标物体拍摄时,f越大,α越小;f越小,α越大。
由图2的几何关系可得下列公式(1)和公式(2):
图2 小孔成像原理示意图
可得公式(3):
根据图2中右边真实环境中的几何关系得公式(4):
将公式(4)代入公式(3)得:
由所得公式可知:实际长度和摄像头里的像素成反比。简单来说就是距离=一个常数/直径的像素,通过这个公式,便可以实现测距的算法。刚开始时,还不知道常数k的值是多少,要想求得常数k的值需要先手动测量出目标物体距离OpenMV的长度,接着通过OpenMV连接上OpenMV IDE观察目标物体在OpenMV视野中的像素点的个数为多少。将得出像素点的个数和距离带入公式便可求出常数k的值。
此时已经得出了常数k的值,k值是固定的,但目标物体像素点个数和距离是时刻在变化的,所以接下来需要通过设计算法,让OpenMV自动得出视野中目标物体的像素点个数:通过Lm=(b[2]+b[3])/2这个算法得出OpenMV自动得出视野中目标物体的像素点个数,其中b[2]为识别到的目标物体的长的像素,b[3]为目标物体的宽的像素数,通过将b[2]和b[3]相加之和然后取其平均值得出目标物体的像素点个数的平均数。最后将通过k值和Lm值来测量目标物体距离OpenMV的实际距离length,大致示例程序如下:
得到目标物体距OpenMV的距离length后通过串口将length值发送给Arduino,使Arduino做出正确的指令。
要想实现让水上清洁卫士在工作水域里找到哪里有水面漂浮物,并前往收集,需要让水上清洁卫士通过机器学习让其识别那些是需要清理的水面漂浮物,比如:矿泉水瓶、塑料袋、烟头等,都可以通过机器学习使水上清洁卫士认识这些东西。
水上清洁卫士采用的是嵌入式机器学习,可以通过EDGE IMPULSE的在线网站来训练神经网络模型,EDGE IMPULSE可以为嵌入式产品快速的生成在嵌入式上面使用的神经网络模型,大约5分钟就可以训练出一个可以在OpenMV上使用的模型。
用OpenMV来训练神经网络模型,大致分为3个步骤:
①首先是采集,利用OpenMV IDE来采集数据集(Data set),也就是拍照,每一个分类至少需要100张左右的数据集来进行训练,这些照片尽量以不同角度、不同光线来制作;②上传至EDGE IMPULSE,上传时可以设置好训练集(Training data)和测试集(Test data)的比例,一般情况下可以将图片的80%设置为训练集,剩余的20%作为测试集,测试集只用于对最后训练好的模型进行测试模型的准确率。③将数据集上传成功后,做一些简单的设置就可以开始训练模型,这里采用迁移学习(Transfer Learning)的方式进行训练,训练完成后会生成两个features,一个是bottle,一个是can。下一步就是对图像的DSP预处理,在DSP预处理后会生成一个长宽比1:1的图像,并且会给每一张图片生成features,features生成输出完成后会生成一张三维散点图,从图3可以看出,代表bottle和can的两种颜色基本是分离的,基本没有混合在一起,这就说明数据集采集的还算不错,如果两种颜色交叉混在一起,就说明前期的数据集的采集特征不够明显,有可能是图片背景复杂或者采集的图片种类不够丰富,这些都可能导致特征不明显。
图3 三维散点图
接下来就可以进行迁移学习,将机器学习的轮数设置为20,置信度为0.8,然后开始训练,在正常情况下训练过程中随着机器学习轮数的增加LOSS值会越来越低,准确度accuracy值会越来越高。
训练完成后可以看到训练后得出的数据,通过刚才采集的数据训练出来的模型的准确度为92.6%,失败为0.16,从表格中可看出有18.2%的塑料瓶被识别成了易拉罐。如图4和图5所示。
图4 训练结果
图5 bottle和can识别是否正确的三维散点图
将训练好的模型下载保存到OpenMV即可。
当水上清洁卫士在工作时,摄像头会时刻开始,当OpenMV识别到为漂浮物时,会通过串口通讯将信息发送给Arduino,Arduino便会驱动无刷直流电机前往目标水域,否则则采取避障。
在水上清洁系统中,JDY-18将负责Arduino与手机的通讯连接。JDY-18透传模块是基于蓝牙4.2协议标准,工作频段为2.4GHz范围,调制方式为GFSK,最大发射功率为0db,最大发射距离60米,采用进口原装芯片设计,支持用户通过AT命令修改设备名、服务UUID、发射功率、配对密码等指令,方便快捷使用灵活。
通过使用JDY-18蓝牙模块不仅成本较低,操作灵活方便,经过实际Arduino连接JDY-18蓝牙模块后对水上清洁卫士控制结果表明:能够实现精确手动控制水上清洁卫士向既定目标运动[4]。
水上清洁卫士在水中的动力靠的是水下推进器完成的,水下推进器的电机采用的是无刷直流电机。通过水上清洁卫士系统中的Arduino控制推进器,完成对推进器中无刷直流电机的控制,包括转向、转速、启停控制。
无刷直机电机的驱动方式根据不同的需求,可分为多种驱动方式。
2.5.1 方波驱动 这种驱动方式实现起来简单方便,容易实现电机无位置传感器控制;
2.5.2 正弦驱动 这种驱动方式可以改善电机运行效果,使电机输出力矩均匀,但正弦驱动实现过程相对复杂。正弦驱动又可分为SPWM和SVPWM(空间矢量PWM)两种方式,SVPWM的效果好于SPWM。
本文采用的是正弦驱动的SVPWM对无刷直流电机进行控制。SVPWM是电调信号信号频率为50Hz,一个周期为20ms。对于电调来讲,高电平脉宽为1ms表示停转,高电平脉宽为2ms表示满油门运转;Arduino可以直接用Servo库来给实现ESC信号的输出。
水上清洁卫士主要应用范围是湖泊、海洋海岸等相对静态水域。水上清洁卫士作为可以在水上清洁垃圾的装置最主要的任务就是做好收集垃圾的工作,而工作环境对清洁效率和清洁效果也至关重要。工作环境的水域不是一成不变的,有可能水面漂浮的不一定是垃圾,也有可能是油脂;工作时吸进去的漂浮物还要做到只能“进”不能“出”。因此在设计之处就已经考虑到水上清洁卫士的工作水域可能会遇到的环境,和如何保证吸进去的水面漂浮物不随便“吐出”的问题。
设备主要分为两部分运输浮船与垃圾收集装置(过滤浮桶)。垃圾收集装置通过小型浮船,运输到垃圾集中区域进行投放,并能够独立漂浮在水面。垃圾收集装置为桶状,分为外筒与过滤网两部分,竖直潜入水下,桶口进水处略低于水面,底部密封只留有抽水泵的排水口,工作时利用抽水泵抽空装置内部的水,造成液压差,周围的流水会源源不断的流入桶内,水面漂浮垃圾跟着水流进入到清洁装置内部,再通过过滤网实现垃圾与水流分离,使得漂浮垃圾留在收纳盒里,完成垃圾的清理。出水口设置止逆刷,防止垃圾回流。如图6所示。
图6 清洁卫士工作原理
清洁卫士的垃圾收集桶里面还内置多层过滤网,当水流经过多层滤网的过滤,将水面漂浮垃圾困于第一层滤网内,完成水面漂浮垃圾的清洁;第二层滤网材料采用碳海绵进行吸附油料净化水源。
水上清洁卫士的供能系统由蓄电池、调压元件和太阳能发电板组成,设计利用太阳能进行发电、供电续航监控系统级,监控、收集数据以及采样作业技术。这样一方面可以减少人力成本,另一方又减少能源消耗产生的碳排放,可以让水上清洁卫士更长效的工作。
本文设计的水上清洁卫士能够自动识别工作水域中的水面漂浮物,并对这些水面漂浮物进行收集,让水上清洁卫士实现识别水面漂浮物,这一功能是通过迁移学习的方法来训练模型,然后OpenMV通过训练好的模型进行判断,以实现分辨哪些时水面漂浮物,然后通过串口通讯将信息发送给Arduino,让Arduino判断是否需要前往清理。除了水上清洁卫士自主工作模式外,还可以通过手机APP连接JDY-18蓝牙模块,进而实现手动操控。当水上清洁卫士将清理的垃圾吸进来后,为了防止垃圾倒流,可以通过止逆刷防止垃圾流出,当面对漂有油脂的水域时也可以对油脂进行清理。
水上清洁卫士除了拥有智能的工作模式,还拥有节能环保的供能系统,对比之下目前使用比较广泛的水面打捞船,主要采用柴油驱动,相比之下水上清洁卫士的碳排放要少的多。
水面清洁卫士前景广阔,因其造价成本不高,操作简单,工作智能化的特点,降低了实验阶段的难度,可以快速投放市场应用。随着国家近几年不断加大力度对于水资源污染问题进行治理,该设备的服务对象既可以是政府机构,也可以是环保公司,尤其是在公园、小区景观、城市内河等场景有着较好的效果。