下载任务
下图展示了从无人机下载任务的通信序列(假设所有作成功)。
这个流程和上传任务时类似。主要区别是客户端(例如 GCS)发送 MISSION_REQUEST_LIST,触发无人机负载计算机响应当前任务项数量(MISSION_COUNT)。开启一个新循环,GCS 请求任务项,无人机提供。
注:
每个需要响应的消息都会设置超时 (例如 MISSION_REQUEST_INT)。如果超时结束且未收到回复,则必须重新发送请求。
任务物品必须按顺序接收。如果项目未按顺序接收,GCS 应重新请求预期项目(该不按顺序的项目被丢弃)。
协议实现也必须以上传任务页中同样的方式支持 MISSION_ITEM 和 MISSION_REQUEST。
使用QGC下载无人机上的任务:
点击左侧plan按钮进入飞行计划页面

点击左侧File->Download按钮开始下载流程

任务成功下载到QGC并显示

上传任务
下图展示了将任务上传到无人机的通信序列(假设所有作都成功)。
更详细地说,作业顺序如下:
- GCS 会发送 MISSION_COUNT 包括需要上传的任务项总数。
· GCS启动一个超时等待 ,等待无人机的响应(MISSION_REQUEST_INT)。 - 无人机收到消息并回复 MISSION_REQUEST_INT 请求第一个任务项(seq==0)。
· 无人机启动一个超时等待 ,等待 GCS 的 MISSION_ITEM_INT 响应。 - GCS 接收 MISSION_REQUEST_INT 并以 MISSION_ITEM_INT 消息回复请求的任务项目。
- 无人机和 GCS 重复 MISSION_REQUEST_INT/MISSION_ITEM_INT 循环,迭代序列直到所有项目上传(seq==count-1)。
- 收到最后一项任务物品后,无人机会回复 MISSION_ACK,并发出指示任务上传完成/成功的 MAV_MISSION_ACCEPTED 类型。
· 无人机应将新任务设置为当前任务,丢弃原始数据。
· 无人机认为上传完成。 - GCS 接收包含 MAV_MISSION_ACCEPTED 的 MISSION_ACK 表示作已完成。
进入/退出任务功能见“切换飞行模式”页。
mavlink id 44 MISSION_COUNT
mavlink id 51 MISSION_REQUEST_INT
MAVLink ID 73: MISSION_ITEM_INT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink id 47 MISSION_ACK
MAV_MISSION_RESULT
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
示例
发送任务到无人机:1、起飞,2、移动至指定航点
import time
import sys
from pymavlink import mavutil
def convert_lat_lon_to_int(lat, lon):
"""将纬度和经度转换为int32_t * 1E7的格式"""
lat_int = int(lat * 1e7)
lon_int = int(lon * 1e7)
return lat_int, lon_int
def send_mission_upload(connection, target_system, target_component, mission_items):
"""
上传任务到飞行器(符合Mavlink文档规范)
:param connection: MAVLink连接对象
:param target_system: 目标系统ID
:param target_component: 目标组件ID
:param mission_items: 任务项列表,每个任务项是一个包含参数的字典
"""
# 发送MISSION_COUNT(任务项数量)
count = len(mission_items)
print(f"发送MISSION_COUNT: {count}个任务项")
connection.mav.mission_count_send(
target_system,
target_component,
count,
mavutil.mavlink.MAV_MISSION_TYPE_MISSION # 任务类型:飞行计划
)
# 等待并处理每个任务项
for seq in range(count):
print(f"等待MISSION_REQUEST_INT for seq={seq}")
retries = 0
max_retries = 5 # 根据文档:Retries (max): 5
while retries < max_retries:
# 根据文档:Timeout (default): 1500 ms
msg = connection.recv_match(
type='MISSION_REQUEST_INT',
blocking=True,
timeout=1.5 # 1500 ms
)
if msg is not None:
# 确保请求的是正确的序列号
if msg.seq != seq:
print(f"错误: 请求的序列号不匹配,期望{seq},收到{msg.seq}")
return False
break
else:
print(f"超时,未收到MISSION_REQUEST_INT (尝试 {retries+1}/{max_retries})")
retries += 1
if retries == max_retries:
print("达到最大重试次数,任务上传失败")
return False
# 发送MISSION_ITEM_INT
item = mission_items[seq]
print(f"准备发送MISSION_ITEM_INT for seq={seq},command={item['command']}")
connection.mav.mission_item_int_send(
target_system,
target_component,
seq,
item['frame'],
item['command'],
item['current'],
item['autocontinue'],
item['param1'],
item['param2'],
item['param3'],
item['param4'],
item['param5'],
item['param6'],
item['param7'],
mavutil.mavlink.MAV_MISSION_TYPE_MISSION
)
# 等待MISSION_ACK
print("等待MISSION_ACK")
max_retries = 5
retries = 0
while retries < max_retries:
msg = connection.recv_match(
type='MISSION_ACK',
blocking=True,
timeout=1.5
)
if msg is not None:
if msg.type == mavutil.mavlink.MAV_MISSION_ACCEPTED:
print("任务上传成功!")
return True
else:
print(f"任务上传失败,错误代码: {msg.type}")
return False
else:
print(f"超时,未收到MISSION_ACK (尝试 {retries+1}/{max_retries})")
retries += 1
print("达到最大重试次数,任务上传失败")
return False
def main():
# 配置连接 UDP连接 (QGroundControl默认)
connection = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
print("等待心跳信号...")
try:
# 等待心跳包(最多等待10秒)
msg = connection.wait_heartbeat(timeout=10)
print(f"心跳包已收到!系统ID: {msg.get_srcSystem()}, 组件ID: {msg.get_srcComponent()}")
target_system = 1
target_component = 1
# 创建简单任务:一个航点
# 纬度: 47.3667, 经度: 8.5500, 高度: 100.0米
lat = 41.3667
lon = 111.5500
altitude = 50.0
# 转换坐标
lat_int, lon_int = convert_lat_lon_to_int(lat, lon)
# 任务项
mission_item = {
'frame': mavutil.mavlink.MAV_FRAME_GLOBAL,
'command': mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, # 起飞
'current': 0, # 0表示不是当前任务项
'autocontinue': 1, # 1表示自动继续到下一个任务项
'param1': 0,
'param2': 0,
'param3': 0,
'param4': 0,
'param5': 0,
'param6': 0,
'param7': 0,
}
mission_item2 = {
'frame': mavutil.mavlink.MAV_FRAME_GLOBAL,
'command': mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, # 导航到指定航点
'current': 0, # 0表示不是当前任务项
'autocontinue': 1, # 1表示自动继续到下一个任务项
'param1': 0, # 0秒停留
'param2': 0, # 0秒停留
'param3': 0, # 0秒停留
'param4': 0, # 航向
'param5': lat_int, # 纬度
'param6': lon_int, # 经度
'param7': altitude, # 高度
}
mission_items = [mission_item]
mission_items.append(mission_item2)
# 上传任务
success = send_mission_upload(connection, target_system, target_component, mission_items)
if success:
print("任务上传成功!")
else:
print("任务上传失败!")
except Exception as e:
print(f"连接错误: {e}")
sys.exit(1)
# 关闭连接
connection.close()
print("连接已关闭")
if __name__ == '__main__':
main()执行结果
于QGC下载任务后查看任务计划
删除任务
下图展示了无人机清除任务的通信序列(假设所有行动成功)。
更详细地说,作顺序如下:
- GCS发送 MISSION_CLEAR_ALL
• GCS 暂停等待无人机的 MISSION_ACK。 - 无人机收到消息,并从存储中清除任务。
- 无人机会以 MISSION_ACK 结果 MAV_MISSION_ACCEPTED 表示成功 。
- GCS 接收 MISSION_ACK 并清理其自身存储的任务信息。手术现已完成。
注:
每个需要响应的消息(例如 MISSION_CLEAR_ALL)都会设置超时 。如果超时结束且未收到回复,则必须重新发送请求。
MISSION_ACK对MISSION_CLEAR_ALL响应时的mission_type字段值为0。
mavlink id 45 MISSION_CLEAR_ALL
| Field Name | Type | Description |
|---|---|---|
| target_system | uint8_t | 系统 ID |
| target_component | uint8_t | 组件 ID |
使用QGC删除无人机上的任务:
点击左侧plan按钮进入飞行计划页面

