news 2026/9/28 2:42:03

PX4-Autopilot LandingTargetPose 消息深度解析:精密着陆目标相对/绝对位姿的发布链路、字段语义与消费方

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PX4-Autopilot LandingTargetPose 消息深度解析:精密着陆目标相对/绝对位姿的发布链路、字段语义与消费方
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

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

本篇技术指南以 PX4-Autopilot 的 uORB 消息landing_target_pose为核心,完整解析其 19 个字段的帧系与单位语义、源消息定义(msg/LandingTargetPose.msg)、生产模块landing_target_estimator的卡尔曼滤波发布链路、相关LTEST_*参数,以及 EKF2 辅助速度融合、导航模块精密起飞(Precision Takeoff)、MAVLinkLANDING_TARGET流等消费方。读完本文,你将掌握该消息从传感器原始观测到导航级目标位姿的完整数据流,并能在实际项目中正确解读、调试与扩展精密着陆功能。

消息概览与设计意图

LandingTargetPose是 PX4 精密着陆(Precision Landing)与精密起飞(Precision Takeoff)体系中的核心 uORB 消息,其官方定义为:

Relative position of precision land target in navigation (body fixed, north aligned, NED) and inertial (world fixed, north aligned, NED) frames.

即同时携带两种坐标系下的目标描述:

  • 导航坐标系(navigation frame):目标相对飞行器的相对位置/速度,坐标轴为北(X)、东(Y)、下(Z),即 NED 对齐,方向与地磁北/航向参考一致;
  • 惯性坐标系(inertial frame):目标相对导航原点的绝对位置(x_abs/y_abs/z_abs),同样为北对齐 NED 系。

该消息的发布主题名为landing_target_pose(来自 msg/LandingTargetPose.msg 及 uORB 生成代码ORB_ID(landing_target_pose))。其设计意图是:将机载传感器(如 IRLOCK 红外相机)或外部定位系统观测到的目标信息,经过滤波估计后,以统一的位姿/速度/协方差结构发布出来,供导航与飞行控制链路消费。

字段逐项详解

LandingTargetPose共 19 个字段,分为时间戳、状态标志、相对状态(位置/速度)、相对协方差、绝对位置五组。下表字段、类型、单位与描述与 docs/en/msg_docs/LandingTargetPose.md 完全一致:

字段类型单位语义
timestampuint64us系统启动以来的时间(时间戳)
is_staticbool-目标相对地面是静止还是运动的标志
rel_pos_validbool-相对位置是否有效
rel_vel_validbool-相对速度是否有效
rel_vel_ekf2_validbool-相对速度是否可用于 EKF2 辅助速度融合
x_relfloat32m目标相对飞行器的 X/北向位置(导航系)
y_relfloat32m目标相对飞行器的 Y/东向位置(导航系)
z_relfloat32m目标相对飞行器的 Z/下向位置(导航系)
vx_relfloat32m/s目标相对飞行器的 X/北向速度(导航系)
vy_relfloat32m/s目标相对飞行器的 Y/东向速度(导航系)
vz_relfloat32m/s目标相对飞行器的 Z/下向速度(导航系)
cov_x_relfloat32m²X/北向位置方差
cov_y_relfloat32m²Y/东向位置方差
cov_z_relfloat32m²Z/下向位置方差
cov_vx_relfloat32(m/s)²X/北向速度方差
cov_vy_relfloat32(m/s)²Y/东向速度方差
cov_vz_relfloat32(m/s)²Z/下向速度方差
abs_pos_validbool-绝对位置是否有效
x_absfloat32m目标相对导航原点的 X/北向位置(导航系)
y_absfloat32m目标相对导航原点的 Y/东向位置(导航系)
z_absfloat32m目标相对导航原点的 Z/下向位置(导航系)

