概要
相較與V4版本開發(fā),V5版本有了更方便簡介的方式。V5不僅再功能上與V4增加更多的功能,而且在功能的使用及API的調(diào)用也做了優(yōu)化。雖然V5現(xiàn)在很新也在不斷地迭代,但是不免會(huì)出現(xiàn)對一些飛行或者遙控器出現(xiàn)bug,大疆的開發(fā)人員也在不斷的完善這整個(gè)V5開發(fā)包,已提供更全更優(yōu)的開發(fā)模式。下面是使用V5開發(fā)包進(jìn)行的大疆無人機(jī)飛控系統(tǒng)的開發(fā)過程。
DJI Mobile SDK V5擁有更加簡潔易用的無人機(jī)硬件控制接口和軟件服務(wù)接口,開放全開源的生產(chǎn)代碼及 Sample 和豐富的教程,為開發(fā)者提供了具有競爭力的無人機(jī)移動(dòng)端解決方案,極大的提升開發(fā)體驗(yàn)和效率?,F(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 有下面幾種功能:
Mobile SDK的體系結(jié)構(gòu)被設(shè)計(jì)為高度可擴(kuò)展的,其中使用了抽象產(chǎn)品類和組件類,以便應(yīng)用程序可以使用相同的代碼控制不同的產(chǎn)品。對于一些沒法在不同產(chǎn)品中保持一致性的功能可以在運(yùn)行時(shí)被查詢調(diào)用,對于一些能保持一致性的功能則直接可以工作了。
例如,Phantom和Inspire系列產(chǎn)品的絕大多數(shù)功能是一致的。因此,為適配Phantom 4而編寫的應(yīng)用程序,除Inspire 1的一些獨(dú)特功能外,將可以直接在Inspire 1機(jī)型上使用。
這也意味著當(dāng)新產(chǎn)品發(fā)布時(shí),就已經(jīng)可以與現(xiàn)有的應(yīng)用程序一起使用了(需要使用支持該新產(chǎn)品的最新SDK)。新產(chǎn)品中的任何新功能都需要添加到應(yīng)用程序中,但是所有現(xiàn)有功能都不需要做修改了。
移動(dòng)應(yīng)用程序一般通過下圖所示的幾個(gè)主要類來訪問Mobile SDK:
智能任務(wù)可以輕松實(shí)現(xiàn)飛行自動(dòng)化。其中基于航點(diǎn)和航點(diǎn)動(dòng)作定義的航點(diǎn)飛行任務(wù)(WaypointMission)可以使無人機(jī)沿著定義好的航點(diǎn)和航點(diǎn)動(dòng)作來自動(dòng)飛行,使用WaypointMissionManager來控制航點(diǎn)任務(wù)的執(zhí)行過程,航點(diǎn)動(dòng)作和航點(diǎn)任務(wù)可以由KMZ文件定義?;趯?shí)時(shí)命令的虛擬搖桿飛行功能,也可以讓飛機(jī)實(shí)現(xiàn)自動(dòng)飛行,開發(fā)者可以基于自己的算法,調(diào)用VirtualStickManager中的接口來控制無人機(jī)進(jìn)行自主飛行。
1、在 Android Studio 啟動(dòng)頁,選擇 New Project > Phone and Tablet > Empty Activity。
2、完成配置。
3、compileSdkVersion 和 targetSdkVersion 為 29。
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)
????}
}
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"
}
1、參照 Sample 的 AndroidManifest.xml 添加 SDK 需要的最基礎(chǔ)權(quán)限。
"android.permission.ACCESS_NETWORK_STATE"?/>
"android.permission.ACCESS_WIFI_STATE"?/>
"android.permission.INTERNET"?/>
"android.permission.ACCESS_COARSE_LOCATION"?/>
"android.permission.ACCESS_FINE_LOCATION"?/>
"android.permission.KILL_BACKGROUND_PROCESSES"/>
"android.permission.WRITE_EXTERNAL_STORAGE"?/>
"android.permission.READ_EXTERNAL_STORAGE"?/>
"android.permission.READ_PHONE_STATE"?/>
2、參照 MSDK V5 Sample 的 AndroidManifest.xml 添加 USB 相關(guān)權(quán)限,為了連接遙控器使用。
????android:name="android.hardware.usb.host"
????android:required="false"/>
????android:name="android.hardware.usb.accessory"
????android:required="true"/>
3、在 application 標(biāo)簽下添加 Myapplication 文件的聲明,啟動(dòng)的時(shí)候需要加載。
????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 時(shí),Package Name 需填寫com.dji.myapplication。
????android:name="com.dji.sdk.API_KEY"
????android:value="X"/>
5、在 activity 標(biāo)簽下添加 intent-filter 和 meta-data。
????"android.intent.action.MAIN"?/>
????"android.hardware.usb.action.USB_ACCESSORY_ATTACHED"?/>
????"android.intent.category.LAUNCHER"?/>
????android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
????android:resource="@xml/accessory_filter"?/>
添加 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")
????????????}
????????})
????}
}
1、將 UXSDK 項(xiàng)目(android-sdk-v5-uxsdk)整個(gè)復(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、同步工程。
以下內(nèi)容主要目的是將MSDK 4.X版本和MSDK 5.X版本中的核心接口做對比和說明,其中主要包含了DJIKey類型接口的對比說明,和幾個(gè)核心模塊的差異點(diǎn)說明,例如SDK注冊管理類(SDKManager)、設(shè)備健康狀態(tài)管理類(DeviceHealthManager)等。
注意:目前MSDK 4.X和5.X還不兼容,不能一起使用。MSDK 5.X 目前支持機(jī)型查看版本發(fā)布中的“支持產(chǎn)品列表和固件版本”,且未來只計(jì)劃支持部分DJI的新機(jī)型。
MSDK 5.X 大多數(shù)與設(shè)備交互的功能,都是基于DJIKey來實(shí)現(xiàn)的,一個(gè)DJIKey代表指定模塊的具體功能。
在4.X上,大部分接口的本質(zhì)是對DJIKey的封裝,比如說Camera$startShootPhoto,其本質(zhì)是CameraKey.START_SHOOT_PHOTO的應(yīng)用。在后面對比表格中,對于4.X,只顯示DJIKey,而不是接口。如有特別需要說明的情況,會(huì)特殊處理。
這里以FlightControllerState下的Motors中的方法areMotorsOn為例:先通過方法areMotorsOn在4.X文檔中,搜到areMotorsOn的方法說明,然后查詢到對應(yīng)的4.X DJIKey.FlightControllerKey.ARE_MOTOR_ON,繼而在遷移文檔中找到方法areMotorsOn對應(yīng)的5.X DJIKey。區(qū)別:
在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(DJIKeyInfo
參數(shù)說明:
往期推薦LabVIEW溫度監(jiān)控系統(tǒng)
LabVIEW圖像灰度測量(基礎(chǔ)篇—7)
Python Qt GUI設(shè)計(jì):UI界面可視化組件、屬性概述(基礎(chǔ)篇—4)
RS485通信如何設(shè)計(jì)EMC電路?
幾十種傳感器原理的動(dòng)態(tài)分析
OpenCV制作類似“全能掃描王”的簡易掃描軟件
直流電源防反接電路設(shè)計(jì)
移遠(yuǎn)BC95使用CoAP協(xié)議接入華為IoT平臺(tái)
