• <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

    智能推薦

    大疆無人機基于自搭建RTMP服務端推流直播

    思路 大疆在手機端提供了軟件DJI GO 4控制飛行參數等,其中包含自定義RTMP接口來向第三方推流進行直播業務,而我們可以利用這種直播的思路來完成畫面傳輸。 環境 精靈Phantom 4 Pro V2.0 DJI GO 4(手機端) win10(PC端) 步驟 一、搭建、啟動RTMP服務端 Notice:搭建RTMP服務端主要參考[1]、[2]鏈接中的步驟。因為我們是通過DJI GO 4來推流,...

    無人機三維建模(5) Photoscan建模

    由于在線建模具有建模完成時間不確定,采用本機建模的方式,這里使用Photoscan建模。 我用的是1.4.0**版,**很簡單,下載包里就有一個exe,覆蓋安裝目錄中的文件就行。 Agisoft PhotoScan軟件介紹      Agisoft PhotoScan是俄羅斯公司Agisoft開發的一款基于影響自動生成高質量三維模型的優秀軟件,這對于3D建模...

    無人機三維建模(1) 調研

    項目需要調研一下無人機三維建模的信息 無人機三維建模核心技術是三維重建,或者說基于圖片的建模(Image-Based Modeling)。 項目需要是建立園區的三維模型,其他應用上可以用于古街道、文物建模。 (參考http://www.sohu.com/a/141731974_154576) 另外室內建模也是三維重建吧,基于激光掃描的。 其他資料:三維重建技術在無人機方面的應用如何?三維重建未來的...

    hive 導出數據之一列多行,轉為一行多列

    需求:提取數據 說明:原數據是一列多行,需要轉化為一行多列 待查詢表為:temp_05 待查詢數據為: 待查詢數據如圖: 需要提取的數據表頭如下: 預定日期 昨日價格 前天價格 2018-02-01 2018-02-02 2018-02-03 2018-02-04 可用提數 SQL 數據如圖: 以下為嘗試過程 數據如圖: 數據如圖: 數據如圖: 數據如圖:...

    asp.net做一個簡易的聊天室

    要求: 結果: 關鍵代碼: Default.aspx Default.aspx.cs Default2.aspx Default2.aspx.cs Default3.aspx Default3.aspx.cs Default4.aspx...

    猜你喜歡

    動態SQL和多表關聯-筆記

    《動態SQL與多表關聯》筆記 學習目標 能夠使用動態SQL完成SQL拼接 能夠使用resultMap完成多表查詢 能夠使用一對一查詢 能夠使用一對多查詢 (注:多對多其實就是兩個一個多) 映射文件:為什么要resultMap 目標 定義結果映射 使用結果映射 回顧 在mybatis中有2種配置文件: 核心配置文件,如:sqlMapConfig.xml 實體類映射文件,如:UserMapper.xm...

    【OpenGL C++ UE4】獲取模型頂點及面索引數據,并優化存儲結構供UE4繪制

    目錄 一、功能需求 二、成果 三、環境配置 四、詳細步驟 4.1 Max制作三棱錐并處理 4.2 核心代碼 4.2.1 傳入結構體數據 4.2.2 頂點去重、更新索引 4.2.3 輸出本地CSV文件 4.3 UE4繪制 一、功能需求 想必你肯定會問我一個問題,UE4直接導入模型不好么? 哈哈,前提是在做畢設時,導師提供的只有頂點與面索引數據,沒有模型。 下文詳細介紹了畢設開發中的難點,涉...

    解決Pyinstaller打包numpy和pandas庫文件過大問題

    解決Pyinstaller壓縮numpy和pandas庫文件過大問題 文件包類型和網上的方法 Windows下docker的安裝 在docker下實現打包     今天是2021年的第一天,先祝各位小伙伴現年快樂哈。最近因為做了一個項目,需要打包文件,文件中包含了numpy和pandas庫,結果打包出來幾百行的代碼居然要900m,人都傻了,翻遍了全網找解決方...

    【混沌工程】基于ChaosBlade實現網絡故障模擬

    一、前言 很久之前曾基于linux內核自帶的TC和netem模擬一些公網中遇到的極端情況(延遲、丟包、重復、損壞和亂序等),驗證了我們傳輸程序的健壯性! 具體細節可見這篇老博客: https://blog.csdn.net/u013128262/article/details/84784663 最近在復現kafka生產端一個timeout異常場景時,發現之前方案時因為內核和OS版本問題有些差異而無...

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