基于大疆無人機(jī)SDK二次開發(fā)
近期公司項(xiàng)目需求,需要基于大疆無人機(jī)SDK開發(fā)一款手機(jī) APP浦妄,用于配合后臺實(shí)現(xiàn)對無人機(jī)的管理尼摹。當(dāng)然大疆本身也給我們提供了管理平臺-----大疆司空。通過大疆的官方 APP 配合后臺管理系統(tǒng)大疆司空剂娄,就可以實(shí)現(xiàn)對無人機(jī)的管理了蠢涝。奈何大疆司空費(fèi)用太高,進(jìn)階版需要 1 年 19999 的費(fèi)用阅懦。因此就需要自己開發(fā)手機(jī)APP和二,用于給后臺傳輸無人機(jī)的有關(guān)信息。
下面就把開發(fā)過程中需要注意的一些地方總結(jié)整理一下耳胎,以免后人踩坑儿咱。
相關(guān)資料鏈接
下面把使用到的資料鏈接貼一下:
通過下載中心我們可以下載無人機(jī)的操作手冊、快速入門手冊還有不同的 app 版本场晶,為我們開發(fā)提供便利的軟件工具等等混埠。
這里有很多 demo,不同的demo用于介紹不同的功能點(diǎn)诗轻,切記在開發(fā)的時候要以demo中的代碼為準(zhǔn)钳宪,不要以官方文檔為準(zhǔn),按照官方文檔你可能無法把程序跑起來扳炬。
在商城里你可以了解相關(guān)產(chǎn)品的特性吏颖,進(jìn)行更好的開發(fā)
文檔還是要看一下的,特別是對沒有接觸過無人機(jī)的新手來說恨樟。文檔都是英文的半醉,其實(shí)很容易看懂。實(shí)在不懂可以通過谷歌瀏覽器的翻譯功能劝术,可以很好的把文檔翻譯成中文缩多。建議原文和中文一起查看。
Api 可以作為在開發(fā)過程中的補(bǔ)充养晋,對那個方法不了解衬吆,就直接到這里搜索就可以了,API 的搜索功能做的很強(qiáng)大绳泉,你只需要把不同的方法名或者類名輸入就可以了逊抡。API 里面的解釋相對來說還是比較詳細(xì)的。
進(jìn)入正文
首先想要開發(fā)大疆無人機(jī) APP 零酪,需要滿足以下條件:
- 首先你要有一臺無人機(jī)(需要這臺無人機(jī)支持 SDK 查看支持的無人機(jī)型號)
- 開發(fā)者賬號
滿足了上面的條件就可以開始進(jìn)行開發(fā)了冒嫡,和平時使用第三方 SDK 一樣拇勃,你需要在開發(fā)者賬號里面新建一個 APP,這里需要注意 APP 的包名必須和真實(shí)的 APP 包名一致 否則運(yùn)行不成功孝凌!
關(guān)于如何導(dǎo)入依賴方咆,如何創(chuàng)建 APP 這些基本內(nèi)容這里就不重復(fù)了,文檔都用胎许,需要注意的是文檔里面的依賴不全峻呛,你需要做的就是罗售,把 demo 下載下來辜窑,然后把 demo 中的依賴全部復(fù)制到你的項(xiàng)目中
再說具體一些,文檔中的這里是不全的寨躁,你需要在依賴中添加:
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'
}
來代替文檔中寫出的那幾種
好了穆碎,依賴也引入成功了,下面就可以進(jìn)行開發(fā)了职恳。
這里就簡單介紹一下sdk的使用步驟把所禀,重點(diǎn)是接受需要特別注意地方。
首先你需要注冊一下 sdk放钦,在注冊成功的回調(diào)里面再調(diào)登錄
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();
// 進(jìn)行登錄
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 開始所必須要經(jīng)過的一步色徘,否則你就無法操控?zé)o人機(jī)。
這一步需要注意的是:
- 上面的回調(diào)內(nèi)容都不是在主線程操禀,因此如果要操作界面內(nèi)容褂策,需要到主線程中操作
- 首次注冊 SDK 和登錄賬戶是需要網(wǎng)絡(luò)支持的,之后就不需要網(wǎng)絡(luò)了颓屑。
- 登錄一定要在注冊 SDK 成功后調(diào)用斤寂,否則加載不出登錄界面
好了,上面步驟完畢后揪惦,就是等待無人機(jī)連接了遍搞,無人機(jī)連接的時候會觸發(fā)回調(diào),等連接上無人機(jī)我們就可以進(jìn)行真正的開發(fā)了器腋。
進(jìn)行開發(fā)的時候主要就是利用了 SDK 中的幾個類溪猿,它們的方法很好理解。
DJISDKManager
這個類非常關(guān)鍵纫塌,它是使用 SDK 和 大疆無人機(jī)的入口再愈。
注冊 SDK、獲取無人機(jī)對象都是通過這個類來實(shí)現(xiàn)的护戳。
通過 SJISDKManager
獲取到無人機(jī)對象(Aircraft
)后翎冲,就可以利用 Aircraft
來獲取無人機(jī)的各個組件對應(yīng)的對象了,比如:飛控 FlightController
(這是無人機(jī)的核心組件媳荒,控制無人機(jī)的飛行抗悍,關(guān)于無人機(jī)的位置信息驹饺,狀態(tài)信息等)、電池 Battery
缴渊、相機(jī)Camera
赏壹、云臺 Gimbal
、遙控器RemoteController
等等衔沼。詳見 COMPONENT CLASSES
同時我們還可以引入 UX SDK
地址來幫助我們進(jìn)行快速的開發(fā)蝌借。
UX SDK 主要是提供了一些線程的控件,這些控件我們放到 UI 中就可以使用指蚁,而且不是靜態(tài)的 UI 菩佑,是有數(shù)據(jù)的,不需要我們進(jìn)行任何處理凝化。
比如:dji.ux.widget.FPVWidget
組件稍坯,你只需要放到布局中,就可以顯示無人機(jī)相機(jī)的畫面搓劫。
注意內(nèi)容
進(jìn)行直播:
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
控件枪向。
獲取無人機(jī)位置的方法
// 主動獲取
Aircraft aircraft1 = (Aircraft) DJISDKManager.getInstance().getProduct();
FlightControllerState state = aircraft1.getFlightController().getState();
L.e("==altitude:" + state.getAircraftLocation().getAltitude() + "latitude:" + state.getAircraftLocation().getLatitude() + "longitude:");
// 當(dāng)然你可以注冊回調(diào)函數(shù)
void setStateCallback(@Nullable FlightControllerState.Callback callback);
布局名字坑
布局中不要出現(xiàn) dialog_login
的名字勤揩,因?yàn)檫@個名字在大疆的 SDK 中已經(jīng)有了,當(dāng)你在添加一個 dialog_login
名字的時候秘蛔,調(diào)用 登錄 API 就會報空指針錯誤了陨亡。
如果出現(xiàn)莫名其妙的布局空指針異常,很有可能是我們自己的布局和大疆 SDK 中的布局名字重復(fù)了缠犀。
回調(diào)大多不在主線程
大疆 SDK 中的回調(diào)大多數(shù)都不是在主線程這一點(diǎn)需要注意