- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
导读
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_hgt | GNSS 高度辅助源 |
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_yaw | GNSS 航向辅助源 |
estimator_aid_src_ev_yaw | 外接视觉航向辅助源 |
话题注册见 msg/CMakeLists.txt,构建时由 uORB 代码生成器(Tools/msg)自动产出estimator_aid_source1d_s结构体与 ORB ID。
二、字段全解:14 个字段的语义、类型与计算来源
2.1 时间戳类字段
| 字段 | 类型 | 说明 |
|---|---|---|
timestamp | uint64 | 消息发布时间(微秒,系统启动后经过时间),由发布模板在发送时填入hrt_absolute_time() |
timestamp_sample | uint64 | 原始数据的采样时间戳(微秒),即底层传感器数据到达 EKF 的时刻,用于时间对齐与延迟补偿 |
time_last_fuse | uint64 | 上一次成功融合该辅助源的时刻(微秒),对应源码中的_time_delayed_us |
2.2 身份与来源字段
| 字段 | 类型 | 说明 |
|---|---|---|
estimator_instance | uint8 | EKF2 实例编号(多实例估计模式下区分主/从估计器),由发布模板填充_instance |
device_id | uint32 | 产生该观测的传感器设备 ID,用于关联到具体物理传感器 |
2.3 观测与新息字段
| 字段 | 类型 | 说明 |
|---|---|---|
observation | float32 | 传感器观测值(如气压计换算高度、空速、侧滑角) |
observation_variance | float32 | 观测噪声方差,由传感器噪声参数与数据质量计算 |
innovation | float32 | 新息 = 观测值 − 状态预测值,如源码updateVerticalPositionAidStatus中innovation = -_gpos.altitude() - observation(position_fusion.cpp) |
innovation_filtered | float32 | 低通滤波后的新息,用于平滑展示与检测持续性偏差 |
innovation_variance | float32 | 新息方差 = 对应状态方差 + 观测方差,源码为getStateVariance<State::pos>()(2) + observation_variance |
2.4 统计检验与结果字段
| 字段 | 类型 | 说明 |
|---|---|---|
test_ratio | float32 | 归一化新息平方:test_ratio = innovation² / (innovation_gate² × innovation_variance) |
test_ratio_filtered | float32 | 带符号的滤波测试比(滤波时保留新息符号),用于趋势监测 |
innovation_rejected | bool | 该观测是否被拒绝(true表示被拒绝,不参与融合) |
fused | bool | 该样本是否被成功融合进状态(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打印单帧字段。
典型判读方法:
test_ratio长期大于 1 → 该辅助源观测与 EKF 状态持续不一致,观测被频繁拒绝(innovation_rejected = true),需检查传感器标定或外部扰动;test_ratio_filtered缓慢漂移 → 反映新息的持续性偏差(如气压计漂移、空速管堵塞);time_last_fuse长时间不更新而timestamp_sample持续增长 → 辅助源被拒或融合被禁用,状态约束可能已失效;fused频繁在 true/false 间切换 → 观测在门限边缘抖动,可针对性调整对应融合门限参数。
五、一维辅助源的融合参数(常见关联参数)
以下参数直接或间接决定observation_variance、innovation_gate与融合开关(以当前仓库源码为准,具体取值以param show输出为准):
| 参数 | 作用对象 | 说明 |
|---|---|---|
EKF2_GPS_CHECK/EKF2_GPS_CTRL | GNSS 高度、航向 | GNSS 数据质量检查与融合控制位掩码(含 VPOS 使能高度融合) |
EKF2_HGT_*(如EKF2_HGT_MODE、EKF2_HGT_REF) | 高度辅助源 | 高度参考模式与气压计/测距/GNSS 高度源选择 |
EKF2_EV_CTRL | EV 高度/航向 | 外接视觉融合控制位掩码(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
相关推荐
PX4-Autopilot UORB 消息详解:FailureDetectorStatus 故障检测器状态消息
PX4 Autopilot UORB 消息详解:FailureDetectorStatus 故障检测器状态消息 failure_detector_status
嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot 中 EKF2 估计器选择状态(EstimatorSelectorStatus)uORB 消息深度解析
PX4 Autopilot 中 EKF2 估计器选择状态(EstimatorSelectorStatus)uORB 消息深度解析 EKF2(扩展卡尔曼滤波器)是
嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot EstimatorBias3d UORB 消息详解:3 维传感器偏差估计的发布与消费
PX4 Autopilot EstimatorBias3d UORB 消息详解:3 维传感器偏差估计的发布与消费 EstimatorBias3d 是 PX4 A
嵌入式物联网机器人自动驾驶智能硬件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考