2. 航点任务概念:任务规划器、航点属性、任务状态机、MAV_CMD命令集

各位同学,今天我们来聊聊航点任务的核心概念。说实话,我刚入行那会儿,以为航点任务就是「飞过去、拍个照、再飞回来」这么简单。直到第一次在野外调试,无人机飞到第三个航点突然悬停不动了——我盯着地面站日志看了两个小时,才发现是任务状态机卡在了某个分支里。

嗯,从那以后我就明白了:航点任务看似简单,但背后的状态机、命令集、属性配置,任何一个环节出问题,飞机都可能跟你「闹脾气」。今天这一章,咱们就把这些概念彻底理清楚。

2.1 任务规划器:你的「空中导演」

任务规划器是什么?说白了,它就是地面站上那个让你画航线、设参数的工具。我个人习惯用 Mission Planner 和 QGroundControl,两者各有千秋。

规划器干的事其实就三件:

  • 画航线:在地图上点几个点,连成一条路径
  • 设属性:每个点的高度、速度、动作(比如拍照、投掷)
  • 生成指令链:把图形化的航线翻译成 MAVLink 指令序列

你想想看,规划器就像导演,航点就是剧本里的场景,而无人机就是演员。导演把剧本写好,演员照着演——只不过这个演员不会跟你讨价还价,你写错了它真摔。

我的经验: 在规划器里设置航点时,一定要检查每个航点的「到达半径」。我见过有人把半径设成 0,结果无人机在每个点上都疯狂绕圈,就是不肯去下一个点。默认值 1-2 米通常够用,但复杂地形建议设到 5 米以上。

2.2 航点属性:每个点都有自己的「脾气」

每个航点不是简单的一个经纬度坐标。它身上挂着一堆属性,就像一个人的身份证信息一样。我整理了一张表,方便你对照:

属性 说明 典型值
经纬度 航点的地理位置 39.9042°N, 116.4074°E
高度 相对起飞点或海平面的高度 50 m (相对)
到达半径 无人机进入该范围即认为「到达」 1-5 m
航向 到达该点时机头指向 -1 (默认不改变)
停留时间 在该点悬停等待的秒数 0-10 s
动作命令 到达后执行的 MAV_CMD MAV_CMD_NAV_WAYPOINT

这里有个坑,我踩过:高度属性。有些飞控用相对高度(相对于起飞点),有些用绝对高度(海平面)。如果你混着用,无人机可能会一头扎进地里。我曾经在山区测试,起飞点海拔 2000 米,航点设了绝对高度 1500 米——结果飞机直接往山下俯冲,吓得我赶紧切了返航。

警告: 在跨区域任务中,务必确认飞控的高度参考系。建议统一使用 相对高度,除非你明确知道自己在做什么。

2.3 任务状态机:无人机的「大脑流程」

任务状态机,这是整个航点任务的核心。无人机不是傻乎乎地从一个点飞到另一个点,它内部有一套严谨的状态切换逻辑。我画了一张图,帮你理解这个过程:

航点任务状态机 空闲 (IDLE) 上传中 (UPLOADING) 已就绪 (READY) 执行中 (ACTIVE) 暂停 (PAUSED) 完成 (COMPLETED) 说明:状态切换由飞控内部逻辑驱动,PAUSED 状态可由遥控器或地面站指令触发 COMPLETED 后自动回到 IDLE,等待下一次任务上传

这张图我建议你保存下来。每次调试任务时,对照着看日志里的状态切换,能快速定位问题。比如,如果无人机一直卡在 UPLOADING 状态,那多半是数传链路不稳定,任务没传完。

状态机的核心逻辑其实就一句话:每个状态只做一件事,做完就切到下一个。但实际开发中,我遇到过最头疼的问题是「暂停恢复」——无人机在 PAUSED 状态下被风吹偏了,恢复执行时是直接飞回原航点,还是从当前位置继续?不同飞控的处理方式不一样,这个后面我们会详细讲。

2.4 MAV_CMD 命令集:无人机的「动作词典」

MAV_CMD 是什么?它是 MAVLink 协议里定义的一套标准命令,告诉无人机「到了这个点该干什么」。我把它分成几大类:

类别 命令示例 作用
导航类 MAV_CMD_NAV_WAYPOINT 飞到指定航点
MAV_CMD_NAV_LOITER_UNLIM 在指定点无限盘旋
MAV_CMD_NAV_RETURN_TO_LAUNCH 返航
动作类 MAV_CMD_DO_SET_SERVO 控制舵机(如投掷器)
MAV_CMD_DO_SET_CAM_TRIGG_DIST 设置相机触发距离
条件类 MAV_CMD_CONDITION_DELAY 等待指定时间
MAV_CMD_CONDITION_DISTANCE 飞到距目标一定距离时触发

这里有个关键点:命令的执行顺序。导航类命令是「必须到达」的,而动作类和条件类命令是「到达后执行」的。我见过有人把拍照命令放在导航命令前面,结果无人机还没起飞就开始拍照——拍了一堆黑照片。

核心原则: 一个完整的航点任务,指令链的顺序应该是:

  1. 导航命令(飞到哪)
  2. 条件命令(什么时候做)
  3. 动作命令(做什么)

这个顺序不能乱,乱了就出幺蛾子。

2.5 一个完整的任务示例

说了这么多理论,咱们看个实际例子。假设你要让无人机从 A 点起飞,飞到 B 点拍照,然后返航。对应的 MAVLink 指令链是这样的:

# 任务开始
MAV_CMD_NAV_TAKEOFF          # 起飞到安全高度
MAV_CMD_NAV_WAYPOINT         # 飞到 B 点(经纬度、高度)
MAV_CMD_CONDITION_DELAY      # 悬停 2 秒
MAV_CMD_DO_SET_CAM_TRIGG_DIST # 触发相机拍照
MAV_CMD_NAV_RETURN_TO_LAUNCH # 返航
MAV_CMD_NAV_LAND             # 降落
# 任务结束

你看,每个命令都有明确的分工。我刚开始写指令链时,总喜欢把条件命令和动作命令混在一起写,结果无人机经常「跳步」。后来养成了习惯:先写导航骨架,再往里填条件和动作,这样逻辑清晰多了。

避坑指南: 我曾经在 MAV_CMD_NAV_WAYPOINT 后面直接跟了 MAV_CMD_DO_SET_SERVO,结果舵机在飞行途中就触发了——因为飞控在飞往航点的路上就开始执行后续命令。正确的做法是:在导航命令和动作命令之间,加一个 MAV_CMD_CONDITION_DELAY 或 MAV_CMD_CONDITION_DISTANCE,确保无人机到达目标点后再执行动作。

好了,这一章的内容就到这里。航点任务的概念其实不复杂,但细节很多。你只要记住:规划器是工具,航点是坐标,状态机是流程,MAV_CMD 是动作——把这四样东西串起来,你就能写出稳定可靠的任务指令链。