PX4 Navigator navigation.h 与任务数据协议
一、任务数据协议层的定位
navigation.h 和 safe_point_land.hpp 是 Navigator 模块的 L0 数据协议层,不包含任何运行逻辑,只定义数据语义。后续所有模式(Mission/RTL/Loiter 等)都基于这里定义的结构体进行操作。
二、NAV_CMD — 导航命令枚举
NAV_CMD 定义了任务项的命令类型,决定了 MissionBlock 如何解释该任务项:
| 分类 | 典型值 | 语义 |
|---|---|---|
| 位置控制 | NAV_CMD_WAYPOINT |
飞往指定航点 |
| 起降 | NAV_CMD_TAKEOFF / NAV_CMD_LAND |
起飞 / 降落 |
| 盘旋 | NAV_CMD_LOITER_UNLIMITED / LOITER_TIME_LIMIT / LOITER_TO_ALT |
各类盘旋 |
| VTOL | NAV_CMD_VTOL_TAKEOFF / VTOL_LAND / DO_VTOL_TRANSITION |
VTOL 相关 |
| 动作 | NAV_CMD_DO_CHANGE_SPEED / DO_SET_ROI_* / DO_JUMP |
速度/ROI/跳转 |
| 围栏 | NAV_CMD_NAV_FENCE_* |
围栏点定义 |
is_mission_item_reached_or_completed() 中的第一步就是 switch(nav_cmd),不同命令有截然不同的完成判据:
1 | switch (navigator->get_mission_item()->nav_cmd) { |
三、NAV_FRAME — 坐标系枚举
NAV_FRAME 指定任务项高度的参考框架:
| 值 | 含义 |
|---|---|
MAV_FRAME_GLOBAL |
WGS84 绝对高度(MSL) |
MAV_FRAME_GLOBAL_RELATIVE_ALT |
相对于 Home 的高度(最常用) |
MAV_FRAME_LOCAL_NED |
本地 NED 坐标系 |
MAV_FRAME_GLOBAL_TERRAIN_ALT |
相对地形的高度(需要地形数据) |
MissionBlock::get_absolute_altitude_for_item() 根据 altitude_is_relative 字段和 frame 进行高度换算,统一转为 AMSL 绝对高度后再用于计算。
四、mission_item_s — 核心数据结构
mission_item_s 是整个 Navigator 的统一任务表达结构,所有导航模式都围绕它工作。
4.1 字段分层说明
1 | struct mission_item_s { |
4.2 关键字段使用位置
| 字段 | 主要使用函数 | 说明 |
|---|---|---|
nav_cmd |
is_mission_item_reached_or_completed(), mission_item_to_position_setpoint() |
第一个 switch 分支点 |
acceptance_radius |
is_mission_item_reached_or_completed() |
普通航点水平到达判据 |
loiter_radius |
mission_item_to_position_setpoint() |
固定翼 Loiter、RTL 等盘旋 |
yaw |
is_mission_item_reached_or_completed(), VTOL heading align |
航向到达判据 |
altitude_is_relative |
get_absolute_altitude_for_item(), MissionFeasibilityChecker |
高度换算 |
autocontinue |
MissionBase::on_active(), advance_mission() |
任务自动推进控制 |
vtol_back_transition |
is_mission_item_reached_or_completed(), VTOL landing |
VTOL 回转换判定 |
五、mission_item_to_position_setpoint() 翻译过程
这是从任务语义到控制量的核心翻译函数,将 mission_item_s 转为 position_setpoint_s:
1 | flowchart TD |
position_setpoint_s 的核心字段:
| 字段 | 含义 |
|---|---|
type |
setpoint 类型(POSITION / VELOCITY / LOITER / TAKEOFF / LAND / IDLE) |
lat / lon / alt |
目标全局位置 |
loiter_radius / loiter_direction |
盘旋参数 |
yaw |
目标航向 |
acceptance_radius |
到达半径 |
cruising_speed |
巡航速度限制 |
六、mission_fence_point_s — 围栏数据
围栏数据存储于 dataman,通过 mission_fence_point_s 表达:
- 多边形顶点(
NAV_FRAME_GLOBAL坐标):构成包含/排除多边形 - 圆形区域:中心 + 半径
- Rally 点:安全备降点
Geofence::checkPointAgainstAllGeofences() 读取 dataman 中的围栏数据,判断目标点是否在有效飞行区域内。
七、PositionYawSetpoint — 轻量化位置航向结构
PositionYawSetpoint 是一个简化结构,专用于 RTL、safe point、着陆进近等不需要完整 mission_item_s 复杂语义的场景:
1 | struct PositionYawSetpoint { |
safe_point_land.hpp 中的 land_approaches_s 进一步描述着陆进近的几何形状(入场角、最终进近路径等),主要由 RTL 模式在选择着陆方式时使用。
八、小结
理解 navigation.h 的关键在于:
mission_item_s是 Navigator 内部的统一语言,所有模式构造目标时最终都填充它的字段nav_cmd是最核心的分支依据,它决定了完成判据和 setpoint 翻译方式- 高度字段需要结合
altitude_is_relative和frame才能正确解释 autocontinue控制任务是否自动推进,这是 mission 模式连续执行的基础
上一篇:Navigator 模块架构总览
下一篇:Navigator 主循环与模式调度
系列总目录:PX4 v1.16 源码解读总目录