首页 > 代码库 > Dji Mobile SDK 基础实现(二)

Dji Mobile SDK 基础实现(二)

Dji Mobile SDK 基础实现(二)

本文简要介绍如何通过调用DJI Mobile SDK,实现获取和释放无人机的控制权限、模拟遥控器按钮控制无人机的飞行、获取无人机的回传视频、获取无人机参数、实现和onboard SDK的数据透传。

下面逐个介绍以上内容,余下内容在前面文章已作介绍(文章末尾附上GitHub链接):

  • 获取无人机的回传视频
  • 获取无人机参数
  • 实现和onboard SDK的数据透传

获取无人机的回传视频


1、调用并实例化TextureView控件,并在调用类中实现SurfaceTextureListener接口;

2、设置回调接口并初始化回传视频:

 1 /**
 2 *设置回调接口
 3 */
 4 protected DJICodecManager mCodecManager = null;//视频编码
 5 private DJIFlightControllerDelegate.FlightControllerReceivedDataFromExternalDeviceCallback mRecvCallback = null;
 6 protected CameraReceivedVideoDataCallback mReceivedVideoDataCallBack = null;
 7 protected DJIOnReceivedVideoCallback mOnReceivedVideoCallback = null;
 8 private DJIBaseProduct mProduct = null;//无人机实例
 9 //设置视频的回调
10         mReceivedVideoDataCallBack = new CameraReceivedVideoDataCallback() {
11             @Override
12             public void onResult(byte[] videoBuffer, int size) {
13                 count++;
14                 if (mCodecManager != null) {
15                         mCodecManager.sendDataToDecoder(videoBuffer, size);
16                 } else {
17                     Log.e(TAG, "mCodecManager is null");
18                 }
19             }
20         };
21 
22 /**
23 *初始化回传视频
24 */
25  private void initVideo() {
26         try {
27             mProduct = VirtualStickApplication.getProductInstance();
28         } catch (Exception exception) {
29             mProduct = null;
30         }
31 
32         if (null == mProduct || !mProduct.isConnected()) {
33             mCamera = null;
34         } else {
35             if (null != mVideoSurface) {
36                 mVideoSurface.setSurfaceTextureListener(this);
37             }
38 
39             if (!mProduct.getModel().equals(Model.UnknownAircraft)) {
40                 mCamera = mProduct.getCamera();
41                 if (mCamera != null) {
42                     mCamera.setDJICameraReceivedVideoDataCallback(mReceivedVideoDataCallBack);
43                 }
44             } else {
45                 if (null != mProduct.getAirLink()) {
46                     if (null != mProduct.getAirLink().getLBAirLink()) {
47                         // Set the callback
48                         mProduct.getAirLink().getLBAirLink().setDJIOnReceivedVideoCallback(mOnReceivedVideoCallback);
49                         mProduct.getAirLink().getLBAirLink().setFPVQualityLatency(DJILBAirLink.LBAirLinkFPVVideoQualityLatency.LowLatency,new DJIBaseComponent.DJICompletionCallback() {
50                             @Override
51                             public void onResult(DJIError djiError) {
52                                 if (djiError != null)
53                                     VirtualStickApplication.logError("setFPVQualityLatency()error:", djiError);
54                             }
55                         });
56                     }
57                 }
58             }
59         }
60     }

 

获取无人机参数


