DJI Mobile SDK(2):多自由度控制飞行(Virtual Stick)
由于项目开发需要用电脑控制Mavic进行飞行。最终选择的方案是用手机做一个中转,即“电脑->手机app->遥控器->飞行器”,电脑和手机之间采用TCPSocket通信。
循序渐进,本文主要介绍如何编写手机app来控制Mavic飞行。
编写UI
UI上一共放置了18个Button,用来模拟遥控器,主要包括左右两套摇杆、起飞、降落、使能手机控制、关闭手机控制,以及四个备用Button。具体代码就不写了,最终实现的界面如下。
按钮响应
最主要的一个Button就是EN(使能手机控制),点击之后,进行一系列初始化的工作。在onClick()方法里编写。
public void onClick(View v){switch (v.getId()) { case R.id.button_enable_virtual_stick:{//使能控制DJISampleApplication.getAircraftInstance().getFlightController().setVirtualStickModeEnabled(true, new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {}});//设置飞行器坐标系和控制模式DJISampleApplication.getAircraftInstance().getFlightController().setRollPitchCoordinateSystem(FlightCoordinateSystem.BODY); DJISampleApplication.getAircraftInstance().getFlightController().setVerticalControlMode(VerticalControlMode.POSITION); DJISampleApplication.getAircraftInstance().getFlightController().setYawControlMode(YawControlMode.ANGULAR_VELOCITY); DJISampleApplication.getAircraftInstance().getFlightController().setRollPitchControlMode(RollPitchControlMode.VELOCITY); //定时器用来定时,200ms发送一次数据if (null == sendVirtualStickDataTimer) { sendVirtualStickDataTask = new SendVirtualStickDataTask(); sendVirtualStickDataTimer = new Timer(); sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 100, 200);}break;}}}
首先是使能手机控制,其次设置飞行器的坐标系(body || ground)和飞行控制模式(速度控制 || 位置控制)。这个很重要,因为它决定着你点击按钮后发给飞机的到底是速度值还是位置值(我这里依次设置的是:坐标系–BODY,垂直–POSITION,Yaw轴–ANGULAR_VELOCITY,PitchRoll轴–VELOCITY),详情参考DJI developer。最后是一个定时器配置,每隔200ms给无人机发送一次数据。
之后在onClick()方法里添加其他Button的响应,代码如下:
case R.id.button_take_off:{DJISampleApplication.getAircraftInstance().getFlightController().startTakeoff(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {}});break;}case R.id.button_auto_land:{DJISampleApplication.getAircraftInstance().getFlightController().startLanding(new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {}});break;}case R.id.button_left_up:{yaw = 0; pitch = 0;roll = 0;if (throttle < 50) {throttle = throttle + 1;}break;}case R.id.button_left_left:{yaw = -10f; pitch = 0;roll = 0;throttle = 3f;break;}case R.id.button_left_center:{yaw = 0; pitch = 0;roll = 0;break;}case R.id.button_left_right:{yaw = 10f; pitch = 0;roll = 0;throttle = 3f;break;}case R.id.button_left_down:{yaw = 0;pitch = 0;roll = 0;if (throttle > 3){throttle = throttle - 1;}break;}case R.id.button_right_up:{yaw = 0; pitch = 0;roll = 1;throttle = 3f;break;}case R.id.button_right_left:{yaw = 0;pitch = -2;roll = 0;throttle = 3f;break;}case R.id.button_right_center:{yaw = 0;pitch = 0;roll = 0;break;}case R.id.button_right_right:{yaw = 0;pitch = 2;roll = 0;throttle = 3f;break;}case R.id.button_right_down:{yaw = 0;pitch = 0;roll = -1;throttle = 3f;break;}case R.id.button_disable_virtual_stick:{DJISampleApplication.getAircraftInstance().getFlightController().setVirtualStickModeEnabled(false, new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {}});break;}default:break;}
以上主要是其它Button的响应,根据我们设置的控制模式,yaw pitch roll分别代表三个轴的速度(或角速度),throttle 代表垂直的高度。这里还有自动起飞、自动降落、关闭手机控制的Button,不再赘述。
之后就是我们的定时器的定时发送任务,把手机设置的控制指令每隔200ms发送给无人机。
private class SendVirtualStickDataTask extends TimerTask { @Overridepublic void run() {if (isFlightControllerAvailable()) { DJISampleApplication.getAircraftInstance().getFlightController().sendVirtualStickFlightControlData(new FlightControlData(pitch,roll,yaw,throttle),new CommonCallbacks.CompletionCallback() {@Overridepublic void onResult(DJIError djiError) {}});}}}
模拟飞行
代码写完了,不能每次调试都拿着飞机出去飞,况且代码不知道能不能用,万一出点Bug,乱发一些控制信号,可能就炸机了(说到这里,摸了摸我的Mavic云台T_T)。
不过DJI还是很人性化的,有一个调参软件DJI Assistant可以模拟飞行。装飞机驱动之后,把飞机通过USB连接到PC上,打开DJI Assistant找到“模拟器”。就可以愉快地调试啦!
特别提示,模拟器必须要连接无人机,防止出现危险,请把无人机的桨叶全部拆掉!!!
加油!
DJI Mobile SDK(2):多自由度控制飞行(Virtual Stick)相关推荐
- 大疆 DJI Mobile SDK 开发:模拟器调试
目录 创建飞行控制器界面 1.新建Activiity 2.MainActivity activity_main.xml MainActivity.java 3.FlightActivity activ ...
- DJI mobile SDK学习
DJI Mobile SDK为开发者提供了丰富的API接口,可以供用户按自身需求开发出不同的移动应用软件.根据移动设备平台的不同,Mobile SDK又主要分为IOS SDK与Android SDK, ...
- DJI Mobile SDK初步开发
大疆Mobile SDK初步开发 1. 从MSDK示例代码开始 配置代码运行环境 (1)下载Moblie SDK:DJI MSDK下载. (2)准备Android开发环境,推荐使用Android St ...
- 大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目
PS:最近又涉及该项目,增加部分没写内容,记录下详细步骤. 上一篇文章讲到了怎么使用DJI mobile SDK,这次主要讲解DJI mobile SDK和DJI onboard SDK联合开发. a ...
- 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)
大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...
- 大疆无人机DJI Mobile SDK入门(一)
目录: 大疆无人机DJI Mobile SDK(Android)入门(一) 大道无疆,创新无限! 将您的想法变为现实! 未来,无所不能! 小Z码农有幸能接触到这么高逼格的玩具.就将这段爱恨往事作为笔记 ...
- 大疆无人机二次开发简介-引入DJI mobile SDK 4.8
基于android studio 3.5 1.引入DJI mobile SDK 4.8和DJI UX SDK 4.8 部分build.gradle如下 apply plugin: 'com.andro ...
- 【DJI Mobile SDK】RTMP 推流卡顿问题
/** * 只对作者个人理解的功能进行描述说明,参考官方说明文档 * 需要其他功能教程或说明请留言或私信 * 需要其他合作请留言或私信 * auth by antman-s */ 项目场景: 使用大疆 ...
- 开发自己的DJI四旋翼无人机(A3飞控Onboard SDK和Mobile SDK介绍)
大疆作为无人机行业的佼佼者,其应用范围从户外旅行.拍照到影视拍摄,以及工业运用都有着极高的地位.那么,我们如何仅仅使用大疆的飞控来开发出我们自己的无人机呢? 首先,你需要如下的东西: 以及相应的机架, ...
最新文章
- Windows 10 Anaconda Python 3.7 安装 MXNet GPU版
- Linux下tmpfs介绍及使用
- 互联网元年:如何提升自己?
- Unity3D的断点调试功能
- matlab guide 自定义右键菜单
- 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
- Java5线程并发库之同步集合
- php如何优化递归函数,php递归函数怎么用才有效?php递归函数典型例子
- VASSISTX在vs里面应用的快捷键
- PADS2007添加过孔
- Air系列模块常见问题列表
- java集成mpush 服务端SDK开发
- 【文化课每周学习记录】2019.4.14——2019.4.20
- Rayman的绝顶之路——Leetcode每日一题打卡10
- AVS3中的intra string copy(ISC)
- pythonBBS问答社区程序源码加文档加说明
- 跟谁一起工作,到底有多重要?
- Java - io输入输出流 --转换流
- 学习机器学习的最佳路径是什么
- 利用MATLAB命令求解运输问题