基于安卓的Multiwii无人机控制系统的实现

2017-12-28 15:45赵旭彭克勤北京信息科技大学计算机学院
数码世界 2017年12期
关键词:飞控摇杆中点

赵旭 彭克勤 北京信息科技大学计算机学院

基于安卓的Multiwii无人机控制系统的实现

赵旭 彭克勤 北京信息科技大学计算机学院

近来消费级无人机市场的火爆催生了大量无人机爱好者对例如Multiwii的开源飞控的关注,而大量开发者的涌入也将无人机的使用范围大大拓宽,这时常规的2.4Ghz遥控器控制方式则显得捉襟见肘。使用同样开源的安卓手机作为控制器可玩性就增加了许多。

Multiwii 无人机 安卓 控制器

1 概述

目前世界上主要的开源飞控系统有Pixhawk,APM,Multiwii,此项目挑选Multiwii飞控作为研究对象及控制板,主要原因有,Multiwii飞控体积相较APM和Pixhawk来说要小很多,而且价钱非常便宜,只要APM的一半左右,Pixhawk的三分之一,其次,虽然Multiwii功能比较少,但是用来控制小型的无人机(轴距210mm左右)是完全足够的,而且使用手机进行基本的控制的话其他的功能是多余的,容易造成浪费,所以最终决定使用Multiwii飞控作为实验对象。

本项目主要使用蓝牙来控制无人机,和普通2.4G模块控制不同,蓝牙使用Serial port来进行通信,而2.4G模块则是使用普通的pin口,通过读取PWM值来进行控制,使用蓝牙的优点是手机本身就自带蓝牙,所以减少了工作量,而且也无需再添加2.4G信号发射机,但缺点显而易见,控制距离短,所以本项目控制的对象为相对较小的210mm轴距无人机,可以比较轻松的在室内进行飞行。

要使用蓝牙控制则需熟悉Multiwii Serial Protocol,串口传输协议,简而言之,只要蓝牙发送的指令格式符合协议规定,蓝牙终端就可以与Multiwii飞控板进行通信,控制。

2 程序结构

2.1 控制摇杆

使用双摇杆对无人机进行控制;左摇杆主要控制控制油门和偏航(摇杆纵向,摇杆横向)右摇杆控制俯仰和滚转(摇杆纵向,摇杆横向)除了左摇杆的纵向(Throt油门控制)其他方向均是放开摇杆后自动回中,因为如果油门舵也回中的话会对飞行器高度产生影响,使其不能维持原有高度。每个舵的舵量范围为1000到2000,中点为1500。摇杆初始化时确定摇杆的中点位置,随后摇杆运动后经过与中点的差值运算算出舵量,再整合到传输的message中,传送至Multiwii飞控板。摇杆有一个使用范围,即使手指挪动超出这个范围摇杆也继续在手指移动方向的圈上,不超出范围(确保舵量最大值不超过2000,最小值不小于1000)。摇杆上方显示各个信号的舵量(Throt油门,Yaw偏航,Pitch俯仰,Roll)使用ProgressBar来直观的显示舵量,方便操作。将ProgressBar的总量设为舵量的最大值,然后摇杆运动时产生的舵量显示在ProgressBar中。摇杆舵量可以进行微调:假设当两摇杆都在中央(舵量输出都是1500)但是无人机始终会向一个方向偏移(或者多个方向),就说明舵量输出不准确,使用微调来调整其数值,使无人机正常飞行。

2.2 控制器

部分包括Rocker和Controller两部分。Rocker用来得到用户所需的各舵的数值,创建时首先获取中心点的坐标,在移动中通过与中心点坐标进行运算得到各个舵量的数值。Controller每经过一小段时间(50ms)获取一次摇杆的舵量信息,并进行封装,利用ProtocolSender将整个控制Message进行封装,然后利用BluetoothService的Binder进行发送控制Message。

2.3 蓝牙部分

