韩 炜,宋晓娟
(内蒙古工业大学 机械学院,内蒙古 呼和浩特 010051)
随着科技的发展,四轴飞行器由于其制造成本低,可垂直起降,机动性良好的特点,在生活中的应用越来越广。传统的精度高的图像识别四轴飞行器搭载了非常多昂贵的传感器元件,负载过重,电量消耗过大使得这类飞行器无法在民用中得到普及。与此同时,搭载GPS定位的飞行器非常依赖GPS信号的强度。在矿难营救或者火灾室内现场等特殊地形无法做到先人一步进行幸存人员搜索[1]。
AR.Drone是法国Parrot公司生产的四轴飞行器[2],因其摄像头性和处理器行性能能满足基本的研究要求,且具有极高的稳定性,同时无需太大的试验场地,非常适用于实验室研究。在Github上,有一个关于AR.Drone的封装包ardrone_autonomy[3]。其控制指令条理清晰,适用于AR.Drone二次开发研究。安装ardrone_autonomy需要使用ROS(Robot Operating System)系统,所以需要用到ROS和Linux Ubuntu开发环境。
ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接处理架构[4],可以适应单个上位机与多个下位机连接,也支持多种语言,免费且开源[5]。多个特点使得ROS在近来受到越来越多的关注与使用。
结合AR.Drone的封装包ardrone_autonomy,在不使用GPS定位等传感器的情况下,进行基本的图像识别及动作反馈。
ROS系统平台使用点对点的网络连接模式,所有的进程会通过点对点的网络形式表现出来。过程包括发布节点,发送消息,订阅主题。
AR.Drone图像识别及动作反馈,分为三个步骤:
(1) AR.Drone连接客户端,能够使用端口。
(2) 对接收来的视频流图像进行图像处理。
(3) 对处理后的图像结果进行AR.Drone的动作反馈。
由AR.Drone发出的原始的飞行数据经过autonomy_ardrone整合后发送给ROS建立的工作空间,其中包括飞行状态和图像信息。经过图像处理,将相对位置写成运动期望的字符串,传回给工作空间,工作空间将相关运动指令计算出来,传至autonomy_ardrone,再由autonomy_ardrone来控制AR.Drone执行运行指令。如图1。
图1 整体构架原理概图
节点、主题关系分成三部分,分别是主题、节点间关系和与节点相关的程序。如图2。由于ROS的节点不能直接通信,需要主题将之联系在一起。需要建立Topic主题,image_raw和Cmd_vel主题是由autonomy_ardrone提供的。image_raw用于接收和发送图像信息,Topic用来接收和发送相关运行期望字符串的信息。Cmd_vel接收Twist类型的运动指令。
建立节点video_sub、video_pub、taker_drone_position、listener_ardrone_position和dronemove_cmd。video_sub负责采集AR.Drone的图像,video_pub负责将图像显示出来,taker_drone_position负责发布运动期望字符串,listener_ardrone_position负责收集发布的运动期望字符串,这里taker_drone_position和listener_ardrone_position可以在终端显示字符串信息,也可以将这个信息集成到关于ROS和QT设计的可视化界面里,以便直观的看到位置信息。
剩下的与节点相关的发送或接收的信息可以通过C++程序来完成。
图2 节点、主题关系图
程序设计包括图像处理的程序,相对位置计算、运动期望字符串以及转化指令格式几个部分,分别采取不同的方法进行设计。
图像处理采用OpenCV库,使用vim进行编辑。
对于简单的图像处理,如图像中只有一个圆,流程简图如图3所示。
图3 图像处理流程简图
(1) 原始图像转化成灰度图,以提高计算效率。
(2) 图像滤波处理,对图像降噪。
(3) 将图像二值化处理,再次提高计算效率。
(4) 霍夫圆检测,将二值化后的图像中的圆检测出来。
(5) 将检测出的圆心坐标、圆半径和图像的中心点坐标输出,以执行下一步操作。
整个处理过程涉及到灰度化、滤波处理、二值化处理和霍夫检测。如图4。
图4 图像处理
灰度化是将图像中的三个通道(分别是B、G、R)的像素点的分量做相加取均值给新的单通道图像。由此将单个像素的计算量的256×256×256降到256。
滤波处理采用高斯滤波,本质上就是图像与正态分布做卷积。也就是用一个方框掩膜扫描图像中的每一个像素,将其中的高频信号平均到临域中去,以消除噪点。
二值化是采用一个阈值将原图像转化为两种极端,即将[0,255]的取值转化成[0,1],这样会提高很多的计算速度,但同时也会损失掉非常多的图像信息。由于这里取的识别圆和背景反差较大,所以可以得到需要的图像信息。
霍夫检测是一种图像特征提取技术,是在一个参数空间寻找符合特征要求形状的算法集,此设计中使用了霍夫圆变换的算法,其原理是使用霍夫梯度法进行边缘检测,梯度处理,累加计算,得到圆心坐标和半径。
图5 相对位置计算简图
运动期望字符串过程采用逻辑判断语句,利用上一步得到的象限位置和x、y的绝对值数据,计算x、y的相对距离较长的MAX值,优先缩短这个MAX值,以使飞行器中心和圆心靠近。这里使用C++设计逻辑判断语句。最后将输出语句以发布消息的方式直观的表示出来。如:Up、Down、Left、Right。意味着飞行器此时需要向上、下、左、右执行某个运动。如图6。
图6 输出消息样图
ardrone_autonomy里有对应的命令执行格式,将上一步的消息接收后,将字符串消息转化为geometry_msgs::Twist类型的信息。然后将此消息发布到对应的控制主题上,控制飞行器的运动和位置变化。当飞行器的摄像头中心和识别图像的中心距离小于阈值后,识别结束。
识别后整个控制流程如图7。坐标对比后,进行逻辑判断,得到飞行器优先运行方向,飞行器执行。然后,再次进行坐标对比,执行上步的操作,直到达到预设的阈值后,整个识别过程结束。
图7 识别程序流程图
运动路径如图8,最开始飞行器中心在最左侧1位置,经过对比后,优先向右运动。经过几步后,到达位置2,经过对比,距离上方向较远,故向上运动。到达位置3后,经对比,向右侧运动,经过几步后,到达预设位置。
图8 飞行器运动路径
研究了关于AR.Drone的图像识别跟随的原理和场景搭建。实现了飞行器与PC端的ROS连接,对图像进行目标识别和中心运算,飞行指令的设计,采用了一个直观高效的方式进行实验。在不使用GPS和各类传感器的情况下,完成设计要求。
实验中,使用ROS的消息发布机制,将飞行器跟随图像动作反馈的过程,分解成多个步骤,每一步进行对比跟踪,直接降低了只执行一套指令的误差。对于移动物体跟踪,也在随时寻找最优的路径,可以完成追踪的任务。
程序设计中,图像处理使用了霍夫圆变换,优点是使用了霍夫梯度法,算法简单,执行高效;缺点是只能识别图像中的圆,并且在图像中只能有一个圆,多个圆会造成程序出错。由于没有使用传感器元件,需要人为干预飞行器与识别图像或者物体的垂直距离。
实验搭建环境是在学校的实验室中,干扰较小。当环境条件较差,或者图像干扰较多时,会出现较大的差异。在后续研究中,会进行改进。
[1] 马建磊.基于视觉的无人飞行器目标识别与跟踪控制[D].大连:大连海事大学,2017.
[2] Parrot.Parrot of developers.2016.[2017].http://developer.parrot.com[DB/OL].
[3] Mani Monajjemi.github.2014.[2017].https://github.com/AutonomyLab/ardrone_autonomy[DB/OL].
[4] 陈金宝,韩 冬,聂 宏,等.开源机器人控制基础[M].上海:上海交通大学出版社,2016.
[5] 高志发,武建新.基于ROS的移动机器人的路径规划策略研究[J].机械研究与应用,2017,30(3):161-162.