1. 程式人生 > >Dji Mobile SDK 基礎實現(一)

Dji Mobile SDK 基礎實現(一)

n-1 app lba ger print ttl touch事件 釋放 bsp

Dji Mobile SDK 基礎實現(一)

本文簡要介紹如何通過調用DJI Mobile SDK,實現獲取和釋放無人機的控制權限、模擬遙控器按鈕控制無人機的飛行、獲取無人機的回傳視頻、獲取無人機參數、實現和onboard SDK的數據透傳。

下面逐個介紹以上內容,余下內容將在以後的文章介紹(文章末尾附上GitHub鏈接):

  • 獲取和釋放權限
  • 模擬遙控器按鈕控制無人機的飛行

獲取和釋放權限


1、獲取flightController 對象;

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

2、通過flightController對象調用方法獲取和釋放無人機的權限:

 1 //獲取無人機的控制權限
 2     public void enable(){
 3     flightController.enableVirtualStickControlMode(
 4                 new DJIBaseComponent.DJICompletionCallback() {
 5                     @Override
 6                     public void onResult(DJIError djiError) {
 7                         if (djiError == null
) { 8 9 } 10 } 11 } 12 ); 13 if(mSendVirtualStickDataTimer==null) { 14 mSendVirtualStickDataTimer = new Timer(); 15 mSendVirtualStickDataTimer.schedule(new MyTimerTask(this), 100, 200); 16 } 17 isEnable=true; 18 VirtualStickApplication.logInfo("已獲取對無人的控制權限!"); 19 } 20 //釋放無人機的控制權限 21 public void disable(){ 22 isEnable=false; 23 flightController.disableVirtualStickControlMode( 24 new DJIBaseComponent.DJICompletionCallback() { 25 @Override 26 public void onResult(DJIError djiError) { 27 if (djiError == null) 28 { 29 30 } 31 } 32 } 33 ); 34 if(taskReference!=null) { 35 taskReference.cancel(); 36 taskReference=null; 37 } 38 if(mSendVirtualStickDataTimer!=null) { 39 mSendVirtualStickDataTimer.cancel(); 40 mSendVirtualStickDataTimer.purge(); 41 mSendVirtualStickDataTimer=null; 42 } 43 }

模擬遙控器按鈕控制無人機的飛行


1、獲取flightController 對象(如上所示);
2、通過flightController對象調用方法實現無人機的起飛、降落、上升、下降、左旋、右旋以及往前後左右四個方向飛行;
起飛

 1 //實現無人機的起飛操作
 2     public void takeOff(){
 3        if(flightController instanceof dji.sdk.FlightController.c){
 4            dji.sdk.FlightController.c tmp=(dji.sdk.FlightController.c)flightController;
 5            tmp.takeOff(new DJIBaseComponent.DJICompletionCallback() {
 6                @Override
 7                public void onResult(DJIError djiError) {
 8                    if (djiError != null)
 9                        VirtualStickApplication.logError("TakeOff error:", djiError);
10                }
11            });
12            VirtualStickApplication.logInfo("無人機開始起飛!");
13         }
14     }

降落

 1 //實現無人機的降落
 2     public void land(){
 3         if(flightController instanceof dji.sdk.FlightController.c){
 4             dji.sdk.FlightController.c tmp=(dji.sdk.FlightController.c)flightController;
 5             tmp.autoLanding(new DJIBaseComponent.DJICompletionCallback() {
 6                                 @Override
 7                                 public void onResult(DJIError djiError) {
 8                                     if (djiError != null)
 9                                         VirtualStickApplication.logError("AutoLanding error:", djiError);
10                                 }
11                             }
12             );
13             VirtualStickApplication.logInfo("無人機開始降落!");
14         }
15     }

上升

1 public void leftUpClick(){
2         if(mThrottle<6)
3             mThrottle++;
4     }

下降

1 public void leftDownClick(){
2         if(mThrottle>=1)
3              mThrottle--;
4 
5     }

左旋

 
1  public void leftLeftClick(){ 2 mYaw= -yawSpeed; 3 }

右旋

1 public void leftRightClick(){
2         mYaw= yawSpeed;
3     }

前行

1 public void rightUpClick(){
2         mRoll =rollPitchSpeed;
3     }

後退

1 public void rightRightClick(){
2         mPitch =rollPitchSpeed;
3     }

左行

1 public void rightDownClick(){
2         mRoll =-rollPitchSpeed;
3     }

右行

 public void rightLeftClick(){
        mPitch=-rollPitchSpeed;
    }

向無人發送控制參數

 1 float rollPitchSpeed= (float) (DJIFlightControllerDataType.DJIVirtualStickRollPitchControlMaxVelocity*0.2);
 2     float verticalSpeed= (float) (DJIFlightControllerDataType.DJIVirtualStickVerticalControlMaxVelocity*0.2);
 3     float yawSpeed=(float) (DJIFlightControllerDataType.DJIVirtualStickYawControlMaxAngle*0.5);
 4     float mPitch=0,mRoll=0,mYaw=0,mThrottle=1.5f;
 5 //用於向無人機發送控制參數
 6     public void run() {
 7         flightController.sendVirtualStickFlightControlData(
 8                 new DJIFlightControllerDataType.DJIVirtualStickFlightControlData(
 9                         mPitch, mRoll, mYaw, mThrottle
10                 ), new DJIBaseComponent.DJICompletionCallback() {
11                     @Override
12                     public void onResult(DJIError djiError) {
13                         if(djiError!=null)
14                             VirtualStickApplication.logError("SendControlData error:",djiError );
15                     }
16                 }
17         );
18         if(count++%3==0) {
19             mPitch = mRoll = mYaw = 0;
20         }
21     }

其中,獲取和釋放權限、起飛、降落函數推薦在onclick事件中進行調用,控制無人機飛行的函數推薦在OnTouch事件中進行調用(也可利用自己寫Timer控制每個函數的執行時間等)。


Github鏈接:https://github.com/MrJoeyM/sky-app

Dji Mobile SDK 基礎實現(一)