由于项目开发需要用电脑控制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)相关推荐

  1. 大疆 DJI Mobile SDK 开发:模拟器调试

    目录 创建飞行控制器界面 1.新建Activiity 2.MainActivity activity_main.xml MainActivity.java 3.FlightActivity activ ...

  2. DJI mobile SDK学习

    DJI Mobile SDK为开发者提供了丰富的API接口,可以供用户按自身需求开发出不同的移动应用软件.根据移动设备平台的不同,Mobile SDK又主要分为IOS SDK与Android SDK, ...

  3. DJI Mobile SDK初步开发

    大疆Mobile SDK初步开发 1. 从MSDK示例代码开始 配置代码运行环境 (1)下载Moblie SDK:DJI MSDK下载. (2)准备Android开发环境,推荐使用Android St ...

  4. 大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目

    PS:最近又涉及该项目,增加部分没写内容,记录下详细步骤. 上一篇文章讲到了怎么使用DJI mobile SDK,这次主要讲解DJI mobile SDK和DJI onboard SDK联合开发. a ...

  5. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)

    大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...

  6. 大疆无人机DJI Mobile SDK入门(一)

    目录: 大疆无人机DJI Mobile SDK(Android)入门(一) 大道无疆,创新无限! 将您的想法变为现实! 未来,无所不能! 小Z码农有幸能接触到这么高逼格的玩具.就将这段爱恨往事作为笔记 ...

  7. 大疆无人机二次开发简介-引入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 ...

  8. 【DJI Mobile SDK】RTMP 推流卡顿问题

    /** * 只对作者个人理解的功能进行描述说明,参考官方说明文档 * 需要其他功能教程或说明请留言或私信 * 需要其他合作请留言或私信 * auth by antman-s */ 项目场景: 使用大疆 ...

  9. 开发自己的DJI四旋翼无人机(A3飞控Onboard SDK和Mobile SDK介绍)

    大疆作为无人机行业的佼佼者,其应用范围从户外旅行.拍照到影视拍摄,以及工业运用都有着极高的地位.那么,我们如何仅仅使用大疆的飞控来开发出我们自己的无人机呢? 首先,你需要如下的东西: 以及相应的机架, ...

最新文章

  1. Windows 10 Anaconda Python 3.7 安装 MXNet GPU版
  2. Linux下tmpfs介绍及使用
  3. 互联网元年:如何提升自己?
  4. Unity3D的断点调试功能
  5. matlab guide 自定义右键菜单
  6. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
  7. Java5线程并发库之同步集合
  8. php如何优化递归函数,php递归函数怎么用才有效?php递归函数典型例子
  9. VASSISTX在vs里面应用的快捷键
  10. PADS2007添加过孔
  11. Air系列模块常见问题列表
  12. java集成mpush 服务端SDK开发
  13. 【文化课每周学习记录】2019.4.14——2019.4.20
  14. Rayman的绝顶之路——Leetcode每日一题打卡10
  15. AVS3中的intra string copy(ISC)
  16. pythonBBS问答社区程序源码加文档加说明
  17. 跟谁一起工作,到底有多重要?
  18. Java - io输入输出流 --转换流
  19. 学习机器学习的最佳路径是什么
  20. 利用MATLAB命令求解运输问题

热门文章

  1. 百度翻译接口测试(3)-最终篇
  2. 利用python实现星轨合成
  3. 8.WLAN频段介绍_频段与信道
  4. C++检测是否ip能够ping通
  5. 一网友大学四年最尴尬的一件事
  6. 从零开始用snakemake搭建完整的甲基化生信分析流程(第一章)基础篇
  7. Dell 错误代码(供参考) 我试过报E1410 却是坏阵列卡 杯具
  8. UG NX 12 曲面的偏置
  9. mac Word中设置下划线之后文字后面不显示的问题解决
  10. 华为hcnp必做综合实验--有qos限制