- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
本篇技术指南围绕 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 中的字段表保持一致):
| 名称 | 类型 | 单位 [坐标系] | 说明 |
|---|---|---|---|
| timestamp | uint64 | 微秒 | 自系统启动以来的时间(hrt_absolute_time()) |
| tracked_target_course | float32 | 弧度 | 在 NED 局部坐标系中的被跟踪目标航向(正北方向为航向 0) |
| follow_angle | float32 | 弧度 | 当前跟随角度设置 |
| orbit_angle_setpoint | float32 | 弧度 | 来自平滑轨迹生成器的当前轨道角设定点 |
| angular_rate_setpoint | float32 | 弧度/秒 | 由 Jerk 受限的轨道角轨迹为轨道角生成的角速度指令 |
| desired_position_raw | float32[3] | 米 | 理想化的期望无人机位置(假设无人机可以瞬间传送) |
| in_emergency_ascent | bool | 布尔 | 为 true 表示正在应急爬升(距地面高度低于安全高度时) |
| gimbal_pitch | float32 | 弧度 | 为使目标保持在画面中心而指令的云台俯仰角 |
字段逐一深入解析
结合 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_HT | float,默认 8.0 m | 跟随高度(目标上方),影响calculateGimbalHeight()的输入,进而影响gimbal_pitch |
| FLW_TGT_DST | float,默认 8.0 m(最小 1.0 m) | 与目标的跟随距离,影响期望位置与偏航控制是否生效(小于 1 m 时不做偏航控制) |
| FLW_TGT_FA | float,默认 180.0°,范围 -180°~180° | 跟随方位角,0° 表示目标航向正前方,顺时针增加(右侧 90°,左侧 -90°);越界值会被包裹处理(如 480°→120°)。对应follow_angle字段的初始值 |
| FLW_TGT_ALT_M | enum,默认 0 | 高度模式:0=相对 home 保持恒定高度(2D);1=相对下方地形保持高度;2=跟踪目标高度(3D,注意 GPS 高度偏差通常使其不可用)。该枚举值直接决定calculateGimbalHeight()中云台高度的计算方式 |
| FLW_TGT_MAX_VEL | float,默认 5.0 m/s(0~20) | 环绕轨道轨迹的最大切向速度,轨道角设定点变化越频繁/越剧烈,该值决定跟随的激进程度 |
| FLW_TGT_RS | float,默认 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) |
|---|---|
| timestamp | hrt_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_raw | calculateDesiredDronePosition(filtered_target_pos, raw_orbit_angle_setpoint) |
| in_emergency_ascent | _dist_to_ground < MINIMUM_SAFETY_ALTITUDE(1.0 m) |
| gimbal_pitch | pointGimbalAt(xy_distance, gimbal_height) |
通过这条消息,开发者无需深入飞行任务内部代码,即可在外围模块、地面站或日志分析中完整获取跟随模式的核心状态,是调试"跟随我"功能、评估目标航向估计质量与轨道机动平滑度的第一手数据来源。
- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
相关推荐
5款免费开源网络拓扑工具:从手画到自动更新拓扑
5款免费开源网络拓扑工具:从手画到自动更新拓扑 网络变更前夜,你要向客户讲清故障路径,翻遍共享盘只找到半年前的旧拓扑图——这种窘境很常见。开源项目 Awesom
嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot UORB 消息详解:FailureDetectorStatus 故障检测器状态消息
PX4 Autopilot UORB 消息详解:FailureDetectorStatus 故障检测器状态消息 failure_detector_status
嵌入式物联网机器人自动驾驶智能硬件torchtitan-npu Checkpoint使用指南:DCP断点续训与HuggingFace权重互转一站式搞定
torchtitan npu Checkpoint使用指南:DCP断点续训与HuggingFace权重互转一站式搞定 torchtitan npu 是基于 to
嵌入式物联网机器人自动驾驶智能硬件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考