☰
PX4 Autopilot 中 EstimatorAidSource1d uORB 消息详解:一维估计辅助源的融合状态、新息与健康监测
2026/9/27 10:30:54 网站建设 项目流程
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

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

导读

EstimatorAidSource1d是 PX4 Autopilot 中 EKF2 姿态与导航估计器(src/modules/ekf2)对外发布的一维"估计辅助源"状态消息。它把气压计高度、GNSS 高度、测距仪高度、空速、侧滑角、外接视觉高度/航向等单维观测量的原始观测、新息(innovation)、新息方差、测试比(test ratio)与融合结果统一打包成 uORB 话题,供飞行日志分析、机载调试与外部 Agent 直接消费。读完本文,你将掌握该消息的 14 个字段含义与取值范围、10 个实例话题的物理语义、底层融合判定逻辑(源码级),以及如何用它诊断 EKF2 对每个辅助源的健康状态。

一、消息概述:什么是一维估计辅助源

EKF2 状态估计融合多种传感器的观测来约束状态。按观测维度划分,辅助源分为:

  • 1 维:高度、空速、侧滑角、航向(偏航)等标量观测量 →EstimatorAidSource1d;
  • 2 维:水平位置、速度等 →EstimatorAidSource2d;
  • 3 维:磁场、角速度等 →EstimatorAidSource3d。

EstimatorAidSource1d即一维辅助源的统一载体。原消息定义位于 msg/EstimatorAidSource1d.msg,其# TOPICS声明将该结构复用到以下 10 个话题(每个话题对应一种一维观测源):

话题名物理含义
estimator_aid_src_baro_hgt气压计高度辅助源
estimator_aid_src_ev_hgt外接视觉(External Vision)高度辅助源
estimator_aid_src_gnss_hgtGNSS 高度辅助源
estimator_aid_src_rng_hgt测距仪(Range Finder)相对地高度辅助源
estimator_aid_src_ranging_beacon测距信标(Ranging Beacon)辅助源
estimator_aid_src_airspeed空速辅助源
estimator_aid_src_sideslip侧滑角辅助源
estimator_aid_src_fake_hgt虚拟/占位高度辅助源
estimator_aid_src_gnss_yawGNSS 航向辅助源
estimator_aid_src_ev_yaw外接视觉航向辅助源

话题注册见 msg/CMakeLists.txt,构建时由 uORB 代码生成器(Tools/msg)自动产出estimator_aid_source1d_s结构体与 ORB ID。

二、字段全解:14 个字段的语义、类型与计算来源

2.1 时间戳类字段

字段类型说明
timestampuint64消息发布时间(微秒,系统启动后经过时间),由发布模板在发送时填入hrt_absolute_time()
timestamp_sampleuint64原始数据的采样时间戳(微秒),即底层传感器数据到达 EKF 的时刻,用于时间对齐与延迟补偿
time_last_fuseuint64上一次成功融合该辅助源的时刻(微秒),对应源码中的_time_delayed_us

2.2 身份与来源字段

字段类型说明
estimator_instanceuint8EKF2 实例编号(多实例估计模式下区分主/从估计器),由发布模板填充_instance
device_iduint32产生该观测的传感器设备 ID,用于关联到具体物理传感器

2.3 观测与新息字段

字段类型说明
observationfloat32传感器观测值(如气压计换算高度、空速、侧滑角)
observation_variancefloat32观测噪声方差,由传感器噪声参数与数据质量计算
innovationfloat32新息 = 观测值 − 状态预测值,如源码updateVerticalPositionAidStatus中innovation = -_gpos.altitude() - observation(position_fusion.cpp)
innovation_filteredfloat32低通滤波后的新息,用于平滑展示与检测持续性偏差
innovation_variancefloat32新息方差 = 对应状态方差 + 观测方差,源码为getStateVariance<State::pos>()(2) + observation_variance

2.4 统计检验与结果字段