蓝牙模块主要功能为接受Multiwii端发送的信息和向Multiwii端发送信息,发送使用向BlueToothGatt写入特征值来实现,而接受消息则使用BlueToothGatt的回调函数中的OnCharactiesChange函数进行接收,接受内容也是BluetoothGatt中的特征值。次要功能则有,搜索BLE设备,连接BLE设备,和断开BLE设备。蓝牙模块为一个Service,所以有一个对应的Binder来作为中间桥梁,作为Activities操作蓝牙的接口。

2.4 通讯协议

通讯协议主要包含协议的指令集(Protocol),协议接收模块(ProtocolHandler),协议发送模块(ProtocolSender)。协议指令集(Protocol)最主要的功能就是提供对Multiwii进行通信中所需的所有控制指令(Command)和发送或接收数据的数据包头部(Header)。协议接收模块(ProtocolHandler)功能为:将蓝牙接收的消息按照Multiwii Serial Protocol进行分析,根据不同的控制指令(Command)来对数据进行处理以得到不同的信息。协议发送模块(ProtocolSender)的功能为将摇杆传回的舵量,依据Multiwii Serial Protocol来进行封装,将数据个数(舵的个数),控制指令(Command),封装的各个舵量,校验和封装为一个Message,因为每次向Multiwii传输的Message长度不都一样,所以先将Message放入ArrayList中,再调用listToArray转为byte数组,至此整个Message封装完毕。

2.5 遥控封装

RC(RadioControl);RC 部分包括 Channel模块和Data模块。Channel为每个舵量原始值的封装,通过摇杆移动时,对摇杆中间的值进行运算的到的数值做基本的封装,Channel部分实现了输出舵量在1000-2000之间,微调时也是通过调整Channel的value来实现输出舵量的变化。Data模块功能则是将各个舵量的Channel进一步进行封装,为封装控制Message做准备。Data分别将四个 Channel(Throt,Yaw,Pitch,Roll)的值取出,然后封装进一个ArrayList中,再通过listToArray转换为byte数组,至此完成封装。

3 实现方法

3.1 摇杆

摇杆的父类为Button,但是修改Button的Shape,修改为圆形。摇杆需要实现的功能为摇杆随手指移动但是并不是摇杆的中心一直在手指按压的地方。有一个活动界限,当手指移动超出活动界限时,摇杆依旧在活动界限的边缘。当实例化摇杆时先获取摇杆的中心点坐标(centerValue_x,centerValue_y)。为实现摇杆功能,重写了父类的onTouchEvent方法。实现随动功能,当手指按下时,先获取按下的坐标(x,y),再计算x,y与centerValue_x, centerValue_y的差值toCenter_x,toCenter_y,然后使摇杆 button invisible。实际上随手指移动的并不是摇杆本身,而是摇杆的一个镜像(ImageView),所以得到toCenter后开启摇杆的绘图缓冲,获取摇杆的 bitmap(Bitmap.createBitmap(getDra wingCache())),随后便释放缓存,避免重复镜像。随后添加WindowManager.LayoutParams的参数,主要有gravity,x,y(x,y并不是需要绘制的图形的中心,而是左边缘和上边缘),alpha(透明度),width,height。之前已经获取了CenterValue所以x的值为cneterValue_x-getWidth/2,y为 centerValue_y-getHeight/2。之前已经获取了摇杆的bitmap,所以使用setImageBitmap方法初始化拖拽用的imageView,随后将这个ImageView利用windowManager的addView添加至屏幕中。拖拽的实现只需改变layoutParams的x,y再调用windowManager的updateViewLayout即可。拖拽过程中随手指移动的imageView的x=moveX - toCenter_x - getWidth()/2,y=moveY - toCenter_y -getHeight()/2 - statusHeight(statusHeight为状态栏的高度),只要刷新x,y值就可实现随手指移动。边界使用一个比摇杆大一些的圆形Button,中点与摇杆相同,位置在摇杆下方,可省去触摸事件分配的代码量。边界主要作用是限制摇杆的移动,以及确保传出的数值无论纵向横向都是1000-2000。边界的实现(举x方向为列)当摇杆移动时的中心在边界内时,按照正常的拖拽即可,当超出时,摇杆只会停留在边界,但是如果手指在边界外移动,摇杆也要在边界移动,实现方法为利用相似三角形定理,moveX到centerValue_x的距离比上摇杆中心到center的距离 = x比上边界半径,由此可求出当手指移出边界外,移动时,摇杆在边界上的坐标,实现边界的作用。摇杆移动时需随时传出舵量,摇杆上下移动时舵量的输出大小是以中点1500来做运算。先得出每像素代表多少舵量(分量),然后用移动中的摇杆的中点坐标(layoutParams.x,layoutParams.y)减去中心点坐标(centerValue_X,centerValue_y)然后乘上分量,加或减去1500(在中点上方,或右方为加。在中点下方或左方为减)。手指离开屏幕时,从WindowManager中移除ImageView然后使原来的摇杆button visible

