• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 大疆無人機安卓Mobile Sdk開發(三)制定航點任務WaypointMission

    標簽: 安卓  大疆無人機開發  mobile sdk  waypointMission  dji sdk

    大疆無人機安卓Mobile Sdk開發(一)簡單介紹

    大疆無人機安卓Mobile Sdk開發(二)連接無人機,獲取無人機信息

    大疆無人機安卓Mobile Sdk開發(三)制定航點任務WaypointMission

    qq505057618

            mobile sdk提供了很多種任務類型,有WaypointMission,FollowMeMission,PanoramaMission,HotPointMission,TapFlyMission等,其中最主要也是最常用的就是WaypointMission,我們可以提前根據坐標規劃好航點,每個航點除了坐標外還可以設置高度、航向、自定義動作等,飛機會按照制定的航點按順序去執行任務,目前消費級無人機最多支持99個航點設置。

    dji.common.mission.waypoint.WaypointMission.Builder builder = new dji.common.mission.waypoint.WaypointMission.Builder();
            builder.autoFlightSpeed(rawMission.getFlySpeed());
            builder.finishedAction(toDJI(rawMission.getFinishedAction()));
            builder.flightPathMode(WaypointMissionFlightPathMode.NORMAL);
            builder.gotoFirstWaypointMode(WaypointMissionGotoWaypointMode.SAFELY);
            builder.headingMode(toDJI(rawMission.getHeadingMode()));
            builder.maxFlightSpeed(15);
            builder.setExitMissionOnRCSignalLostEnabled(rawMission.exitMissionOnRCSignalLost);
            builder.setGimbalPitchRotationEnabled(true);
            builder.repeatTimes(1);

    這是初始化一個WaypointMission,下面解釋每個方法的含義

    autoFlightSpeed

    如果沒有設置航點速度那么會按照任務的 autoFlightSpeed 速度飛行。與航點速度只能是正數不同,任務自動飛行速度可以是負數,取值范圍是 -15 到 15 m/s。當速度是負數時,無人機會朝著前一個航點往回飛。在任務過程中,用戶手中的遙控器撥桿也可以調整無人機的飛行速度。遙控器也可以讓飛機往回飛。
    總結一下,航點間速度只能是正數,autoFlightSpeed 和遙控器調整的速度可以是負數,可以讓無人機往回飛。那么這三種方式都可以控制飛行速度,那么優先級是怎樣的呢?遙控器 > 航點速度 > autoFlightSpeed。無人機優先響應遙控器的控制,其次是按照每個航點預設好的速度飛行,如果沒有設置航點速度使用 autoFlightSpeed

    maxFlightSpeed

    前面提到的執行任務時的默認速度屬性是 autoFlightSpeed。與之相關的還有 maxFlightSpeed。因為執行任務期間遙控器可以調整當前飛行速度。maxFlightSpeed 的值用來限制遙控器影響飛行速度時的最大偏移量。比如當前 autoFlightSpeed 是 5,maxFlightSpeed 的值是 10。這個時候遙控器提高飛行速度,那么速度到 10 m_s 后就不會再提高了。遙控器還可以降低飛機速度到負數,所以也同時限制了無人機往回飛的時候速度最快是 -10 m_s。往回飛如果到底第一個點飛機就會懸停。

    finishedAction

    FinishedAction 指的是無人機飛到最后一個航點后要進行什么操作。有五個 action 可供選擇:

    • NoAction:什么都不做
    • GoHome:任務結束后返航
    • AutoLand:到達最后一個航點后自動降落
    • GoFirstWaypoint:回到第一個航點
    • ContinueUntilStop:任務的狀態不會自動結束(可以繼續手動控制無人機做一些操作),直到調用 stopMission 任務才會結束

    headingMode

    無人機在航點間飛行時的航向。有以下 5 種選擇:

    • Auto:和無人機飛行方向一致
    • UsingInitialDirection:使用無人機到達第一個航點時的航向。在到達第一個航點前遙控器可以控制航向,到達第一個點后航向就固定不再改變。
    • ControlledByRemoteController:遙控器控制
    • UsingWaypointHeading:使用每個航點設置的航向
    • TowardPointOfInterest:總是朝向設置的興趣點
      默認航向的策略是 auto。

    flightPathMode

    航點間的路徑。默認是 normal ,使用直線飛行。如果希望按照曲線飛行,設置為 Curved,但是需要配合 waypoint 的 cornerRadiusInMeters

    曲線飛行時的弧度:cornerRadiusInMeters

    通常 waypoint 間的路徑都是直線飛行,不過如果 pathMode 是 DJIWaypointMissionFlightPathCurved 時航點間就是以曲線飛行。在按照曲線飛行的模式下,不同航點間的弧度通過 cornerRadiusInMeters 屬性調整。航點設置了航點圓角半徑后,無人機就不會飛過航點的坐標,而是按照航點的設置的半徑弧線飛行

    gotoFirstWaypointMode

    無人機如何到達第一個航點。有兩種方式:

    • PointToPoint:起飛后徑直朝第一個航點以最短距離飛過去。
    • Safely:無人機先垂直上升到和第一個航點同樣的高度后水平飛過去。
      假設起飛地點和第一個航點的路線中有一棟樓,如果采用 Safely 模式則可以避過這棟樓,所以安全一些。

    exitMissionOnRCSignalLost

    無人機丟失遙控器信號后是否停止任務。Waypoint 任務航點是一次性上傳好的,如果剛好某個位置遙控器信號差,只要 GPS 信號正常無人機還是可以按照規劃好的航點飛行。默認值是 false,如果遙控器信號丟失,無人機繼續執行任務。
    如果在航點過程中需要手動控制航向,或者一些拍照動作,遙控器信號丟失肯定數據采集的就有問題了,這種場景下就會把 exitMissionOnRCSignalLost 設置成 true。

    rotateGimbalPitch

    布爾值,飛行過程中云臺角度是否可以被設置。如果設置為 true,航點的 gimbalPitch 可以控制云臺角度。

    repeatTimes

    任務結束后是否重復一次。默認值是 0,表示任務只執行一次。1 表示任務結束后再重復一次,那么就是總共執行兩次任務。

    waypointList

    傳入一組wayPoint的list,就是傳入一組航點,然后任務按照航點順序去執行,一個wayPoint代表一個航點。

    下面我們看如何添加WayPoint

    List<Waypoint> resultList = new ArrayList<>(rawList.size());
            for (int i = index; i < rawList.size(); i++) {
                DIYWaypoint item = rawList.get(i);
                Waypoint waypoint = new Waypoint(item.getLatLng().getLat(), item.getLatLng().getLng(), item.getAltitude());
                waypoint.gimbalPitch = item.getGimbalPitch();
                waypoint.heading = item.getHeading();
                waypoint.turnMode = toDJI(item.getTurnMode());
                waypoint.altitude = item.getAltitude();
                List<DIYWaypoint.DIYWaypointAction> rawActionList = item.getWaypointActions();
                if (rawActionList != null && rawActionList.size() > 0) {
                    for (DIYWaypoint.DIYWaypointAction action : rawActionList) {
                        waypoint.addAction(new WaypointAction(toDJI(action.getmActionType()), action.getmActionParam()));
                    }
                }
                resultList.add(waypoint);
            }
            builder.waypointList(resultList);
            builder.waypointCount(resultList.size());

     這里我的代碼是是用我自定義的類轉換成大疆的WayPoint,大家可以參考官方的文檔,這里wayPoint可以設置很多參數,比如設置云臺的角俯仰角,飛機的航向角,飛機的高度,最主要的是到了航點飛機要執行的動作WaypointAction

    Action 的執行時間最多只有 6 秒時間(除了 stay action,因為 stay 是用戶主動表示要飛機停留的 action),如果一個 aciton 超過 6 秒沒有執行完,這個 action 會被停止,無人機繼續往下一個航點飛行。

    一個 waypoint 中 action 數量沒有限制,但是對所有 action 執行總時長是有限制的。DJI 也提供了actionTimeoutInSeconds 屬性來自定義 action 的執行總時長限制,取值范圍是 0 - 999 秒,默認是 60 秒。如果有一組 action 是重復執行的,可以設置 waypoint 的 actionRepeatTimes 來實現。actionRepeatTimes 表示配置 action 的執行次數,默認是 1 次。

     

    任務的上傳,開始和監聽

    在 DJI SDK 中 Mission 的執行是由各自對應的 operator 管理的,WaypointMission 的生命周期由 DJIWaypointMissionOperator 管理。

    當WaypintMission定義完成之后,我們可以調用operator.uploadMission()去上傳任務,同時我們可以監聽任務的上傳進度

     private void uploadMission(WaypointMission mission) {
            DJIError checkError = mission.checkParameters();
            if (checkError != null) {
                passResult(MISSION_UPLOAD, VALUE_FAILED, checkError.getDescription());
            } else {
                DJIError loadError = operator.loadMission(mission);
                if (loadError != null) {
                    passResult(MISSION_UPLOAD, VALUE_FAILED, loadError.getDescription());
                } else {
                    operator.uploadMission(djiError -> {
                        if (djiError != null) {
                            passResult(MISSION_UPLOAD, VALUE_FAILED, djiError.getDescription());
                        } else {
                            passResult(MISSION_UPLOAD, VALUE_STARTED, "");
                        }
                    });
                }
            }
        }

     

    當任務上傳完成之后,我們可以調用operator.startMission()去執行任務,在任務執行的過程中我們可以通過WaypointMissionOperatorListener監聽任務執行的進度,同時我們也可以通過operator.startMission()去暫定任務的執行,通過operator.resumeMission會繼續執行任務。

     @Override
        public void startMission() {
            operator.startMission(djiError -> {
                if (djiError == null) {
                    passResult(MISSION_START, VALUE_SUCCEED, "");
                } else {
                    passResult(MISSION_START, VALUE_FAILED, djiError.getDescription());
                }
            });
        }
    
        @Override
        public void pauseMission() {
            operator.pauseMission(djiError -> {
                if (djiError == null) {
                    passResult(MISSION_PAUSE, VALUE_SUCCEED, "");
                } else {
                    passResult(MISSION_PAUSE, VALUE_FAILED, djiError.getDescription());
                }
            });
        }
    
     @Override
        public void resumeMission() {
            operator.resumeMission(djiError -> {
                if (djiError == null) {
                    passResult(MISSION_RESUME, VALUE_SUCCEED, "");
                } else {
                    passResult(MISSION_RESUME, VALUE_FAILED, djiError.getDescription());
                }
            });
        }

    以上是一個航點任務定義和執行的流程,有不懂的歡迎交流。

    版權聲明:本文為qq_26923265原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_26923265/article/details/104946124

    智能推薦

    kettle8調度監控平臺(kettle-scheduler)開源

    背景 Kettle作為用戶規模最多的開源ETL工具,強大簡潔的功能深受廣大ETL從業者的歡迎。但kettle本身的調度監控功能卻非常弱。Pentaho官方都建議采用crontab(Unix平臺)和計劃任務(Windows平臺)來完成調度功能。所以大家在實施kettle作業調度功能的時候,通常采用以下幾種方式:使用spoon程序來啟動Job,使用crontab或計劃任務,自主開發java程序來調用k...

    機試題:單詞替換

    StringBuffer真的很強大也很好用。...

    可持久化數據結構

    可持久化的前提:本身拓撲結構不變 可持久化解決問題:記錄數據結構的所有歷史版本 核心思想:只記錄每一個版本與上一個版本不一樣的地方 如線段樹:每次修改最多logn點 可持久化trie樹 上一個版本的trie樹種有這個字母的指針就直接copy過來,沒有當前版本就新開一個指針。 數據最多 2242^{24}224 ,每次最多加 252525 個點,所以開 252525 倍數組 如果超過了題目所限我們可...

    vscode實用插件和配置

    vscode前段實用插件集合 小編進過一段時間的使用得出的最適合剛上手vscode的實用插件如下: 這里對這些插件就不一一的解釋了,大部分為代碼智能提示和補全,有些會使代碼變工整,也有的可以使重要部分改變顏色,以及編輯后瀏覽器打開等等。 順帶附上vscode個人設置的代碼(不知道位置的可以在設置中搜setting,settings.json就是的) 一個是用于ctrl+滾軸可以放大代碼,一個是用于...

    品優購項目靜態頁面應用中總結(京東)

    1、line-height 行高=高度:垂直居中 行高<高度:文字偏上 行高>高度:文字偏下 2、添加字體圖標 將字體的font文件夾放入根目錄下 在樣式里聲明自定義字體(注意路徑的正確) 利用CSS3偽元素選擇器給元素添加字體圖標,利用子絕父相確定位置...

    猜你喜歡

    kNN_約會網站匹配效果改進實現代碼

    kNN_約會網站匹配效果改進 【準備數據】數據處理函數 【分析數據】繪制數據散點圖 由數據兩兩對比的三幅散點圖分布可知,取第一列和第二列為x,y軸繪制散點圖(圖一)時,三種類型的人基本分屬于不同的區域。 注:用scatter繪制散點圖時,當數據在列表中未分類時,無法按照顏色給出圖例。 想要顯示圖例,需對數據進行分類,然后分別用不同的scatter繪制,則可有不同分類的圖例。 【準備數據】歸一化特征...

    Java下載Word文件內容丟失

    源文件:   下載后的Word文件: 代碼: 錯誤提示:   希望結果: 與源文件內容格式保持一致。有師傅能解決的幫我下,晴指點一下。謝謝...

    [數據結構]快速排序算法JavaScript版

    快排基本思路 找出一個切割點 找到切割點左右部分的切割點,直到每個被分割的小團體只含一個數字 原理講解 在這里我們有一個長度為7的無規則數字數組,我們將用快排的方法將它從小到大排序。 第一步——找到切割點 一般地,我們選用團體中的第一個元素為切割點,在上圖中即為2 第二步——以切割點為主體,逐個比較大小并重新置位 因為我們是比較切割點與其他元素的大小...

    仿淘寶圖片放大以及顏色切換

    首先圖片放大引用一個jquery jqzoom文件 然后在jquery里面寫: 效果圖如下: 星級滑動評分: 效果圖: 然后就是點擊商品圖片改變物品顏色: 點擊小圖更換大圖:...

    1.spring security入門

    1.spring security入門 decurity-demo.sql 數據庫驗證的文件 密碼是123或者123456/ 可以使用 new BCryptPasswordEncoder_().encode(“123”)_;加密出來 模板項目地址https://gitee.com/find_me/java-findme 1.創建項目,引入依賴 引入依賴后,項目中所有的接口就...

    精品国产乱码久久久久久蜜桃不卡