大疆無人機開發:手寫全景(思路 + 大疆的坑)
標簽: 大疆Android開發 android
大疆手寫全景的三個思路:
1.采用missionTimeLine的方式實現。
2.采用航點的方式WayPoint實現。
3.采用虛擬搖桿的方式VirtualStick實現。
第一種方案:
其中最符合軟件開發思路的還是第一種方案,寫好算法,將所有的action提交給timeLine就可以了。對于開發者來說無需關心內部是如何執行的,只需關注業務及算法就可以。簡易Demo代碼:
for (int j = 0; j < 9; j++) {
if (j != 0) { // 首次不轉機身
AircraftYawAction yawAction = new AircraftYawAction(45, 20);
elements.add(yawAction);
}
for (int i = 0; i < 5; i++) {
double pitch = 0;
Attitude attitude;
// 以下計算為簡易方式
pitch = 30 - 30 * i;
attitude = new Attitude((float) pitch, Rotation.NO_ROTATION, Rotation.NO_ROTATION);
// 設置云臺轉動element
GimbalAttitudeAction gimbalAction = new GimbalAttitudeAction(attitude);
gimbalAction.setCompletionTime(3); // 完成時間,默認1秒,太短容易報動作超時
gimbalAction.setGimbalMode(GimbalMode.FPV);
elements.add(gimbalAction);
// 拍照
ShootPhotoAction photoAction = newShootSinglePhotoAction();
elements.add(photoAction);
}
}
但是,你不關注大疆內部如何寫的代碼還不行,因為你這么設置了之后,無人機不是按照官方文檔以及你認為的那樣進行的,也叫作不適配,或者直接就是bug。
給大疆發郵件,首先肯定了大疆的態度是好的,人工回復并且很效率,只是我沒有時間陪著他們一點點改這個bug。義工也得保證吃飯的,所以。。。對于那種很空的回復,這種方案就PASS掉了。
這種方案一個是不適配御相關機型(官方文檔跟實際效果不是一回事);另一個是不可控,TimeLine偶爾報TimeOut等,不是很靠譜。精靈挺好,但是偶爾會多拍照片。
作為開發者表示理解,畢竟無人機這種難度比較高的硬件會有很多困難,期待大疆不斷完善bug,走得更遠!
第二種方案:
這種方案其實是不可行的,想到這個是因為大疆提供航點的WayPoint可以帶waypointActions的,這個Action可以是云臺、拍照、轉向。不可行是因為大疆官方文檔寫了:(搜WayPoint)
雖然大疆提供了removeAction,但是航點任務是一下子寫入無人機的,感興趣的同學可以再嘗試嘗試。
第三種方案:
這種方案排在最后是因為比較笨重,程序員都不希望發生的,就是將1 * 100 寫成 1 + 1 + 1 + 1 ... 的方式,將無人機設置成VirtualStick的方式,監聽回調,像鞭炮一樣一個一個的向無人機發送指令。因為大疆封裝的SDK都是回調方式,也就是說... 你得想辦法去解決這一百多個回調形成的回調地獄。要不然功能實現了這代碼也很爛。。。
實現思路是響應式編程,具體實現用的隊列(用棧也可以),觀察者模式。
寫一個Observer實現具體云臺、拍照、無人機yaw軸移動,Observeable作為算法具體實現的控制類。實現中途取消,完成回調即可。
這種方案的好處是可控,每一個action你都自己寫了,可以非常高效完成全景任務,媲美大疆自己軟件的全景。
代碼不貼了,大疆都提供了API,我自己封裝的也比較水。。。
寫在最后:
可以參考大疆官網給提供的思路,代碼是OC的:https://developer.dji.com/cn/document/ef495549-6501-4504-bbc1-3e1f39d4985c
這篇文章用了三周的時間去調研、測試、完善,踩坑埋坑。
搬磚不易,我也深知完不成功能的無助。歡迎轉載,請注明出處。
智能推薦
盤一盤 Python 特別篇 22 - 分箱之 cut
本文含 1852 字,14 圖表截屏 建議閱讀 10 分鐘 掃碼下載本貼用到的數據 本文是 Python 系列的特別篇的第二十二篇 特別篇 1 - PyEcharts TreeMap 特別篇 2 - 面向對象編程 特別篇 3 - 兩大利「器」 特別篇 4 - 裝飾器 特別篇 5 -&nbs...
LeetCode-47.全排列Ⅱ、深度優先搜索
深度優先搜索 深度優先搜索(DFS)就是在每一步時對每一種可能的選擇一條道走到底,然后再回過頭嘗試另外一種選擇。 深度優先搜索的關鍵是要考慮“當前這一步”該如何做,至于“下一步”該怎么做和當前這一步的解決方法是一樣的。在進行當前步的選擇之前要確定已經做出的選擇列表,然后在剩余可供選擇的每一種可能進行遍歷,對于每一種選擇將選擇結果以及選擇狀態代入下一步...
知識點最全的數據庫面試題
來源:https://zhuanlan.zhihu.com/p/150959652 13道sql,基本上覆蓋了所有sql的核心點。 要求寫出一下SQL語句 1、查詢位于“華東”或“華南”地區的供應商的ID、公司名稱、地區、城市和電話字段的值 a. 地區=”華東” OR a.地區=”華南”; 2、查詢&l...
猜你喜歡
面向切面編程(AOP)知識總結
目錄 1.存在問題 2.AOP的概念 3.AOP應用范圍 3.AOP實現方式 4.應用舉例 5.結束語 本文在學習【老張的哲學】系列文章AOP相關章節后,自己歸納總結的筆記。 1.存在問題 最近,其它項目小組在開發的過程中遇到了一個問題,在日志記錄時,用戶明明點擊的是更新操作,可翻看記錄時卻發現是查詢操作,起初是一頭霧水,后面跟蹤該更新操作的代碼后才發現,在日志記錄時確實是寫著查詢,說到這里,大家...
集合中出現的問題
1.Java集合框架的長處? 2.集合框架中的泛型有什么長處? 3.Java集合框架的基礎接口有哪些? 4.為何Map接口不繼承Collection接口? 5.Iterater和ListIterator之間有什么差別? 6.fail-fast與fail-safe有什么差別? 7.在迭代一個集合的時候,怎樣避免ConcurrentModificationException?8.在Java中,Hash...
三元運算符引起的bug
三元運算符引起的bug 前言 延伸 總結 前言 今天測試提交了一個bug,跟蹤發現了一段代碼,初看還沒什么問題,簡易后的代碼: 這段代碼想要實現的功能是返回 細看發現后面使用的是三元運算符,這就是造成這個bug的元兇。 解決方案:使用括號括起來。 延伸 在做這個例子的時候,使用ideal,習慣性的使用sonar掃描: 這里很明顯的提醒這里表達式有問題。 總結 三元運算符格式:expression1...
利用dom4j來生成xml
xml比較常用,處理xml的方式也比較多。現在就聊聊如何用dom4j來生成xml吧 先看看效果。。。 上傳代碼: 大概說下主要步驟吧: 1.創建document對象,創建root根節點,然后通過根節點繼續生成節點。其中也可以給該節點添加屬性,復制等。 2.創建輸出流,將該對象輸出到xml文件中去。需要設置好路徑和文件名等。...
Android輪播圖原理思路分析+實現方案
來自:http://blog.csdn.net/wubihang/article/details/52512597 ListView的headerView設置為輪播圖之后結合上/下拉刷新/加載的模式成為現在大多數APP的一個必須具備的功能,對于許多初學者來說想要實現輪播圖這樣一個集線程睡眠、自動處理、替換過程中刷新UI界面的組合功能非常困難,沒有思路,感覺無從下手,去搜索各種實現方案,發現目前充斥...