3. 航点命令详解:MAV_CMD_NAV_WAYPOINT、悬停时间设置、航点半径与通过精度、航点到达判定逻辑

各位同学,欢迎来到第三章。前两章我们把 Mission Planner 的界面和基础操作捋了一遍,从这章开始,咱们要真正啃硬骨头了——航点命令。

说白了,航点规划的核心就是一条条 MAVLink 命令。你给飞控下什么指令,它就干什么活。而 MAV_CMD_NAV_WAYPOINT,是所有命令里最基础、也最常用的一条。我做了这么多年无人机,90% 的任务航线里都有它。今天咱们就把它的每个参数掰开揉碎,讲清楚。

3.1 MAV_CMD_NAV_WAYPOINT 命令结构

先看一条典型的航点命令长什么样。在 Mission Planner 的航点列表里,你选中一个航点,右侧参数面板会显示这些字段:

CMD: 16 (MAV_CMD_NAV_WAYPOINT)
Frame: 3 (MAV_FRAME_GLOBAL_RELATIVE_ALT)
Autocontinue: 1
Param1: 悬停时间 (秒)
Param2: 到达半径 (米)
Param3: 通过半径 (米)
Param4: 偏航角 (度, 可选)
X: 纬度
Y: 经度
Z: 相对高度 (米)

嗯,这里要注意:CMD 编号 16 就是 MAV_CMD_NAV_WAYPOINT。你手动添加航点时,Mission Planner 默认生成的就是这个命令。Frame 选 3 表示高度是相对起飞点的,这是最常用的模式。

我个人习惯把 Param4 偏航角留空(设为 0),让飞控自己根据下一个航点方向自动计算偏航。除非你有特殊需求,比如让相机始终对准某个方向,否则自动偏航更省心。

3.2 悬停时间设置 (Param1)

Param1 控制无人机到达航点后悬停多久,单位是秒。这个参数看似简单,但坑不少。

Param1 值 行为 典型场景
0 不悬停,直接飞向下一个航点 普通巡航、测绘航线
1 ~ 65535 悬停指定秒数后继续 航拍、投放、等待指令
-1 或 小于 0 无限悬停,直到收到新指令 应急等待、人工接管
注意:Param1 设为 -1 时,飞机会一直悬停在这个点。我曾经有个项目,测试时忘了改这个参数,结果飞机在天上悬停了 20 分钟,直到电池报警才手动切回。所以,除非你明确需要无限等待,否则别用负值。

悬停时间的精度取决于飞控的 EKF 和 GPS 定位质量。在 RTK 模式下,悬停位置误差可以控制在 10 厘米以内;普通 GPS 模式下,2~3 米的漂移是正常的。我建议在风速超过 5m/s 时,把悬停时间适当缩短,或者改用 LOITER_UNLIM 命令,它的抗风性能更好。

3.3 航点半径与通过精度 (Param2 & Param3)

这两个参数是新手最容易搞混的。我当年也吃过亏,咱们一次说清楚。

  • Param2 (到达半径):飞机进入这个半径范围,就认为“到达”了该航点。单位是米。
  • Param3 (通过半径):飞机在飞过该航点时,允许偏离航线的最大距离。单位也是米。

你想想看,这两个参数有什么区别?

举个例子:假设 Param2=5 米,Param3=10 米。飞机从航点 A 飞向航点 B。当它进入距离 B 点 5 米范围内时,飞控判定“到达 B 点”,然后开始执行下一个航点。但在飞过 B 点的过程中,飞机实际轨迹可能偏离直线航线最多 10 米——这就是 Param3 的作用。

核心原则:

  • Param2 控制“何时切换下一个航点”
  • Param3 控制“飞过时允许偏多远”
  • Param3 必须 ≥ Param2,否则飞控会自动调整

我建议的典型配置:

应用场景 Param2 (到达半径) Param3 (通过半径)
精准悬停(如投放) 1 ~ 2 米 2 ~ 3 米
普通航拍航线 5 ~ 10 米 10 ~ 15 米
高速测绘(固定翼) 15 ~ 30 米 30 ~ 50 米
转弯半径受限(城市环境) 3 ~ 5 米 5 ~ 8 米
我的经验:对于多旋翼,Param2 设 3 米、Param3 设 5 米是个不错的起点。太小的半径会导致飞机在航点附近反复调整姿态,反而浪费电池。固定翼则要设大一些,否则转弯太急容易失速。

3.4 航点到达判定逻辑

飞控到底怎么判断“到达”了一个航点?这背后有一套完整的逻辑,不是简单的距离比较。

  1. 距离检查:飞机当前位置与目标航点的水平距离是否小于 Param2?
  2. 时间检查:如果距离条件满足,飞控会等待一个短暂的时间(默认 0.5 秒),确认位置稳定,防止 GPS 抖动导致误判。
  3. 航向检查(可选):如果启用了 WP_TURN_ANGLE 参数,飞控还会检查飞机是否已经转向下一个航点方向。
  4. 高度检查:如果当前高度与目标高度偏差超过 WP_ALT_ERR(默认 1 米),飞控会先调整高度,再判定到达。

为什么会这么复杂?我遇到过一种情况:飞机在强风中接近航点,GPS 显示距离已经小于 2 米,但实际位置还在漂移。如果没有时间检查,飞控会立刻切换下一个航点,导致航线出现锯齿。所以,这套逻辑是为了保证可靠性。

你可以通过 Mission Planner 的 Flight Data 页面实时观察判定过程。在状态栏里,WP_Dist 显示当前距离下一个航点的距离,WP_Number 显示当前目标航点编号。当 WP_Dist 小于 Param2 时,编号会跳转。

3.5 核心逻辑流程图

下面这张图总结了航点到达判定的完整流程,我建议你保存下来,调试时对照着看。

航点到达判定逻辑流程图 航点到达判定逻辑流程图 开始执行航点 N 检查水平距离 是否 < Param2 (到达半径)? 否 是 时间检查 位置稳定超过 0.5 秒? 否 是 高度检查 高度偏差 < WP_ALT_ERR? 否 是 航向检查(可选) 已转向下一航点方向? 是 判定到达航点 N 执行 Param1 悬停时间 切换至航点 N+1 说明 • 所有条件必须满足 • 任一条件不满足则 继续等待/调整

3.6 常见问题与避坑指南

避坑 1:Param2 设得太小
我曾经把 Param2 设为 0.5 米,想着让飞机精准到达。结果在 GPS 精度只有 2 米的情况下,飞机永远无法“到达”,一直在航点附近打转。最后电池耗尽,触发了低电量保护。建议 Param2 至少设为 GPS 精度的 2 倍。
避坑 2:悬停时间与电池容量
如果你在航线中设置了多个长悬停点(比如每个点悬停 30 秒),一定要算好总时间。我有个测绘项目,50 个航点每个悬停 10 秒,结果总悬停时间超过 8 分钟,加上飞行时间,电池差点不够返航。建议在 Mission Planner 的 Total Time 预估里提前检查。
技巧:如果你想让飞机在航点之间走直线,而不是弧线,可以把 Param3 设得和 Param2 一样大。这样飞控会尽量贴近航点再转弯。不过这会增加飞行时间,适合需要精确覆盖的测绘任务。

3.7 实战建议

最后,给你一套我常用的参数模板,可以直接套用:

  • 多旋翼 / 普通任务:Param1=0, Param2=3, Param3=5
  • 多旋翼 / 精准悬停:Param1=5, Param2=1, Param3=2
  • 固定翼 / 巡航:Param1=0, Param2=20, Param3=30
  • 固定翼 / 测绘:Param1=0, Param2=15, Param3=15

记住,这些参数不是死的。每次飞行前,根据风速、GPS 精度、任务类型微调。我习惯在第一次飞行时把 Param2 和 Param3 设大 50%,确认航线没问题后再收紧。

好了,这一章的内容就是这些。航点命令是 ArduPilot 规划的基石,把 MAV_CMD_NAV_WAYPOINT 吃透了,后面的命令学起来就快多了。