关键字段语义澄清

  • rel_vel_ekf2_valid与is_static的耦合:从 LandingTargetEstimator.cpp 的实现可见,生产方以rel_vel_ekf2_valid = is_static && rel_vel_valid的方式赋值。即只有目标被标记为静止(LTEST_MODE=1)时,相对速度才被允许用于 EKF2 辅助速度融合——因为对移动目标而言,相对速度无法直接反推机体地速;
  • z_rel的语义:虽然vz_rel/cov_z_rel在消息中存在,但当前landing_target_estimator实现中z_rel直接取自传感器测距(见下文_dist_z),并未经过卡尔曼滤波,vz_rel、cov_z_rel由该模块发布时保持默认零值,主要保留给其他生产方(如视觉目标估计器)使用;
  • 相对量与绝对量的关系:绝对位置 = 相对位置 + 机体本地位置(x_abs = x_rel + vehicle_local_position.x等),仅当机体本地位置xy_valid有效时abs_pos_valid才为真。

源消息定义:msg/LandingTargetPose.msg

消息的真实定义位于仓库根目录的 msg/LandingTargetPose.msg,构建时由Tools/msg/px_generate_uorb_topic_files.py生成 C/C++ 头文件与 IDL 定义。其完整内容如下:

# Relative position of precision land target in navigation (body fixed, north aligned, NED) and inertial (world fixed, north aligned, NED) frames uint64 timestamp # [us] Time since system start bool is_static # [-] Flag indicating whether the landing target is static or moving with respect to the ground bool rel_pos_valid # [-] Flag showing whether relative position is valid bool rel_vel_valid # [-] Flag showing whether relative velocity is valid bool rel_vel_ekf2_valid # [-] Flag showing whether relative velocity is valid for EKF2 auxiliary velocity aiding float32 x_rel # [m] X/north position of target, relative to vehicle (navigation frame) float32 y_rel # [m] Y/east position of target, relative to vehicle (navigation frame) float32 z_rel # [m] Z/down position of target, relative to vehicle (navigation frame) float32 vx_rel # [m/s] X/north velocity of target, relative to vehicle (navigation frame) float32 vy_rel # [m/s] Y/east velocity of target, relative to vehicle (navigation frame) float32 vz_rel # [m/s] Z/down velocity of target, relative to vehicle (navigation frame) float32 cov_x_rel # [m^2] X/north position variance float32 cov_y_rel # [m^2] Y/east position variance float32 cov_z_rel # [m^2] Z/down position variance float32 cov_vx_rel # [(m/s)^2] X/north velocity variance float32 cov_vy_rel # [(m/s)^2] Y/east velocity variance float32 cov_vz_rel # [(m/s)^2] Z/down velocity variance bool abs_pos_valid # [-] Flag showing whether absolute position is valid float32 x_abs # [m] X/north position of target, relative to origin (navigation frame) float32 y_abs # [m] Y/east position of target, relative to origin (navigation frame) float32 z_abs # [m] Z/down position of target, relative to origin (navigation frame)

值得注意的编码细节:

  • 全部数值字段使用float32:位置、速度、方差各 9 个float32字段,加上 5 个布尔标志与 1 个uint64时间戳。布尔字段在 uORB 序列化中按位打包,整套消息体积很小,适合高频发布与日志记录;
  • 单位注释规范:每个字段的# [unit]注释遵循 PX4 uORB 消息惯例,方差字段明确区分m^2(位置方差)与(m/s)^2(速度方差),避免歧义;
  • 无 Range/Enum 约束:该消息所有字段均为自由取值,不设范围校验,因此消费方必须依赖各*_valid标志判断数据可用性。

生产方:landing_target_estimator 模块的发布链路

在默认机架配置中,landing_target_pose主要由 src/modules/landing_target_estimator 模块(landing_target_estimator)发布。该模块的类定义与实现分别在 LandingTargetEstimator.h 与 LandingTargetEstimator.cpp 中。

数据流总览

模块update()的典型执行流程如下:

  1. 订阅输入(_update_topics):订阅vehicle_local_position、vehicle_attitude、vehicle_acceleration与irlock_report(IRLOCK 红外传感器报告);
  2. 预测步:若估计器已初始化且未超时,利用机体加速度(经姿态旋转到导航系后取负)对 x/y 两个独立一维卡尔曼滤波器做时间预测;
  3. 量测转换:收到新的irlock_report后,将传感器像素坐标先经LTEST_SCALE_X/Y缩放、再按LTEST_SENS_ROT旋转得到机体坐标系下的单位射线,随后用机体姿态旋转到导航系,最后按下视距离dist_bottom缩放成米制相对位置(LandingTargetEstimator.cpp);
  4. 更新步:用相对位置量测更新 x/y 两个卡尔曼滤波器,量测不确定性按LTEST_MEAS_UNC * dist_z²计算;
  5. 发布:量测未被拒绝时填充并发布landing_target_pose,同时发布新息到landing_target_innovations。

