基于大疆無人機SDK二次開發
近期公司專案需求,需要基于大疆無人機SDK開發一款手機 APP,用于配合后臺實作對無人機的管理,當然大疆本身也給我們提供了管理平臺-----大疆司空,通過大疆的官方 APP 配合后臺管理系統大疆司空,就可以實作對無人機的管理了,奈何大疆司空費用太高,進階版需要 1 年 19999 的費用,因此就需要自己開發手機APP,用于給后臺傳輸無人機的有關資訊,
下面就把開發程序中需要注意的一些地方總結整理一下,以免后人踩坑,
相關資料鏈接
下面把使用到的資料鏈接貼一下:
下載中心
通過下載中心我們可以下載無人機的操作手冊、快速入門手冊還有不同的 app 版本,為我們開發提供便利的軟體工具等等,
官方Demo
這里有很多 demo,不同的demo用于介紹不同的功能點,切記在開發的時候要以demo中的代碼為準,不要以官方檔案為準,按照官方檔案你可能無法把程式跑起來,
商城
在商城里你可以了解相關產品的特性,進行更好的開發
檔案
檔案還是要看一下的,特別是對沒有接觸過無人機的新手來說,檔案都是英文的,其實很容易看懂,實在不懂可以通過谷歌瀏覽器的翻譯功能,可以很好的把檔案翻譯成中文,建議原文和中文一起查看,
API
Api 可以作為在開發程序中的補充,對那個方法不了解,就直接到這里搜索就可以了,API 的搜索功能做的很強大,你只需要把不同的方法名或者類名輸入就可以了,API 里面的解釋相對來說還是比較詳細的,
進入正文
首先想要開發大疆無人機 APP ,需要滿足以下條件:
- 首先你要有一臺無人機(需要這臺無人機支持 SDK 查看支持的無人機型號)
- 開發者賬號
滿足了上面的條件就可以開始進行開發了,和平時使用第三方 SDK 一樣,你需要在開發者賬號里面新建一個 APP,這里需要注意 APP 的包名必須和真實的 APP 包名一致 否則運行不成功!
關于如何匯入依賴,如何創建 APP 這些基本內容這里就不重復了,檔案都用,需要注意的是檔案里面的依賴不全,你需要做的就是,把 demo 下載下來,然后把 demo 中的依賴全部復制到你的專案中
再說具體一些,檔案中的這里是不全的,你需要在依賴中添加:
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"
doNotStrip "*/*/libDJIFlySafeCore.so"
doNotStrip "*/*/libdjifs_jni.so"
doNotStrip "*/*/libsfjni.so"
doNotStrip "*/*/libDJICommonJNI.so"
doNotStrip "*/*/libDJICSDKCommon.so"
doNotStrip "*/*/libDJIUpgradeCore.so"
doNotStrip "*/*/libDJIUpgradeJNI.so"
exclude 'META-INF/rxjava.properties'
}
來代替檔案中寫出的那幾種
好了,依賴也引入成功了,下面就可以進行開發了,
這里就簡單介紹一下sdk的使用步驟把,重點是接受需要特別注意地方,
首先你需要注冊一下 sdk,在注冊成功的回呼里面再調登錄
if (isRegistrationInProgress.compareAndSet(false, true)) {
AsyncTask.execute(() -> DJISDKManager.getInstance()
.registerApp(MainActivity.this.getApplicationContext(),
new DJISDKManager.SDKManagerCallback() {
@Override
public void onRegister(DJIError djiError) {
// 如果配置的包名和API_KEY沒有問題那么這里就注冊成功了
if (djiError == DJISDKError.REGISTRATION_SUCCESS) {
DJISDKManager.getInstance().startConnectionToProduct();
// 進行登錄
loginAccount();
}
}
@Override
public void onProductDisconnect() {
Log.e(TAG, "onProductDisconnect");
notifyStatusChange();
}
@Override
public void onProductConnect(BaseProduct baseProduct) {
Log.e(TAG, String.format("onProductConnect newProduct:%s",
baseProduct));
notifyStatusChange();
}
@Override
public void onComponentChange(BaseProduct.ComponentKey componentKey,
BaseComponent oldComponent,
BaseComponent newComponent) {
}
@Override
public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) {
}
@Override
public void onDatabaseDownloadProgress(long l, long l1) {
}
}));
}
上面的一步是 APP 開始所必須要經過的一步,否則你就無法操控無人機,
這一步需要注意的是:
- 上面的回呼內容都不是在主執行緒,因此如果要操作界面內容,需要到主執行緒中操作
- 首次注冊 SDK 和登錄賬戶是需要網路支持的,之后就不需要網路了,
- 登錄一定要在注冊 SDK 成功后呼叫,否則加載不出登錄界面
好了,上面步驟完畢后,就是等待無人機連接了,無人機連接的時候會觸發回呼,等連接上無人機我們就可以進行真正的開發了,
進行開發的時候主要就是利用了 SDK 中的幾個類,它們的方法很好理解,
DJISDKManager
這個類非常關鍵,它是使用 SDK 和 大疆無人機的入口,
注冊 SDK、獲取無人機物件都是通過這個類來實作的,
通過 SJISDKManager 獲取到無人機物件(Aircraft)后,就可以利用 Aircraft 來獲取無人機的各個組件對應的物件了,比如:飛控 FlightController (這是無人機的核心組件,控制無人機的飛行,關于無人機的位置資訊,狀態資訊等)、電池 Battery、相機Camera、云臺 Gimbal 、遙控器RemoteController 等等,詳見 COMPONENT CLASSES
同時我們還可以引入 UX SDK 地址來幫助我們進行快速的開發,
UX SDK 主要是提供了一些執行緒的控制元件,這些控制元件我們放到 UI 中就可以使用,而且不是靜態的 UI ,是有資料的,不需要我們進行任何處理,
比如:dji.ux.widget.FPVWidget 組件,你只需要放到布局中,就可以顯示無人機相機的畫面,
注意內容
進行直播:
if (!DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) {
new Thread() {
@Override
public void run() {
fpv.registerLiveVideo(VideoFeeder.getInstance()
.getSecondaryVideoFeed(),
true);
DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl(
"rtmp://x.x.x.x/x");
DJISDKManager.getInstance().getLiveStreamManager()
.setVideoEncodingEnabled(true);
int result =
DJISDKManager.getInstance().getLiveStreamManager()
.startStream();
L.e("startLive:" + result + DJISDKManager.getInstance()
.getLiveStreamManager().isStreaming() +
"\n isVideoStreamSpeedConfigurable:" + DJISDKManager
.getInstance().getLiveStreamManager()
.isVideoStreamSpeedConfigurable() +
"\n isLiveAudioEnabled:" + DJISDKManager.getInstance()
.getLiveStreamManager().isLiveAudioEnabled());
}
}.start();
}
單純的 setLiveUrl() 然后開始直播是不會成功的,需要有前面一步 注冊直播視頻,代碼中的 fpv就是 dji.ux.widget.FPVWidget 控制元件,
獲取無人機位置的方法
// 主動獲取
Aircraft aircraft1 = (Aircraft) DJISDKManager.getInstance().getProduct();
FlightControllerState state = aircraft1.getFlightController().getState();
L.e("==altitude:" + state.getAircraftLocation().getAltitude() + "latitude:" + state.getAircraftLocation().getLatitude() + "longitude:");
// 當然你可以注冊回呼函式
void setStateCallback(@Nullable FlightControllerState.Callback callback);
布局名字坑
布局中不要出現 dialog_login 的名字,因為這個名字在大疆的 SDK 中已經有了,當你在添加一個 dialog_login 名字的時候,呼叫 登錄 API 就會報空指標錯誤了,
如果出現莫名其妙的布局空指標例外,很有可能是我們自己的布局和大疆 SDK 中的布局名字重復了,
回呼大多不在主執行緒
大疆 SDK 中的回呼大多數都不是在主執行緒這一點需要注意
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/5578.html
標籤:Android