3.2 蓝牙传输

BLE和Blutooth2.0的开发有一 些区别,由于BLE诞生较晚,所以整体设计语言也是以之后的回调机制为主,相较更为复杂,连接不再只是一段代码,而是将一个远程BLE设备抽象为一个BlueToothGatt对象,连接则变为与这个Gatt对象进行连接,之后再通获取Gatt的BlueToothGattService,再 获 取Service中的BlueToothGattCharacteristic作为传输介质,然后上位机和下位机通过对BlueToothGattCharacteristic的Value进行写值,从而实现两端的通信。在回 调 类(BluetoothGattCallback) 中 通 过 重 写onCharacteristicChanged方法实现对接受到的信息进行处理。扫描设备同样采用了回调机制(scanCallback),通过重写scanCallbakc的onScanResult方法可获取远程BluetoothDevice列表,再通过用户选择来得到想要的远程BluetoothGatt。

3.3 协议封装

Multiwii Serial Protocol。要是想与FC进行通信,Message就必须遵循一定的格式,这个格式就是MSP(Multiwii Serial Protocol),协议分两种,一种是向F'C发送消息,一种是从F'C获得信息。发送消息的格式为 <header>,<direction>,<size>,<command>,<data>...,<crc>,Header为 $M 的字符串,direction 确定是从F'C获取信息还是向Multwii发送消息,’>’为向FC发送消息,’<’为从FC获取消息。size为data的数据长度,crc为Message的校验和,校验和的算法为:先将校验和初始为(char)0再依次与size,command,每个data作异或运算(^=)最后得出校验和。例如,我想获取FC的版本,这条指令是想从FC获取信息,所以direction为’<’,查询MSP(MSP_IDENT)得command(MSP文档中为message_id)为100(0x64)所以,因为是获取信息,所以data为空,crc为command,所以整合得一个获取FC版本的Message为”$M<0dd”(字符d的ascii码为100)。

4 结语

安卓端使用摇杆控制无人机只是一种最基本的用法,这也就意味着在安卓端实现了了一个控制接口,而拥有控制接口之后就可以进行一些很有趣的拓展,例如在手机端实现一个环境的建模,手机就可以针对这个环境规划这个环境的飞行路线,从而做到自动控制。

[1]郭霖.第一行代码,北京: 人民邮电出版社,2016-12-01

[2]张元亮.深入理解Android系统,北京:清华大学书版社,2015-5

[3]Multiwii 官方文档http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol

[4][美] Michael Margolis 著;杨昆云 译.Arduino权威指南(第2版),北京: 人民邮电出版社,2015-03-01

本文由计算机学院大学生创新实践基地建设项目资助,项目号:5111723400。

赵旭,男,本科,北京信息科技大学计算机学院。彭克勤,女,硕士,副教授,北京信息科技大学计算机学院。

猜你喜欢
飞控摇杆中点
例谈圆锥曲线中的中点和对称问题
曲柄摇杆机构的急回程度分析与探讨*
基于3D打印的曲柄摇杆机构实验设计
民用飞机飞控通电自检测安全性研究
中点的联想
VR飞行模拟的伴侣
中小型太阳能无人机航电系统设计
中点出招,招招喜人
二次曲线存在中点弦的一个充要条件