字段类型说明
test_ratiofloat32归一化新息平方:test_ratio = innovation² / (innovation_gate² × innovation_variance)
test_ratio_filteredfloat32带符号的滤波测试比(滤波时保留新息符号),用于趋势监测
innovation_rejectedbool该观测是否被拒绝(true表示被拒绝,不参与融合)
fusedbool该样本是否被成功融合进状态(true表示融合成功)

三、源码级解析:辅助源状态如何生成与发布

3.1 状态更新核心:updateAidSourceStatus

所有一维辅助源的状态字段统一由Ekf::updateAidSourceStatus()生成(ekf_helper.cpp),其逻辑揭示了各统计量的精确定义:

  • 测试比:test_ratio = sq(innovation) / (sq(innovation_gate) * innovation_variance),其中innovation_gate由各辅助源的融合门限参数(如 GPS 的EKF2_GPS_CHECK、气压计的EKF2_HGT_*)决定;
  • 滤波:以时间常数tau = 0.5 s、alpha = dt/(dt + tau)对test_ratio与innovation做一阶低通,得到test_ratio_filtered(保留sign(innovation)符号)与innovation_filtered;
  • 限幅:当test_ratio > 4(kNormalizedInnovationLimit = 2的平方)时,对滤波值进行限幅,防止异常尖峰污染趋势数据;
  • 拒绝判定:test_ratio > 1.0或新息/新息方差非有限值时置innovation_rejected = true,否则可进入融合;
  • 每次调用后将fused复位为false,由后续融合函数在真正成功融合时置true。

此外resetAidSourceStatusZeroInnovation()(ekf_helper.cpp)在状态重置时把新息、测试比清零并标记fused = true,保证重置后辅助源状态一致。

3.2 一维融合:fuseVerticalPosition 与 fuseYaw

  • 垂直位置融合fuseVerticalPosition()(position_fusion.cpp):若innovation_rejected == false,调用fuseDirectStateMeasurement将新息作用于位置状态 Z 分量,置fused = true、记录time_last_fuse = _time_delayed_us并更新_time_last_hgt_fuse;否则置fused = false。
  • 偏航融合fuseYaw()(yaw_fusion.cpp)同样维护estimator_aid_source1d_s状态(GNSS 双天线航向、EV 航向均走此路径)。

特殊情况下(如垂直加速度数据异常),updateVerticalPositionAidStatus会将新息限幅到门限内并强制取消拒绝标记,避免单点故障导致滤波器失稳——这是 1D 辅助源相对 2D/3D 源特有的保护逻辑。

3.3 发布链路:PublishAidSourceStatus

EKF2::PublishAidSourceStatus()(EKF2.cpp)在每次 EKF2 主循环中依次发布空速、侧滑、气压计高度、测距仪高度、测距信标、虚拟源、EV 高度/位置/速度/航向、GNSS 高度/位置/速度/航向等全部辅助源话题。发布模板(EKF2.hpp)的关键行为是:

  • 仅当status.timestamp_sample > status_publish_last时发布(即样本更新才发布,无重复帧);
  • 填充estimator_instance = _instance与timestamp(回放模式使用日志时间,否则用hrt_absolute_time())。

各辅助源发布器在 EKF2 启动时按功能开关注册(如CONFIG_EKF2_AIRSPEED、CONFIG_EKF2_BAROMETER、CONFIG_EKF2_GNSS、CONFIG_EKF2_EXTERNAL_VISION等宏,以及ekf2_gps_ctrl、ekf2_ev_ctrl参数位掩码控制,见 EKF2.cpp)。内部辅助源状态则保存在 ekf.h 的_aid_src_baro_hgt、_aid_src_airspeed、_aid_src_sideslip、_aid_src_gnss_yaw等成员中。

四、日志与观测:如何用该消息诊断 EKF2

  • 默认记录:日志模块已把estimator_aid_src_baro_hgt加入默认记录列表,频率 10 Hz(logged_topics.cpp),因此 ulog 中通常可直接看到气压计高度辅助源的全过程变化;
  • 详细调试:设置EKF2_LOG_VERBOSE参数后,EKF2 会额外 advertise 新息、新息方差、测试比等汇总话题(EKF2.cpp),可与本消息各字段交叉验证;
  • 实机/仿真观测:在 NuttX shell 或 SITL 终端使用uorb top estimator_aid_src_gnss_hgt等命令实时查看话题发布频率与内容,或用listener estimator_aid_src_baro_hgt打印单帧字段。

