DJI Mobile SDK(2):多自由度控制飞行(Virtual Stick)
来源:互联网 发布:物润船联软件下载 编辑:程序博客网 时间:2024/06/18 06:47
由于项目开发需要用电脑控制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() { @Override public 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() { @Override public void onResult(DJIError djiError) { } }); break; } case R.id.button_auto_land:{ DJISampleApplication.getAircraftInstance().getFlightController(). startLanding(new CommonCallbacks.CompletionCallback() { @Override public 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() { @Override public void onResult(DJIError djiError) { } }); break; } default: break; }
以上主要是其它Button的响应,根据我们设置的控制模式,yaw pitch roll分别代表三个轴的速度(或角速度),throttle 代表垂直的高度。这里还有自动起飞、自动降落、关闭手机控制的Button,不再赘述。
之后就是我们的定时器的定时发送任务,把手机设置的控制指令每隔200ms发送给无人机。
private class SendVirtualStickDataTask extends TimerTask { @Override public void run() { if (isFlightControllerAvailable()) { DJISampleApplication.getAircraftInstance() .getFlightController() .sendVirtualStickFlightControlData(new FlightControlData(pitch, roll, yaw, throttle), new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { } }); } } }
模拟飞行
代码写完了,不能每次调试都拿着飞机出去飞,况且代码不知道能不能用,万一出点Bug,乱发一些控制信号,可能就炸机了(说到这里,摸了摸我的Mavic云台T_T)。
不过DJI还是很人性化的,有一个调参软件DJI Assistant可以模拟飞行。装飞机驱动之后,把飞机通过USB连接到PC上,打开DJI Assistant找到“模拟器”。就可以愉快地调试啦!
特别提示,模拟器必须要连接无人机,防止出现危险,请把无人机的桨叶全部拆掉!!!
加油!
- DJI Mobile SDK(2):多自由度控制飞行(Virtual Stick)
- Dji Mobile SDK 基础实现(一)
- Dji Mobile SDK 基础实现(二)
- DJI Mobile SDK(1):获取App Key
- 【dji sdk】mobile sdk开发
- DJI Mobile SDK笔记(一):移植SDK库到自己的工程
- Android DJI Mobile-SDK 开发
- 【dji sdk】mobile sdk 视频部分
- 【dji sdk】mobile sdk 摇杆部分
- 玩转四旋翼无人机(DJI SDK 使用)
- 玩转四旋翼无人机(DJI OnBoard SDK ROS)
- 基于Dji M600-PRO的Onboard-SDk-ROS入门应用之———航点记录与自主飞行
- 机构自由度计算(笔记)
- 自由度(degree of freedom)
- 玩转四旋翼无人机(DJI SDK LIB)
- 知识点扫盲(tcp,QList),dji
- 15自由度机器人课程日志(四)arduino控制舵机控制器
- 机器人技术(7)AtdRobot六自由度机械臂控制教程
- VISIO2010界面介绍
- ExcelPro《EXCEL图表之道-如…
- 戴维·阿克:品牌如何避免陷入竞争…
- 互联网时代的十大特征和趋势
- 2014中国企业面对的五大挑战
- DJI Mobile SDK(2):多自由度控制飞行(Virtual Stick)
- 《大数据时代》
- Quartz 定时任务与 Spring 整合要点
- memcpy范的SB问题
- 跟德鲁克学营销
- 用互联网思维做产品的7个要…
- 启动jetty服务后提示javax.naming.OperationNotSupportedException(没有其它多余错误信息)
- 创建世界级品牌的大师忠告
- 美国开始第三次剪羊毛,目标…