点击左侧File->Clear按钮开始删除流程

无人机任务已清空并正确响应QGC,QGC清空本地任务列表

环绕模式
MAV_CMD_DO_ORBIT(34)
开始沿着参数定义的圆周绕行。将值设置为 NaN(视情况而定)会使用默认值。
| Param (Label) | Description | Values | Units |
|---|---|---|---|
| 1(半径) | 圆的半径。正值:顺时针轨道。负值:逆时针绕轨道。NaN:使用飞行器默认半径。 | m | |
| 2(速度) | 切线速度。NaN:使用飞行器默认速度。 | m/s | |
| 3(偏航行为) | 车辆的偏航行为。 | ORBIT_YAW_BEHAVIOUR | |
| 4(轨道) | 绕中心点运行该弧度数(即设定为 270*Pi/180 的三分之三轨道)。0或NaN:一直环绕。 | 最少:0 | 弧度 |
| 5(纬度/X) | 中心点纬度坐标。如果为 NaN:使用当前飞行器位置。 | ||
| 6(经度/Y) | 中心点经度坐标。如果为 NaN:使用当前飞行器位置。 | ||
| 7(高度/Z) | 中心点高度(MSL)坐标。NaN:使用当前飞行器的高度。 |
ORBIT_YAW_BEHAVIOUR
环绕飞行中的偏航行为模式。
| Value | Name | Description |
|---|---|---|
| 0 | ORBIT_YAW_BEHAVIOUR_HOLD_FRONT_TO_CIRCLE_CENTER | 无人机前部朝向中心(默认)。 |
| 1 | ORBIT_YAW_BEHAVIOUR_HOLD_INITIAL_HEADING | 收到消息时无人机保持朝向不变。 |
| 3 | ORBIT_YAW_BEHAVIOUR_HOLD_FRONT_TANGENT_TO_CIRCLE | 无人机前部沿飞行轨迹(与圆相切)。 |
使用QGC发送执行环绕模式命令:
鼠标左键点击地面作为环绕时的中心点,在弹出菜单中点击Orbit at location

拖动上方滑条以发送环绕模式指令

无人机进入环绕模式并沿规定轨道飞行

mavlink id 242 HOME_POSITION
结果(使用QGC查看)

最后编辑:孙渝泓 更新时间:2026-06-18 17:59