☰
PX4 FollowTargetStatus 消息解析:跟随目标飞行任务的航向、轨道与云台状态观测
2026/9/28 2:21:12 网站建设 项目流程
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

本篇技术指南围绕 PX4-Autopilot 仓库中的 FollowTargetStatus 消息定义(及其自动生成的文档 FollowTargetStatus.md)展开,介绍该 uORB 消息在"跟随我"(Follow-Me)飞行模式中的实际用途:它由 FlightTaskAutoFollowTarget 飞行任务在每一个控制周期内发布,用于对外输出目标航向估计、当前跟随角度、轨道角设定点、角速度设定点、理想期望位置以及应急爬升与云台俯仰状态。读完本文,你将理解这条消息的每个字段在跟随任务中的生成原理、如何订阅解析它用于调试与日志分析,以及它与其他 uORB 话题(如 follow_target_estimator)之间的调用关系。

FollowTargetStatus 是什么

在 PX4 的飞行模式管理(Flight Mode Manager)框架中,AutoFollowTarget是一个基于 GPS 的自主跟随任务(飞行任务源码位于 src/modules/flight_mode_manager/tasks/AutoFollowTarget)。该任务会:

  • 通过follow_target_estimator话题订阅目标位置/速度估计;
  • 用二阶参考模型(Second Order Reference Model)平滑出运动学上可行的目标位置与速度;
  • 基于 Jerk 受限(Jerk-limited)的轨道角轨迹生成器计算期望的环绕轨道角度;
  • 最终计算出无人机的期望位置、偏航设定点和云台俯仰命令。

FollowTargetStatus正是这个任务对外发布的"状态广播",它把上述计算过程中最有价值的状态量(目标航向估计、轨道角设定点、理想位置等)以 uORB 消息的形式公开出来,便于地面站显示、日志记录和飞行后分析。

消息在源码中以 C 结构体的形式定义在 msg/FollowTargetStatus.msg,其 TOPICS 常量为follow_target_status,意味着生成的头文件中消息类型为follow_target_status_s,uORB 主题 ID 为ORB_ID(follow_target_status)。

字段总览

下表完整列出了FollowTargetStatus的全部字段及其类型、单位和含义(数据与 docs/en/msg_docs/FollowTargetStatus.md 中的字段表保持一致):

名称类型单位 [坐标系]说明
timestampuint64微秒自系统启动以来的时间(hrt_absolute_time())
tracked_target_coursefloat32弧度在 NED 局部坐标系中的被跟踪目标航向(正北方向为航向 0)
follow_anglefloat32弧度当前跟随角度设置
orbit_angle_setpointfloat32弧度来自平滑轨迹生成器的当前轨道角设定点
angular_rate_setpointfloat32弧度/秒由 Jerk 受限的轨道角轨迹为轨道角生成的角速度指令
desired_position_rawfloat32[3]米理想化的期望无人机位置(假设无人机可以瞬间传送)
in_emergency_ascentbool布尔为 true 表示正在应急爬升(距地面高度低于安全高度时)
gimbal_pitchfloat32弧度为使目标保持在画面中心而指令的云台俯仰角

字段逐一深入解析

结合 FlightTaskAutoFollowTarget.cpp 中发布该消息的代码(约第 406~424 行),可以看到每个字段的实际生成逻辑。

timestamp:消息时间戳

发布前直接取实时时钟:

follow_target_status.timestamp = hrt_absolute_time();

与 PX4 其他 uORB 消息一致,该字段表示自系统启动以来的微秒时间,用于日志时间轴对齐与话题同步。

tracked_target_course:被跟踪目标航向

对应任务内部维护的_target_course_rad,表示"目标速度向量指向的方向",在 NED 局部坐标系中以正北为 0。它由 FlightTaskAutoFollowTarget.hpp 中的updateTargetOrientation()方法基于滤波后的目标速度计算,且带有一个速度死区常量TARGET_SPEED_DEADZONE_FOR_ORIENTATION_TRACKING = 1.0 m/s:当目标速度低于该值时,航向跟踪会被冻结,因为低速下目标朝向估计噪声较大。源码注释还指出,滤波后的速度在目标停下时可能产生过冲(overshoot),因此updateTargetOrientation()会同时参考未滤波速度来避免在目标已停止时错误更新朝向。

follow_angle:当前跟随角度设置

对应任务内部维护的_follow_angle_rad(初始为 0.0 rad),表示无人机在目标周围的跟随方位角。它既可由参数FLW_TGT_FA设定,也可在飞行中通过遥控器摇杆实时调整(见下文"与参数的关系")。