典型判读方法:

  1. test_ratio长期大于 1 → 该辅助源观测与 EKF 状态持续不一致,观测被频繁拒绝(innovation_rejected = true),需检查传感器标定或外部扰动;
  2. test_ratio_filtered缓慢漂移 → 反映新息的持续性偏差(如气压计漂移、空速管堵塞);
  3. time_last_fuse长时间不更新而timestamp_sample持续增长 → 辅助源被拒或融合被禁用,状态约束可能已失效;
  4. fused频繁在 true/false 间切换 → 观测在门限边缘抖动,可针对性调整对应融合门限参数。

五、一维辅助源的融合参数(常见关联参数)

以下参数直接或间接决定observation_variance、innovation_gate与融合开关(以当前仓库源码为准,具体取值以param show输出为准):

参数作用对象说明
EKF2_GPS_CHECK/EKF2_GPS_CTRLGNSS 高度、航向GNSS 数据质量检查与融合控制位掩码(含 VPOS 使能高度融合)
EKF2_HGT_*(如EKF2_HGT_MODE、EKF2_HGT_REF)高度辅助源高度参考模式与气压计/测距/GNSS 高度源选择
EKF2_EV_CTRLEV 高度/航向外接视觉融合控制位掩码(VPOS/YAW 位)
EKF2_ARSP_THR空速空速融合使能阈值,> 0时 advertise 空速辅助源
EKF2_RNG_*测距仪高度测距仪融合门限与地面回波处理参数
EKF2_SIDESLIP_*侧滑角固定翼侧滑融合使能及门限

在 EKF2.cpp 中可以看到:ekf2_arsp_thr > 0才注册空速辅助源、ekf2_baro_ctrl使能才注册气压计高度辅助源、ekf2_gps_ctrl & GnssCtrl::VPOS才注册 GNSS 高度辅助源——即话题的存在性本身就是功能开关的镜像。

六、消息定义原文(与 msg 源文件一致)

EstimatorAidSource1d.msg的完整定义如下(与 msg/EstimatorAidSource1d.msg 一致):

uint64 timestamp # time since system start (microseconds) uint64 timestamp_sample # the timestamp of the raw data (microseconds) uint8 estimator_instance uint32 device_id uint64 time_last_fuse float32 observation float32 observation_variance float32 innovation float32 innovation_filtered float32 innovation_variance float32 test_ratio # normalized innovation squared float32 test_ratio_filtered # signed filtered test ratio bool innovation_rejected # true if the observation has been rejected bool fused # true if the sample was successfully fused # TOPICS estimator_aid_src_baro_hgt estimator_aid_src_ev_hgt estimator_aid_src_gnss_hgt estimator_aid_src_rng_hgt estimator_aid_src_ranging_beacon # TOPICS estimator_aid_src_airspeed estimator_aid_src_sideslip # TOPICS estimator_aid_src_fake_hgt # TOPICS estimator_aid_src_gnss_yaw estimator_aid_src_ev_yaw

七、总结

EstimatorAidSource1d是 PX4 观测 EKF2 内部"谁在被融合、谁被拒绝、偏差多大"的标准窗口:它用 14 个字段完整刻画了一次一维观测从采样、检验到融合的全程,配合test_ratio的门限判据与fused/innovation_rejected布尔标志,开发者无需深入滤波器内核即可定位空速、气压计、测距仪、GNSS/EV 高度与航向等辅助源的异常。结合 ekf_helper.cpp 的统计定义、position_fusion.cpp 与 yaw_fusion.cpp 的融合实现,以及 EKF2.cpp 的发布链路,即可对飞行日志中的辅助源健康状态做出准确、可复现的量化诊断。

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

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载
上一篇:openEuler文档捉虫:5种常见文档问题分类与处理方法
下一篇:Velox API参考手册:开发者必备的核心接口详解

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

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

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

立即咨询