第5章四旋翼飞行器的飞行控制 5.1飞行控制板控制系统总体框架 本章的系统硬件主要由三部分构成: Android手机客户端、WR703N路由器的图像采集传输和飞行控制板及传感器,其总体构架如图5.1所示。 图5.1系统总体框架结构图 5.2所用器件 飞行器的各种零部件及开发调试器件如图5.2所示。 电源选用1200mA·h锂电池为整个系统供电,惯性器件选用MPU6050,高度传感器选用US100超声测距模块(自带温度传感器对测距结果进行校正,同时具有GPIO、串口等多种通信方式,内带看门狗,工作稳定可靠,使用GPIO通信模式)。NRF无线通信模块,电调,无刷电机(飞行器采用配套的无刷电机电子调速器驱动),螺旋桨选用6045桨,处理器选用TI公司的TM4C123G,光流传感器PX4Flow,9g舵机,相影HD720P高清网络摄像头,WR703N无线路由器。 图5.2飞行器零部件示意图 摄像头安装在舵机上,手机端发送指令,通过路由器接收控制舵机的运动,摄像头就可以从不同方向拍摄画面,拍摄到的图像由路由器发送到手机端。 摄像头和路由器的重量越小越好,所以选型上挑选重量较小的HD720P高清网络摄像头和WR703N 无线路由器,分别如图5.3和图5.4所示。 图5.3相影HD720P 高清网络摄像头 图5.4WR703N 无线路由器 图5.5和图5.6列出了摄像头和路由器的参数。 图5.5相影HD720P 高清网络摄像头的性能参数 图5.6WR703N 无线路由器的主要参数 5.3四旋翼飞行器的组装 5.3.1飞行器的整体组成 飞行器有以下部件: 上下两块碳纤维机架,4个无刷电机,4个电调,1个超声波模块,1个PX4Flow光流传感器,9g舵机和相影HD720P 高清网络摄像头,1个路由器,1对正桨,1对反桨,1块飞控板,1块电池,1条固定电池的魔术贴,连接机架之间的零件若干,固定机架的螺丝若干。 5.3.2飞行器的组装步骤 (1) 首先将4个无刷电机通过螺丝固定在底板的机架上。注意: 必须是一条对角线装正丝,另一条对角线装反丝。 (2) 在飞行器正方向的一边装两个相同且醒目颜色的桨,以此在操控飞行器时作为飞行器正方向的参照物。 (3) 适当剪短无刷电机3根导线与配套电调的3根导线的长度,套上适当长度热缩管。 (4) 将3对香蕉头分别与一对电机和电调对接的导线焊接。 (5) 将热缩管套入无刷电机的导线内和电调的导线内,对齐后用热风机吹缩固定。 (6) 按照同一步骤完成另外3个无刷电机与电调之间的连接。 (7) 将4个电调连电池的正极导线选出,适当剥去外层胶皮后,一起套入较大热缩套内,然后与一根短粗导线焊接,焊锡完全包裹住导线后,移动热缩套至焊接处遮挡,用热风机吹缩后完成。 (8) 对于4个电调的4根负极导线采取相同的方法连接电池的负极。 (9) 将以上的电调总正负极线焊接到分压板的电池电压输出脚上,注意红色导线对应正极,黑色对应负极。 (10) 将分压板上电池电压输入脚上焊接上XT60插座,将分压板安装于机架中心置于机架层中部。 (11) 电池的正负极线焊接上XT60插头,同样注意正负极对应的颜色。 (12) 将螺柱通过螺丝固定在机架上方,然后将另一块机架用螺丝盖在螺柱上固定。 (13) 在上机架的中心通过4组短螺柱固定飞控板,此时注意飞控板的摆放的正方向。 (14) 将4根电调上连接飞控板的双口导线按照顺序插在飞控板上。 (15) 用尺子和划刀裁剪出4块大小合适并且相同的泡沫塑料,通过黑胶布固定在机架上,作为飞行器的起落架。 (16) 装好飞行器之后,先对电机第一次运转进行初始化的过程。用事先编好的电调初始化程序下载入飞控板运行一次,设置4个电机最大最小转速。 (17) 调整电机的旋转方向。电机对角的转向相同,相邻的转向相反,这样才能抵消飞行器的自旋。0号电机和2号电机是顺时针方向,1号电机和3号电机是逆时针方向。注意调整转向时,一定要拆下桨。把遥控油门开到最低,接通电源,遥控器解锁,电机以最低转速开始工作,观察其顺逆方向,从0号(正方向的左上位置)电机开始,关注一个标志点来判断方向,开关操作两至三次验证。若与预期方向相反,则把电机和电调对接的三个信号线中任意两根信号线交叉对接即可。 5.4地面站 地面站的主要功能如下。 (1) 实时采集遥控器数据,采集遥控器的PPM信号并解析成真正的遥控数据,实现遥控器对四旋翼飞行器的控制。 (2) 实现飞控板之间的交互通信,包括传送遥控数据和控制命令数据,接收飞行器的状态数据,例如超声波传送的高度数据。 (3) 在LCD屏幕上动态显示飞行器的飞行状态数据。地面站实物如图5.7所示。 图5.7地面站实物图 5.5飞行控制板的功能 飞行控制板的主要功能如下。 (1) 通过电机驱动程序控制飞控板输出四路PWM波,调节4个电机的转速来实现对四旋翼飞行器运动状态的控制。 (2) 传感器数据的采集与处理。包括超声波模块的高度数据、光流传感器的位移数据等。 (3) 与地面站的交互通信。接收地面站发送来的遥控数据以及其他控制命令,同时向地面站反馈自身各项状态数据。 飞行器正反面见图5.8和图5.9。 图5.8四旋翼飞行器的正面图 图5.9四旋翼飞行器的反面图 5.6软件结构 5.6.1飞行控制板软件结构 飞控板控制软件对于实时性的要求非常高,通常采用C语言进行系统软件的编程,在主程序中先执行各类硬件和软件的初始化函数,初始化完成后进入主循环。除了数据通信和超声波定高以外,其余飞控板所要执行的任务均在400Hz的定时中断中依次进行。数据通信模块利用端口触发接收中断处理,超声波模块则在循环数据采集到之后触发中断将数据存入变量。采用一个主定时中断,免去了对于中断优先级复杂的设置,重要的处理程序不会被其他中断所打断,易于确认每一次中断是否在下一次中断到来前执行完毕,方便了系统的设计,也确保了飞控系统的实时处理的稳定性。 5.6.2通信数据帧格式 飞行器与地面站之间采用NRF24L01进行无线通信。在发送数据时,自动加上字头和CRC校验码。在接收数据时,又自动把字头和CRC校验码移去。NRF24L01还有自动应答及自动重发机制,故大大提高了数据通信的可靠性。可简化自定义的通信协议,帧长度固定,数据以先入先出的方式读取,高字节在前,低字节在后,空数据以00H代替。通信协议见表5.1。 表5.1飞行器与地面站通信协议 飞行器与地面站双方通信数据包格式 字节数 数据内容 字头 1 01010101和10101010交替发送 接收方地址 5 0x11, 0x23, 0x58, 0x13, 0x58 数据 32 crc校验 2 0xFFFF 飞行器发送地面站数据内容(飞行状态数据) int16[0] int16[1] int16[2] int[3] int[4] Pitch Roll Yaw 高度(cm) SumX(cm) int[5] int[6] SumY(cm) 16 (地面站通过16来判断是否为飞行器端发送的数据,是则显示数据在LED上,否则不执行) 地面站发送飞行器数据内容(控制飞行器飞行数据) int16[0] int16[1] int16[2] int16[3] int16[4] Pitch Roll Throttle Yaw Mod int16[5] 13 (飞行器收到数据,判断是否为13,是则执行飞行控制命令, Mod为解锁闭锁指令) 上位机通过串口与地面站连接,再通过地面站发送指令给飞行器。上位机发送的数据低字节在前,高字节在后。上位机与地面站通信协议如表5.2所示。 表5.2上位机与地面站通信协议 帧头 数据类型 数据内容 校验位 说明 2字节 1字节 28字节 1字节 数据长度 一帧数据总共32字节 帧头 0x9c 0x5f 帧头 数据内型 0x23 让飞行器写入上位机发送的PID1值,roll/pitch/yaw 0x24 让飞行器写入上位机发送的PID2值,high/POS X/POS Y 数据内容 未写入为00H 校验位 第0~30位相加续表 地面站收到数据内型0x23时发送给飞行器数据 int16 int16 int16 int16 int16 int16 Roll方向平衡PID参数值P值 Roll方向平衡PID参数值I值 Roll方向平衡PID参数值D值 Pitch方向平衡 PID参数值P值 Pitch方向平衡 PID参数值I值 Pitch方向平衡 PID参数值D值 int16 int16 int16 int16 Yaw方向平衡PID参数值P值 Yaw方向平衡PID参数值I值 Yaw方向平衡PID参数值D值 12 飞行器判别12执行写入PID1数据 地面站收到数据内型0x24时发送给飞行器数据 int16 int16 int16 int16 int16 int16 高度平衡PID参数值P值 高度平衡PID参数值I值 高度平衡PID参数值D值 X方向悬停PID参数P值 X方向悬停PID参数I值 X方向悬停PID参数D值 int16 int16 int16 int16 Y方向悬停PID参数P值 Y方向悬停PID参数I值 Y方向悬停PID参数D值 14 飞行器判别14执行写入PID2数据 5.7光流传感器 5.7.1PX4Flow光流传感器 PX4Flow是一款智能光学流动传感器。传感器拥有原生752×480像素分辨率,计算光流的过程中采用了4倍分级和剪裁算法(4×4分级图像算法),光流运算速度为120Hz(室内)~250Hz(室外),高感光度,有24×24高像素。通过UART口与飞行控制板连接,通过USB口连接计算机调试。 PX4Flow调试平台为Qgroundcontrol,安装好驱动后便可以与计算机连接。Qgroundcontrol是专门为PX4Flow设计的地面站软件,通过该软件可以直观地看到修改PX4Flow参数的效果。 PX4Flow可调参数参见第2章。 PX4Flow通过USB和串口输出MAVLink数据包。通过读取这个数据包,可以得到x、y相对位移数据,用来控制飞行器的飞行。其中MAVLink通信协议是一个为微型飞行器设计的信息编组库。它通过串口高效地封装C结构数据,并将数据包发送至地面站。 5.7.2Qgroundcontrol软件的使用 主要使用Qgroundcontrol软件的Analyze功能,对光流输出数据进行观察,把光流调节到最合适的工作状态,然后再安装到飞行器上使用。 通过video downlink功能,能接收到摄像头传输的实时图像。调试显示界面如图5.10所示,控制参数设置如图5.11所示,修改完参数后,通过set键使修改的参数作用在波形上。调试平台能观察许多参数的波形,如光流到地面的高度,x与y方向的光流值,其中通过观察integrated_x、integrated_y、integrated_xgyro和integrated_ygyro来确认目前光流是否已经达到了可以正常使用的状态。integrated_x、integrated_y分别表示x和y方向上的位移量,integrated_xgyro和integrated_ygyro表示x、y在三轴陀螺仪补偿后的位移量。 图5.10调试显示界面 图5.11控制参数设置 5.7.3PX4Flow光流调试 调试PX4Flow主要通过修改参数完成,可修改参数已经在第2章列出,这里简述调试方法。 进入Qgroundcontrol软件,单击Pixhawk on comX(根据实际串口选择)后,再单击Connect按钮,进入操作界面。 为了调试有好的效果,准备一张60cm×60cm大小的马赛克图案纸铺在地面。首先调整镜头焦距。单击Video Downlink按钮,可以显示出摄像头拍摄画面,画面清晰则说明焦距正确。摄像头得到的图像以及调试用的马赛克地面如图5.12所示。 图5.12清晰的图像及调试用的马赛克地面 在马赛克地面上能更加准确地看到光流波形的变化,更便于调试,在普通地面可能效果并不理想,这与地面的材质、花纹、反光程度都有关系。调节参数是希望在普通地面也能达到与马赛克地面一样的效果,两种地面的实测效果图见图5.13和图5.14。图中是integrated_x(表示x方向上的位移量)在传感器上下移动时的波形。 图5.13马赛克地面波形 图5.14普通地面波形 在马赛克地面只有少量毛刺,普通地面抖动严重,并不理想。 经过测试发现,BFLOW_F_THLD、BFLOW_V_THLD对波形影响较大,BFLOW_W_NEW对波形影响较小,LENS_FOCAL_LEN对陀螺仪输出波形有影响,其他参数对输出没有影响。 BFLOW_F_THLD参数是一个特征阈值,定义了底层光流计算图形的质量。原值为30,测试发现,把值调小至15后波形更为敏感,微小的移动偏量也会被探测到。 BFLOW_V_THLD参数是图形相关阈值,用来过滤较差的图形匹配。原值为5000,基本所有图像都被用来计算,所以误差会很大,调低至150,效果较为理想。 BFLOW_W_NEW位光流低通滤波器增益,原值为0.3,调至0.1有微小变化,基本影响不大。 LENS_FOCAL_LEN为透镜焦距(mm),此数值要与所使用镜头相对应。焦距对应时则陀螺仪输出波形在偏移时与x拟合理想,如图5.15所示。图中是integrated_x与 integrated_xgyro(表示x在三轴陀螺仪补偿后的位移量),两条曲线的重合程度越好,表示光流参数越理想。 图5.15xgyro与x波形对比 通过观察x、y的正负值关系,可以确定光流的x与y方向,见图5.16。 图5.16x与y位移量波形图 值得注意的是,PX4Flow对光照极为敏感。经测试发现,在夜晚、光照不好、日光灯照射下,光流工作状况并不理想,比较效果见图5.17和图5.18。 图5.17日光灯下光流波形有大量毛刺 图5.18阳光下光流拟合波形 光流在光照条件好的情况下,以250Hz速度处理图像,日光灯光照为50Hz,对图像处理有极大干扰。所以光流应工作在明亮的室内环境,不可使用有频闪的日光灯。 试验表明,焦距相同镜头像素越高,x与y的位移越精确,而不同焦距的镜头也对输出波形有影响。在不同高度,不同焦距的镜头在画面输出上也有很大的差别。通过观察输出波形,得到对应镜头焦距与高度的部分关系,如表5.3所示。 表5.3焦距与适用高度范围 焦距适用高度范围 3.6mm 50~60cm 4.2mm 80~90cm 6mm 100cm以上 在调试完光流传感器后,就可以在地面站上读取光流数值来确认是否达到可以使用的程度。 在地面站上编写程序,通过串口可以读取到光流输出的数据包,然后将需要的数据显示到地面站的LCD屏上,地面站与光流连接示意图如图5.19所示。 图5.19地面站与光流连接示意图 图5.19(续) 光流值显示数据值如图5.20所示。其中YAW、height对应光流的x位移量与y位移量,单位是像素。 图5.20光流显示数据值 通过定义一个26元素的数组flow_buf来存放从光流发送的数据,数据对应的数组如表5.4所示。 表5.4PX4光流数据对应的数组 数组编号内容 数组编号 内容 0~7 flow.time_sec 20、21 flow.flow_x.origin 8~11 flow.flow_comp_x.originf 22、23 flow.flow_y.origin 12~15 flow.flow_comp_y.originf 24 flow.id 16~19 flow.hight.originf 25 flow.quality 同理,定义flow_buf_rad数组来取得陀螺仪矫正数据,只需要用到x与y的矫正数据。 flow_rad.integrated_x和flow_rad.integrated_y指水平方向x、y位移的像素值,flow_rad.integrated_x和flow_rad.integrated_y指陀螺仪偏转时x、y的位移像素值。在四旋翼飞行器悬停或位移时,输出x、y方向的位移值对飞行器进行修正。当四旋翼飞行器出现前倾、后仰等情况时,减去flow_rad.integrated_x和flow_rad.integrated_y可以使飞行器认为自己没有产生水平上的位移,以保证悬停的稳定。 通过地面站读取的数值是像素值,而不是实际的距离,所以还要对数据进行修正,使输出到地面站的值为实际移动距离,同时修正后的位移值再通过x和y方向PID的调节,以实现飞行器的悬停。 在不同高度移动20cm像素输出差值如表5.5所示。 表5.5不同高度移动20cm像素输出差值 高度60cm 高度80cm 高度1m 280 200 156 275 200 152 278 226 150 260 225 170 290 210 170 270 220 151 270 200 190 取均值=277 取均值=208 取均值=166 在不同高度移动50cm像素输出差值如表5.6所示。 表5.6不同高度移动50cm像素输出差值 高度60cm 高度90cm 703 463 704 460 710 455 670 460 700 463 710 461 690 464 取均值=694 取均值=462 由数据可知,高度越低,移动相同距离输出的值越大,这与实际情况相符合。 获得实验数据后,就可以开始进行高度与角度的修正了。 角度变化示意图见图5.21,飞行器偏移会使其误认为自己产生了水平位移,需要矫正这一偏转误差。角度修正为: x1 =flow_rad.integrated_x-flow_rad.integrated_xgyro; y1 =flow_rad.integrated_y-flow_rad.integrated_ygyro; 陀螺仪输出值为偏转误差,只需要位移量减去这个值就可以使飞行器在原地偏转时输出的位移值不变。 图5.21角度变化示意图 不同高度移动相同距离示意图见图5.22。飞行器越低,移动同一距离输出的值就会越大,称为高度误差。 图5.22不同高度移动相同距离示意图 高度修正程序如下: x_mm=px4_sumy*High_Now * conv_factor; y_mm=px4_sumx*High_Now * conv_factor; 可知这是一个与高度相关的线性关系,只需要得到高度因数conv_factor即可,High_Now是通过超声波数据得到的当前高度值。通过表5.5和表5.6,运用Excel软件运算进行拟合,即可得到参数值conv_factor =0.0012f,拟合公式见图5.23。 图5.23拟合公式 5.7.4PX4Flow光流与四旋翼飞行器的硬件连接 光流传感器有4个引脚需要连接到飞控板上,分别是5V电源输入、GND、TX、RX。光流TX与主控芯片PD4(UART6RX)相连,光流RX与主控芯片PD5(UART6TX)相连。 光流传感器与四旋翼飞行器安装方向示意图见图5.24。通过地面站读取到的移动数值,可以确认飞行器向正方向飞行,光流输出值为负值,所以在进行飞行器悬停校正时,应该加上光流输出的位移量。光流传感器安装方向应与飞行器正方向平行,摄像头位置在飞行器尾部方向。 图5.24光流传感器与四旋翼飞行器安装方向示意图 5.7.5PX4Flow光流与四旋翼飞行器的软件连接 光流传感器能实现飞行器的定点悬停,软件流程图见图5.25。光流传感器连接的是飞控板UART6串口,初始化时开启串口接收中断。 图5.25定点悬浮流程图 在地面站能够查看是否能正常接收到正确的光流数值,飞控程序根据姿态和高度将光流数值修正完毕得到实际的位移值后,通过PID调节就可以实现飞行器悬停。程序如下: PID_POS_XOUT=(eeprom_readdate[3]/1000.0)*(tot_x_cm/10.0)+ (eeprom_readdate[5]/100.0)*(tot_x_cm-last_tot_x_cm)/10.0; PID_POS_YOUT=(eeprom_readdate[6]/1000.0)*tot_y_cm/10.0+ (eeprom_readdate[8]/100.0) *(tot_y_cm-last_tot_y_cm)/10.0; 将其转换为数学公式: 控制输出量=P×当前方向偏移量+D×(当前方向偏移量-上一次偏移量) eeprom_readdate[3]和 eeprom_readdate[6]是x方向上的P值和D值,eeprom_readdate[5]和 eeprom_readdate[8]是y方向上的P值和D值。由于四旋翼飞行器的对称关系,x与y方向的P值是相同的,P=0.035,D值也是相同的,D=3.8。 数值除以1000、100是因为上位机传输到飞控的P、D值是整形,这里要转换为小数。同样位移偏移量的单位也要转换。 定点悬停的输出量PID_POS_X.OUT和PID_POS_Y.OUT控制的是飞行器的U2(翻滚输入控制量)、U3(俯仰控制量),使光流输出的位移值趋于0,则飞行器能够保持飞行在原点附近,实现定点悬停的功能。 最后输出给电机的控制值为PID调节后的六轴传感器姿态值、光流数据、高度数据以及遥控器输入值之和。姿态、高度和光流的PID调节参数如图5.26所示。 图5.26姿态、高度和光流PID值 5.8飞行器及图像传感器调试 整个系统的调试需要软件部分与硬件部分联合进行调试。下面介绍几个在调试中主要出现的问题及对应的解决方法。 (1) 问题描述: 在软件之前已调试成熟的情况下,新组装的四旋翼飞行器在下载了软件后进行试飞时产生自旋,或轻推微小油门飞行器会翻身,或偏航严重。 解决方案: ① 首先确定电机转向正确,螺旋桨安装正确。飞控板安装方向确定了飞行器的正方向。电机的编号m1、m2、m3、m4确定了其正反转方向。 ② 飞控板拆卸后再次安装的位置是否对齐飞行器正方向。当改变飞控板安装方向时,就意味着对应的m1、m2、m3、m4电机改变位置,则其电机正反转就会发生错误。 ③ 如果上电时电调持续鸣叫,证明电调损坏,需要更换。更换后需要重新进行初始化才能正常工作。 ④ 电机无桨空转时声音异常,或手动旋转电机轴不灵活,则电机需要更换。 (2) 问题描述: 飞行器在起飞时向左或者向右自旋一定角度。 解决方案: 这可能是因为某些电机没有垂直安装或者电调没有初始化校准成功。 (3) 问题描述: 飞行器起飞时总是朝着某一个方向偏移。 解决方案: 如果只是起飞时歪,飞至空中后悬停能自动调整稳定,那应该是飞行器重心不对或起飞地面不平的原因。可通过电池的安装位置调整重心,还可以在飞控姿态程序中在倾斜方向上减去能使飞行器水平的偏移量。 5.8.1图像传输 可以实现视频传输的方式很多,比如使用ARM板、DSP平台进行编程,通过图传模块或WiFi模块来传输图像。考虑到要将航拍功能应用于载荷有限的四旋翼飞行器上,应选用体积较小的、空间利用率高的WiFi发射装置。 本方案采用WR703N无线路由器作为WiFi信号发射器。它不仅体积小,集成度高,利于安装固定,而且在软件部分采用了开源的OpenWrt,程序编写灵活简单。实物图如图5.27所示。其USB接口连接摄像头,串口通信三根导线接头连接飞控板。 图5.27WR703N路由器 5.8.2OpenWrt的使用 1. OpenWrt固件刷写 刚买来的WR703N无线路由器并不能直接使用,要对其进行OpenWrt固件的刷写。 (1) WR703N路由器连接计算机,在计算机上找到本地连接属性对话框,对“Internet协议版本4(TCP/IPv4)”进行正确的配置,如图5.28和图5.29所示。 图5.28“本地连接 属性”界面 图5.29Internet协议属性界面 (2) 将烧写的固件放入tftp32文件夹内,如图5.30所示。tftp32相当于一个多功能的网络服务器包,主要用于不同服务器之间的资源传输。 图5.30放置固件到目的路径 (3) 在计算机与路由器之间用网线和TTL线连接,登录PuTTY,如图5.31所示。PuTTY是一款在Windows平台下访问Linux系统的软件。 图5.31使用PuTTY登录 (4) 对系统进行适当的配置即可完成固件刷写,路由器的启动页面如图5.32所示。软件SecureCRT功能与PuTTY相似。 图5.32OpenWrt启动画面 OpenWrt是一个集成化的Linux系统,在功能上有很好的扩展性,可用于U盘、串口透传、智能家居、中继转发等。 2. 备份安装bin文件 (1) 用PuTTY进入路由以后,输入cat/proc/mtd查看分区状况。里面说明了各个分区的内容,如图5.33所示。 图5.33分区情况 firmware分区包含了所有的kernel、rootfs、rootfs_data和art,如表5.7所示。 表5.7分区情况说明 分区名称 描述 uboot 设备初始化程序+引导程序代码本身 kernel 内核,顾名思义是一个系统的最核心部分,存放的都是对内核进行管理的核心信息,这些信息都是以二进制形式存放的 rootfs 完整的系统文件包含只读和可写 rootfs_data 在rootfs中的可写部分的位置,为配置文件所在区,rootfs_data 相当于/overlay art EEPROM分区,在Atheros的方案中这个分区保存了无线的硬件参数 firmware 完整的固件位置包含了除uboot和art之外全部的内容 (2) 输入以下几行命令就可以备份整个.bin格式的back_firmware文件了,如图5.34所示。 root@Dreambox:~# cd /tmp root@Dreambox:/tmp# dd if=/dev/mtd5 of=/tmp/back_firmware.bin 7808+0 records in 7808+0 records out 图5.34文件备份目录 (3) 通过WinSCP传到Windows系统,如图5.35所示。WinSCP是不同系统之间文件传输处理的工具。 图5.35备份文件显示 3. 编译一个Hello World程序 (1) 在Ubuntu下,新建名为hello_world.c文件,编写相应的程序。 vi hello_world.c (2) 输入以下内容: #include int main(char argc,char *argv[]) { int i=1; while(1){ … printf("Hello world!!!%d\n",i); if(i<10) i++; else i=1; sleep(1); } return 0; } (3) 用mips指令编译“hello_world.c”文件,并生成“hello_world”可执行文件mipopenwrtlinuxgcc hello_world.co hello_world。 (4) 用WinSCP将文件传输到/tmp目录下。 (5) 在开发板的串口终端下执行hello_world文件。 /tmp/hello_world 4. 交叉编译并生成IPK文件 交叉编译通常用于两个有不同控制语言的平台之间,先在A机器上对程序进行编译,生成可执行文件,再将执行文件转移到B机器上来运行。起初要从官网上下载交叉编译工具链并进行安装,工具链通常包括编译器、连接器、解释器和调试器四部分。 (1) 切换到openwrt根目录,执行下列命令。 cd./package/utils//进入package/utils目录 mkdir hello_world//创建一个名为"hello_world"的文件夹,用于放置安装包源码 cd hello_world//进入相应文件夹 mkdir src//新建一个名为"src"的文件夹 vi src/hello_world.c//在src目录下新建一个名为hello_world.c文件 (2) 在src目录下新建一个Makefile,输入相应的内容。 vi src/Makefile (3) 在当前目录下新建一个Makefile文件并进行编写。 Makefile如同脚本文件,其中定义编写了一系列系统需要执行的操作命令。 (4) 返回至openwrt文件夹,执行命令: make menuconfig 选择已经加进去的安装包: utilities----> hello_world............Hello world -prints a hello world message 保存并退出。 (5) make V=s。等待编译完成后,可以在openwrt目录下的base文件夹内找到生成的安装包/hello_world_1.0_ar71xx.ipk。 (6) 将ipk包传输与安装到开发板上即可运行。 更改权限 root@Dreambox:/# chmod u+x /tmp/hello_world, 运行结果如图5.36所示。 图5.36Hello World运行结果 5. OpenWrt高级功能 除了基本的Hello World程序的运行外,OpenWrt这个嵌入式Linux系统还有很多高级功能可以拓展,以下介绍了其中的3种模式。 (1) AP模式。接入点模式,可以不用设置SSID和密码,关闭DHCP Server,外设通过WiFi连接开发板。 (2) Router。路由器模式,输入SSID和密码才可以进入,开启DHCP Server,外设通过WiFi连接开发板。 (3) 二级无线路由器模式设置。开启DHCP Server,连接开发板的设备和上级路由器处于不同网络,一般不能互通。 6. OpenWrt挂载摄像头 (1) 要实现视频传输必须安装相关功能的IPK,如表5.8所示。 表5.8视频传输相关IPK介绍 IPK名称 描述 kmodvideocore 摄像头内核模块,UVC 驱动依赖包 kmodvideovideobuf2 UVC驱动依赖包 kmodvideouvc UVC驱动 libpthread mjpegstreamer依赖包 libjpeg mjpegstreamer依赖包 mjpgstreamer mjpegstreamer功能安装包 (2) 插入摄像头。根据系统打印信息判断开发板是否支持该型号的摄像头,必须选择UVC摄像头。在安装完摄像头之后会出现/etc/config/mjpgstreamer配置文件,如图5.37所示。 图5.37mjpgstreamer文件内容 文件中的内容分别配置了设备名称、摄像头的分辨率、帧率、访问目录与访问端口。 (3) 在连接上路由器发射的WiFi信号之后,用浏览器打开网址http://192.168.1.1:8080/?action=stream即可看到实时传输的视频,效果如图5.38所示。 图5.38视频传输效果 5.9电源电压测量 由于锂电池连续使用或长期静置会产生电池过放的现象,这也就意味着电池报废,因而对电池电量的实时监控是十分有必要的。一般情况下,每节锂电池充满为4.2V,而将其报警电压设置为3.7V(即需要充电电压)。 如果采用带有报警功能的18S高精度电量显示器,飞行器飞行时插在电池上实时检测电池电量,其电压检测精度为±0.03V,电量显示于数码管上,需要几十毫安的驱动电流,低电量时会启动蜂鸣器进行报警,整个电量显示器的质量约为9g。相比而言,采用飞控AD口设计的分压电路进行电池电压检测,锂电池的耗电量远小于电量显示器,质量小,而且电路简单,生产成本很低。 5.9.1模数转换器概述 模数转换器的功能是将输入的连续模拟电压值转换成离散数字量。它的参考电平为3.3V,也就是说当输入源输入电压为3.3V时,12位模数采样值为4095。另外,每一个ADC模块都包含了4个可以对输入源触发、捕获、中断等进行灵活配置编程的序列发生器。 对于4个采样序列发生器,第一个序列发生器能够捕获八路采样,第二、三个序列发生器能够进行四路采样,而第四个序列发生器则只能捕获一路采样。采样序列发生器还可以通过配置其相应的先后顺序来应对多个响应同时触发的情况,优先级最高的采样序列发生器首先被触发,优先级第二的采样序列发生器接着被触发,以此类推。 5.9.2电源电压测量的实现 1. 电源分压电路的设计 由于3S锂电池充满时电压为12.6V,而飞行控制板上ADC模块的参考电压为3.3V,因此需要设计基本的分压电路进行电压转换。考虑到飞控板的安全问题与电路的耗电量问题,选用了3.6kΩ、15kΩ的电阻和正向管压降为0.7V的硅二极管各一个,如图5.39所示。 图5.39电源电压测量电路 由图可得,电压输出值为 Uout=VCC-UCER1+R2×R2+UCE(5.1) 电路设计中,若R1、R2分压电阻的阻值过大,则会导致电路中的电流过小,虽然功耗大大减小了,但这样微小的电流却不足以驱动ADC模块正常工作; 若阻值选择太小,则使得电路中电流过大,功耗过大。 2. ADC采样的软件实现 ADC的API 封装了一系列处理ADC功能的函数,主要包含了3类: 用于处理采样序列发生器; 用于处理触发器和处理器; 用于处理中断。 在本电路中,采用了PE0作为AD的采样引脚,其基本配置参数如表5.9所示。 表5.9PE0引脚参数 引脚名称 引脚编号 引脚赋值 引脚类型 缓冲区类型 描述 AIN3 9 PE0 I 模拟 模数转换器输入3 根据PE0引脚的参数来进行相应的初始化,具体程序如下: void battery_init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1); //使能ADCO SysCtlDelay(3); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); //使能PE0 CPIOPinTypeADC(GPI0_PORTE_BASE,CPI0_PIN_0); //使能PE0为ADC功能 ROM_ADCReferenceSet(ADC1_BASE,ADC_REF_INT); //配置ADC1,采样序列3,ADC处理器触发,优先级为0 ROM_ADCSequenceConfigure(ADC1_BASE,3,ADC_TRIGGER_PROCESSOR,0); //配置采样序列步进,ADC通道3,中断使能,对列结束选择 ROM_ADCSequenceStepConfigure(ADC1_BASE,3,0,ADC_CTL_CH3|ADC_CTL_IE|ADC_CTL_END); ADCSequenceEnable(ADC1_BASE,3); //使能ADC采样 ADCIntClear(ADC1_BASE,3); //ADC1中断清除 } 而对于读取数据,需要将AD数组中的值取出并赋给目标值,程序如下: ADCIntClear(ADC1_BASE,3); //ADC中断清除 ADCProcessorTrigger(ADC1_BASE,3); //中断发生器触发ADC while(!ADCIntStatus(ADC1_BASE,3,false)); //等待数据采样完成 ADCSequenceDataGet(ADC1_BASE,3,pui32ADC0Value); //采集第一个像素点 SysCtlDelay(10); battery_temp=pui32ADC0Value[0]; //将AD数组中的值取出,赋值 5.9.3电源分压模块的测试 测试阶段,进入Debug模式,通过单步调试将读取的AD值转换成理论电压值,公式为 U测量=3.3×(Temp+1)4096(5.2) 其中Temp为单片机内读取的12位AD值,然后将其与实际值进行对比,结果如表5.10所示。 表5.10采样值与实际值对比 Temp U测量 Uout 2705 2.17 2.2 2785 2.24 2.3 2890 2.32 2.4 3045 2.45 2.5 3165 2.55 2.6 3282 2.64 2.7 3435 2.76 2.8 3560 2.86 2.9 3700 2.98 3.0 最后,由式(5.1)反推即可得到锂电池的实际电压值。 5.10舵机 舵机是一个微型伺服功能的控制系统,可在0°~180°内转动,具有安装灵活、结构稳固、便于控制、稳定性好等优点,适用于需要保持或变化角度值的驱动场合中。随着飞行器的日益发展,带有航拍功能的飞行器越来越受欢迎,而云台是用于置放免驱摄像头的平台。对于航拍这项功能,一个摄像头的拍摄范围是有限的,但通过云台使得镜头可以自由转动,从而拍摄观测到各个角度方向的影像。 5.10.1舵机云台的硬件搭建 按照舵机说明书的介绍分步组装舵机云台,安装完成的实物见图5.40。其中红色线代表VCC,咖啡色线代表GND,橘色线代表信号输入端。 图5.40舵机云台实物图 5.10.2舵机云台的软件编写 根据9G舵机的基本参数得知,要想实现单片机对舵机云台旋转位置的控制,首先需要产生周期为20ms的PWM信号; 其次需要改变PWM信号的占空比,应使得脉冲宽度变化范围为0.5~2.5ms,对应了云台转动位置的0°~180°。由于飞行控制TM4C123GH6PM芯片自带PWM信号发生功能,因此只需对其进行基本配置即可。 在本方案中,采用了PB6、PB7作为上、下两个舵机的信号发生引脚,其基本配置参数如表5.11所示。 表5.11PB6、PB7引脚参数 引脚名称 引脚编号 引脚赋值 引脚类型 缓冲区类型 描述 MOPWM0 1 PB6 输出 TTL 运行控制模式0,信号由PWM发生器0产生 MOPWM1 4 PB7 输出 TTL 运行控制模式1,信号由PWM发生器0产生 根据PB6、PB7引脚的参数进行相应的初始化,具体程序如下: void camera_init() { SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0); //使能PWM0模块 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //使能PWM0和PWM1输出所在GPIO MAP_GPIOPinConfigure(GPIO_PB6_MOPWM0|GPIO_PB7_MOPWM1); MAP_GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_6|GPIO_PIN_7); MAP_GPIOPinTypePWM(GPIO_PORTB_BASE,); SysCtlPWMClockSet(SYSCTL_PWMDIV_32); //PWM时钟配置: 32分频 //配置PWM发生器0: 加减计数,不同步 PWMGenConfigure(PWMO_BASE,PWM_GEN_0,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MOOE_NO_SYNC); //设置PWM发生器0的频率,时钟频率/PWM分频数/n,80M/32/50000=50Hz PWMGenPeriodSet(PWMO_BASE,PWM_GEN_0,50000); PWMPulseWidthSet(PWMO_BASE,PWM_OUT_0,step_top); PWMPulseWidthSet(PWMO_BASE,PWM_OUT_1,step_down); PWMOutputState(PWMO_BASE,(PWM_OUT_1_BIT|PWM_OUT_0_BIT),true); PWMGenEnable(PWMO_BASE,PWM_GEN_0); } 由于系统的主频为80MHz,因而经过32分频和50000次时钟计数后,PWM方波的频率为80MHz/32/50000 =50Hz,即20ms。而变量step_top与step_down则用于控制PWM信号的脉冲宽度,取值为1250~6250,对应0.5~2.5ms。为了使云台在手机控制下有较明显的转动,将步进值取为250,即每次正向或反向旋转9°。 引脚输出波形如图5.41所示。 图5.41PWM波形输出 5.11四旋翼飞行器的遥控实现 5.11.1手机终端控制需求分析 1. 系统功能需求 四旋翼飞行器的手机终端控制的目的就是用身边现有携带的智能设备与四旋翼飞行器建立稳定可靠的连接,控制飞行器的飞行并实现双向通信,所以功能需求包含以下内容。 (1) 控制四旋翼飞行器的飞行。 (2) 实时显示电压余量。 (3) 实时图像显示。 2. 系统性能需求 (1) 实时性。 (2) 可靠性。 (3) 准确性。 5.11.2手机终端控制软件的设计方案 1. 设计原则 充分考虑到使用者的需求以及系统本身的特点,再结合软件的系统质量,该软件的设计应该遵循以下5个原则。 (1) 实用性。 (2) 容易使用。 (3) 界面的一致性。 (4) 可移植。 (5) 封装性。 手机APP软件编程环境采用Eclipse,编程语言用Java。开始编程前还需安装JDK以及配置环境变量。 2. 功能模块的设计 手机终端系统主要是利用飞行器上的WiFi路由设备对电池余量进行接收,操控飞行器平稳飞行,按照Socket通信将读取到的电压余量显示在界面上,并且当电量低于某一门限时进行报警。因此根据整个系统的需求分析,可以把系统分成3个功能模块,如图5.42所示。 图5.42手机功能模块结构图 1) UI界面模块 此模块是手机终端系统的人机接口界面,其中数据显示界面主要提供飞行高度、重力感应3轴数据以及云台拍摄的实时画面,用户操控界面主要有操控云台舵机上、下、左、右以及飞行高度控制。 2) 数据通信模块 此模块分为数据存储与数据通信两部分。数据存储就是将上下行的数据保存在数据库里面,并实时地显示在界面上,包括飞行的高度、电池余量等。 (1) 基于TCP协议的Socket。 Socket通信模型见图5.43。 图5.43Socket 通信模型 (2) Socket建立连接的过程。 Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。 Socket建立连接主要分为以下3个步骤。 ① 服务器(Server)监听。Server创建Socket,将它绑定到一个IP和Port上,并设置为监听的模式,这时Server会实时地监控网络状态,等待Client的连接请求。TCP 协议通信见图5.44。 图5.44TCP 协议通信 ② 客户端(Client)请求。Client创建Socket,并对Server发送连接请求,为了连接上Server端Socket,Client需要对连接的目标Server的Socket进行准确叙述,包括Server的IP和Port,这是Client向Server发送请求的前提。 ③ 两者确认连接并通信。处于监听状态的Server的Socket监听到Client的连接请求时,会对其做出响应并返回一个新的Socket给Client表示已接收请求,随着Client对此确认,两者至此就建立起连接进行通信。另外,Server的Socket仍然处于监听的状态来响应其他Client的请求。 在四旋翼飞行器的飞控中,涉及四旋翼飞行器的飞控板与手机客户端之间的通信。总体来说,采用了WiFi的通信方式,将一个WiFi路由器作为一个站点,一方面可以接收飞控板串口发送过来的数据,并转发给到该路由器的手机客户端。另一方面,路由器还可以接收手机发送过来的数据并发送给四旋翼飞行器的飞控板,于是四旋翼飞行器的飞控板和手机客户端便建立了一个全双工通信的网络。 通信数据的发送和接收采用TCP/IP面向连接的传输协议。通信具体内容相互传送采用ASCII编码。 四旋翼飞行器的飞控板传送数据给手机客户端时: 首先向手机端发送一个字符,这个字符可以让手机端知道传送过来的数值表示电池余量检测的数值。比如发送“D”,则表示发送的是电量的数值,最后需要发送一个换行符'\n'表示电压余量检测数值发送完毕。 四旋翼飞行器的飞控板收到手机端传送操控四旋翼飞行器摄像头的四种运动方向,数据传输协议为: 当单片机串口接收到字符串'_CMDUa'时,表示云台向上; 接收到'_CMDUb'时,表示云台向下; 接收到'_CMDUc'时,表示云台向左; 接收到'_CMDUd'时,表示云台向右。此外手机与网络摄像头之间的数据(视频)传输,采用的是HTTP协议。 (3) HTTP视频传输协议。 采用HTTP协议作为视频传输的协议栈,主要分成网络层、传输层和应用层,如图5.45所示。 图5.45HTTP作为视频传输的协议栈 应用层是面向对象的协议,主要特点如下。 ① 支持Client/Service 模式。 ② 通信的速度十分迅速。 ③ HTTP能够传输任意类型的数据对象,因此十分灵活。 ④ 无须连接: HTTP限制每一次的连接都只处理一个请求,利用这种方式可以节省传输时间。 3) 飞行控制模块 利用手机终端向四旋翼飞行器发送云台的控制指令以及调整飞行高度等参数,及时调整四旋翼飞行器的飞行状态。另外,使用Android移动终端重力加速度进行重力感应遥控。 (1) Android开发相关技术。 Android是Google公司开发的基于Linux平台的开源手机操作系统,其包括操作系统、User界面和Applications,具有手机工作需要的全部功能。 Android的系统架构与其操作系统一样,采用了分层的架构。Android分成4层: 应用程序层、应用程序框架层、系统运行库层和Linux核心层,如图5.46所示。 图5.46Android系统分层架构 (2) Android的四大组件。 Android的四大组件分别为Activity、Service、Content Provider、Broadcast Receiver。 ① Activity。  一个Activity就是一个独立的界面。  Activity与Activity之间是利用Internet来实现通信的。  每一个Activity都要在AndroidManifest.xml中声明。 ② Service。  Service用于在后台完成用户指定的操作。  Service需要在应用程序配置文件中进行声明。  Service组件没有图形UI界面。 ③ Content Provider。  当需要在多个Application程序间进行数据共享时才需要Content Provider。  Content Provider实现数据共享。 ④ Broadcast Receiver。  Broadcast Receiver没有User界面,但可以通过开启一个Activity来响应收到的数据信息。  Broadcast Receiver的注册有两种方法: 程序的动态注册和AndroidManifest文件中进行静态注册。 (3) Android重力感应的开发。 重力加速度传感器(Gsensor),能够返回X、Y、Z三个方向的加速度。 该数值包含地心引力的影响,单位是m/s2。 将手机平放,X轴为0,Y轴为0,Z轴为9.81。 将手机朝下放在桌面上,Z轴为-9.81。 将手机向左倾斜,X轴为正值。 将手机向右倾斜,X轴为负值。 将手机向上倾斜,Y轴为负值。 将手机向下倾斜,Y轴为正值。 5.11.3软件工作的整个流程设计 设置手机终端的工作流程如下。 (1) 登录iDrone,初始化系统参数。 (2) 检查WiFiOpenWrt是否连接。 (3) 进入App操作界面,单击Connect按钮,再单击“一键起飞”按钮,利用重力感应进行飞行遥控。 (4) 微调飞行高度,调整云台舵机方向,观察周围环境,实时获取电压余量,若低于11V门限,则进行报警功能。 (5) 单击“一键降落”按钮,断开手机与四旋翼飞行器的连接,退出App。 手机App工作流程如图5.47 所示。 图5.47手机App 工作流程 5.11.4Android传感器的种类 对于四旋翼飞行器的飞行控制,主要是利用手机终端的重力感应来实现的。Android手持终端作为四旋翼飞行器的遥控系统的优势之一就是它含有多种传感器,如表5.12所示。 表5.12Android常用传感器种类 传感器 说明 测量单位 常用场景 类型 重力加速度 测量应用于设备X/Y/Z三轴的加速度,包括重力 m/s2 运动检测(振动、倾斜等) 硬件 陀螺仪 测量设备围绕设备X/Y/Z三轴的旋转率 m/s2 运动检测(旋转、翻转等) 硬件续表 传感器 说明 测量单位 常用场景 类型 线性加速度 测量应用于设备X/Y/Z三轴的加速度,重力除外 m/s2 检测一个单独的物理周的加速度 软件或硬件 旋转矢量 通过提供设备旋转矢量的三个要素测量设备的方向 无 运动检测和旋转检测 软件或硬件 图5.48重力加速度传感器图 四旋翼飞行器中选用重力加速度传感器来进行重力感应的遥控任务,利用加速度传感器能够十分灵敏地检测手机上下左右,能够通过倾斜手机来实现对飞行器的飞行控制,这种交互设计能够更直接轻松地对飞行器进行遥控。 重力加速度传感器(Gsensor)主要用于获取values[0]、values[1]、values[2]3个参数。如图5.48所示,将手机平放,X轴为0,Y轴为0,Z轴为9.81。 如将手机旋转90°放置,视频画面占满整个屏幕时,可以得到以下结论。 (1) 把手机的正面朝下平放,Z轴显示为-9.81; (2) 把手机的正面向上倾斜,X轴显示为正值; (3) 把手机的正面向下倾斜,X轴显示为负值; (4) 将手机的正面朝左倾斜,Y轴显示为负值; (5) 将手机的正面朝右倾斜,Y轴显示为正值。 5.11.5重力感应的遥控方式 通过控制界面,进入重力感应遥控模式,接着就可以直接通过手机上下左右操控四旋翼飞行器的稳定飞行,具体使用方法如图5.49所示。 图5.49重力感应控制方式 5.11.6重力感应遥控的实现 重力感应遥控的实现主要是通过Android感应检测管理——SensorManager。 1. 取得SensorManager 使用感应检测Sensor首先要获取感应设备的检测信号,可以调用Context.getSysteService(SENSER_SERVICE)方法来取得感应检测的服务。 2. 实现取得感应检测Sensor状态的监听功能 通过以下两个SensorEventListener方法来监听,并取得感应检测Sensor状态: public void onAccuracyChanged(Senso sensor,int accuracy);//在感应检测到Sensor的精密度有 //变化时被调用到 public void onSensorChanged(SensorEvent event); //在感应检测到Sensor的值有变化 //时会被调用到 3. 取得感应检测Sensor目标各类的值 通过下列getSensorList()方法来取得感应检测Sensor的值: Listsensors=sm.getSensorList(Sensor.TYPE_TEMPERATURE); 图5.50重力感应的实现程序框图 4. 注册SensorListener sm.regesterListener(SensorEventListener listener, Sensor sensor, int rate); 第一个参数是监听Sensor事件; 第二个参数是Sensor目标种类的值; 第三个参数是延迟时间的精度密度。 5. 取消注册SensorListener sm.unregisterListener(SensorEventListener listener) 6. 加速度感应检测——Accelerometer Accelerometer Sensor测量所有施加在设备上的力所产生的加速度的负值(包括重力加速度)。加速度所使用的单位是m/s2,数值是加速度的负值。 (1) SensorEvent.values[0]: 加速度在X轴的负值。 (2) SensorEvent.values[1]: 加速度在Y轴的负值。 (3) SensorEvent.values[2]: 加速度在Z轴的负值。 重力感应的实现程序框图如图5.50所示。 5.11.7飞行控制高度的实现 SeekBar可以用来当Media的进度指示和调整工具等,SeekBar是ProgressBar的一个子类,飞行高度控制的实现框图如图5.51所示。 图5.51飞行高度控制的实现框图 5.12手机终端与飞行控制板的通信 5.12.1概述 在一般的设计中,人们用遥控器给飞行器发送指令,通常需要搭建一个地面站,由NRF进行无线传输,并且还需要对地面站的收发数据与液晶屏的显示进行程序上的编写,比较烦琐。若手机能够连接到路由器发射的WiFi,那么就可以向飞行器发送控制命令。相比较而言,这种方法不需要遥控器、地面站、天线等大件实验器材的参与,实现起来简单方便,可扩展空间大。 5.12.2数据通信模块 数据通信模块需要处理的数据,包含手机终端上传到四旋翼飞行器的飞行控制命令和四旋翼飞行器下载到手机终端的数据。 1. 上下行数据的传输 上下行数据的传输如表5.13和表5.14所示。 表5.13上行数据的传输 上行传输数据 数据类型 数据值格式 1 一键起飞 Int _CMDUe$ 2 一键降落 Int _CMDUf$ 3 云台向上 Int _CMDUa$ 4 云台向下 Int _CMDUb$ 5 云台向左 Int _CMDUc$ 6 云台向右 Int _CMDUd$ 7 重力感应X/Y/Z Float _CMDXx.x Yx.x Zx.x$ 8 飞行高度H Int _CMDHh$ 注: _CMDXx.x Yx.x Zx.x$:当X轴或Y轴或Z轴在负轴方向时,x.x表现为x.x。 表5.14下行数据的传输 下行传输数据 数据类型 数据值格式 9 电压余量 Float DYxx.x 注: 当xx.x小于等于10.6V时,产生警报。 2. 数据通信 四旋翼飞行器与手机终端系统通过基于TCP/IP的Socket实现连接,四旋翼飞行器是Server,手机终端为Client,Client根据Server指定的IP和Port建立起Socket连接,然后从Server获取到输入流来读取并处理数据,最后把电压余量检测数值显示在Control界面。 Client利用Socket连接到Server,当Client和Server建立了Socket以后,程序就不会对Server和Client进行区分,而是直接通过两者的Socket进行通信。其中包括从Socket获取的输入流和输出流进行双向通信。 (1) 实现四旋翼飞行器电压余量检测并报警的程序框图如图5.52所示。 图5.52电压余量检测并报警的程序框图 (2) 控制云台方向以及一键起飞和降落的程序框图如图5.53所示。 图5.53实现云台方向控制以及一键起飞和降落程序框图 5.12.3手机终端界面设计 在Windows下搭建Android开发环境,利用Eclipse集成开发环境下设计UI界面模块。最关键的是控制界面的设计,这一界面用来显示四旋翼飞行器的飞行状态和四旋翼飞行器的状态信息,如图5.54所示。 图5.54控制界面 控制界面主要包括以下6部分。 (1) 重力感应数值。位于界面的左下方,可以通过重力感应控制飞行判断当前X、Y、Z的状态值。 (2) 云台舵机图像。整个界面的背景就是四旋翼飞行器上云台拍摄的实时视频。 (3) 云台舵机控制。位于界面的右下方,包括FRONT、LEFT、BACK、RIGHT。 (4) 电压余量检测。位于界面的左上方,用于实时显示四旋翼飞行器的供电电压,若电压低于11V会启动自动报警功能。 (5) 飞行高度控制。位于界面的最上方,用来拉动Progress亮标控制四旋翼飞行器的当前高度。 (6) 一键起飞和降落。位于界面的右上方,单击按钮可以控制飞行器的一键起飞和一键降落。 5.12.4WiFi实时视频模块 WiFi视频实时传输模块的实现就是将云台舵机传过来的数据进行解析,然后把每一帧的图片不断地绘图到手机屏幕上。WiFi视频拍摄模块如图5.55所示。 图5.55WiFi视频拍摄模块 利用IP WiFi云台,连接对应的IP和Port,这里是192.168.1.1:8080,就会在手机屏幕上获取到实时拍摄的画面,具体实现的程序框图如图5.56所示。 图5.56WiFi视频传输程序框图