(哈尔滨工程大学 信息与通信工程学院,黑龙江 哈尔滨 150001)
随着时代发展、技术革新,对无人机与人的交互领域也提出更高要求。考虑到手势具有自然性、灵活性等特点,手势控制[1]已经成为无人机与人进行信息交互的一种新的手段。目前,国内外很多优秀学者和研究员都投入极大的精力研究基于视觉的动态手势识别系统[2]。因此,它也就成为了目前科研领域的众热点之一。可以预见,未来手势识别系统的主要发展趋势将是基于视觉的动态手势识别。如今,市面上有一款广受关注的体感控制器Leap Motion,它已被应用于游戏、手语识别、虚拟应用、计算机应用等领域。
另外,将焦点聚焦于无人机,国内无人机市场从最初的军用领域[3]渐渐地扩展到消费电子领域。据最新的消息显示,在抢险救灾、气象预报、农业、电力、消防等方面,无人机都具有很高的实际应用价值。而且,无人机加上机械爪能够解决高空取物、小型物资投送等实际问题。因此,将动态手势识别技术与可抓取无人机相结合将具有极高的实用价值和比较广阔的市场前景。
本系统的采用Leap Motion实现手势控制无人机的飞行以及抓取功能。该系统的实现方案也可被借鉴到其他相关的研究之中。
本系统对无人机飞控Pixhawk[4]和体感控制器Leap Motion进行二次开发。通过Leap Motion双目传感器进行手势数据采集,通过PC端进行数据处理并利用无线模块发送数据,无人机端接收到的数据用Arduino解码处理,输出相应PWM波控制飞控及机械爪[5]。系统的总体设计框图如图1所示。
图1 系统总体框图
本系统划分为3个部分,即手势识别及显示部分(PC端)、数据传输部分(NRF24L01)、飞行控制部分。
① 手势识别部分:手势数据的采集主要是使用了Leap Motion双目传感器,并且使用Python结合Leap Motion v2 SDK库对双目识别到的数据进行运算处理。采用Qt编写上位机界面,显示手势识别到的数据,利于用户观察自己的手势状态。同时将处理到的数据进行自定义编码,等待进行发送。
② 数据传输部分:将上一步获取到的编码数据通过UART协议发送到串口中通过单片机进行接收,并将数据转发给NRF24L01模块进行无线发射。同时在无人机端实时接收NRF24L01数据,将接收到的数据传输到无人机飞行控制部分[6]。
③ 飞行控制部分:控制端采用Arduino解码接收到的数据,然后进行数据处理,输出PWM到Pixhawk以及机械臂,实现控制无人机的飞行以及机械臂的抓取。最后,通过多次测试、修改相关参数使无人机飞行平稳,响应迅速。
2.1.1 Leap Motion模块
本系统采用Leap公司的Leap Motion体感控制器,它采用USB接口连接计算机,支持Windows,Linux 和Mac OS多操作系统,可以面向C++、C#、Java、Python等语言进行更高级的应用程序开发,同时也可作为一个插件在其他平台使用。
Leap Motion的相关参数如下。
① 最小识别动作范围:0.01 mm;
② 识别视角:150°;
③ 最大频率:290 f/s。
Leap Motion遵循右手坐标系,设备的中心被定义为坐标的原点。水平平面由X轴、Z轴组成,设备的长边被定义为X轴的方向,短边为Z轴方向。Y轴为垂直方向(正方向朝上)。
2.1.2 无线传输模块
无线模块采用NRF24L01。它是一种射频收发器件,工作于2.4~2.5 GHz ISM频段,并且融合了增强型ShockBurst技术,可通过程序配置输出功率和通信频道,因此非常利于二次开发。此外,它还同时具有低电压工作、高速率、多频点、超小型、低功耗、低应用成本等优点。
2.1.3 机械模块
本系统机械爪使用的是含舵机的全金属爪子。机械爪舵机由三根线控制,分别是地线、信号线和电源正极线。信号线与单片机Arduino相连,通过单片机产生的脉冲信号来控制机械爪的张合运动。因为电池供电为12 V,远超机械爪的供电电压范围,通过使用LM317稳压芯片来为机械爪提供7 V左右的电压。
2.1.4 机械结构控制流程
本系统机械结构控制首先由NRF24L01将接收的手势数据传给Arduino,并由Arduino进行处理,接着输出相应的两路PWM脉冲信号。一路PWM脉冲信号直接控制机械爪的张合角度;另一路PWM信号传给无人机Pixhawk飞控,控制4个电机的输出,以此实现手势数据控制无人机的飞行状态。具体控制流程如图2所示。
图2 控制流程
2.2.1 Leap Motion工作原理
Leap Motion的核心部分是高帧率摄像头、红外LED以及红外滤光器。自然光线通过红外滤光器后被过滤成红外线,在设备上方形成一个虚拟的平面光线网。当手在设备上方移动时,就会引起红外线反射而返回手所在的位置。摄像头进行实时捕捉,通过双目立体视觉原理进行解算并生成3D数据[7]。
2.2.2 双目立体视觉原理
双目立体视觉是一种由两幅图像获取物体三维几何信息的测量方法。
人在轮流闭合左右眼时,会发现同一物体的位置发生了偏移,这种现象称为视差。Leap Motion采用双摄像头模拟人眼,运用立体视觉原理对物体进行定位。它的基本原理是从两个不同视点观察同一景物。从而得到在不同视角下的感知图像,通过三角测量法计算图像像素间的位置偏差(视差),来获取物体深度信息。
2.2.3 TBD技术
Leap Motion在追踪手势的算法上主要采用的TBD技术。检测前跟踪算法(TBD)通过时间上的积累弥补信噪比的不足,与传统检测方法相比,能实现更低信噪比目标的检测[8]。因此,它成为弱目标检测的重要方法。现在应用比较广泛的方法主要有动态规划算法。下面是动态规划算法的模型。
设xn为待测目标在第n周期的运动状态向量,对于传感器检测的xoy平面内运动的目标,其状态向量可以描述为
(1)
xn+1=f(xn)
(2)
将传感器所探测区域分割为a×b个有相同边长为Δx×Δy的分辨单元。假设在n时刻,用δn=1表示目标出现,用δn=0表示目标没有出现。在每个时刻n,目标状态集合为
x(n)={xn(i,j)},i∈1,2,…,a,j∈1,2,…,b
(3)
测量值在每个单元记录,在时刻n记录的总测量量是一个a×b矩阵Z(n)={zn(i,j)}。其中,zn(i,j)为在分辨单元(i,j)记录的状态xn(i,j)测量值,其表达式为
(4)
式中,An为目标信号幅度;nn(i,j)为噪声或杂波。目标航迹可定义为从时刻1到时刻N的一系列状态值,公式可表示为
XN={x1,x2,…,xN}
(5)
因此,DP-TBD技术可归结为:基于目标状态转移方程和给定N帧测量数据{Z(1),Z(2),…,Z(N)},通过DP-TBD算法和相应判决准则逐阶段估计目标的最优状态序列,从而产生最优的目标航迹[9]。
2.2.4 与传统视觉处理的对比
目前,手势跟踪和识别采用的主流方法是计算机视觉技术,Leap Motion也采用此技术。当识别目标运动速度过快、受到大面积相似背景颜色干扰以及环境灯光明暗变化时,传统的基于计算机视觉的手势识别技术容易丢失跟踪目标。而Leap Motion利用红外LED灯对光源进行补充,能够有效减少环境光和背景颜色的干扰,增加了手势识别的准确性。
系统的核心是手势控制,而系统的手势识别是通过对Leap Motion的二次开发来实现的。通过Leap Motion获取识别到的手势数据,再进行数据的处理。手势识别框图如图3所示。
图3 手势识别框图
Leap Motion在使用过程中,会定期发送关于识别到的手的运动信息,每一份这样的信息称为一帧。通过对帧数据的处理可以得到手势的运动方向,以及检测手是否有抓取的动作。
二次开发时采用的语言是Python[10],配合官方的示例以及Leap Motion v2 SDK库能够比较方便地控制Leap Motion,得到有用的帧数据。首先,设置好与PC通信的端口,实例化一个控制器对象用于控制Leap Motion。然后,使能控制器,并且实例化一个帧对象用于获取采集到的帧数据。接着就可以遍历所获得的数据,取出有用的手势坐标数据以及手动作程度大小数据。下面给出部分关键代码。
#设置发送端口
t=serial.Serial(serialCom,9600)
#实例化Controller类
controller=Leap.Controller()
controller.enable_gesture(Leap.Gesture.TYPE_SWIPE)
#实例化帧对象
frame=controller.frame()
#遍历Leap Motion获取的数据
for hand in frame.hands:
#获取手势的坐标数据
data=hand.palm_position
翠姨的妹妹有一张,翠姨有一张,我的所有的同学,几乎每人有一张。就连素不考究的外祖母的肩上也披着一张,只不过披的是蓝色的,没有敢用那最流行的枣红色的就是了。因为她总算年纪大了一点,对年轻人让了一步。
#获取手抓取动作程度大小的数据
strength=int(hand.grab_strength * 10)
Leapmotion控制流程图如图4所示。
图4 Leap Motion控制流程图
无人机操控上位机基于Qt5[11]开发环境,可运行于用户PC端。作为无人机操控者观察无人机状态的窗口,上位机包含Leap Motion串口窗口、无人机飞行状态窗口、操控者手势状态窗口。
① Leap Motion串口窗口。通过Qt串口类QSerialPort调用操控者PC端的串口与手势识别装置Leap Motion连接,获取Leap Motion中的手势数据。
② 无人机飞行状态窗口。通过接收无人机远程数据传输的飞行状态信息,显示信息包括无人机基于欧拉坐标系的pitch、yaw、roll数据,以及飞行高度、飞行速度、飞行距离等信息。
③ 操控者手势状态窗口。通过连接Leap Motion的驱动程序获取操控者实时的手势信息,利用Qt软件内部的Qt 3D工具将操控者的手势信息实时显示在上位机的窗口中,便于操控者根据手势状态调整无人机飞行状态。
数据接收端的单片机采用Arduino处理接收到的数据,并与飞控Pixhawk进行通信[12],以及控制机械臂的抓取。首先,校验接收到的一帧手势数据,如果数据存在错误,则舍弃这一帧的数据。然后,对存储的每一帧数据进行处理,因为获得的数据是手的空间位置坐标,因此,判断每一帧手势数据与Leap Motion位置坐标原点的差值,以此判断出手的移动方向。根据手的移动方向,定义相应占空比的PWM波,输出给飞控,以此来间接控制无人机的飞行姿态[12]。同时,也检测每一帧数据中手抓取程度大小的数据,根据数据的大小,输出相应占空比的PWM波来控制机械爪的开合大小。
相应的逻辑流程图如图5所示。
图5 Arduino控制逻辑流程图
在进行系统总体测试前分别对系统的各个子模块进行单独的调试,以保证每一个模块都能正常运行。同时,在场外实测前,先在室内进行了系统级模拟试验。能够实现手势控制,飞控端的Arduino能够输出相应占空比的PWM波,且手的抓取动作能够控制机械爪的开合。之后,在室外宽阔的操场进行了飞行测试,开始时并不能很好地控制无人机的飞行,最后,通过反复测试以及校准数据,成功实现了手势控制无人机的飞行以及机械爪的抓取。
然后,优化了手势控制无人机机械爪的抓取方式,提高了抓取成功率。通过对Leap Motion端代码的修改,增加了一个抓取力度变量,将Leap Motion识别到的手抓取动作程度分为3个等级(1等级对应手轻微闭合、2等级对应手闭合程度为50%、3等级对应于手闭合程度为100%)。然后,将机械爪张开的大小分为3个等级。因此,手抓取的力度大小将对应机械爪的闭合程度大小。相较于之前的抓取方式——当检测到手抓取动作时,机械爪就立即闭合,优化后的方法更具有灵活性和实用性。抓取成功率从优化前的60%提高到80%。
由此,可以证明此种方法能够提高机械爪的抓取成功率。再者,为了进一步验证Leap Motion的手势识别准确性以及机械爪的抓取成功率。在一些新的测试条件下继续验证机械爪的抓取成功率。具体实验数据如表1所示。
表1 抓取实验结果
表1中的“手的高度”为手距离Leap Motion中心的垂直距离。表中的数据均是经过多次测试后得到的概率值,具有普遍性。分析实验数据可知,在手高度为20 cm时,抓取成功率最高;当手高度为5 cm及50 cm时抓取成功率均不高,且当手高度超出这两个值时,抓取成功率将急剧变低直至不能抓取。因此,Leap Motion的最佳识别范围是手高度为20~35 cm。且在同等高度情况下,当手抓取动作为3等级时,抓取成功率最大。
经过上述测试,设计的可抓取无人机系统能够完全实现目标功能。手进行移动和抓取动作,系统都能够较快速地响应。
本文提出了一种人机实时交互系统,能够实现手势控制无人飞行,以及无人机机械爪的抓取。该系统经过多次实验调试,证明了系统设计的可行性及稳定性,且设计思想新颖,具有较高的创新性和实用价值,
较成功地将动态手势识别、无人机飞行以及无人机抓取相结合。实现了一种新的与无人机的交互手段,能够解放传统的遥控器交互方式。同时,该系统经过进一步的改良,能够解决一些小型物资的投送问题或者应用于玩具市场。