色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 基于Mobile SDK V5版固件開發(fā)大疆無人機(jī)手機(jī)端遙控器(4)

          基于Mobile SDK V5版固件開發(fā)大疆無人機(jī)手機(jī)端遙控器(4)

          發(fā)布人:美男子玩編程 時間:2023-06-30 來源:工程師 發(fā)布文章

          相較與V4版本開發(fā),V5版本有了更方便簡介的方式。V5不僅再功能上與V4增加更多的功能,而且在功能的使用及API的調(diào)用也做了優(yōu)化。雖然V5現(xiàn)在很新也在不斷地迭代,但是不免會出現(xiàn)對一些飛行或者遙控器出現(xiàn)bug,大疆的開發(fā)人員也在不斷的完善這整個V5開發(fā)包,已提供更全更優(yōu)的開發(fā)模式。下面是使用V5開發(fā)包進(jìn)行的大疆無人機(jī)飛控系統(tǒng)的開發(fā)過程。

          整體架構(gòu)流程

          DJI Mobile SDK V5擁有更加簡潔易用的無人機(jī)硬件控制接口和軟件服務(wù)接口,開放全開源的生產(chǎn)代碼及 Sample 和豐富的教程,為開發(fā)者提供了具有競爭力的無人機(jī)移動端解決方案,極大的提升開發(fā)體驗(yàn)和效率。現(xiàn)目前所支持的飛機(jī)有以下幾種:

          圖片


          Matrice 300 RTK

          圖片

          Matrice 30 Series



          圖片

          DJI Mavic 3 Enterprise Series



          圖片

          DJI Mavic 3M

          圖片

          DJI Mini 3



          圖片

          DJI Mini 3 Pro


          現(xiàn)目前V5 SDK 有下面幾種功能:

          • 參數(shù)獲取和設(shè)置:負(fù)載參數(shù)設(shè)置、無人機(jī)參數(shù)設(shè)置、負(fù)載狀態(tài)監(jiān)聽、無人機(jī)狀態(tài)監(jiān)聽。
          • 飛行控制:航點(diǎn)自動飛行、虛擬搖桿飛行、RTK定位配置、Tracking飛行。
          • 應(yīng)用數(shù)據(jù)處理:實(shí)時碼流直播、MOP數(shù)據(jù)通道、媒體文件管理、實(shí)時點(diǎn)云數(shù)據(jù)獲取。
          • 更多功能:健康管理、SD卡加密、升級提示、飛行記錄、網(wǎng)絡(luò)控制、備份鏈路。
          技術(shù)細(xì)節(jié)SDK 架構(gòu)體系概述

          Mobile SDK的體系結(jié)構(gòu)被設(shè)計(jì)為高度可擴(kuò)展的,其中使用了抽象產(chǎn)品類和組件類,以便應(yīng)用程序可以使用相同的代碼控制不同的產(chǎn)品。對于一些沒法在不同產(chǎn)品中保持一致性的功能可以在運(yùn)行時被查詢調(diào)用,對于一些能保持一致性的功能則直接可以工作了。

          例如,Phantom和Inspire系列產(chǎn)品的絕大多數(shù)功能是一致的。因此,為適配Phantom 4而編寫的應(yīng)用程序,除Inspire 1的一些獨(dú)特功能外,將可以直接在Inspire 1機(jī)型上使用。

          這也意味著當(dāng)新產(chǎn)品發(fā)布時,就已經(jīng)可以與現(xiàn)有的應(yīng)用程序一起使用了(需要使用支持該新產(chǎn)品的最新SDK)。新產(chǎn)品中的任何新功能都需要添加到應(yīng)用程序中,但是所有現(xiàn)有功能都不需要做修改了。

          層級架構(gòu)

          移動應(yīng)用程序一般通過下圖所示的幾個主要類來訪問Mobile SDK:

          圖片


          • SDKManager:MSDK工具包的入口類,管理MSDK的初始化,反初始化,MSDK注冊,以及監(jiān)聽DJI硬件產(chǎn)品的連接事件。
          • KeyTools / KeyManager:MSDK V5版本使用了以Key為基礎(chǔ)元素的參數(shù)設(shè)置和參數(shù)獲取功能接口,KeyTools是創(chuàng)建Key的入口類,KeyManager是調(diào)用或者監(jiān)聽Key的入口類,大多數(shù)的功能都可以通過相應(yīng)的Key來控制,例如控制云臺旋轉(zhuǎn)或者控制相機(jī)拍照、錄像等。
          • MediaDataCenter:應(yīng)用數(shù)據(jù)獲取功能的入口類,通過MediaDataCenter可以獲取到原始的碼流數(shù)據(jù)管理類,以及多媒體文件數(shù)據(jù)的管理類。
          • WaypointMissionManager:航點(diǎn)任務(wù)自動飛行的入口類,可以控制無人機(jī)基于航點(diǎn)的自主飛行。
          • VirtualStickManager:虛擬搖桿飛行入口類,可以控制無人機(jī)進(jìn)入虛擬搖桿控制模式,進(jìn)入此模式之后可以通過實(shí)時發(fā)送動作命令的形式控制無人機(jī)飛行。
          • FlightLogManager:飛行日志管理類,可以獲取手機(jī)端存儲的日志路徑。
          • DeviceHealthManager:設(shè)備健康管理模塊,通過此類可以實(shí)時獲取到設(shè)備的健康狀態(tài)以提醒無人機(jī)的操縱者。
          智能任務(wù)

          智能任務(wù)可以輕松實(shí)現(xiàn)飛行自動化。其中基于航點(diǎn)和航點(diǎn)動作定義的航點(diǎn)飛行任務(wù)(WaypointMission)可以使無人機(jī)沿著定義好的航點(diǎn)和航點(diǎn)動作來自動飛行,使用WaypointMissionManager來控制航點(diǎn)任務(wù)的執(zhí)行過程,航點(diǎn)動作和航點(diǎn)任務(wù)可以由KMZ文件定義。基于實(shí)時命令的虛擬搖桿飛行功能,也可以讓飛機(jī)實(shí)現(xiàn)自動飛行,開發(fā)者可以基于自己的算法,調(diào)用VirtualStickManager中的接口來控制無人機(jī)進(jìn)行自主飛行。

          空白項(xiàng)目集成 MSDK新建空白項(xiàng)目

          1、在 Android Studio 啟動頁,選擇 New Project > Phone and Tablet > Empty Activity。

          2、完成配置。

          • Name:My Application Package。
          • name:com.dji.myapplication。
          • Minimum SDK:23。

          3、compileSdkVersion 和 targetSdkVersion 為 29。

          新建 MyApplication.kt 文件

          1、新建 MyApplication.kt 文件。

          2、參照 MSDK V5 Sample 的 DJIAllApplication 編輯成如下內(nèi)容。代碼的作用是引入 SDK 的解密加固包。

          package com.dji.myapplication
          import android.app.Application
          import android.content.Context
          class MyApplication : Application() {
              override fun attachBaseContext(base: Context?) {
                  super.attachBaseContext(base)
                  com.secneo.sdk.Helper.install(this)
              }
          }
          修改 build.gradle(Module) 文件

          1、在 dependencies 項(xiàng)里添加 MSDK 飛行器包,如只需全量包或手持包請參考 Sample 添加。

          implementation "com.dji:dji-sdk-v5-aircraft:5.2.0"
          implementation "com.dji:dji-sdk-v5-networkImp:5.2.0"
          compileOnly "com.dji:dji-sdk-v5-aircraft-provided:5.2.0"
          implementation 'com.squareup.okio:okio:1.15.0'
          implementation 'com.squareup.wire:wire-runtime:2.2.0'
          implementation 'com.airbnb.android:lottie:3.3.1'

          dji-sdk-v5-aircraft:飛機(jī)主包,提供 MSDK 對飛機(jī)控制的支持。dji-sdk-v5-networkImp:網(wǎng)絡(luò)庫包,為 MSDK 提供聯(lián)網(wǎng)能力。

          dji-sdk-v5-aircraft-provided:飛機(jī)編譯包,提供飛機(jī)包相關(guān)接口。

          2、在 android 項(xiàng)里添加 packagingOptions。

          packagingOptions {
              doNotStrip "*/*/libconstants.so"
              doNotStrip "*/*/libdji_innertools.so"
              doNotStrip "*/*/libdjibase.so"
              doNotStrip "*/*/libDJICSDKCommon.so"
              doNotStrip "*/*/libDJIFlySafeCore-CSDK.so"
              doNotStrip "*/*/libdjifs_jni-CSDK.so"
              doNotStrip "*/*/libDJIRegister.so"
              doNotStrip "*/*/libdjisdk_jni.so"
              doNotStrip "*/*/libDJIUpgradeCore.so"
              doNotStrip "*/*/libDJIUpgradeJNI.so"
              doNotStrip "*/*/libDJIWaypointV2Core-CSDK.so"
              doNotStrip "*/*/libdjiwpv2-CSDK.so"
              doNotStrip "*/*/libffmpeg.so"
              doNotStrip "*/*/libFlightRecordEngine.so"
              doNotStrip "*/*/libvideo-framing.so"
              doNotStrip "*/*/libwaes.so"
              doNotStrip "*/*/libagora-rtsa-sdk.so"
              doNotStrip "*/*/libc++.so"
              doNotStrip "*/*/libc++_shared.so"
              doNotStrip "*/*/libmrtc_28181.so"
              doNotStrip "*/*/libmrtc_agora.so"
              doNotStrip "*/*/libmrtc_core.so"
              doNotStrip "*/*/libmrtc_core_jni.so"
              doNotStrip "*/*/libmrtc_data.so"
              doNotStrip "*/*/libmrtc_log.so"
              doNotStrip "*/*/libmrtc_onvif.so"
              doNotStrip "*/*/libmrtc_rtmp.so"
              doNotStrip "*/*/libmrtc_rtsp.so"
          }
          修改 AndroidManifest.xml 文件

          1、參照 Sample 的 AndroidManifest.xml 添加 SDK 需要的最基礎(chǔ)權(quán)限。

          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
          <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
          <uses-permission android:name="android.permission.INTERNET" />
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
          <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
          <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
          <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
          <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
          <uses-permission android:name="android.permission.READ_PHONE_STATE" />

          2、參照 MSDK V5 Sample 的 AndroidManifest.xml 添加 USB 相關(guān)權(quán)限,為了連接遙控器使用。

          <uses-feature
              android:name="android.hardware.usb.host"
              android:required="false"/>
          <uses-feature
              android:name="android.hardware.usb.accessory"
              android:required="true"/>

          3、在 application 標(biāo)簽下添加 Myapplication 文件的聲明,啟動的時候需要加載。

          <application
              android:name="com.dji.myapplication.MyApplication"

          4、參照 MSDK V5 Sample 的 AndroidManifest.xml 添加 SDK API KEY。用戶需要使用工程中的 AndroidManifest.xml 中的package,前往 開發(fā)者網(wǎng)站 申請 appkey,成功后將appkey替換如下代碼段中的X。本指導(dǎo)中 package=com.dji.myapplication。申請 appkey 時,Package Name 需填寫com.dji.myapplication。

          <meta-data
              android:name="com.dji.sdk.API_KEY"
              android:value="X"/>


          圖片

          5、在 activity 標(biāo)簽下添加 intent-filter 和 meta-data。


          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <meta-data
              android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
              android:resource="@xml/accessory_filter" />
          修改 MainActivity.kt 文件

          添加 MSDK 的 init 函數(shù)即可。

          package com.dji.myapplication
          import android.os.Bundle
          import android.util.Log
          import androidx.appcompat.app.AppCompatActivity
          import dji.v5.common.error.IDJIError
          import dji.v5.common.register.DJISDKInitEvent
          import dji.v5.manager.SDKManager
          import dji.v5.manager.interfaces.SDKManagerCallback
          class MainActivity : AppCompatActivity() {
              private val TAG = "myApp"
              override fun onCreate(savedInstanceState: Bundle?) {
                  super.onCreate(savedInstanceState)
                  setContentView(R.layout.activity_main)
                  registerApp()
              }
              private fun registerApp() {
                  SDKManager.getInstance().init(this, object : SDKManagerCallback {
                      override fun onRegisterSuccess() {
                          Log.i(TAG, "myApp onRegisterSuccess")
                      }
                      override fun onRegisterFailure(error: IDJIError) {
                          Log.i(TAG, "myApp onRegisterFailure")
                      }
                      override fun onProductDisconnect(productId: Int) {
                          Log.i(TAG, "myApp onProductDisconnect")
                      }
                      override fun onProductConnect(productId: Int) {
                          Log.i(TAG, "myApp onProductConnect")
                      }
                      override fun onProductChanged(productId: Int) {
                          Log.i(TAG, "myApp onProductChanged")
                      }
                      override fun onInitProcess(event: DJISDKInitEvent, totalProcess: Int) {
                          Log.i(TAG, "myApp onInitProcess")
                          if (event == DJISDKInitEvent.INITIALIZE_COMPLETE) {
                              Log.i(TAG, "myApp start registerApp")
                              SDKManager.getInstance().registerApp()
                          }
                      }
                      override fun onDatabaseDownloadProgress(current: Long, total: Long) {
                          Log.i(TAG, "myApp onDatabaseDownloadProgress")
                      }
                  })
              }
          }
          導(dǎo)入 UXSDK 開源框架

          1、將 UXSDK 項(xiàng)目(android-sdk-v5-uxsdk)整個復(fù)制到myapplication項(xiàng)目路徑的app/libs文件夾下。

          2、工具欄點(diǎn)擊 File > New > Import Module,選擇myapplication項(xiàng)目路徑的app/libs文件夾下的android-sdk-v5-uxsdk。

          3、修改settings.gradle文件。

          rootProject.name = "My Application"
          include ':app'':android-sdk-v5-uxsdk'
          project(':android-sdk-v5-uxsdk').projectDir = new File(rootDir, 'app/libs/android-sdk-v5-uxsdk/')

          4、修改build.gradle(:android-sdk-v5-uxsdk)文件中的配置和myApplication項(xiàng)目一致。

          apply plugin: 'com.android.library'
          apply plugin: 'kotlin-android'
          apply plugin: 'kotlin-android-extensions'
          apply plugin: 'kotlin-kapt'
          android {
              compileSdkVersion 32
              resourcePrefix "uxsdk_"
              defaultConfig {
                  minSdkVersion 23
                  targetSdkVersion 32
                  versionCode 1
                  versionName "1.0"
              }
              compileOptions {
                  sourceCompatibility JavaVersion.VERSION_1_8
                  targetCompatibility JavaVersion.VERSION_1_8
              }
              kotlinOptions{
                  jvmTarget = JavaVersion.VERSION_1_8
              }
          }
          dependencies {
              implementation 'androidx.annotation:annotation:1.1.0'
              implementation 'androidx.appcompat:appcompat:1.3.1'
              implementation 'androidx.multidex:multidex:2.0.1'
              implementation 'androidx.legacy:legacy-support-v4:1.0.0'
              implementation 'androidx.recyclerview:recyclerview:1.1.0'
              implementation 'com.squareup.okio:okio:1.15.0'
              implementation 'com.squareup.wire:wire-runtime:2.2.0'
              implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
              implementation 'androidx.lifecycle:lifecycle-common-java8:2.3.1'
              implementation 'androidx.lifecycle:lifecycle-runtime:2.3.1'
              implementation 'androidx.lifecycle:lifecycle-process:2.3.1'
              implementation 'androidx.media:media:1.0.0'
              implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
              implementation "androidx.core:core-ktx:1.3.2"
              api 'io.reactivex.rxjava3:rxandroid:3.0.0'
              implementation 'com.airbnb.android:lottie:3.3.1'
              implementation 'androidx.cardview:cardview:1.0.0'
              api 'org.maplibre.gl:android-plugin-annotation-v9:1.0.0'
              api 'org.maplibre.gl:android-sdk-turf:5.9.0'
              api 'org.maplibre.gl:android-sdk:9.4.2'
              api 'com.amap.api:3dmap:7.3.0'
              api 'com.amap.api:search:7.3.0'
              api 'com.google.android.gms:play-services-places:16.0.0'
              api 'com.google.android.gms:play-services-maps:16.0.0'
              api 'com.google.android.gms:play-services-location:16.0.0'
              api 'com.google.android.gms:play-services-base:16.0.0'
              compileOnly "com.dji:dji-sdk-v5-aircraft-provided:5.2.0"
              compileOnly "com.dji:dji-sdk-v5-aircraft:5.2.0"
          }

          5、同步工程。

          4.X 和 5.X 版本差異說明

          以下內(nèi)容主要目的是將MSDK 4.X版本和MSDK 5.X版本中的核心接口做對比和說明,其中主要包含了DJIKey類型接口的對比說明,和幾個核心模塊的差異點(diǎn)說明,例如SDK注冊管理類(SDKManager)、設(shè)備健康狀態(tài)管理類(DeviceHealthManager)等。

          注意:目前MSDK 4.X和5.X還不兼容,不能一起使用。MSDK 5.X 目前支持機(jī)型查看版本發(fā)布中的“支持產(chǎn)品列表和固件版本”,且未來只計(jì)劃支持部分DJI的新機(jī)型。

          DJIKey差異說明DJIKey

          MSDK 5.X 大多數(shù)與設(shè)備交互的功能,都是基于DJIKey來實(shí)現(xiàn)的,一個DJIKey代表指定模塊的具體功能。

          在4.X上,大部分接口的本質(zhì)是對DJIKey的封裝,比如說Camera$startShootPhoto,其本質(zhì)是CameraKey.START_SHOOT_PHOTO的應(yīng)用。在后面對比表格中,對于4.X,只顯示DJIKey,而不是接口。如有特別需要說明的情況,會特殊處理。

          這里以FlightControllerState下的Motors中的方法areMotorsOn為例:先通過方法areMotorsOn在4.X文檔中,搜到areMotorsOn的方法說明,然后查詢到對應(yīng)的4.X DJIKey.FlightControllerKey.ARE_MOTOR_ON,繼而在遷移文檔中找到方法areMotorsOn對應(yīng)的5.X DJIKey。區(qū)別:

          圖片


          如何CreateKey

          在4.X上,DJIKey的create方法定義在各類模塊Key中,這里以CameraKey來舉例:

          1、創(chuàng)建主位置的Key:CameraKey。

          create(String paramKey, int componentIndex) 3、創(chuàng)建指定位置、指定鏡頭的Key:CameraKey$createLensKey(String paramKey, int componentIndex, int subComponentIndex)。

          在5.X上,DJIKey的create方法統(tǒng)一定義到KeyTools中,以CameraKey為例:

          只有一種方法,創(chuàng)建指定位置、指定鏡頭的DJIKey:KeyTools$createCameraKey(DJIKeyInfomKeyInfo, ComponentIndexType componentIndexType, CameraLensType cameraLensType),相關(guān)DJIKey如果不指明鏡頭的話,就用CameraLensType.CAMERA_LENS_DEFAULT(在Kotlin上,DJIKeyInfo有擴(kuò)展方法createCamera,cameraLensType默認(rèn)值就是CameraLensType.CAMERA_LENS_DEFAULT)。

          參數(shù)說明:

          圖片

          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。




          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