关键实现细节(可直接在源码中印证)

  • 超时重置机制:常量landing_target_estimator_TIMEOUT_US = 2000000(2 秒)。若在 2 秒内未收到新量测,模块打印Lost sight of Marker并重置估计器,等待下一次观测重新初始化(LandingTargetEstimator.h、LandingTargetEstimator.cpp);
  • 量测拒绝与_faulty标志:当任一轴的卡尔曼更新返回失败时,打印Landing target measurement rejected日志;只有两轴都通过才发布位姿(LandingTargetEstimator.cppL123-L182);
  • 初始化逻辑:首次观测时以rel_pos_x/rel_pos_y为位置初值、以机体地速的负值为目标速度初值(vx_init = -vehicle_local_position.vx),并用LTEST_POS_UNC_IN/LTEST_VEL_UNC_IN作为初始方差(L112-L121);
  • 绝对位置合成:在机体本地位置有效(xy_valid)时,x_abs = x_rel + local_pos.x、y_abs = y_rel + local_pos.y、z_abs = rel_pos_z + local_pos.z,并置abs_pos_valid = true;否则置 false(L168-L176);
  • is_static来源:直接取自LTEST_MODE == Stationary(L151)。

卡尔曼滤波器结构

滤波器实现位于 KalmanFilter.h 与 KalmanFilter.cpp。估计器对北向(x)与东向(y)各维护一个独立的一维常量加速度卡尔曼滤波器(状态含位置与速度),因此cov_x_rel/cov_vx_rel与cov_y_rel/cov_vy_rel分别对应两个滤波器输出的协方差,而cov_z_rel、cov_vz_rel不在该模块的滤波范围内。

相关参数:LTEST_* 系列

landing_target_estimator的全部参数定义在 src/modules/landing_target_estimator/landing_target_estimator_params.yaml 中,构建时生成到参数系统。下表完整列出:

参数类型默认值单位说明
LTEST_MODE枚举0-着陆目标模式:0=Moving(目标可能移动,量测不用于辅助定位);1=Stationary(目标静止,相对速度用于辅助速度估计)
LTEST_ACC_UNCfloat10.0(m/s²)²用于目标位置预测的加速度量测方差;值越大,对量测跟踪越紧、异常值剔除越宽松
LTEST_MEAS_UNCfloat0.005tan(rad)²驱动器的着陆目标量测方差;值越大,对量测跟踪越弱、输出越平滑、被拒绝的量测越少
LTEST_POS_UNC_INfloat0.1m²相对着陆目标位置(x/y)的初始方差,最小 0.001
LTEST_VEL_UNC_INfloat0.1(m/s)²相对着陆目标速度(x/y)的初始方差,最小 0.001
LTEST_SCALE_Xfloat1.0-传感器 x 轴量测缩放因子,最小 0.01
LTEST_SCALE_Yfloat1.0-传感器 y 轴量测缩放因子,最小 0.01
LTEST_SENS_ROT枚举2-IRLOCK 传感器相对机体的旋转:0=无旋转、1=偏航45°、2=偏航90°、3=偏航135°、4=偏航180°、5=偏航225°、6=偏航270°、7=偏航315°(默认偏航 90°),需重启生效
LTEST_SENS_POS_Xfloat0.0mIRLOCK 在机体坐标系中的 X 位置(前向),需重启生效
LTEST_SENS_POS_Yfloat0.0mIRLOCK 在机体坐标系中的 Y 位置(右向),需重启生效
LTEST_SENS_POS_Zfloat0.0mIRLOCK 在机体坐标系中的 Z 位置(下向),需重启生效

参数影响解读:LTEST_MODE直接决定is_static与rel_vel_ekf2_valid的取值;LTEST_SENS_ROT与三个LTEST_SENS_POS_*用于将传感器安装朝向/安装位置造成的偏差在量测进入滤波器之前校正(见 LandingTargetEstimator.cpp)。在 QGroundControl 参数界面或地面站中可通过搜索前缀LTEST过滤查看。

