余善恩, 李 真, 邓文渝
(杭州电子科技大学自动化学院,杭州 310018)
当前,机器人系统最广泛的一个应用就是获取环境的信息,并且应用在对人类生存安全有着重要影响的一些场景,例如高空作业、有毒气体泄露追踪[1]、海洋环境监测及污染物追踪[2-3]、遇险者营救以及起火源定位[4-5]和无线传感器节点的信号追踪[6]等。
本设计的四旋翼飞行器以TM4C123GH6单片机作为控制芯片,飞行器的姿态控制和动作功能在前期已经基本完成。本文主要研究系统在视觉处理方面的设计:基于OpenMV4和ARM A53环境,通过二次开发,实现对杆塔、线缆的检测和条形码、二维码的照相。
如图1所示为场地的示意图,场地内敷设材料为各宽20 mm的灰白相间条纹,图2为杆塔B上二维码的位置示意图。巡线机器人从距A杆塔1 m范围内的起飞点起飞,以1 m定高绕杆巡检,巡检流程为:起飞→杆塔A→电力线缆→绕杆塔B→电力线缆→杆塔A,然后稳定降落;巡检期间,巡线机器人激光笔轨迹应落在地面虚线框内。拍摄所发现线缆异物上的条形码图片和B杆的二维码图片存储到SD卡,巡检结束后在显示装置上清晰显示。
图1 场地杆塔与线缆示意图(cm)
图2 杆塔B二维码位置示意图
视觉系统的主要功能是通过摄像头采集周围环境图像之后,得到当前位置和状态,再将需要执行的指令用串口通讯发送给飞控,同时飞控也会把正在执行的指令状态和高度等信息发送给视觉系统进行统筹决定。图3为视觉系统的设计方案,包括了3个摄像头5个任务。
图3 视觉系统方案图
摄像头1主要用于获取飞行器当前光流数据,即速度。由于场地是密集条纹,图像出现摩尔纹干扰,市面上一般的光流模块无法正常使用,所以需要自己来解决这个问题。对于密集条纹的地面,稀疏光流无法获取有效的特征点,故选用稠密光流,但稠密光流对计算量要求较大。Raspberry Pi Model A+的CPU配置是ARM1176JZF-S主频700 MHz,而OpenMV4搭载的是STM32H743VI主频480 MHz。OpenMV4不能满足高帧数的稠密光流计算,无法满足飞行器飞行过程中对速度数据的需求,所以使用Raspberry Pi搭载OpenCV环境来实现。对于摩尔纹干扰,经过各种尝试,最后通过使用长焦镜头,放大条纹间隔,提高帧数来解决[7-8]。
摄像头2和3都是基于OpenMV4使用MicroPython来编写程序的,OpenMV4相较于树莓派来说更方便调试,可以即插即用,缺点是运行速度较低,需要在不同功能中切换来保证图像采集和运算速度。
摄像头2主要实现两个任务。第1个是飞行器定点起飞时对黑色圆盘的检测,将圆心坐标发送给飞控部分,保证在起飞过程中不会发生偏离。使用霍夫变换算法来检测圆需要遍历圆的半径r,但飞行器起飞到指定高度过程中,摄像头看到的圆半径变化较大,如果直接遍历这个半径区间会极大地降低速度。所以这里融合了飞控发过来的高度信息,将不同高度区间分段成不同的半径区间,这样就极大地提高了圆的检测速度和位置信息的有效性,同时也减小了误判率[9]。第2个是路径检测,在完成定点起飞动作之后进入路径检测状态,利用下方密集条纹的分布信息,检测有条纹与无条纹区域的分界线,利用这条线为飞行器提供飞行参考坐标,避免路径产生偏离。之所以不选择线缆作为路径参考坐标是因为线缆太细不易检测,且飞行器高度的变化会对这个坐标产生影响,所以使用核滤波的方法对条纹进行多次滤波突出边界线来实现更稳定的位置信息反馈[10]。
摄像头3用于完成A、B黑杆的检测以及条形码、二维码的检测和拍照储存。飞行器主要实现的动作流程如图4所示。这个动作过程是由摄像头3检测信息时统筹飞控传回当前任务状态来判断决策的,即在特定的位置发送动作指令控制飞行器执行相应动作。正常状态下摄像头获取的是其最大可视范围,这才能保证检测到黑杆时及时地发出指令,避免响应不及时导致飞出场地。但条形码无法在这样的大视野低分辨率下清晰识别,所以要先检测黄色物块(条形码背景色为黄色),在一定的图像模糊处理后找出黄色物块,以此黄色物块为坐标让飞行器定点暂停移动,再缩小图像范围提高分辨率拍下可识别的条形码。二维码在正常图像视野范围也能直接检测到,但为了保证照片能够准确识别,仍选择相同方法放大图像后拍照保存。飞行器绕B杆时需要按一定半径飞行,避免撞杆或者偏离轨道,但黑杆较细无法用超声波或者激光测距模块获取距离数据,为了减小复杂程度,增加闭环稳定性,这里选择用图像中黑杆的面积或宽度换算成飞行器与杆的距离,实现了单目摄像头测距功能[11]。
图4 飞行器动作流程
3个摄像头的安装位置如图5所示。摄像头1检测并向飞控发送光流数据(始终运行)。飞行器定点起飞的过程中摄像头2检测圆并返回圆心坐标,计时结束后发送巡线指令。在巡线状态下摄像头2处理下方条纹图像并返回边界坐标固定飞行器的Y轴。摄像头3开始检测黄色异物以及黑杆,检测到黄色异物时发送定点指令返回黄色异物坐标固定飞行器X轴;定点稳定后,放大图像并拍摄条形码,拍摄之后发送指令继续巡线。同理,检测到B杆后发送B杆坐标定点,摄像头3放大图像并拍摄二维码,拍摄结束发送绕杆指令,返回杆坐标以及离杆距离,直到飞控返回绕杆结束信息。绕杆结束后继续巡线,直到检测到黑杆A,发送黑杆坐标定点,准确定点后发送降落指令。
图5 摄像头位置实物图
3个摄像头协同工作,提供飞行器的速度信息,除高度以外的另外两轴的位置信息,并通过对数据的优化处理和滤波,保证了飞行器的闭环稳定飞行控制。利用多传感器的信息统筹决策,便于功能调试和切换,提高了整个项目方案的可行性和稳定性。
根据场地要求,场地内敷设材料为各宽20 mm的灰白相间条纹。当使用市面上的成品光流模块来检测飞行器飞行中的光流数据时,发现光流数据失效,甚至还产生了很大的干扰,导致无法正确地得知自己的瞬时速度。无法得到有效的光流数据有两个主要原因,①由于场地的条纹导致拍摄得到的图片产生了摩尔纹干扰,这种无规律的干扰对光流检测有极大影响;②飞行器在移动过程中密集条纹本身光流检测难度就比较大。本设计中,首先尝试了通过使用稠密光流并选用更快的处理器得到更高的运行速度提升帧率,同时还从摩尔纹产生的原理出发去除摩尔纹带来的干扰。
光流是指图相中像素点的瞬时速度,包含了运动速度和运动方向信息,利用前后两帧图像中特征点位置变化的偏移及时间计算得到。而稠密光流对图像中每个像素点都进行运算,所以准确率高,缺点是运算量很大。因为飞行器下方是密集条纹,用稀疏光流无法得到有效的光流数据,所以本设计中使用了OpenCV库里的cv2.calcOpticalFlowFarneback()函数,利用Gunnar Farneback算法来实现利用稠密光流来获取速度信息。
摩尔纹是指因为物理上的差拍原理产生的一种现象。因为场地是规律的密集条纹,所以具有固定的空间频率,飞行器挂载的摄像头,其光学元件也有相应的空间频率。当这两个空间频率接近时,拍摄出的图像就会出现摩尔纹。由于摩尔纹受拍摄角度和拍摄距离等影响,所以其产生几乎是无规律不可预测的。图6为拍摄时摩尔纹产生的原理。
图6 拍摄时摩尔纹产生示意图
飞行器需要光流数据,在有摩尔纹的情况下无法获得有效的光流数据,光流数据会出现无规律的波动。要去除或者减少摩尔纹可以改变拍摄对象或者感光元器件的空间频率、改变拍摄角度、改变拍摄距离。由于设计要求中飞行器与拍摄对象的角度和距离固定,那就只能考虑改变光学元件或者拍摄对象的空间频率,也就是条纹密度。
本设计的解决方法是使用长焦镜头,放大了拍摄对象,改变了拍摄对象的空间频率,并且适当减小了图像视野,调节了分辨率,让其可以在不产生摩尔纹的前提下保证高帧率地进行稠密光流的检测,以获得优质的光流数据[12]。
本设计中巡线是主要功能,需要飞行器能够自主在A、B杆之间巡线。在巡线设计中采取的方案是以飞行器正下方的条纹场地边缘为检测目标,以此边缘坐标为基础加偏置来确定Y轴坐标。该方案需要检测条纹敷设材料的边缘,主要用到了核滤波、膨胀等图像处理方法。
在从A杆到B杆再从B杆到A杆的中间还有一个关键动作,绕B杆180°。绕杆作为巡线的中间动作采取的方案是固定半径半圆轨道旋转绕杆,让摄像头3始终对准杆B,根据杆B坐标以及杆与飞行器的距离来确定飞行器的X、Y轴,让飞行器在旋转中绕杆飞行180°。
核滤波是一种对图像滤波的滤波器,又叫卷积核。图像求导是像素的颜色值在某一个方向变化的速度,即如果对X正方向求导,那么在这个方向上颜色变化大的点求导之后的值越大,也就是说可以利用求导这种方法把特定方向的颜色突变的线条标记出来。一个二维图像的像素点周围有一圈像素点,要获取二维图像颜色突变的像素位置即图像轮廓,就需要用到一个二维的卷积核。在待处理图像的每个像素点用卷积核进行对应元素乘积相加,也就是卷积计算,就可以得到相应的图像。得到的图像显示原图像的哪种特征与卷积核的选取有关。比如Sobel边缘检测算子可以强调边缘相邻的影响,或者高斯模糊也是用相同的原理。卷积核的中心元素去对准每一个像素点,相应元素乘积求和计算公式为:飞行器飞行场地的条纹如图7所示,要求灰白条纹各宽20 mm,灰色的红绿蓝三原色参数为R-178、G-178、B-178,场地宽为±60 cm,场地外无条纹,如图7中条纹上方边缘可用Sobel算子滤波得到一条虚线,再通过膨胀等处理可得到图7中条纹下方边缘的直线。处理得到了这条直线就得到了巡线的Y轴坐标,即路径数据。为了使飞行器在规定场地内飞行,在这个坐标上加合适的偏置,只要保证摄像头能够看到条纹边缘即可[13]。
图7 对条纹边缘滤波示意图
用MicroPython的morph()函数进行核滤波的图像变换,这里运用到的卷积核是Sobel边缘检测算子,特别是:
可以将X轴的水平边缘检测出来,过滤掉不需要的条纹边缘[14]。
黑杆检测用到的方法是色块检测。一般情况下设定色块的颜色阈值、检测区域,在看见目标色块时就可以检测出来,但由于是侧面的摄像头,背景非常复杂。如果只设置颜色阈值会出现大量误检。所以在此基础上还要限制色块的长宽或者面积,过小或过大的都会被过滤掉,以提高检测的准确性,设计中采用MicroPython里的image.find_blobs()函数来实现。
由于需要绕杆以固定半径旋转180°,所以需要在检测到黑杆的基础上得到飞行器离黑杆的距离。这里运用下式来实现单目摄像头的测距。因为
即实际长度Lm和摄像头里的像素Bpix成反比,等号右边为一个常数。即“距离=一个常数/直径的像素”,利用该式就可以得到距离数据进而实现绕杆旋转的动作。但实际测试中发现由于黑杆较细且飞行器不能离杆太近,为了得到较快的运算速度,一般设置图像分辨率为320×240,这导致一个像素点的波动很可能导致距离数据出现5~7 cm的波动。优化方案是检测到黑杆后切换成640×480分辨率,同时为保证检测速度只选取一个窄区域进行检测,如图8所示。因为杆的高不作为判断元素,这样切换分辨率既满足了测距需要又不会对图像帧数和视野范围产生影响,取得了较好的效果。
图8 黑杆的检测
本设计中飞行器的第1个动作是以一个圆为起点定点起飞,并在达到指定高度后悬停,在该过程中要保证飞行器在圆心上方不发生偏离。另外,在巡线过程中还有额外任务,检测并拍照保存条形码和二维码。检测圆用到的方法是霍夫变换检测圆,难度在于保证实时性;条形码和二维码检测的难度在于保证拍照的清晰度。
一个圆可以用圆心坐标(a,b)和圆半径r来确定,实际采集的图像如果不考虑复杂背景,那就是一个单独的圆,使用霍夫变换的方法就可以把这个圆的圆心坐标和半径确定下来,也就检测出了这个圆。检测的过程一般是先对原图进行边缘检测,如果图像中有可见的圆,那么圆的轮廓必然会是前景点。在边缘检测之前可以对图像做平滑滤波过滤掉噪声,这样得到的前景点更有效。得到了圆的轮廓后就可以估计圆心坐标和圆半径了,先设置最小半径、最大半径以及半径遍历的分度值,以边界点为圆心,以估计半径为圆半径,就可以得到如图9右部分的图形,当这些曲线的交点最多时,这个交点就是估计得到的圆心,得到这个点时的半径就是估计得到的圆半径。这就是霍夫变换检测圆的方法。
在此基础上还有一些优化的算法,比如霍夫梯度法,用到了Sobel算子计算梯度,可以得到圆到圆心的方向,同样利用圆轮廓得到的前景点向圆心画线,交点越多越可能是圆。
在实现时调用image.find_circles()函数就可以方便地使用霍夫变换检测圆,但霍夫变换检测圆也有缺点,比如圆半径范围较大时需要对半径范围进行遍历导致计算量巨大;再比如无法检测同心圆等。这就需要对半径条件、检测区域、圆估计的阈值进行合适的调试才能得到适用的检测函数[15]。
检测圆在本项目的运用场景是飞行器定点起飞,起飞点为一个已知圆。在起飞到达到规定高度的过程中,图像中的圆半径变化较大,为了保证程序运行速度和位置坐标的有效性,选择了融合高度信息,将高度分段分别对应半径区间的分段,在不同高度遍历不同的半径范围,极大地提高了运行速度,也减小了误检的可能性。
条形码的检测使用了MicroPython的find_barcodes()函数,其支持所有的一维条形码检测。项目中使用该函数对图像进行水平和垂直两个方向的扫描。由于条形码需要足够的分辨率才可以被识别,所以需采用640×480分辨率进行检测和拍摄。然而,在飞行器飞行过程中侧部图像检测使用的是320×240分辨率,故无法检测出条形码并定位。考虑到条形码背景色为黄色,如图10所示,在分辨率较低的情况下可以对图像进行高斯模糊等运算,将条形码识别为一个黄褐色物块。先通过色块检测发现条形码,再让飞行器暂停移动,以色块坐标为位置信息进行定点,然后切换到高分辨率检测条形码并保存图片。
图10 条形码示例
二维码检测需要对图像畸变进行校正,但畸变矫正会加大运算量,为了免除畸变矫正过程,侧面摄像头可采用无畸变镜头,本设计中使用了lens_corr()函数来矫正。二维码检测的方案与条形码检测方案类似,因为二维码位置固定在B杆,故当检测到B杆时就可以停下再将摄像头切换到高分辨率状态检测二维码并拍照保存。本设计使用了MicroPython的find_qrcodes()函数来检测二维码。
设计的以TM4C123GH6芯片为主控芯片的四旋翼飞行器,在OpenMV4和ARM A53的环境下,通过3个摄像头进行图像采集及处理,实现了对杆塔、线缆的检测和条形码、二维码的采集功能。主要完成:①对地面路况进行检测,返回地面状态和相关数据,实现对起飞点的识别和环形圆板的识别和定位;②对塔杆进行检测,并返回相关数据,实现对飞行器与塔杆之间的距离控制和绕杆控制,同时实现对条形码和二维码的拍照和存储功能;③对电线的状态进行检测,检测异物的存在。飞行器基于超声波、光流、惯性传感器、3个摄像头的数据,对其姿态、空间位置、速度进行控制。经过测试,设计的视觉系统有着较高的稳定性与可靠性,飞行器可以实现巡线、条形码及二维码的记录功能,可扩展性强,可有效地应用到部分实际场景去。