剛剛結(jié)束了項(xiàng)目交付,趁熱打鐵分享一下這次遇到的新東西。首先了解一下大疆的無人機(jī),它大致可以分為三級(jí)。
入門級(jí):適合新手,沒事干在野外飛一飛拍拍風(fēng)景啥的。操作也簡單,基本上看飛行教程都能懂,也不需要太高的專業(yè)性,飛機(jī)也相對(duì)較小安全系數(shù)相對(duì)較高。如:御2系列的一些飛機(jī)。
消費(fèi)級(jí):形體上會(huì)比入門級(jí)的大一點(diǎn),但是飛機(jī)搭載了一些高精度的東西,比如RTK、高精度攝像頭、紅外鏡頭等。這類飛機(jī)則需要飛手具備一定的專業(yè)知識(shí),并且需要考取大疆的初級(jí)飛手證書才能上手飛行。如:精靈系列、悟系列的一些飛機(jī)。
專業(yè)級(jí):形體上更大,操作不當(dāng)會(huì)出現(xiàn)一些嚴(yán)重后果。它的優(yōu)勢在于高續(xù)航、高精度定位、熱成像鏡頭、搭載第三方喊話器等。一般用于大型工程作業(yè),使用這個(gè)級(jí)別的飛機(jī)則需要考取大疆專業(yè)飛手證書,一般這個(gè)會(huì)在你購買專業(yè)級(jí)飛機(jī)的時(shí)候贈(zèng)送你培訓(xùn)課程,一般全部聽完就能考過。這類飛機(jī)的典型代表有:M30系列、M300系列。
1SDK開發(fā)包
大疆的SDK開發(fā)包目前分為兩個(gè)大版本:
v4版
Mobile SDK是一款軟件開發(fā)套件,旨在讓開發(fā)者能夠訪問DJI無人機(jī)和手持相機(jī)產(chǎn)品的豐富功能。該SDK通過兼顧更底層的功能,諸如飛行穩(wěn)定,電池管理,信號(hào)傳輸和通信等,簡化了應(yīng)用程序開發(fā)的過程。這樣,開發(fā)者就不需要具備豐富的機(jī)器人或嵌入式系統(tǒng)背景知識(shí),而可以專注于DJI產(chǎn)品相關(guān)的行業(yè)應(yīng)用開發(fā)。
該SDK包括:
可導(dǎo)入Android或iOS應(yīng)用程序的庫/框架,用于訪問DJI產(chǎn)品的功能。
飛行模擬器和可視化工具。
適用于iOS的調(diào)試工具和遠(yuǎn)程logger。
示例代碼和教程。
開發(fā)者指南和API文檔。
功能概述
開發(fā)者可以通過SDK訪問許多DJI產(chǎn)品的功能。開發(fā)者可以實(shí)現(xiàn)自主飛行,控制相機(jī)和云臺(tái),接收實(shí)時(shí)視頻圖傳和傳感器數(shù)據(jù),下載保存好的媒體文件,以及監(jiān)聽其他組件的狀態(tài)。
飛行控制
Mobile SDK提供三種控制無人機(jī)飛行的方式:
手動(dòng)操控: 用戶使用遙控器操控?zé)o人機(jī),而SDK支持監(jiān)控實(shí)時(shí)視頻流和傳感器數(shù)據(jù)。虛擬搖桿命令: SDK支持產(chǎn)生模擬遙控器搖桿的控制指令。
智能任務(wù): 方便,易于實(shí)現(xiàn)無人機(jī)的高級(jí)控制。例如,可以通過航點(diǎn)任務(wù),讓無人機(jī)按預(yù)定義的飛行路徑飛行。
虛擬搖桿命令和智能任務(wù)允許對(duì)DJI無人機(jī)進(jìn)行簡單而功能強(qiáng)大的自主飛行控制。
相機(jī)
相機(jī)和云臺(tái)的功能都支持編程調(diào)用, 例如:
相機(jī)模式: 視頻和靜態(tài)圖像拍攝。
曝光: 快門,ISO,光圈和曝光補(bǔ)償均支持定制,以實(shí)現(xiàn)最大的靈活性。
圖像參數(shù): 屏幕長寬比,對(duì)比度,色相,清晰度,飽和度和濾鏡。
視頻參數(shù): 分辨率和幀頻。
方向: 使用云臺(tái)時(shí),相機(jī)的朝向和運(yùn)動(dòng)可以自動(dòng)控制。
實(shí)時(shí)視頻流
開發(fā)者可以通過Mobile SDK獲取無人機(jī)主攝像頭的實(shí)時(shí)視頻流。即使攝像頭正在將圖像或視頻捕獲到存儲(chǔ)介質(zhì)中,也可以獲取實(shí)時(shí)視頻流。
傳感器數(shù)據(jù)
開發(fā)者可以通過SDK獲得豐富的傳感器數(shù)據(jù)。GPS位置,指南針,氣壓計(jì),飛行速度和海拔高度都是通過Mobile SDK獲取的一些傳感器數(shù)據(jù),頻率最高可達(dá)10 Hz。
下載媒體文件
開發(fā)者通過Mobile SDK可以查看和下載保存在相機(jī)存儲(chǔ)介質(zhì)(SD卡或固態(tài)硬盤)中的照片和視頻。預(yù)覽圖和完整的圖像數(shù)據(jù)都可以被訪問。
遙控器,電池和無線鏈路
遙控器,電池和無線鏈路都可以通過SDK進(jìn)行訪問。通常,這些組件會(huì)提供相關(guān)的狀態(tài)信息,但開發(fā)者也可以對(duì)它們進(jìn)行一些控制。
連接應(yīng)用程序和產(chǎn)品
下圖說明了Mobile SDK如何與移動(dòng)應(yīng)用程序進(jìn)行融合以及如何與DJI飛行器進(jìn)行連接。對(duì)于手持?jǐn)z像機(jī)產(chǎn)品,遙控器已替換為手持控制器,并且沒有飛行器或其他無線鏈路。
移動(dòng)應(yīng)用程序由Mobile SDK,平臺(tái)SDK(iOS或Android)構(gòu)建而成,并在移動(dòng)設(shè)備(Apple iPhone,iPad,Nexus手機(jī),Nexus平板電腦等)上運(yùn)行。
移動(dòng)設(shè)備可以通過WiFi無線連接到DJI產(chǎn)品上,也可以通過USB線纜連接到DJI產(chǎn)品上。
v5版
v5版現(xiàn)在只適用于M30、M300系列,目前還在持續(xù)更新,因?yàn)槭切掳娴腟DK,大疆的工程師也是在不斷地再完善里面的內(nèi)容,這里就不詳細(xì)說了,之后的文章會(huì)詳細(xì)說這個(gè)v5版的SDK。
2V4版SDK 二次開發(fā)
多的不說少的不嘮,上主菜?!肮び破涫?必先利其器”,首先準(zhǔn)備好開發(fā)軟件,因?yàn)槲覀兪褂玫氖茿ndroid版的SDK所以開發(fā)軟件我們使用Android Studio,本人使用的是Android Studio Fox版,版本之間感覺都一樣沒有什么開發(fā)上的區(qū)別。準(zhǔn)備好工具之后,先去大疆無人機(jī)的開發(fā)者官網(wǎng)注冊(cè)一個(gè)開發(fā)者賬號(hào),并且注冊(cè)好自己的應(yīng)用,拿到sdk的專用Key值,申請(qǐng)的方法大疆官網(wǎng)有我就不贅述了。給大家個(gè)地址【大疆開發(fā)者官網(wǎng)】自己看吧,挺簡單的。
注冊(cè)成為DJI開發(fā)者
在注冊(cè)過程中,需要您提供電子郵件信息和信用卡或手機(jī)號(hào)碼用于注冊(cè)驗(yàn)證。您所提供的任何信用卡信息將僅用于驗(yàn)證,不會(huì)收取任何費(fèi)用。
本指南假定您使用 Xcode 7.3 以及 Android Studio 2.1.1 以上版本。
生成 App Key
每個(gè)應(yīng)用程序都需要一個(gè)唯一的應(yīng)用程序密鑰(App Key)來初始化SDK。
要?jiǎng)?chuàng)建一個(gè)應(yīng)用程序App Key:
請(qǐng)?jiān)L問DJI開發(fā)者網(wǎng)站的 開發(fā)者中心
選擇左側(cè)欄的 "應(yīng)用 "。
選擇右側(cè)的 “創(chuàng)建應(yīng)用” 按鈕。
輸入應(yīng)用程序的名稱, 開發(fā)平臺(tái), Package Name,分類和描述信息。
會(huì)收到一封應(yīng)用程序激活郵件,以完成App Key的生成。
可以在開發(fā)者中心中找到AppKey,復(fù)制粘貼到應(yīng)用程序配置中。
Android 示例代碼配置
下載或者克隆Github上的Android示例代碼工程。
在Android Studio中打開項(xiàng)目工程,將生成的App Key字符串粘貼到 "AndroidManifest.xml" 文件中 "com.dji.sdk.API_KEY" meda-data element下的 android:value。
3Android Studio項(xiàng)目集成
本節(jié)中的屏幕截圖是使用Android Studio 4.1生成的。
創(chuàng)建一個(gè)新的應(yīng)用
可以使用一個(gè)新的應(yīng)用程序來演示如何將DJI SDK集成到Android Studio項(xiàng)目中。
打開Android Studio,然后在初始屏幕上選擇Start a new Android Studio project。
在 New Project 界面:
設(shè)置 Application name 為 "ImportSDKDemo"。
設(shè)置 Company Domain 和Package name 為 "com.dji.ImportSDKDemo"。
注意:Package name是 生成App Key 所需的標(biāo)識(shí)字符串。在這個(gè)工程中Package name為“com.dji.ImportSDKDemo”
在 Target Android Devices 界面:
選擇 Phone and Tablet 尺寸。
選擇API 23:Android 6.0 (Marshmallow)。
在 Add an Activity to Mobile 界面選擇 Empty Activity。
在Configure Activity 界面:
設(shè)置 Activity Name: 為 "MainActivity"。
確認(rèn)勾選Generate Layout File 。
設(shè)置Layout Name: 為"activity_main"。
點(diǎn)擊Finish 。
配置Gradle 腳本
在Gradle Scripts 中雙擊 build.gradle (Module: app)
使用以下內(nèi)容進(jìn)行更新:
applyplugin:'com.android.application' android{ ... defaultConfig{ ... } ... 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" exclude'META-INF/rxjava.properties' } } dependencies{ ... implementation('com.dji4.15',{ excludemodule:'library-anti-distortion' }) compileOnly'com.dji4.15 }
主要變更為:
添加 packagingOptions以防止應(yīng)用程序意外崩潰。
添加compile和provided依賴項(xiàng)以導(dǎo)入最新的DJIAndroid SDK Maven依賴項(xiàng)。
選擇 Tools -> Android -> Sync Project with Gradle Files 然后等待Gradle項(xiàng)目同步完成。
再次確認(rèn) Maven 依賴
在Android Studio菜單中選擇File->Project Structure,以打開"Project Structure"界面。然后選擇“app”模塊,然后單擊Dependencies選項(xiàng)卡。
實(shí)現(xiàn)應(yīng)用注冊(cè)和SDK回調(diào)
右鍵單擊com.dji.importSDKDemo,然后選擇 New->Java Class以創(chuàng)建一個(gè)新的Java類,并將其命名為“MApplication”。
打開MApplication.java文件,并將內(nèi)容替換為以下內(nèi)容:
packagecom.dji.importSDKDemo; importandroid.app.Application; importandroid.content.Context; importcom.secneo.sdk.Helper; publicclassMApplicationextendsApplication{ @Override protectedvoidattachBaseContext(ContextparamContext){ super.attachBaseContext(paramContext); Helper.install(MApplication.this); } }
在這里,重寫了attachBaseContext()方法,添加了Helper.install(MApplication.this);代碼。
注意:由于某些SDK類現(xiàn)在需要在使用之前進(jìn)行加載,因此加載過程由Helper.install()完成。開發(fā)人員需要在使用任何SDK功能之前調(diào)用此方法, 否則可能會(huì)導(dǎo)致意外崩潰。
修改完成后需要在AndroidManifest中 配置 Application name。
雙擊app模塊中的MainActivity.java。
MainActivity類需要注冊(cè)應(yīng)用程序以獲得使用Mobile SDK的授權(quán)。它還需要實(shí)現(xiàn)SDK回調(diào)方法。
首先將MainActivity類修改為包括幾個(gè)類變量,其中包括mProduct,它是代表連接到移動(dòng)設(shè)備的DJI產(chǎn)品的對(duì)象。
另外,onCreate方法將被修改以調(diào)用checkAndRequestPermissions方法來檢查和請(qǐng)求運(yùn)行時(shí)權(quán)限。同樣,checkAndRequestPermissions方法將有助于調(diào)用startSDKRegistration()方法來注冊(cè)應(yīng)用程序。此外,重寫onRequestPermissionsResult方法將有助于檢查應(yīng)用程序是否具有足夠的權(quán)限,如果有,請(qǐng)調(diào)用startSDKRegistration()方法來注冊(cè)應(yīng)用程序。
最后,將MainActivity類替換為:
publicclassMainActivityextendsAppCompatActivity{ privatestaticfinalStringTAG=MainActivity.class.getName(); publicstaticfinalStringFLAG_CONNECTION_CHANGE="dji_sdk_connection_change"; privatestaticBaseProductmProduct; privateHandlermHandler; privatestaticfinalString[]REQUIRED_PERMISSION_LIST=newString[]{ Manifest.permission.VIBRATE, Manifest.permission.INTERNET, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.WAKE_LOCK, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, }; privateListmissingPermission=newArrayList<>(); privateAtomicBooleanisRegistrationInProgress=newAtomicBoolean(false); privatestaticfinalintREQUEST_PERMISSION_CODE=12345; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //Whenthecompileandtargetversionishigherthan22,pleaserequestthefollowingpermissionatruntimetoensuretheSDKworkswell. if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ checkAndRequestPermissions(); } setContentView(R.layout.activity_main); //InitializeDJISDKManager mHandler=newHandler(Looper.getMainLooper()); } /** *Checksifthereisanymissingpermissions,and *requestsruntimepermissionifneeded. */ privatevoidcheckAndRequestPermissions(){ //Checkforpermissions for(StringeachPermission:REQUIRED_PERMISSION_LIST){ if(ContextCompat.checkSelfPermission(this,eachPermission)!=PackageManager.PERMISSION_GRANTED){ missingPermission.add(eachPermission); } } //Requestformissingpermissions if(missingPermission.isEmpty()){ startSDKRegistration(); }elseif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ showToast("Needtograntthepermissions!"); ActivityCompat.requestPermissions(this, missingPermission.toArray(newString[missingPermission.size()]), REQUEST_PERMISSION_CODE); } } /** *Resultofruntimepermissionrequest */ @Override publicvoidonRequestPermissionsResult(intrequestCode, @NonNullString[]permissions, @NonNullint[]grantResults){ super.onRequestPermissionsResult(requestCode,permissions,grantResults); //Checkforgrantedpermissionandremovefrommissinglist if(requestCode==REQUEST_PERMISSION_CODE){ for(inti=grantResults.length-1;i>=0;i--){ if(grantResults[i]==PackageManager.PERMISSION_GRANTED){ missingPermission.remove(permissions[i]); } } } //Ifthereisenoughpermission,wewillstarttheregistration if(missingPermission.isEmpty()){ startSDKRegistration(); }else{ showToast("Missingpermissions!!!"); } } }
DJISDKManager的registerApp()方法具有一個(gè)回調(diào),該回調(diào)需要處理兩種方法:一、用于處理應(yīng)用程序注冊(cè)結(jié)果。二、用于通知硬件產(chǎn)品和移動(dòng)設(shè)備的連接變更。
繼續(xù)添加如下所示的 startSDKRegistration() 方法,并實(shí)現(xiàn) onRegister(), onProductDisconnect(), onProductConnect(), onComponentChange(), onInitProcess() and onDatabaseDownloadProgress() 和SDKManagerCallback方法:
privatevoidstartSDKRegistration(){ if(isRegistrationInProgress.compareAndSet(false,true)){ AsyncTask.execute(newRunnable(){ @Override publicvoidrun(){ showToast("registering,plswait..."); DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(),newDJISDKManager.SDKManagerCallback(){ @Override publicvoidonRegister(DJIErrordjiError){ if(djiError==DJISDKError.REGISTRATION_SUCCESS){ showToast("RegisterSuccess"); DJISDKManager.getInstance().startConnectionToProduct(); }else{ showToast("Registersdkfails,pleasecheckthebundleidandnetworkconnection!"); } Log.v(TAG,djiError.getDescription()); } @Override publicvoidonProductDisconnect(){ Log.d(TAG,"onProductDisconnect"); showToast("ProductDisconnected"); notifyStatusChange(); } @Override publicvoidonProductConnect(BaseProductbaseProduct){ Log.d(TAG,String.format("onProductConnectnewProduct:%s",baseProduct)); showToast("ProductConnected"); notifyStatusChange(); } @Override publicvoidonComponentChange(BaseProduct.ComponentKeycomponentKey,BaseComponentoldComponent, BaseComponentnewComponent){ if(newComponent!=null){ newComponent.setComponentListener(newBaseComponent.ComponentListener(){ @Override publicvoidonConnectivityChange(booleanisConnected){ Log.d(TAG,"onComponentConnectivityChanged:"+isConnected); notifyStatusChange(); } }); } Log.d(TAG, String.format("onComponentChangekey:%s,oldComponent:%s,newComponent:%s", componentKey, oldComponent, newComponent)); } @Override publicvoidonInitProcess(DJISDKInitEventdjisdkInitEvent,inti){ } @Override publicvoidonDatabaseDownloadProgress(longl,longl1){ } }); } }); } }
最后需要實(shí)現(xiàn) notifyStatusChange, Runnable 和 showToast 方法:
privatevoidnotifyStatusChange(){ mHandler.removeCallbacks(updateRunnable); mHandler.postDelayed(updateRunnable,500); } privateRunnableupdateRunnable=newRunnable(){ @Override publicvoidrun(){ Intentintent=newIntent(FLAG_CONNECTION_CHANGE); sendBroadcast(intent); } }; privatevoidshowToast(finalStringtoastMsg){ Handlerhandler=newHandler(Looper.getMainLooper()); handler.post(newRunnable(){ @Override publicvoidrun(){ Toast.makeText(getApplicationContext(),toastMsg,Toast.LENGTH_LONG).show(); } }); }
必須授予應(yīng)用程序權(quán)限,DJI SDK才能運(yùn)行。
雙擊 app 模塊中的 AndroidManifest.xml 。
在 package=com.dji.ImportSDKDemo 后,
在 application 元素的開發(fā)添加 android:name=".MApplication" :
在 android:theme="@style/AppTheme"> 之后,之前插入如下代碼:
如下所示,在activity元素中插入android:configChanges ="orientation"和android:screenOrientation ="portrait",以防止在屏幕方向變更時(shí)重啟activity,并將activity的屏幕方向設(shè)置為縱向模式 :
生成App Key, 然后用App Key 字符串替換AndroidManifest.xml文件內(nèi)Please enter your App Key here. 字段。
審核編輯:湯梓紅
-
Android
+關(guān)注
關(guān)注
12文章
3936瀏覽量
127397 -
Mobile
+關(guān)注
關(guān)注
0文章
518瀏覽量
26489 -
遙控器
+關(guān)注
關(guān)注
18文章
837瀏覽量
66113 -
SDK
+關(guān)注
關(guān)注
3文章
1036瀏覽量
45934 -
大疆無人機(jī)
+關(guān)注
關(guān)注
13文章
111瀏覽量
30221
原文標(biāo)題:基于Mobile SDK V4版固件開發(fā)大疆無人機(jī)手機(jī)端遙控器(1)
文章出處:【微信號(hào):美男子玩編程,微信公眾號(hào):美男子玩編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論