消费方与应用场景

landing_target_pose在仓库中被多个模块订阅,构成精密着陆/起飞的完整消费链路。

1. EKF2 辅助速度融合(速度辅助定位)

src/modules/ekf2/params_aux_velocity.yaml 中定义的EKF2_AVEL_EN参数说明明确指出:

Fuse the landing-target relative velocity as auxiliary velocity … When enabled, EKF2 fuses the relative velocity published in landing_target_pose … only fused when landing_target_pose.rel_vel_ekf2_valid is true.

即当目标静止(LTEST_MODE=1)时,EKF2 可将landing_target_pose中的相对速度作为辅助速度源参与位置/速度估计,这在 GPS 受限场景(如室内、桥下)下可显著改善定位。对应实现位于 src/modules/ekf2/EKF2.cpp,相关延迟参数见EKF2_AVEL_DELAY。

2. 导航模块:精密起飞(Precision Takeoff)

src/modules/navigator/prec_takeoff.cpp 中的PrecTakeoff::update_setpoint订阅该消息,并在满足以下条件时使用其绝对位置修正起飞航点:

  • 目标时间戳新鲜(now - timestamp < kTargetTimeoutUs);
  • abs_pos_valid为真且x_abs/y_abs为有限值;
  • 目标时间戳晚于本地坐标系原点重置时间(ref_timestamp),且机体位置处于全球坐标系有效状态(xy_global)。

满足条件后,模块将x_abs/y_abs通过_map_ref.reproject反投影为经纬度航点,使飞行器在垂直起飞后保持于着陆坪上方。与之配合的参数为MIS_TKO_PREC、MIS_TKO_PREC_DLY(见 docs/en/advanced_features/precland.md)。

3. MAVLink 外发:LANDING_TARGET 流

src/modules/mavlink/streams/LANDING_TARGET.hpp 定义了MavlinkStreamLandingTarget流,将landing_target_pose的timestamp/x_rel/y_rel/z_rel/rel_pos_valid映射为 MAVLinkLANDING_TARGET消息(MAV_FRAME_LOCAL_NED),供地面站、外部定位系统或 GCS 可视化使用。反向地,外部系统也可通过 MAVLink 注入目标信息(见 src/modules/mavlink/mavlink_receiver.cpp)。

4. 视觉目标估计器(Vision Target Estimator)

src/modules/vision_target_estimator/Position/VTEPosition.h 同样会发布landing_target_pose,用于为视觉目标(ArUco 码、着陆坪图案等)提供滤波后的位姿。它发布的is_static等标志语义与 landing_target_estimator 一致,两类生产方可通过uORB多发布者机制并存,具体选用取决于机架配置(相关说明见 docs/en/advanced_features/vision_target_estimator_advanced.md)。

5. 日志与回放

src/modules/logger/logged_topics.cpp 将landing_target_pose列入默认/可配置日志主题,飞行日志(.ulg)中可直接检索该主题进行事后分析;src/modules/replay/ReplayEkf2.cpp 在回放模式下也会消费该主题,用于复现 EKF2 的辅助速度融合行为。

在精密着陆工作流中的位置

按 docs/en/advanced_features/precland.md 的描述,精密着陆支持多旋翼在静止或移动目标上降落,目标可由机载 IR 传感器+信标或外部定位系统提供。landing_target_pose在此工作流中的角色是目标信息在传感器与导航/控制之间的统一接口:

  • 水平接近阶段:导航模块消费相对位置x_rel/y_rel判断目标是否进入水平收敛半径(PLD_HACC_RAD);
  • 目标上方下降与最终进近阶段:持续消费相对位置维持机体居中于目标上方(PLD_FAPPR_ALT以下进入最终进近);
  • 目标丢失处理:若 2 秒内无新位姿(对应估计器超时重置与导航侧kTargetTimeoutUs),精密着陆退化为搜索流程(PLD_SRCH_ALT/PLD_SRCH_TOUT)或常规降落;
  • 偏航对齐:可选地通过vte_orientation(另一 uORB 消息)将机体偏航对齐目标朝向,相关参数PLD_YAW_EN、VTE_EN、VTE_YAW_EN见 docs/en/advanced_features/vision_target_estimator_advanced.md。

