聯繫作者QQ 843230304
本文翻譯自 https://mavlink.io/en/services/mission.html#mission-protocol
Mavlink任務協議
任務子協議允許GCS或開發人員API 在無人機/組件上管理任務(飛行計劃),地理圍欄和安全點信息。
該協議涵蓋:
- 上傳,下載和清除任務,設置/獲取當前任務項目編號以及在當前任務項目發生更改時獲得通知的操作。
- 用於交換任務項目的消息類型。
- 大多數自動駕駛儀/ GCS通用的MAVLink命令。
該協議遵循客戶端/服務器模式,其中操作(和大多數命令)由GCS /開發人員API(客戶端)發起,並由自動駕駛儀(服務器)確認。
該協議支持重新請求尚未到達的消息,從而可以通過有損鏈路可靠地傳輸任務。
任務類型
MAVLink 2支持三種類型的“任務”:
- 飛行計劃
MAV_MISSION_TYPE_MISSION
- 地理圍欄
MAV_MISSION_TYPE_FENCE
- 集會/安全點
MAV_MISSION_TYPE_RALLY
該協議對所有類型都使用相同的操作順序(儘管任務類型不同)。任務類型必須分別/獨立存儲和處理。
任務協議消息包括mission_type相關任務的類型(MAVLink 2消息擴展名)。
該字段採用MAV_MISSION_TYPE枚舉值之一:
MAV_MISSION_TYPE_MISSION,
MAV_MISSION_TYPE_FENCE,
MAV_MISSION_TYPE_RALLY。
MAVLink 1僅支持“常規”飛行計劃任務
MAV_MISSION_TYPE_MISSION
。
任務項目(MAVLink命令)
在MAV_CMD
枚舉中定義了所有任務類型的任務項目。
MAV_CMD
用於定義可以在任務中使用的命令(“任務項”)和可以在任務上下文之外發送的命令(使用命令協議)。有些MAV_CMD
可以與任務和命令協議一起使用。並非所有系統(或所有飛行模式)都支持所有命令/任務項目。
使用簡單的名稱前綴約定來標識不同類型任務的項目:
-
飛行計劃
- MAV_CMD_NAV_*用於導航/移動的NAV命令()(例如MAV_CMD_NAV_WAYPOINT,MAV_CMD_NAV_LAND)
- DO命令(MAV_CMD_DO_*)用於立即採取措施,例如更改速度或激活伺服器(例如MAV_CMD_DO_CHANGE_SPEED)。
- CONDITION命令(MAV_CMD_CONDITION_*),用於根據條件更改任務的執行-例如,在執行下一個命令(MAV_CMD_CONDITION_DELAY)之前暫停任務一段時間。
-
地理圍欄
- 帶有前綴MAV_CMD_NAV_FENCE_(例如MAV_CMD_NAV_FENCE_RETURN_POINT)。
-
集會/安全點
- 只有一個 MAV_CMD:MAV_CMD_NAV_RALLY_POINT
命令在MISSION_ITEM
或MISSION_ITEM_INT
消息中傳輸/編碼。這些消息包括用於標識所需任務項目(命令ID)的字段以及最多7個特定於命令的參數。
前四個參數可用於任何目的(取決於特定命令)。最後三個參數(x,y,z)用於NAV命令中的位置信息,但可以在其他命令中用於任何目的。
消息中特定於命令的字段如下所示:
名稱 | 類型 | 取值 | 描述 |
---|---|---|---|
command | uint16_t | MAV_CMD |
命令ID,如MAV_CMD中所定義 |
param1 | float | 參數#1 | |
param2 | float | 參數#2 | |
param3 | float | 參數#3 | |
param4 | float | 參數#4 | |
x | float/int32_t | 導航命令的X座標(局部座標系)或緯度(全局座標系)(否則,參數5)。 | |
y | float/int32_t | 導航命令的Y座標(局部框架)或經度(全局框架)(否則,參數#6)。 | |
z | float | Z座標(局部框架)或高度(全局-相對或絕對,取決於框架)(否則,參數#7)。 |
其餘消息字段用於尋址,定義任務類型,指定NAV消息中用於x,y,z的幀等:
名稱 | 類型 | 取值 | 描述 |
---|---|---|---|
target_system | uint8_t | 系統ID | |
target_component | uint8_t | 組件ID | |
seq | uint16_t | 消息的序列號 | |
frame | uint8_t | MAV_FRAME | 航路點的座標系。ArduPilot和PX4都僅在MAVLink命令中支持全局座標系(如果通過命令協議發送相同的命令,則可能支持本地座標系) |
mission_type | uint8_t | MAV_MISSION_TYPE | 任務類型 |
current | uint8_t | false:0, true:1 | 下載時,該項目是否爲當前任務項目。 |
autocontinue | uint8_t | 命令完成後,自動繼續到下一個航點。 |
消息/枚舉摘要
該服務使用以下消息和枚舉。
信息 | 描述 |
---|---|
MISSION_REQUEST_LIST | 通過請求任務項目列表從系統啓動任務下載。 |
MISSION_COUNT | 發送任務中的項目數。[下載任務]時,它用於啓動任務上傳或作爲對MISSION_REQUEST_LIST的響應。 |
MISSION_REQUEST_INT | 收件人使用MISSION_ITEM_INT消息發送特定序列號的請求任務項目數據。用於任務上傳和下載。 |
MISSION_REQUEST | 收件人使用MISSION_ITEM消息發送請求特定序列號的任務項目數據。用於任務上傳和下載。 |
MISSION_ITEM_INT | 消息編碼任務項目/命令(在MAV_CMD中定義)。該消息將整數形式的位置信息編碼爲比MISSION_ITEM更高的精度。用於任務上傳和[下載]。 |
MISSION_ITEM | 消息編碼任務項目/命令(在MAV_CMD中定義)。該消息將位置信息編碼爲float參數。用於任務上傳和下載。 |
MISSION_ACK | 系統完成任務操作時的確認消息(例如,在上載所有任務項目後由自動駕駛儀發送)。該消息包括指示成功或失敗類型的MAV_MISSION_RESULT。 |
MISSION_CURRENT | 包含當前任務項目序列號的消息。噹噹前任務項被設置/更改時,將發出此消息。 |
MISSION_SET_CURRENT | 通過序列號設置當前任務項目(在最短路徑上繼續該項目)。狀態文字 在設置當前任務項目的請求失敗時發送通知系統。 |
MISSION_CLEAR_ALL | 發送消息以清除/刪除系統上存儲的所有任務項目。 |
MISSION_ITEM_REACHED | 系統到達新航路點時發出的消息。用於監視進度。 |
MISSION_REQUEST_PARTIAL_LIST | 啓動從系統/組件的任務項目的部分下載。 |
MISSION_WRITE_PARTIAL_LIST | 啓動將新任務項目的部分上傳到系統/組件。 |
枚舉 | 描述 |
---|---|
MAV_MISSION_TYPE | 消息的任務類型(任務,地理圍欄,集會點)。 |
MAV_MISSION_RESULT | 用於指示某項操作成功或失敗的原因(例如上傳或下載任務)。這在MISSION_ACK中進行。 |
MAV_FRAME | 消息中位置/速度/加速度數據的座標框架。 |
MAV_CMD | 任務項目(和MAVLink命令)。這些可以通過MISSION_ITEM或MISSION_ITEM_INT發送。 |
運作方式
本節介紹了協議定義的主要操作。
將任務上傳到飛行器
下圖顯示了將任務上傳到無人機的通信順序(假設所有操作均成功完成)。
甘特圖:
更詳細地,操作順序爲:
1.GCS(客戶)發送了MISSION_COUNT,其中包含要上傳的任務項目數(count)
- 一個超時必須開始爲GCS等待從飛機的響應(MISSION_REQUEST_INT)。
2.無人機(服務器)收到消息,並準備上傳任務項目。
3.無人機以MISSION_REQUEST_INT進行響應,請求第一個任務項目(seq==1)。
4.GCS MISSION_REQUEST_INT在MISSION_ITEM_INT消息中接收並響應所請求的任務項目。
5.無人機和GCS重複MISSION_REQUEST_INT/ MISSION_ITEM_INT循環,seq直到所有項目上傳完畢。
6.對於最後一個任務項目,無人機將以MISSION_ACK響應,並顯示以下操作結果:type(MAV_MISSION_RESULT):
- 成功時,type必須設置爲MAV_MISSION_ACCEPTED
- 失敗時,type必須設置爲MAV_MISSION_ERROR或其他錯誤代碼。
7.GCS收到MISSION_ACK:
- 如果MAV_MISSION_ACCEPTED操作完成。
- 如果出現錯誤,則交易失敗,但可以重試。
注意:
- GCS(客戶端)會在每條消息後設置一個超時時間,如果飛行器沒有響應,它將重新發送。
- 如果未按順序收到任何任務,客戶將重新請求缺少的任務項目。
- 上面的序列顯示了打包在MISSION_ITEM_INT消息中的MAVLink命令。協議實現還必須以相同的方式支持MISSION_ITEM和MISSION_REQUEST(請參閱下面的MISSION_ITEM_INT與MISSION_ITEM)。
從飛行器下載任務
下圖顯示了從無人機下載任務的通信順序(假設所有操作均成功完成)。
甘特圖:
序列類似於上傳任務的序列。主要區別在於客戶端(例如GCS)發送MISSION_REQUEST_LIST,該消息觸發自動駕駛儀以當前項數進行響應。這開始了一個週期,在該週期中,GCS請求任務物品,而無人機則提供它們。
該序列顯示了打包在
MISSION_ITEM_INT
消息中的MAVLink命令。協議實現還必須以相同的方式支持MISSION_ITEM
和MISSION_REQUEST
(請參閱下面的MISSION_ITEM_INT與MISSION_ITEM)。
設置當前任務項目
下圖顯示了設置當前任務項目的通信順序。
甘特圖:
更詳細地,操作順序爲:
1.GCS(客戶端)發送MISSION_SET_CURRENT,並指定新的序列號(seq)。
2.無人機(服務器)收到消息並嘗試更新當前任務序列號。
- 成功後,無人機應廣播包含當前序列號()的MISSION_CURRENT消息seq。
- 如果失敗,無人機應播放一個狀態文本與MAV_SEVERITY和一個字符串,說明這個問題。這可以顯示在接收系統的UI中。
注意:
- 此消息沒有特定的超時/重新發送。
- 消息的確認是通過任務/系統狀態的廣播來實現的,該狀態與原始消息無關。之所以使用這種方法,是因爲該消息與所有任務處理客戶端有關。
監控任務進度
GCS / developer API可以通過處理無人機發送的相應消息來監視進度:
- 每當到達新任務項目時,飛行器(服務器)都必須廣播MISSION_ITEM_REACHED消息。該消息包含seq當前任務項目的編號。
- 如果當前任務項被消息更改,則飛行器還必須廣播MISSION_CURRENT消息。
清除任務
下圖顯示了從無人機清除任務的通信順序(不顯示超時,我們假設所有操作均成功)。
甘特圖:
更詳細地,操作順序爲:
1.GCS(客戶端)發送MISSION_CLEAR_ALL
- 一個超時開始爲GCS來等待MISSION_ACK來自無人機。
2.無人機(服務器)收到消息,並清除任務。
- 如果後續的任務計數或當前任務項目請求表明沒有上傳任務,則認爲該任務已清除。
3.無人機以MISSION_ACK響應,其中包含結果type(MAV_MISSION_RESULT):
- 成功後,此類型必須設置爲MAV_MISSION_ACCEPTED
- 失敗時,類型必須設置爲MAV_MISSION_ERROR或其他錯誤代碼。
4.GCS收到MISSION_ACK:
- 如果MAV_MISSION_ACCEPTEDGCS清除了自己存儲的有關任務的信息(該信息剛剛從飛行器中刪除)並完成。
- 如果出現錯誤,則交易失敗,並且將保留任務的GCS記錄(如果有)。
5.如果未MISSION_ACK收到該操作,則該操作最終將超時並且可以重試(請參閱上文)。
上傳部分任務
待定
下載部分任務
待定
超時和重試
所有客戶端(GCS)命令都會發送超時。如果MISSION_ACK在超時之前未收到a ,則客戶端(GCS)可以重新發送該消息。如果重試多次後仍未收到響應,則客戶端必須取消該操作並返回到空閒狀態。
重新發送之前的建議超時值以及重試次數爲:
- 超時(默認):1500毫秒
- 超時(任務項):250毫秒。
- 重試次數(最多):5
MISSION_ITEM_INT和MISSION_ITEM
上面的操作/順序圖顯示了使用MISSION_REQUEST_INT
和MISSION_ITEM_INT
請求/發送的消息命令。
協議實現還必須使用相應的MISSION_REQUEST和MISSION_ITEM消息類型來支持相同的操作/序列。唯一的區別是MISSION_ITEM_INT將緯度和經度編碼爲整數而不是浮點數。
MAVLink 用戶應始終偏愛*_INT變體。這些避免/減少了使用的精度限制MISSION_ITEM。
任務文件格式
用於交換任務/計劃的事實上的標準文件格式在以下文件中進行了討論:文件格式>任務純文本文件格式。
實現
PX4
該協議已在C中實現。
源代碼:
- src/modules/mavlink/mavlink_mission.cpp
實施狀態爲(在撰寫本文時):
- 飛行計劃任務:
- 如本規範中所定義,支持上載,下載,清除任務和監視進度。
- 不支持部分上傳和部分下載。
- 如本規範中所定義,支持“地理圍欄任務”。
- PX4不支持集結點“任務”。
QGroundControl
該協議已用C ++實現。
源代碼:
- src/MissionManager/PlanManager.cc
ArduPilot
ArduPilot用C ++實現任務協議。
ArduPilot使用此規範中描述的相同消息和消息流。有一些實現差異會影響兼容性。這些記錄在下面。
源代碼:
- /libraries/GCS_MAVLink/GCS_Common.cpp
飛行計劃任務
支持任務上傳,下載,清除任務以及監視進度和部分任務上傳(MISSION_WRITE_PARTIAL_LIST)。
不支持部分任務下載(MISSION_REQUEST_PARTIAL_LIST)。
ArduPilot的實現與該規範不同(非窮盡):
-
第一個任務序列號(seq==0)填充有飛行器的原始位置,而不是第一個任務項。
-
任務上傳不是“原子的”。中途失敗(或被取消)的上載將與更新前的狀態不匹配。相反,它可能是原始任務和新任務的混合。
-
即使上傳成功,飛行器任務也可能與上傳系統上的版本不匹配(如果隨後下載了任務,則該版本將不同於原始版本)。
- 如果您嘗試上傳的項目超過ArduPilot可以存儲的數量,則系統將“接受”這些項目(即不報告失敗),但只會將每個新項目覆蓋到任務列表中的相同(最高)位置。
- 僅存儲使用的字段。
- 在某些字段上四捨五入(由於可用的存儲空間,在某些情況下內部可能的最大值)。如果直接比較上傳前後的float參數,則可能會失敗。
-
一個MISSION_ACK返回錯誤值(NACK)不終止上載(即它不被視爲不可恢復的錯誤)。只要ArduPilot尚未超時,系統就可以重試當前任務項目上載。
-
在執行任務時(即在自動模式下)無法清除任務。請注意,可以上傳新任務(甚至是零大小的任務-相當於清除)。
-
不支持明確取消操作。如果一端停止通信,另一端最終將超時,並將自身重置爲空閒/就緒狀態。
規範未定義以下行爲(但仍然值得關注):
- 提交任務項目時,ArduPilot將對字段進行一些驗證。驗證碼是所有飛行器通用的;飛行器類型無法理解的任務項目在上傳時被接受,但在任務執行期間被跳過。
- ArduPilot在任務運行時(例如,跳躍目標)執行一些特定於飛行器的驗證。
- 執行任務時可以上傳新任務。在這種情況下,即使新任務中的航路點順序不同,當前的航路點也將執行完畢(要獲取新項目,您需要重置順序或切入/退出自動模式)。
- ArduPilot任務沒有存儲在SD卡中,因此具有特定於飛行器/主板的最大任務大小(作爲好處,在ArduPilot上,任務可以在飛行中SD卡中倖存下來)。
地理圍欄任務
Geofence受ArduPilot支持,但不使用此協議進行管理。
集會點任務
集會點受ArduPilot支持,但不使用此協議進行管理
MAVSDK
待定
無人機套件
待定