3、任务规划基础:航点、动作与文件格式

任务规划,说白了就是告诉无人机:去哪儿、干什么、怎么回来。很多新手一上来就盯着QGroundControl的航线界面乱点,结果飞出去才发现高度不对、动作没触发、返航路径乱成一团。我刚开始带项目时也吃过这个亏——有一次在农田测绘,航点顺序搞反了,飞机直接往反方向飞,差点撞树。从那以后,我要求团队每个人必须先搞懂任务规划的底层逻辑。

3.1 任务规划的核心概念

一个完整的PX4任务,由三个层次组成:

  • 任务(Mission):整趟飞行的完整描述,包含起飞、航线、动作、降落。
  • 航段(Segment):两个航点之间的飞行路径,包含速度、高度、转弯半径。
  • 航点(Waypoint):空间中的一个三维坐标点(经纬度+高度),附带动作指令。

你想想看,这就像写一个导航程序。航点是“到哪”,动作是“干啥”,任务就是整个脚本。我个人习惯把任务规划分成三步:画路径 → 配动作 → 检查逻辑。缺一步,后面就容易出幺蛾子。

核心原则:任务规划不是画线,而是定义状态机。每个航点都是一个状态,飞机从一个状态飞到下一个状态,执行完动作再切换。

3.2 航点(Waypoint)与动作(Action)

航点不只是坐标。每个航点背后有一堆参数,我列个表给你看:

参数 说明 典型值
纬度/经度 WGS84坐标系,小数点后6位 39.904200, 116.407400
相对高度 相对于起飞点或海平面 50 m
航点类型 普通航点、起飞、降落、悬停等 NAV_WAYPOINT
停留时间 到达后悬停等待的秒数 5 s
接受半径 到达目标点多少米内算“到达” 1 m
偏航角 机头朝向(-180° ~ 180°) 0°(正北)

动作(Action)是附着在航点上的指令。PX4支持的动作类型不少,常用的有:

  • DO_SET_SERVO:控制舵机,比如放下投放器。
  • DO_SET_CAM_TRIGG_DIST:设置相机触发距离,航测必备。
  • DO_CHANGE_SPEED:改变飞行速度,适合转弯前减速。
  • DO_LAND_START:标记降落起始点,用于精准降落。
  • DO_JUMP:跳转到指定航点,实现循环飞行。

我的经验:DO_JUMP这个动作很容易被忽略。有一次做巡检任务,需要绕塔飞三圈,我直接用DO_JUMP跳回起点,配合计数器,省了三分之二的航点数量。但注意——跳转次数别设成无限,否则飞机永远回不来。

3.3 任务文件格式:.plan 与 .mission

QGroundControl(QGC)使用两种文件格式保存任务。很多人搞混,我直接说区别:

格式 扩展名 包含内容 适用场景
任务文件 .mission 纯航线数据(航点+动作) 机载端上传、跨地面站交换
计划文件 .plan 航线 + 地理围栏 + 参数 + 起飞点 完整任务存档、团队共享

.plan文件本质上是JSON格式,结构清晰。我拆开给你看:

{
  "fileType": "Plan",
  "geoFence": {
    "polygons": [...],
    "circles": [...]
  },
  "mission": {
    "items": [
      {
        "type": "SimpleItem",
        "command": 22,          // MAV_CMD_NAV_WAYPOINT
        "params": [0, 0, 0, 0, 39.9042, 116.4074, 50.0]
      },
      {
        "type": "SimpleItem",
        "command": 183,         // MAV_CMD_DO_SET_CAM_TRIGG_DIST
        "params": [10, 0, 0, 0, 0, 0, 0]
      }
    ],
    "plannedHomePosition": [39.9040, 116.4070, 0.0]
  },
  "rallyPoints": {
    "points": [...]
  },
  "version": 2
}

注意看,每个航点通过command字段指定MAVLink指令编号。22是普通航点,183是相机触发。我建议你手写任务文件时,先对照MAVLink指令表,别凭记忆写编号——我曾经把21(起飞)和22(航点)搞混,结果飞机在第一个点就执行了起飞动作,悬停在那不动了。

避坑指南:.plan文件里的plannedHomePosition只是参考位置,不是真正的起飞点。真正的起飞点由飞控在解锁时记录。如果你在室内编辑任务,记得把起飞点改成实际场地坐标,否则飞机可能以为自己在千里之外。

3.4 上传与下载任务

任务规划好之后,怎么塞进飞控?流程很简单,但细节决定成败。

3.4.1 上传任务(Upload)

  1. 在QGC中打开.plan文件,检查航点列表。
  2. 点击“上传”按钮,QGC通过MAVLink的MISSION_COUNT协议逐条发送。
  3. 飞控收到后,会回复MISSION_ACK确认。
  4. 上传完成后,QGC会发送MISSION_CURRENT设置当前航点。

这里有个坑:上传过程中不要断开数传。我遇到过好几次,信号不好导致航点丢失,飞控只收到一半的任务。结果飞机起飞后直接往错误方向飞。嗯,从那以后我养成了习惯——上传完立刻下载回来校验一遍。

3.4.2 下载任务(Download)

下载用于备份或分析。操作更简单:

  • 点击QGC的“下载”按钮,飞控会把整个任务列表发回。
  • 下载完成后,QGC自动保存为.plan文件。
  • 你可以对比下载的任务和原始文件,检查是否一致。

小技巧:我每次外场飞行前,都会先下载飞控里已有的任务,确认不是上次遗留的旧航线。有一次队友忘了清空任务,结果飞机上天后直接执行了三天前的测绘航线,飞到了隔壁工地。从那以后,“下载校验”成了我的肌肉记忆。

3.5 任务规划知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作任务规划的“脑图”:

任务规划知识体系 任务规划知识体系 任务规划 航点 (Waypoint) 动作 (Action) 文件格式 坐标 + 高度 接受半径 停留时间 偏航角 DO_SET_SERVO / DO_JUMP / ... DO_SET_CAM_TRIGG_DIST .plan(完整计划) .mission(纯航线) 上传 (Upload) 下载 (Download) 核心:航点定义位置,动作定义行为,文件格式定义存储与交换

这张图把本章内容串起来了。从任务规划出发,分三条线:航点(位置参数)、动作(行为指令)、文件格式(存储交换)。最后汇到上传下载——这是你与飞控交互的必经之路。

3.6 本章小结

任务规划不是画几条线那么简单。你得理解:

  • 航点是三维坐标 + 行为参数的组合体。
  • 动作是附着在航点上的指令,控制飞机“做什么”。
  • .plan文件是完整任务包,.mission是纯航线数据。
  • 上传后一定要下载校验,这是保命操作。

我个人习惯在每次外场飞行前,花5分钟手动检查一遍任务文件里的航点高度和动作顺序。别嫌麻烦——地面多花5分钟,天上少花5000块维修费。