orbit_angle_setpoint:轨道角设定点

对应_orbit_angle_setpoint_rad,来自任务内部的 Jerk 受限轨道角轨迹生成器(VelocitySmoothing _orbit_angle_traj_generator)。该设定点是在目标航向的基础上叠加跟随角度得到的、经过运动学约束平滑后的目标环绕角,无人机围绕目标做弧形机动时即跟踪此角度。

angular_rate_setpoint:轨道角角速度设定点

发布代码中直接取自轨迹生成器的当前速度:

follow_target_status.angular_rate_setpoint = _orbit_angle_traj_generator.getCurrentVelocity();

结合头文件中的常量,该角速度轨迹由以下参数约束生成:

  • ORBIT_TRAJECTORY_MAX_JERK = 4.0 (m/s³)
  • ORBIT_TRAJECTORY_MAX_ACCELERATION = 2.0 (m/s²)

(角度轨迹在实现上以"轨道半径 × 角量"的方式映射为切向运动量,因此这里的加加速度/加速度单位对应于切向运动。)

desired_position_raw:理想期望位置

这是一个float32[3](NED 三轴,单位米)。发布代码调用calculateDesiredDronePosition(),直接根据滤波后的目标位置与"原始"轨道角设定点(未经过 Jerk 限速的即时值)计算无人机应在的位置:

const Vector3f drone_desired_position_raw = calculateDesiredDronePosition( _target_position_velocity_filter.getState(), raw_orbit_angle_setpoint); drone_desired_position_raw.copyTo(follow_target_status.desired_position_raw);

注释将其描述为"假设无人机可以瞬间从一处传送到另一处"时的理想位置,即不包含实际飞行动力学延迟的位置。对比它和真实位置设定点,可以直观评估跟随任务的实际跟踪误差与响应速度。

in_emergency_ascent:应急爬升标志

当无人机距地面距离小于安全高度常量MINIMUM_SAFETY_ALTITUDE = 1.0 m时置为 true:

in_emergency_ascent = PX4_ISFINITE(_dist_to_ground) && _dist_to_ground < MINIMUM_SAFETY_ALTITUDE; if (in_emergency_ascent) { _position_setpoint(0) = _position_setpoint(1) = NAN; _position_setpoint(2) = _position(2); _velocity_setpoint(0) = _velocity_setpoint(1) = 0.0f; _velocity_setpoint(2) = -EMERGENCY_ASCENT_SPEED; // Slowly ascend }

应急爬升期间,水平位置设定点被置为 NAN(不控制水平方向),垂直速度设定为EMERGENCY_ASCENT_SPEED = 0.5 m/s向上缓慢爬升,防止贴地飞行时撞地。该字段供外部观察者(地面站、日志分析)判断无人机是否正处于保护性爬升状态。

gimbal_pitch:云台俯仰指令

云台俯仰角由pointGimbalAt()方法根据无人机与目标的水平距离和垂直高度差计算得出,目标是把被跟随目标保持在画面中心:

const float gimbal_height = calculateGimbalHeight((kFollowAltitudeMode)_param_flw_tgt_alt_m.get(), target_position_filtered(2)); gimbal_pitch = pointGimbalAt(drone_to_target_vector.norm(), gimbal_height);

该值既被发布到gimbal_manager_set_attitude话题用于实际控制云台(Gimbal v2 服务),也被写入gimbal_pitch字段用于日志记录(头文件注释明确写有 "for logging in follow_target_status uORB message")。注意:当无人机距离目标过近(小于MINIMUM_DISTANCE_TO_TARGET_FOR_YAW_CONTROL = 1.0 m)时不做偏航控制,云台接管画面跟踪,此时该字段的语义尤为重要。

发布周期与调用链

FollowTargetStatus由FlightTaskAutoFollowTarget::update()在每个控制循环末尾构建并发布(发布代码)。该飞行任务类在 FlightTaskAutoFollowTarget.hpp 中声明了对应的发布器:

uORB::Publication<follow_target_status_s> _follow_target_status_pub{ORB_ID(follow_target_status)};

其上游数据来源是目标估计器话题follow_target_estimator(由同目录下的 follow_target_estimator/TargetEstimator.hpp 实现的 Alpha-Beta-Gamma 滤波器输出):

uORB::Subscription _follow_target_estimator_sub{ORB_ID(follow_target_estimator)};

数据流简化为:follow_target_estimator(目标位置/速度粗估计)→ 二阶参考模型平滑 → 目标航向/轨道角/理想位置计算 → 位置与速度设定点 +follow_target_status状态发布。目标估计如果超过TARGET_ESTIMATOR_TIMEOUT_US = 1500000 µs(1.5 秒)未更新,任务会重置目标位置/速度滤波器。

与参数的关系

AutoFollowTarget任务的行为由一组FLW_TGT_*参数控制(定义于 follow_target_params.yaml,分组名为 "Follow target")。其中与FollowTargetStatus各字段直接相关的有:

参数类型/默认值作用
FLW_TGT_HTfloat,默认 8.0 m跟随高度(目标上方),影响calculateGimbalHeight()的输入,进而影响gimbal_pitch
FLW_TGT_DSTfloat,默认 8.0 m(最小 1.0 m)与目标的跟随距离,影响期望位置与偏航控制是否生效(小于 1 m 时不做偏航控制)
FLW_TGT_FAfloat,默认 180.0°,范围 -180°~180°跟随方位角,0° 表示目标航向正前方,顺时针增加(右侧 90°,左侧 -90°);越界值会被包裹处理(如 480°→120°)。对应follow_angle字段的初始值
FLW_TGT_ALT_Menum,默认 0高度模式:0=相对 home 保持恒定高度(2D);1=相对下方地形保持高度;2=跟踪目标高度(3D,注意 GPS 高度偏差通常使其不可用)。该枚举值直接决定calculateGimbalHeight()中云台高度的计算方式
FLW_TGT_MAX_VELfloat,默认 5.0 m/s(0~20)环绕轨道轨迹的最大切向速度,轨道角设定点变化越频繁/越剧烈,该值决定跟随的激进程度
FLW_TGT_RSfloat,默认 0.1(0~1)目标估计器对目标移动的响应度,值越低对位置变化越敏感(噪声抑制越差),影响follow_target_estimator的输出质量

如何订阅与使用

该话题默认不会出现在日志中,需要通过配置显式启用。在 src/modules/logger/logged_topics.cpp 中可以看到其日志配置为可选话题(rate 400 Hz 的上限):

add_optional_topic("follow_target_status", 400);

飞行中查看

在 SITL(软件在环仿真)或真机调试时,可以用listener命令在 PX4 终端(NSH 控制台)中实时订阅并打印该话题:

listener follow_target_status

该命令会持续打印消息内容,便于实时观察tracked_target_course、orbit_angle_setpoint、in_emergency_ascent等字段的变化。

日志分析

在 QGroundControl 或 MAVLink 地面站中勾选相应日志话题后,.ulog文件会记录follow_target_status,随后可用 Flight Review 等工具(或 PX4 自带的 Tools/ecl_ekf 日志分析脚本)查看:

  • tracked_target_course与orbit_angle_setpoint:验证目标航向估计是否稳定、轨道角轨迹是否平滑收敛;
  • angular_rate_setpoint:核对角速度指令是否超出合理范围(反映 Jerk/加速度限制是否生效);
  • desired_position_raw与实际位置设定点对比:评估跟随控制的理想—实际差距;
  • in_emergency_ascent:确认是否发生过保护性应急爬升(结合高度曲线可排查贴地飞行风险)。

消息文件与代码对照小结

将消息字段与发布代码一一对照,可以快速建立"消息 → 实现"的映射:

FollowTargetStatus 字段实现出处(FlightTaskAutoFollowTarget)
timestamphrt_absolute_time()
tracked_target_course_target_course_rad(由updateTargetOrientation()维护)
follow_angle_follow_angle_rad(初始 0,可摇杆调整)
orbit_angle_setpoint_orbit_angle_setpoint_rad(由updateOrbitAngleTrajectory()维护)
angular_rate_setpoint_orbit_angle_traj_generator.getCurrentVelocity()
desired_position_rawcalculateDesiredDronePosition(filtered_target_pos, raw_orbit_angle_setpoint)
in_emergency_ascent_dist_to_ground < MINIMUM_SAFETY_ALTITUDE(1.0 m)
gimbal_pitchpointGimbalAt(xy_distance, gimbal_height)

通过这条消息,开发者无需深入飞行任务内部代码,即可在外围模块、地面站或日志分析中完整获取跟随模式的核心状态,是调试"跟随我"功能、评估目标航向估计质量与轨道机动平滑度的第一手数据来源。

  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

相关推荐

上一篇:PSD开源项目安装与使用指南
下一篇:🍖 LTUI:基于Lua的跨平台终端UI库

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询