调试与观测建议

  • 实时观测:在 SITL 或真机上运行landing_target_estimator后,可用listener landing_target_pose(PX4 控制台/NSH 命令)实时打印消息字段,重点观察rel_pos_valid、is_static、abs_pos_valid与x_rel/y_rel是否随目标移动合理变化;
  • 日志分析:使用 Flight Review 或ulog工具打开.ulg文件中的landing_target_pose主题,对比x_rel与机体本地位置可验证绝对位置合成是否正确(x_abs ≈ x_rel + local_pos.x);
  • 参数排查顺序:若位姿长期无效,依次检查LTEST_SENS_ROT(安装朝向)、LTEST_SCALE_X/Y(像素缩放)、LTEST_SENS_POS_*(安装偏移)是否与实际安装一致,并确认LTEST_MODE与目标运动状态匹配(移动目标用 0,静止目标用 1 才能启用 EKF2 辅助速度);
  • MAVLink 验证:通过地面站查看LANDING_TARGET消息是否持续刷新,可确认从landing_target_pose到外发链路的映射是否正常。

综上,LandingTargetPose虽然只是一条 uORB 消息,但它贯穿 PX4 精密着陆的感知—估计—导航—控制全链路:生产方 landing_target_estimator 负责将传感器原始观测滤波为导航级位姿,消费方则覆盖 EKF2 辅助速度、精密起飞航点修正、MAVLink 外发与日志回放。理解其字段语义与发布/订阅关系,是二次开发精密着陆或自定义目标检测模块的第一步。

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

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

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

相关推荐

上一篇:10分钟掌握xsv时空索引:从CSV提速到地理数据处理
下一篇:iOS开发资源:NVActivityIndicatorView学习路径与进阶指南

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 2:42:01

做韦恩图的网站2026最新

3款免费工具实测:零代码做韦恩图网站,W3C标准保排名 想做个能画韦恩图的网站,但看着后台代码就头疼?这种“自己不会代码想做网站”的焦虑,我见过太多站长踩过坑。别慌,现在完全不需要你手写一行前端逻辑。 我花了两周时间,把市面上主流的 免费工具…

作者头像 李华
网站建设 2026/9/28 2:42:00

改需求拖一周?一文搞懂企业网站建设内容程序开发

改需求拖一周?一文搞懂企业网站建设内容程序开发 “改个按钮颜色,代码怎么还要等一周?” 这是很多甲方爸爸或者业务部门同事在催进度时最爱抱怨的话。作为在网站建设圈子里摸爬滚打十年的老兵,我太熟悉这种场景了。很多老板以为网站就是个网页,改改图片、调调文字就行,结果发现改个需求,开发团队要排期、要测试、要…

作者头像 李华
网站建设 2026/9/28 2:41:51

如何做网站活动封面详细步骤

3天搞定网站活动封面避坑指南:拒绝拖稿 上周三下午四点,甲方销售总监急匆匆冲进会议室,把手机拍在桌上:“周五的大促活动,封面图必须上线,不然流量全跑了。”我还没反应过来,他补充道:“之前找的那家建站公司,改个Banner拖了一周,这次你们得救火。”这种场景,对于做过多年建站和前端开发的老兵来说,简直…

作者头像 李华
网站建设 2026/9/28 2:41:41

旅游门户网站建设避坑指南:备案与性能优化实战

旅游门户网站建设避坑指南:备案与性能优化实战 刚接手一个旅游门户项目,客户拿着手机急得跳脚,说网站打不开。我一看后台,域名解析正常,服务器活着,唯独卡在访问页面全是空白,或者报403错误。问清缘由,原来是ICP备案还没下来,或者备案主体和域名解析IP对不上。这种“备案流程一头雾水”导致的上线延误,在…

作者头像 李华
网站建设 2026/9/28 2:41:35

搞懂网页制作标准这5步,备案不迷糊

搞懂网页制作标准这5步,备案不迷糊 别再说备案流程一头雾水了,90%的中小企业老板卡在这里,不是代码写不好,而是没搞懂 网页制作标准 背后的合规逻辑。其实,只要把技术选型、代码规范和部署细节对齐 最佳实践…

作者头像 李华