由于项目开发需要用电脑控制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. COMP0037 Coursework Investigating Path Planning Algorithms
  2. 【深度学习】PyTorch深度学习技术生态
  3. listagg 函数--oracle 11g release 2
  4. 03—Shell脚本编写规范
  5. 关于jquery ajax发送以及php接受json数据的一点记录
  6. python数据分析numpy_(转)Python数据分析之numpy学习
  7. 已知后序与中序输出前序(先序)
  8. cesium获取点击内容信息_Cesium获取鼠标点击位置(PickPosition)
  9. 解析恶意软件***技术特点
  10. 用python画一只皮卡丘_画皮卡丘怎么执行不了
  11. 活动目录权限委派|父域子域管理
  12. 网易公开课专辑下载脚本python
  13. react ssr方法
  14. 【第一天】【ROS操作系统】【2】ROS安装教程
  15. 计算机打印机驱动f4200,惠普HP Deskjet F4238 多功能一体机驱动惠普HP Deskjet F4238 多功能一体机驱动...
  16. qq连连看java版_Java实战_仿QQ连连看
  17. java pdf 富文本_富文本编辑器保存的html内容使用itextpdf转PDF文件(css提取,内容重叠)问题解决...
  18. 【Java】月份枚举
  19. .Net MVC个人笔记
  20. 如何使用相芯科技美妆SDK实现美妆(Android)

热门文章

  1. 【宇麦科技】十大基于风险的漏洞管理工具
  2. 安全起见,如何修改ssh默认的22端口号
  3. 制度经济学与法律经济分析课程资源
  4. python题目:1-9不重复的填入九宫格(第一列是百位,第二列是十位,第三列是各位),使第一排的三个数组成的百位数加上第二排三个数组成的百位数等于第三排组成的百位数。问:一共有多少种不重复的填法?
  5. Python第三方库推荐:pyttsx3
  6. MPU6050专用稳压模块的原理图设计
  7. 保证消息不会乱序——消息序号生成器
  8. 关于BiocManager更新
  9. 2022年度浦东新区企业研发机构认定公示
  10. Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths