联系作者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
待定
无人机套件
待定