基于大疆無人機(jī)SDK二次開發(fā)

聲明

基于大疆無人機(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,不同的demo用于介紹不同的功能點(diǎn)诗轻,切記在開發(fā)的時候要以demo中的代碼為準(zhǔn)钳宪,不要以官方文檔為準(zhǔn),按照官方文檔你可能無法把程序跑起來扳炬。

商城

在商城里你可以了解相關(guān)產(chǎn)品的特性吏颖,進(jìn)行更好的開發(fā)

文檔

文檔還是要看一下的,特別是對沒有接觸過無人機(jī)的新手來說恨樟。文檔都是英文的半醉,其實(shí)很容易看懂。實(shí)在不懂可以通過谷歌瀏覽器的翻譯功能劝术,可以很好的把文檔翻譯成中文缩多。建議原文和中文一起查看。

API

Api 可以作為在開發(fā)過程中的補(bǔ)充养晋,對那個方法不了解衬吆,就直接到這里搜索就可以了,API 的搜索功能做的很強(qiáng)大绳泉,你只需要把不同的方法名或者類名輸入就可以了逊抡。API 里面的解釋相對來說還是比較詳細(xì)的。

進(jìn)入正文

首先想要開發(fā)大疆無人機(jī) APP 零酪,需要滿足以下條件:

滿足了上面的條件就可以開始進(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)需要注意

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末数苫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辨液,更是在濱河造成了極大的恐慌虐急,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滔迈,死亡現(xiàn)場離奇詭異止吁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)燎悍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門敬惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谈山,你說我怎么就攤上這事俄删。” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵畴椰,是天一觀的道長臊诊。 經(jīng)常有香客問我,道長斜脂,這世上最難降的妖魔是什么抓艳? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮帚戳,結(jié)果婚禮上玷或,老公的妹妹穿的比我還像新娘。我一直安慰自己片任,他們只是感情好偏友,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚂踊,像睡著了一般约谈。 火紅的嫁衣襯著肌膚如雪笔宿。 梳的紋絲不亂的頭發(fā)上犁钟,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音泼橘,去河邊找鬼涝动。 笑死,一個胖子當(dāng)著我的面吹牛炬灭,可吹牛的內(nèi)容都是我干的醋粟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼重归,長吁一口氣:“原來是場噩夢啊……” “哼米愿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鼻吮,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤育苟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后椎木,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體违柏,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年香椎,在試婚紗的時候發(fā)現(xiàn)自己被綠了漱竖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡畜伐,死狀恐怖馍惹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤万矾,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布肥照,位于F島的核電站,受9級特大地震影響勤众,放射性物質(zhì)發(fā)生泄漏舆绎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一们颜、第九天 我趴在偏房一處隱蔽的房頂上張望吕朵。 院中可真熱鬧,春花似錦窥突、人聲如沸努溃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧税。三九已至,卻和暖如春称近,著一層夾襖步出監(jiān)牢的瞬間第队,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工刨秆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凳谦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓衡未,卻偏偏與公主長得像尸执,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缓醋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355