获取获取无人机的剩余电量,以百分比的形式返回

 1 private DJIBaseProduct mProduct = null;//无人机实例
 2  try {
 3                 mProduct = VirtualStickApplication.getProductInstance();
 4             } catch (Exception exception) {
 5                 mProduct = null;
 6             }
 7             if(mProduct != null && mProduct.isConnected()) {
 8                 //获取无人机的剩余电量,以百分比的形式返回
 9                 try{
10                     mProduct.getBattery().setBatteryStateUpdateCallback(new DJIBattery.DJIBatteryStateUpdateCallback() {
11                         @Override
12                         public void onResult(DJIBatteryState djiBatteryState) {
13                             if(djiBatteryState == null){
14                                 VirtualStickApplication.logInfo("电量为空");
15                             }else{
16                                 StringBuffer mBuffer = new StringBuffer();
17                                 mBuffer.append(djiBatteryState.getBatteryEnergyRemainingPercent());
18                                 tvBattery.setText(mBuffer.toString()+"%");
19                                 if(djiBatteryState.getBatteryEnergyRemainingPercent() != 0 && djiBatteryState.getBatteryEnergyRemainingPercent() <= 30){
20                                       if(entry){
21                                           AlertDialog.Builder builder =  new  AlertDialog.Builder(VirtualStickActivity.this);
22                                           builder.setTitle("警告" )
23                                                   .setMessage("电池电量不足!" )
24                                                   .setPositiveButton("确认" ,  null )
25                                                   .setNegativeButton("取消" , null)
26                                                   .show();
27                                           entry = false;
28                                       }
29                                 }else{
30                                     entry = true;
31                                 }
32                             }
33                         }
34                     });
35                 }catch(Exception e){
36                     Toast.makeText(VirtualStickActivity.this,"1"+e.toString(),Toast.LENGTH_LONG).show();
37                     e.printStackTrace();
38                 }

 

获取飞行器所在所在高度、飞行速度、无人机姿态、GPS信号 
1、获取flightController 对象;

 1 DJIFlightController flightController;
 2 public void setAircraft(DJIBaseProduct djiAircraft){
 3         if(djiAircraft==null){
 4 
 5             return;
 6         }
 7         flightController=((DJIAircraft)djiAircraft).getFlightController();
 8         if(flightController!=null) {
 9 
10         }
11 
12     }

 

2、通过flightController对象调用方法获取飞行器所在所在高度、飞行速度、无人机姿态、GPS信号; 
所在高度

1 public String getHeight(){
2         if(flightController != null){
3             DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
4             if (currentState != null) {
5                 return currentState.getAircraftLocation().getAltitude() + "";
6             }
7         }
8         return null;
9     }

 

飞行速度

 1 //获取前后速度
 2     public String getX(){
 3         if(flightController != null){
 4         DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
 5             if (currentState != null) {
 6                 currentState.getGpsSignalStatus();
 7                 return currentState.getVelocityX() + "";
 8             }
 9         }
10 
11         return null;
12     }
13 
14     //获取左右速度
15     public String getY(){
16         if(flightController != null){
17             DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
18             if (currentState != null) {
19                 return currentState.getVelocityY() + "";
20             }
21         }
22         return null;
23     }
24 
25     //获取上下速度
26     public String getZ(){
27         if(flightController != null){
28             DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
29             if (currentState != null) {
30                 return currentState.getVelocityZ() + "";
31             }
32         }
33         return null;
34     }

 

无人机姿态(roll、yaw、pitch)

 1 public String getYaw(){
 2         if(flightController != null){
 3             DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
 4             if (currentState != null) {
 5                 return "pitch:"+currentState.getAttitude().pitch+"  Yaw:"+currentState.getAttitude().yaw
 6                         +"  Roll:"+currentState.getAttitude().roll;
 7             }
 8         }
 9         return null;
10     }

 

GPS信号


实现和onboard SDK的数据透传


发送数据到onboard SDK device 
1、获取flightController 对象,如上所示; 
2、通过flightController对象调用响应函数实现数据发送;

 1 public void sendDataToOnboard(byte[] data){
 2             if(flightController.isOnboardSDKDeviceAvailable()){
 3                 flightController.sendDataToOnboardSDKDevice(data, new DJIBaseComponent.DJICompletionCallback() {
 4                     @Override
 5                     public void onResult(DJIError djiError) {
 6                         if(djiError!=null) {
 7                             VirtualStickApplication.logError("SendDataToOnBoard error:", djiError);
 8                         }else{
 9                             VirtualStickApplication.logInfo("发送指令成功!");
10                         }
11                     }
12                 });
13             }
14         }
15     }

 

从onboard SDK获取数据 
1、获取flightController 对象,如上所示; 
2、通过flightController对象调用响应函数实现数据回传;

 1 /**
 2 *设置回调接口
 3 */
 4 flightController.setReceiveExternalDeviceDataCallback(flightControllerReceivedDataFromExternalDeviceCallback);
 5 /**
 6 *初始化并接受回传数据
 7 */
 8  flightControllerReceivedDataFromExternalDeviceCallback = new DJIFlightControllerDelegate.FlightControllerReceivedDataFromExternalDeviceCallback() {
 9             @Override
10             public void onResult(byte[] bytes) {
11 
12             }
13         };

 

注意事项: 
  1、在向onboard SDK device发送数据时,发送的数据需要调用String.getbytes(),转换为byte[]类型的数据; 
  2、在onboard device端,由于接收到的数据为int8类型的,因此需要强制转换为char类型的数据,再减去 ‘0’才可得到发送的值; 
  3、接收到的数据需要进行组装才可得到大于一位的数据。


[Github链接](https://github.com/MrJoeyM/sky-app)

 

 

Dji Mobile SDK 基础实现(二)