• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 大疆文檔(3)-開發流程

    本節全篇為開發流程,內容較多,只記錄android部分

    開發流程(1)

    預備知識

    使用DJI Mobile SDK開發應用程序需要幾個通用的和平臺特定的先決條件。

    生成

    • 了解如何去開發一個IOS或Android應用程序
    • 一個與DJI Mobile SDK兼容的DJI產品。兼容產品列表
    • 信用卡或電話號碼用于大疆開發者注冊驗證(不收費)。
    • 至少一個兼容iOS或Android的移動設備。

    注意: 對于iOS,可以使用兩個移動設備來更輕松地進行調試和分析。

    iOS

    • Xcode 7.0+或更高版本
    • iOS 8.1或更高版本的部署目標
    • iOS開發者帳戶
    • 設備支持
      • iPhone 5s或更高版本
      • iPad Pro,iPad Air 2,iPad Mini 2或更高版本
      • iPod Touch 5或更高版本

    Android

    • Android API等級19或更高
    • Android Studio 1.5或更高版本
    • 設備支持:Samsung S7, Samsung S8, Samsung tabs 705c, Samsung S6, Samsung S5, Samsung NOTE4, Samsung NOTE3, Google Pixel, Google Nexus 9, Google Nexus 7 II, Ascend Mate7, Huawei Mate 8, Nubia Z7 mini, SONY Xperia Z3, MI 3, MI PAD

    注意:隨著測試和開發的繼續,支持更多的Android設備。

    注冊為DJI開發者并下載SDK

    注冊為開發者

    注冊一個DJI開發者賬號在這里

    在注冊過程中,需要提供電子郵件信息和信用卡或電話號碼以驗證注冊。所提供的任何信用卡信息僅用于驗證,不會收取費用。

    下載DJI Mobile SDK

    從這里下載適用于iOS或Android的DJI Mobile SDK:http://developer.dji.com/mobile-sdk/downloads.

    集成SDK到應用程序

    下面的示例將DJI SDK導入一個新的iOS和Android項目。同樣的步驟也可以用于集成到現有的應用程序中。

    Xcode項目集成

    詳情

    Android Studio 項目集成

    截圖使用 Android Studio 3.0

    創建一個新項目

    一個新的應用程序可以用來展示如何將DJI SDK集成到Android Studio項目中。

    • 打開 Android Studio 并且在初始屏幕上選擇Start a new Android Studio project

    • New Project 框中:

      • Application name 設置為“ImportSDKDemo”。
      • Set the Company Domain and Package name to “com.dji.importSDKDemo”.(注意:大疆文檔這里的import是Import,改成小寫即可,見下圖)

    img

    注意: Package name 是生成App Key 所必需的標識字符串。下面的activity.javamanifest.xml和Gradle腳本代碼假定包名為“com.dji.ImportSDKDemo”

    • Target Android Devices中:
      • 選擇 Phone and Tablet
      • 選擇 API 19: Android 4.4 (KitKat).

    img

    • Add an Activity to Mobile 中選擇 Empty Activity.

    • Configure Activity 中:

      • 設置 Activity Name: 為 “MainActivity”.
      • 勾選 Generate Layout File
      • 設置 Layout Name: 為 “activity_main”.
      • 點擊完成

    img

    配置Grade腳本
    • 打開 build.gradle (Module: app)

    AndroidConfigureGradleInitial

    • 更新內容如下:
    apply plugin: 'com.android.application'
    
    android {
    
        ...
        defaultConfig {
            ...
        }
    
        ...
    
        packagingOptions{
            doNotStrip "*/*/libdjivideo.so"
            doNotStrip "*/*/libSDKRelativeJNI.so"
            doNotStrip "*/*/libFlyForbid.so"
            doNotStrip "*/*/libduml_vision_bokeh.so"
            doNotStrip "*/*/libyuv2.so"
            doNotStrip "*/*/libGroudStation.so"
            doNotStrip "*/*/libFRCorkscrew.so"
            doNotStrip "*/*/libUpgradeVerify.so"
            doNotStrip "*/*/libFR.so"
            exclude 'META-INF/rxjava.properties'
        }
    }
    
    dependencies {
       ...
        compile ('com.dji:dji-sdk:4.9')
        provided ('com.dji:dji-sdk-provided:4.9')
    }
    
    • 主要變更應為:

      • 添加 packagingOptions 以防止應用程序發生任何意外崩潰。
      • 添加 compileprovided 依賴來導入最新的DJI Android SDK Maven依賴。
      • 點擊 Sync Now 并等待Gradle項目同步完成。

      note: 這里要注意的是,compile和provided會產生兩個警告,聲明作廢:分別用implementation和compileOnly代替,本例還是繼續跟隨大疆文檔進行,實際開發中注意修正。

    AndroidConfigureGradleAfterChange

    • 雙重檢查 Maven依賴

      • 選擇 File->Project Structure 來打開“Project Structure”窗口。然后選擇 “app” 模塊并且點擊 Dependencies . 你應該看到最新的DJI SDK已經編譯完成,并且提供了已經導入的依賴。

    img

    實現應用注冊和SDK回調

    右鍵點擊com.dji.importSDKDemo,并選擇New->Java Class創建一個新的Java類,并將其命名為“MApplication”。

    createJaveClass

    打開 MApplication.java 并替代如下內容:

    package com.dji.importSDKDemo;
    
    import android.app.Application;
    import android.content.Context;
    
    import com.secneo.sdk.Helper;
    
    public class MApplication extends Application {
    
        @Override
        protected void attachBaseContext(Context paramContext) {
            super.attachBaseContext(paramContext);
            Helper.install(MApplication.this);
        }
    
    }
    

    這里我們重寫attachBaseContext()方法來添加Helper.install(MApplication.this);這行代碼。

    注意: 由于現在需要在使用之前加載一些SDK類,所以加載過程由Helper.install()完成。開發者需要在使用任何SDK功能之前調用此方法。如果不這樣做,將導致意外的崩潰。

    AndroidImplementationMainActivity

    打開 MainActivity.java

    AndroidImplementationMainActivity

    MainActivity類需要注冊應用程序才能獲得使用DJI Mobile SDK的授權。它還需要實現SDK期望的回調方法。

    MainActivity類將首先被修改為包含幾個類變量,包括“mProduct”,該對象表示連接到移動設備的DJI產品。

    此外,onCreate方法將被修改為調用checkAndRequestPermissions方法來檢查和請求運行時權限。此外,checkAndRequestPermissions方法將幫助調用startSDKRegistration()方法來注冊應用程序。而且,重寫onRequestPermissionsResult方法將幫助檢查應用程序是否有足夠的權限,如果有,調用startSDKRegistration()方法來注冊應用程序。

    現在,替換 MainActivity 類為:

    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = MainActivity.class.getName();
        public static final String FLAG_CONNECTION_CHANGE = "dji_sdk_connection_change";
        private static BaseProduct mProduct;
        private Handler mHandler;
    
        private static final String[] REQUIRED_PERMISSION_LIST = new String[]{
                Manifest.permission.VIBRATE,
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.WAKE_LOCK,
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.CHANGE_WIFI_STATE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.BLUETOOTH,
                Manifest.permission.BLUETOOTH_ADMIN,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE,
        };
        private List<String> missingPermission = new ArrayList<>();
        private AtomicBoolean isRegistrationInProgress = new AtomicBoolean(false);
        private static final int REQUEST_PERMISSION_CODE = 12345;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // When the compile and target version is higher than 22, please request the following permission at runtime to ensure the SDK works well.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                checkAndRequestPermissions();
            }
    
            setContentView(R.layout.activity_main);
    
            //Initialize DJI SDK Manager
            mHandler = new Handler(Looper.getMainLooper());
    
        }
    
        /**
         * Checks if there is any missing permissions, and
         * requests runtime permission if needed.
         */
        private void checkAndRequestPermissions() {
            // Check for permissions
            for (String eachPermission : REQUIRED_PERMISSION_LIST) {
                if (ContextCompat.checkSelfPermission(this, eachPermission) != PackageManager.PERMISSION_GRANTED) {
                    missingPermission.add(eachPermission);
                }
            }
            // Request for missing permissions
            if (missingPermission.isEmpty()) {
                startSDKRegistration();
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                showToast("Need to grant the permissions!");
                ActivityCompat.requestPermissions(this,
                        missingPermission.toArray(new String[missingPermission.size()]),
                        REQUEST_PERMISSION_CODE);
            }
    
        }
    
        /**
         * Result of runtime permission request
         */
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            // Check for granted permission and remove from missing list
            if (requestCode == REQUEST_PERMISSION_CODE) {
                for (int i = grantResults.length - 1; i >= 0; i--) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        missingPermission.remove(permissions[i]);
                    }
                }
            }
            // If there is enough permission, we will start the registration
            if (missingPermission.isEmpty()) {
                startSDKRegistration();
            } else {
                showToast("Missing permissions!!!");
            }
        }
    }
    

    DJISDKManagerregisterApp()方法有一個回調函數,它需要處理兩個方法來處理APP注冊結果,以及當連接到移動設備的產品發生變更時。

    繼續添加如下所示的startSDKRegistration()方法,并實現SDKManagerCallbackonRegister(), onProductDisconnect(), onProductConnect()onComponentChange()方法:

    private void startSDKRegistration() {
        if (isRegistrationInProgress.compareAndSet(false, true)) {
            AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    showToast("registering, pls wait...");
                    DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(), new DJISDKManager.SDKManagerCallback() {
                        @Override
                        public void onRegister(DJIError djiError) {
                            if (djiError == DJISDKError.REGISTRATION_SUCCESS) {
                                showToast("Register Success");
                                DJISDKManager.getInstance().startConnectionToProduct();
                            } else {
                                showToast("Register sdk fails, please check the bundle id and network connection!");
                            }
                            Log.v(TAG, djiError.getDescription());
                        }
    
                        @Override
                        public void onProductDisconnect() {
                            Log.d(TAG, "onProductDisconnect");
                            showToast("Product Disconnected");
                            notifyStatusChange();
    
                        }
                        @Override
                        public void onProductConnect(BaseProduct baseProduct) {
                            Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct));
                            showToast("Product Connected");
                            notifyStatusChange();
    
                        }
                        @Override
                        public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent oldComponent,
                                                      BaseComponent newComponent) {
    
                            if (newComponent != null) {
                                newComponent.setComponentListener(new BaseComponent.ComponentListener() {
    
                                    @Override
                                    public void onConnectivityChange(boolean isConnected) {
                                        Log.d(TAG, "onComponentConnectivityChanged: " + isConnected);
                                        notifyStatusChange();
                                    }
                                });
                            }
                            Log.d(TAG,
                                    String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s",
                                            componentKey,
                                            oldComponent,
                                            newComponent));
    
                        }
                    });
                }
            });
        }
    }
    

    最后,需要實現 notifyStatusChangeRunnableshowToast方法:

    private void notifyStatusChange() {
        mHandler.removeCallbacks(updateRunnable);
        mHandler.postDelayed(updateRunnable, 500);
    }
    
    private Runnable updateRunnable = new Runnable() {
    
        @Override
        public void run() {
            Intent intent = new Intent(FLAG_CONNECTION_CHANGE);
            sendBroadcast(intent);
        }
    };
    
    private void showToast(final String toastMsg) {
    
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), toastMsg, Toast.LENGTH_LONG).show();
            }
        });
    
    }
    

    為了讓DJI SDK運行,應用程序必須被授權。

    • 打開 app 模塊中的AndroidManifest.xml

    AndroidManifest

    • package=com.dji.ImportSDKDemo 之后和 <application 之前插入:
    <!-- Permissions and features -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature
        android:name="android.hardware.usb.host"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.usb.accessory"
        android:required="true" />
    
    <!-- Permissions and features -->
    
    • application 元素開頭添加 android:name=".MApplication"
    <application
        android:name=".MApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
    
    • android:theme="@style/AppTheme"> 之后和 <activity android:name=".MainActivity">之前插入以下內容:
    <!-- DJI SDK -->
    <uses-library android:name="com.android.future.usb.accessory" />
    <meta-data
        android:name="com.dji.sdk.API_KEY"
        android:value="Please enter your App Key here." /> // 這里替換為注冊的App Key
    <activity
        android:name="dji.sdk.sdkmanager.DJIAoaControllerActivity"
        android:theme="@android:style/Theme.Translucent" >
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
        </intent-filter>
        <meta-data
            android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter" />
    </activity>
    <service android:name="dji.sdk.sdkmanager.DJIGlobalService" >
    </service>
    <!-- DJI SDK -->
    

    生成App Key, 并替換 “Please enter your App Key here.”

    • activity元素中插入android:configChanges="orientation"android:screenOrientation="portrait",如下圖所示,防止activity在屏幕方向改變時重啟,并將activity的屏幕方向設置為豎屏模式:
    <activity android:name=".MainActivity"
              android:configChanges="orientation"
              android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    運行導入SDK Demo

    ImportSDKDemo 項目現在可以運行了。也可以從 Github 下載這個項目的示例代碼。

    由于此應用程序只檢查注冊,而不直接與產品交互,因此不需要將任何產品連接到應用程序即可運行。因此,該應用程序既可以在移動設備上運行(連不連接DJI產品都行),也可以在Android模擬器中運行。應用程序需要網絡連接才能成功地執行注冊。(不知道為什么我用模擬器注冊失敗,sdk中間件jni報錯,真機注冊成功)

    如果App Key生成正確,且Android模擬器或移動設備具備網絡連接,則應看到:

    img

    FFmpeg License

    DJI Android SDK是動態鏈接到LGPLv2.1許可的未修改的FFmpeg庫。Github提供了這些FFmpeg庫的源代碼、編譯說明和LGPL v2.1許可。Github提供了這些FFmpeg庫的源代碼、編譯說明和LGPL v2.1許可。

    運行APP

    準備產品

    應檢查每個產品的用戶手冊以理解完整的產品設置(訪問http://www.dji.com并導航到每個產品的下載頁)。本節詳細介紹了一些需要記住的要點。

    充電電池

    通常,在運行應用程序之前,應對產品的所有電池充電以獲得最佳體驗。這可能包括飛機電池,遙控器電池,手持云臺電池和飛機安裝的云臺電池(用于Ronin MX)。當電池電量過低時,飛機可能會在應用程序中更早的返航或著陸,或者根本不起飛。

    **產品

    在首次使用之前,任何新產品都需要通過DJI GO**。DJI GO可在 iOS App StoreGoogle Store 上使用,可用于**產品。

    重定向到DJI Go 應用程序

    如果SDK應用程序需要重定向到DJI Go Apps來做像**DJI產品這樣的操作,你可以使用以下代碼來實現它:

    iOS
    • 重定向到DJI Go 4 App:使用URL方案 "djiVideoNew://"
    • 重定向到DJI Go App:使用URL方案 "djiVideo://"
    Android
    • 重定向到DJI Go 4 App:
    Intent launchIntent = getPackageManager().getLaunchIntentForPackage("dji.go.v4");
    if (launchIntent != null) { //null pointer check in case package name was not found 空指針檢查以防包名沒被找到
        startActivity(launchIntent); 
    }
    
    • 重定向到DJI Go App:
    Intent launchIntent = getPackageManager().getLaunchIntentForPackage("dji.pilot");
    if (launchIntent != null) { //null pointer check in case package name was not found
        startActivity(launchIntent);
    }
    

    有關更多詳細信息,請查看Github示例代碼: iOS SDK Github Sample, Android SDK Github Sample.

    升級產品固件

    飛機、遙控器和/或手持控制器固件應在開始應用程序測試和調試之前更新到最新版本。不同的產品有時會有不同的檢查固件版本和升級固件的過程。在 http://www.dji.com 中每個產品頁的 Downloads 模塊都有升級固件的說明。

    遙控器飛行模式開關

    對于飛機,遙控器FAP或ASP飛行模式開關需要處于特定位置才能接收改變飛行方向和自動飛行的SDK命令。遙控器和飛機有時可以互換,因為FAP / ASP開關配置有多種選擇。

    Aircraft Remote Controller Switch
    P3, Inspire (all models) P3, Inspire (all models) F
    P3, Inspire (all models) P4 A
    P4 P3, Inspire (all models) P
    P4 P4 P

    網絡連接

    任何SDK應用程序在首次運行時都需要互聯網連接才能向DJI注冊并獲得使用SDK的授權。首次成功注冊后,授權將存儲在本地,且注冊時無需網絡連接。

    連接移動設備并運行應用程序

    移動設備和產品之間有幾種連接配置:

    • 移動設備 -> USB -> 遙控器 -> Lightbridge / OcuSync -> 飛機
    • 移動設備 -> WiFi -> 遙控器 -> WiFi - >飛機
    • 移動設備 -> WiFi -> 手持云臺

    有幾種方法可以初始化所有產品并運行應用程序。下面給出USB和WiFi連接場景的示例。

    USB連接程序

    Mavic Pro,Phantom 4,Phantom 4 Professional,Phantom 3 Professional,Phantom 3 Advanced,Inspire系列,Matrice系列:

    打開遙控器。

    • 打開飛機并等待遙控器與飛機連接。
    • 使用 Lightning(iOS)或 USB(Android)導線將 iOS / Android 移動設備連接到遙控器。
    • 在移動設備上運行應用程序。

    注意:

    如果使用Android設備,DJI遙控器需要支持AOA . 所有最新版本的固件都支持AOA。如果Sample Application與Android設備連接,則會支持AOA,會出現類似下面的對話框:

    dialog

    要了解如何更改USB附件的默認應用程序,請查看以下兩個常見問答:Android Device, Samsung Device.

    WiFi連接程序

    Phantom 3 Standard,Phantom 3 4K,Spark:

    打開遙控器

    • 將移動設備連接到遙控器創建的WiFi網絡。
    • 打開飛機并等待遙控器與飛機連接。
    • 在移動設備上運行應用程序。

    Osmo,Mavic Pro,Spark:

    1. 打開產品(Osmo或飛機)。
    • 將移動設備連接到產品創建的WiFi網絡。
    • 在移動設備上運行應用程序

    測試、分析和調試

    應用程序開發需要大量的測試、分析和調試。DJI提供的工具包括飛機模擬器、無線橋接app和遠程日志功能,使開發更快更方便。

    飛行模擬器

    DJI飛機產品包括一個駐留在飛行控制器中的模擬器,可以:

    • 從遙控器(手動飛行)或應用程序(SDK命令)獲取飛機控制輸入
    • 基于輸入在模擬環境中模擬飛機行為
    • 基于模擬行為輸出飛機狀態信息

    這使得手動和自動飛行都可以模擬,而無需實際駕駛飛機。

    DJI提供Windows和Mac工具,可用于初始化模擬器,并根據模擬器提供的狀態信息顯示飛機的行為:

    • DJI Assistant 2 ( Windows Mac ) 用于Spark,Mavic Pro,Phantom 4系列和Matrice系列等新型飛機。
    • DJI PC Simulator ( Windows ) 用于Phantom 3系列,Inspire 1系列飛機。

    此外,可以通過SDK直接控制模擬器初始化,監聽和終止,從而允許在持續集成環境中進行應用程序開發。

    DJI Assistant 2模擬器

    DJI Assistant 2工具是專門為SDK開發人員構建的,可以初始化、終止并提供在DJI飛機飛行控制器中運行的飛機模擬器的可視化。DJI Assistant 2通過USB連接到飛機。

    • 支持大疆產品:Spark、Mavic Pro、Matrice系列、Phantom 4系列、Inspire 2。
    • 支持的操作系統:Mac OS X 10、Windows 7、Windows 8和Windows 8.1

    注意: Windows 10不受官方支持,但通常可以工作。

    安裝和設置

    Mac

    • 從Mac下載 DJI Assistant 2
    • 雙擊驅動程序并按照說明安裝它。
    • 打開下載的 DMG 文件。
    • Assistant.app 拖進系統的 Applications 文件夾。

    Windows

    • 從Windows下載 DJI Assistant 2
    • 運行安裝程序
    • 按照說明安裝
    • 在安裝過程中,確認安裝程序的請求。
    使用 DJI Assistant 2

    在啟動時,將出現一個請求將DJI Assistant 2連接到飛機的窗口。

    assistantLaunch

    通過 USB連接線 連接到Mac或PC的飛機。

    打開遙控器,然后打開飛機。幾秒鐘后,應用程序將檢測到飛機。

    在連接設備頁選擇 “Mavic Pro” ,然后選擇左側的 Simulator 選項卡。應該看到以下屏幕:

    P4Connected

    Open 按鈕,輸入所需的起始緯度和經度以及所需的風速。

    按下 Start Emulating 按鈕。將會顯示連接的產品,以及一些位置和速度狀態信息。

    simulatorOld

    Note: 正向世界坐標系X,Y和Z分別為北,東和上方向。

    使用遙控器起飛和飛行以試驗模擬器。

    視圖角度可以通過在可視化窗口中左鍵單擊和拖動來更改。在窗口內滾動可以縮放。

    飛行時,可以通過右擊可視化并選擇 Setup 來追蹤飛行路徑。

    setupButton

    然后在模擬器UI配置選項卡下選擇 show trace 顯示飛行軌跡,如下圖所示:

    showTrace

    然后將飛行路徑跟蹤添加到可視化中。

    simulator

    DJI PC 模擬器

    DJI PC模擬器工具是專門為SDK開發人員開發的,可以對DJI飛機飛行控制器中運行的飛機模擬器進行初始化、終止和可視化。DJI PC模擬器工具通過USB連接到飛機。

    • 支持大疆產品:Phantom 3系列、Inspire 1系列。
    • 支持的操作系統:Windows 7、Windows 8、Windows 8.1

    Note: Windows 10不受官方支持,但通常可以工作。

    安裝和設置

    • 下載 DJI PC模擬器安裝程序和用戶手冊 以及 WIN驅動安裝程序http://developer.dji.com/mobile-sdk/downloads/
    • 運行 Win Driver Installer
      • 對于早期產品兼容性,會出現一個顯示消息內容為 Please power on MC and connect it to PC via USB! 的對話框。
      • 現在不需要任何操作,按 Yes 繼續。
      • 按照其余的安裝步驟操作。
    • 運行DJI PC Simulator Installer
      • 按照安裝步驟完成安裝。

    使用 DJI PC 模擬器

    DJI PC Simulator 既可以運行在Windows PC上,也可以運行在Mac的虛擬機上(如Parallels或VMWare)。

    首先使用USB將Windows PC連接到飛機并打開飛機。

    啟動 DJI PC Simulator 來配置和初始化飛機模擬器。設置經度和經度進行模擬。

    Config

    Note: 如果經緯度太接近或進入GEO區域,飛機將無法起飛。

    如果飛機處于開機狀態并與PC機連接,則***應顯示在 ** SN:** 文本視圖中。

    選擇 Log Settings 選項卡下的 show log window 以顯示日志窗口。

    showLog

    返回 Simulator Control 選項卡,按 Start Simulation 啟動飛機模擬器。此時,飛機將在不實際啟動電機的情況下模擬飛行。

    Display Simulation 以啟動可視化。

    使用遙控器起飛和飛行以試驗模擬器。

    可視化將顯示連接的產品(在本例中為Inspire 1),以及一些位置和速度狀態信息。

    display

    Note: 正向世界坐標系的X,Y和Z分別為北,東和上方向。

    視圖角度可以通過在可視化窗口中左擊并拖動來更改。在窗口內滾動可以縮放。

    zoomIn

    While flying, the flight path can be traced by right clicking on the visualization and selecting Setup.

    飛行時,可以通過右擊可視化并選擇 Setup 來跟蹤飛行路徑。

    simulatorSetup

    然后在模擬器UI配置選項卡下選擇 show trace 以顯示飛行軌跡,如下所示:

    showTrace

    然后飛行路徑軌跡將添加到可視化中。

    flightTrace

    Simulator Config 窗口中,可以按下 Stop Simulation 來停止模擬。

    重要提示: 要在中途停止Waypoint Mission,請從應用程序中停止任務,然后停止模擬器。否則,模擬器可以在重啟時繼續運行先前的Waypoint Mission。

    有關更多 DJI PC Simulator 的信息,請在查看下載的 DJI PC Simulator 中包含的用戶手冊pdf文件**。**

    持續集成模擬

    DJI Assistant 2DJI PC Simulator 都提供飛機模擬器的可視化,這需要PC或Mac連接到飛機。

    如果不需要可視化,DJI SDK可用于啟動和停止模擬器。這意味著可以在沒有飛機連接到Mac或PC的情況下執行模擬,從而允許在連續集成環境中進行自動測試。

    DJIFlightController 中的 DJISimulator 類被用于控制模擬。該類提供以下功能:

    • 啟動和停止模擬
    • 使用GPS定位進行播放模擬 Seed the simulation with a GPS location
    • 檢索飛機對于世界的狀態信息。

    在項目中使用模擬器提供示例代碼:iOS | Android.

    無線橋接App

    對于Android和iOS,當移動設備通過USB線直接連接到Android Studio或Xcode時,應用程序開發最有效率。

    然而,一些DJI飛機需要飛機的遙控器和移動設備之間的直接連接。這意味著應用程序無法通過USB直接連接到開發環境。

    BridgeAppNeeded

    對于Android,ADB通過WiFi可以實現實時開發,但iOS沒有這樣的選項。

    因此,DJI提供無線橋接App或 Bridge App

    • Bridge App直接連接到遙控器。
    • 運行開發者的應用程序的移動設備已連接到Mac。
    • SDK將所有飛機通信從USB重新路由到與Bridge App設備的WiFi連接。

    BridgeApp

    Note: 如果只有一個移動設備可用,Bridge App也可以在iOS模擬器上運行。在這種情況下,移動設備將承載 bridge app,而開發者應用程序在iOS模擬器上運行。

    SDK Bridge App由DJI提供,可以從 Apple App Store 下載。

    使用 DJI Bridge App 的教程 here.

    遠程日志

    在現場測試應用程序時,通常需要某種形式的日志記錄來理解行為。

    對于iOS,可以設置DJI Mobile SDK來允許遠程日志記錄。如果移動設備有網絡連接,則可以將在飛行期間生成的消息記錄到遠程服務器。

    這里有一個描述如何使用遠程日志的教程。 here.

    部署

    使用DJI Mobile SDK部署Android應用程序不需要任何典型流程之外的額外步驟。

    然而iOS應用程序需要適當的Xcode配置。如果支持的DJI產品是MFi附件,還需要MFi附件授權。

    詳情點擊

    版權聲明:本文為lftaoyuan原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/lftaoyuan/article/details/89029624

    智能推薦

    樹莓派3B+ 運行大疆 DJI PSDK2.1.0

    開發前準備: 1.申請PSDK ID與KEY 申請鏈接:https://developer.dji.com/payload-sdk/apply/ 2.申請通過后可以在用戶中心中下載PSDK2.1.0的開發包 二、對PSDK2.1.0進行適配 1.下載安裝包,并解壓 大家可以看下文件架構 2.我們先修改Cmakelist.txt文件,位于Payload_SDK_V2.1.0-build.189/sa...

    大疆地圖規劃航線飛行

    最近碰到一個需求,在app上,引用高德地圖,在地圖上選點。連線,然后上傳航點數據,讓大疆的無人機,按照我們設置的航線飛行。 1.效果圖: 1.1.下載模擬軟件,模擬無人機的當前位置,在軟件上查看軟件的飛行 DJI Assistant 2 For Phantom,運行的效果圖如下,這個軟件可以在大疆api官網下載 1.2.地圖上用紅色的小飛機,表示當前模擬的無人機的位置,點擊按鈕add,開...

    2018大疆創新A卷

    遍歷一遍字符串,找到 j 就去統計前面的d的數量 和 后面 i的數量,然后乘起來,累加到sum中去(sum = 0)。找完所有的 j 前后d和i的數量的乘積后,最后sum就是得到的值 比如 ddabcjabci 只有一個j,前面兩個d * 后面一個 i,==2,輸出結果就是2 兩個數異或,然后統計異或后的數中1的個數,就是不同位的個數 比較繁瑣,只能分條件進行遍歷。...

    大疆Livox Mid-40 SLAM

    原博主琨特,本人便于學習寫到了自己的賬號下,見諒。 介紹基于Livox三維激光雷達和開源LOAM-Livox進行定位和建圖實驗。 目錄 1、簡介 1.1 Livox Mid-40三維激光雷達 1.2 基于LOAM-Livox的SLAM開源方案 2、Livox Mid-40驅動安裝 2.1 編譯和安裝Livox SDK 2.2 Livox ROS Driver驅動安裝 2.3 運行Livox ROS...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