1、国家级大学生创新实验项目基于人机交互技术的多旋翼飞行器控制研究报告项目主持人:姚佳乐项目组成员:石磊 杨梦飞 姜裳指导教师:匡银虎、张虹波物理电气信息学院2014 年 3 月目 录1 研究背景 31.1 AR.Drone2.0 四轴飞行器介绍 .31.2 科大讯飞语音识别系统介绍 41.3 Halcon 机器视觉软件介绍 .42 开发过程 52.1 AR.Drone2.0 SDK 研究 .52.1.1 翻译 AR.Drone2.0 SDK 原文 .52.1.2 初期研究 52.1.3 深入研究 112.2 通过 PC 语音识别,发送语音控制命令 .122.3 飞行器视频流采集,分析图片,自动判
2、定飞行区域 132.3.1 学习 halcon 软件,达到图像标志识别的目的 .132.3.2 通过获取的圆形区域的参数建立与实际距离之间的关系 203 后续开发展望 .264 总结 .271 研究背景1.1 AR.Drone2.0 四轴飞行器介绍AR.Drone2.0 是一款遥控四轴飞行航模,拥有四个螺旋桨控制其飞行动作,如图 1 所示。图 1 四轴飞行器其结构包括:四轴机架、螺旋桨、无刷电机、电调、飞控板、传感器模块、wifi 模块、机壳、摄像头、电池。以下为 AR 飞行器的基本参数:飞行速度:5 米/秒;18 千米/小时;重量:有机壳-400 克/436 克;无机壳-366 克;尺寸:有
3、机壳-51.5x51.5/45.2x45.2;无机壳-45x29cm;电池:3 芯锂电池-11.1V 1000 毫安时;充电时间-1.5 小时;飞行时间-12分钟;内置系统:ARM cortex A8 位处理器;DDR SDRAM 128MB;NAND Flash memory 128MB WiFi/g/n;Linux OS;超声波高度计:发射频率-40kHz;范围-6 米;操作温度:055 摄氏度; AR 飞行器的飞控板为 ARM 板,型号为 armv71 gnu/linux,搭载了以 linux uclibc 2.6.32.9-gbb4d210 为内核的 Linux 系统,封装了飞行器的飞
4、控算法等基本代码,自带一块 WiFi 卡,通过 WiFi 网络发送控制命令。Linux 系统开源,因此理论上可以在任何客户端上开发控制程序控制飞行器(只要支持 WiFi) 。1.2 科大讯飞语音识别系统介绍自动语音识别技术(Auto Speech Recognize,简称 ASR),是让计算机通过识别和理解过程把语音信号转变为相应文本或命令的技术,通俗的讲,就是让计算机明白人类语言。科大讯飞语音识别软件是当前用于人机交互智能语音识别技术的领先软件。该软件可将控制者的语音命令通过输入法转换为文字命令。1.3 Halcon 机器视觉软件介绍HALCON 是德国 MVtec 公司开发的一套完善的标准
5、的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境。图 2 维视图像开发定制软件HALCON 是一套 image processing library,由一千多个各自独立的函数,以及底层的数据管理核心构成。其中包含了各类滤波,色彩以及几何,数学转换,型态学计算分析,校正,分类辨识,形状搜寻等等基本的几何以及影像计算功能,由于这些功能大多并非针对特定工作设计的,主要用于自动化控制检测。HALCON 支持 Windows,Linux 和 Mac OS X 操作环境。整个函数库可以用C,C+,C#,Visual basic 和 Delphi 等多种普通编程语言访问。HALCON 包含了一套交互式的
6、程序设计界面 HDevelop,可在其中以 HALCON程序代码直接撰写,修改,执行程序,并且可以查看计算过程中的所有变量,设计完成后,可以直接输出 C、C+、VB、C#、vb 等程序代码,套入程序中。这对于本项目基于飞行器的人机交互有较大帮助。2 开发过程设备列表:AR.Drone2.0 四轴飞行器一台,聚合物锂离子可充电电池组(1500mAh 和1000mAh 各一块) ,笔记本电脑一台。运行环境:Windows 7 系统,Visual studio2012,C#编程语言,Halcon10.0,科大讯飞语音输入法。2.1 AR.Drone2.0 SDK 研究2.1.1 翻译 AR.Dron
7、e2.0 SDK 原文由于 AR.Drone2.0 SDK 说明发行时间较短,网络和书籍上关于该部分的介绍说明均为纯英文版本,因此,要深入研究需将原文翻译为中文,起初的翻译有一定的偏差,项目组成员在多次实验的过程中不断对译文进行修改,达到最契合版本。2.1.2 初期研究(一)对 SDK 进行初步研究,初步选取有用信息,了解控制AR.Drone 是通过 3 个主要的通信服务完成的。控制和配置无人机是通过在UDP的5556端口发送AT命令实现的。控制命令的发送延时是向用户体验的关键。这些命令都是定期发送的(通常为30次/秒) 。可用命令的列表和它们的语法在将第6章中讨论。关于无人机的信息(像它的状
8、态,它的位置,速度,发动机转速等) ,被叫做导航数据,这些信息是由无人机通过UDP的5554端口发送给客户端的。这些导航数据也包括可用于创建增强的现实游戏的标签检测信息。在演示模式下他们被发送15次/秒,在全模式(调试模式)下为200次/秒。视频流是由 AR.Drone 发送到客户端设备的 5555 端口 (AR.Drone2.0 使用TCP )。视频流中的图像可以用 SDK 中的编码解码器进行解码。(二)能够使用识别使飞机起飞、降落等的普通基础指令,即AT 指令。(1)AT 命令的语法字符串被编码为 8 位 ASCII 字符,后跟一个回车字符(字节值为 0D(16)),标记以后,表示一个换行
9、符标记符。一个命令由三个字符的 AT*(即三个值分别为 41(16),54(16)、2A (16)的 8 位字节)后面跟上一个命令的名字,一个等号,一个序列号,和可选的一系列以逗号分隔开的含义取决于命令的参数。一个 UDP 包可以包含一个或多个命令,以换行符隔开(字节值为 0A(16)。一个 AT 命令必须属于一个 UDP 包。将一个 AT 命令分解到两个或更多的 UDP 包中是不可能的。示例:AT*PCMD_MAG=21625,1,0,0,0,0,0,0AT*REF=21626,290717696总命令的最大长度不能超过 1024 个字符,否则整个命令行将被拒绝。这个限制硬性编码在无人机的软
10、件中。注意:不正确的 AT 命令会被无人机忽略。然而,客户端应该总是确保它发送UDP 数据包是正确的。大多数命令可以接受以下三种不同类型的参数: 一个有符号整数 ,存储在用一个十进制表示的命令字符串中(例如:序列号) 一个值存储在双引号中的字符串(例如:参数 AT*CONFIG) 一个单精度 IEEE-754 标准的浮点值(又名:浮点数)。那些并不直接存储在命令字符串中。相反,在 AT 命令中,32 位字包含的浮点数将被认为是一个 32位有符号的整数并打印出来。(2)命令序列为了避免无人机执行旧的命令,一个序列号将和每个发送的 AT 命令相联系,并存储为“等号”后面的第一个数字。如果该命令的序
11、列号小于最后一个收到的有效命令的序列号,则无人机将不会执行该命令。每当客户端与 AT 指令的UDP 端口断开连接,或者接收到将序列号置为 1 的命令时,这个序列号将在无人机中被重置为 1(当前,如果超过 2 秒还没有发送任何指令将被认为是断开连接)。因此客户端为了在无人机上成功地执行命令,必须遵守以下规则: 总是发送 1 作为发送的第一个命令的序列号。 总是发送序列号递增的命令。如果有几个软件的线程向无人机发送命令,应该通过一个专门的受互斥机制保护的函数生成序列号并发送给 UDP 包。(3)浮点参数示例如下,使用浮点参数并思考发送一个改进的带有-0.8 参数的命令来让它倾斜。数字-0.8 是根
12、据 IEEE-754 的格式作为值为 BF4CCCCD(16)的 32 位字存储在内存中的。这 32 位字可以被认为是 32 位整数的-1085485875 (10)。所以要发送的命令应该是:AT*PCMD_MAG=xx,xx,-1085485875,xx,xx,xx,xx(4)AT 命令总结表 1 AT 命令总结(5)命令语法AT*REF 概述:控制无人机的基本行为(起飞/降落,紧急停止,复位)语法: AT*REF=%d,%d参数 1:序列号参数 2:一个取值范围为02 32-1的整数值,代表一个位宽为 32 的位域来控制飞行器描述:发送这些命令来控制无人机的基本行为。在1.5版本的 SDK
13、 中,只有位8和位9是用于控制的位域。位18,20,22,24和28应设置为1。其他位应设置为0。Bits 31 109 8 7 0使用方法 不使用 起飞/着陆(又叫“启动位” )紧急信号(又叫“选择位” )不使用位9的用法:发送一个使这一位设置为1的命令来让无人机起飞。这个命令应该被重复直到在导航数据中无人机的状态显示为确实已起飞状态。如果没有给其他命令,飞行器将进入悬停模式并停留离地面约1米高的位置上。发送一个使这一位设置为0的命令来让无人机着陆。这个命令应该被重复直到在导航数据中无人机的状态显示为确实已着陆状态,并且当检测到异常情况发生时,将作为安全信号被发送。在第一次起飞命令发送后,无
14、人机处在起飞状态,但仍可接受其他的命令。这意味着当无人机在空中上升到“1米悬停状态”时,用户可以发送命令来移动或使它旋转。位8使用方法:当飞行器处在一个“正常”的状态时(飞行或在地面等待状态) ,发送一个将此位设置为1(例如:发送一个“紧急指令” )的命令会使无人机进入紧急模式。无论飞行器处在何种状态发动机都将停止工作(例如:飞行器可能严重受到撞击) 。当飞行器处于紧急状态(处在以前的紧急命令状态下或是受到撞击)时,发送一个将此位设置为1(例如:发送一个“紧急指令” )的命令,如果造成紧急情况的条件得到解决时,会使无人机恢复到正常状态(允许它再次起飞) 。发送一个将此位设置为0的 AT*REF
15、 命令时,会使无人机考虑执行“紧急指令”的控制(这将防止连续的“紧急指令”使无人机在紧急和正常状态之间剧烈的变化)。例如:把下列命令送到一个独立的 UDP 包中将发送一个紧急信号:AT*REF=1,290717696AT*REF=2,290717952AT*REF=3,290717696AT*PCMD/ AT*PCMD_MAG 概述:发送一个命令使飞行器移动(行驶,旋转)语法: AT*PCMD=%d,%d,%d,%d,%d,%d语法: AT*PCMD_MAG=%d,%d,%d,%d,%d,%d,%d,%d参数1:序列号参数2:允许使用改进命令或组合式偏航模式(位域)的标志参数3:无人机左右倾斜
16、浮点值的范围-11参数4:无人机前后倾斜浮点值的范围-11参数5:无人机垂直速度浮点值的范围-11参数6:无人机角速度浮点值的范围-11参数7:磁航向(仅在 AT*PCMD_MAG 中使用)浮点值的范围-11参数8:磁航向精度(仅在 AT*PCMD_MAG 中使用)浮点值的范围-11描述:这一命令控制无人机的动作。始终设置标志(参数2)位的值从0到1从而使无人机可以考虑其他参数。将它设置为0可以使无人机进入悬停模式(在地面上同一点的高度上保持).Bits 31 3 2 1 0用法 不使用 绝对控制可使用 组合式偏航可使用改进命令可使用这里所配置的左右倾斜(又叫“无人机的滚转”或 角)的参数是最
17、大倾斜的一个百分比。一个负值使飞行器向左倾斜,从而向左飞。一个正值使飞行器向右倾斜,从而向右飞。这里所配置的前后倾斜(又叫“无人机的俯仰”或 角)的参数是最大倾斜的一个百分比。一个负值使飞行器机头向下,从而向前飞。一个正值使飞行器机头向上,从而向后飞。无人机在水平面上改变速度取决于环境,并且不能被固定。当滚转或俯仰的值设置为 0 时,无人机将保持水平,但由于其惯性,它会继续在空气中移动。只有空气阻力能让它停下来。这里所定义的垂直速度(又叫“gaz”)的参数是最大垂直速度的一个百分比。一个正值使无人机在空中上升。一个负值使得它下降。这里所定义的角速度的参数是最大角速度的一个百分比。一个正值使它向
18、右旋转;一个负值使它向左旋转。这里所定义的 psi 参数是一个由磁力计传感器提供的标准的 psi 偏北角。一个值为 0 的角度表示控制器是面向北方的。一个正值表示控制器是朝向东的,一个负值是朝向西的。值为 1 和-1 表示同一方向。(只用于 AT * PCMD_MAG)Psi 精度的参数是磁力计传感器的精度。此值表示当前位置磁方向的角度可能不同于地磁方向的最大偏差。负值表示无效的方向。(只用于 AT*PCMD_MAG)2.1.3 深入研究考虑到需要识别预设区域,需要加入图像识别,又深入研究 SDK 导航数据部分,编写导航数据命令,精确具体方位。(一)导航流数据Navdata 是由无人机的 UD
19、P5554端口发送到客户端的 UDP5554端口。信息存储是一种二进制格式,包括几个部分数据块的形式称为选项。(二)AR.Drone2.0 的视频流AR.Drone2.0 使用标准的视频编解码器,具有管理网络数据流的自定义封装视频编解码器。AR.Drone2.0 使用 H264( MPEG4.10 AVC )处理高品质视频流和视频录像的基本规范。实时 H264 视频流可以调整以下参数: FPS : 15 和 30 之间比特率: 250kbps 的和 4Mbps 之间分辨率: 360P ( 640360 )或 720P( 1280 * 720 ),此处本项目使用前段摄像头,分辨率为后者网络视频封
20、装:对于网络传输,视频图像通过自定义头标题文件被发送出去,其中包含图像的许多信息。网络传输视频流AR.Drone 2.0 的视频流是通过 TCP 的 5555 插座传输的。当客户端连接到插座时,AR.Drone2.0 将立刻开始发送视频帧。2.2 通过 PC 语音识别,发送语音控制命令在控制界面上建立文本框,用科大讯飞语言输入法,在编好的程序中输入内容,发出命令。图 3 输入起飞语音信号图 4 输入向指定地点飞行的语音命令2.3 飞行器视频流采集,分析图片,自动判定飞行区域2.3.1 学习 halcon 软件,达到图像标志识别的目的(一)提取对本项目有用的语句dev_set_colored (
21、number)显示 region 时用到的颜色rgb1_to_gray(image,toimage)功能:把一个 RGB 图像转变成一个灰度图像smallest_circle( Regions : : : Row, Column, Radius )获取圆形区域的参数get_image_pointer1 ( Image : : : Pointer, Type, Width, Height )获得图像的数据。如:图像的尺寸的宽度和高度count_obj( Objects : : : Number )主要用法是计算 objects 的个数dev_open_window( : :Row,Column,
22、WidthHeight,Background :WindowHandle )打开一个图形的窗口dev_set_draw(fill)填满选择的区域dev_set_draw(margin)显示的对象只有边缘线threshold( Image : Region : MinGray, MaxGray : )选取从输入图像灰度值的 g 满足下列条件:MinGray 0);判断如果 d-e,则说明飞行器位于靶标的左侧,因此我们发送右倾的命令来矫正它的位置;否则就说明飞行器位于正确航线。(三)c#语言导出图 18 导出的具体操作图 19 导出的 C#语言将导出后的 C#语言添加到主控制程序中。(四)到指定地
23、点转弯从飞行器中获取导航数据 yaw,该参数为飞行器当前的磁偏角,我们设定正对靶标的磁偏角为默认值,并给定出误差范围。若磁偏角在该误差范围内,说明飞行器的摄像头与正对靶标方向的磁偏角为同一值;否则,向飞行器发送旋转命令纠正其磁偏角。如果,飞行器当前检测到的实际距离为预定值,则向飞行器发送向左或向右(这取决于语音指令检测到的是 a 区还是 b 区)90的指令,使飞行器能够对准 a 区或 b 区的靶标。(五)完整实验过程通过利用 SDK 提供的控制飞行器的指令,编写 C#主控制程序,创建控制界面。图 20 主控程序部分截图 1图 21 主控程序部分截图 2图 22 主控界面只要向语音输入端发送“机
24、器人一号,请到 a 区” 或“机器人一号,请到b 区” 的指令,飞行器会自动起飞,先检测它相对靶标的左右位置,如果超出范围它会自动校正,校正完成后飞行器会检测实际距离,如果小于预定值它会向前飞行,到了预定位置飞行器会自动向左或向右旋转 90,寻找 a 区和 b 区的靶标然后跟踪,先校正方向后矫正距离,直到预设地点降落。 3 后续开发展望本项目初步实现了语音人机交互,随后可以预期飞行器能够扩大控制范围,通过 3G 网络,实现超远程控制飞行器。同时,可以加入体感控制技术,让人们可以很直接地使用肢体动作,与周边的装置或环境互动,而无需使用任何复杂的控制设备,便可让人们身历其境地与内容做互动。本项目在
25、图像抓取、以及图像处理方面做出了研究,今后预期可以通过图像中标志物的大小判断远近,甚至测距,这一方面为飞行器飞行测量不可人为测距处(如高山、湖泊等)的未知距离奠定了基础。4 总结本项目选择了能同时适用于四轴飞行器、科大讯飞语音识别系统以及Halcon 图像识别软件的 VS2012 编程环境及 C#编程语言。能够在具体实验环境中,用语音控制飞行器,使其执行控制命令,将语音识别技术成功应用于飞行器的运动控制,实现语音识别与飞行器运动控制的完美结合。在飞行器飞行过程中,利用 Halcon 图像处理软件,将飞行器拍摄的视频流截图进行处理,使飞行器能够自动识别视野中的标志,并根据标志判定所处位置及区域,从而完成控制中的位移指令。本项目能够达到通过语音控制飞行器飞行,使飞行器自动到达标记好的区域,达到了语音人机交互的初步预想。