资讯动态

PX4-Autopilot HoverThrustEstimate 悬停推力估计:UORB 消息字段、单状态 EKF 原理与参数调优

发布时间:2026/9/28 7:44:27 来源:尧图企业网站定制
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载本指南围绕 PX4-Autopilot 的HoverThrustEstimateUORB 消息展开系统讲解其字段定义、发布者mc_hover_thrust_estimator模块的数据流与底层零阶 EKF 实现并结合HTE_*参数族给出实战调优建议。读完本文你将能读懂悬停推力估计日志、理解其有效性判定逻辑并知道在载荷变化或气动干扰场景下如何调整相关参数。消息概述悬停推力估计值是什么HoverThrustEstimate是 PX4 多旋翼控制栈中发布的一条诊断性 UORB 消息主题名为hover_thrust_estimate用于对外广播在当前飞行条件下维持悬停所需的归一化推力估计值。该估计值由多旋翼悬停推力估计器模块mc_hover_thrust_estimator在线计算可作为悬停推力在线辨识的结果用于状态监控、日志分析以及后续控制环节的参考。消息原始定义位于 msg/HoverThrustEstimate.msg生成后的 C/C 结构体类型为hover_thrust_estimate_s。发布端在 src/modules/mc_hover_thrust_estimator/MulticopterHoverThrustEstimator.cpp 中通过uORB::Publicationhover_thrust_estimate_s _hover_thrust_ekf_pub{ORB_ID(hover_thrust_estimate)}发布订阅方可通过ORB_ID(hover_thrust_estimate)读取。字段完整说明消息包含 9 个字段覆盖时间戳、估计状态、滤波新息与有效性标志四类信息。下表依据 docs/en/msg_docs/HoverThrustEstimate.md 的字段定义整理字段名类型取值范围描述timestampuint64—消息发布时间系统启动后的微秒数timestamp_sampleuint64—本次估计所使用传感器数据的时间戳微秒hover_thrustfloat32[0.1, 0.9]悬停推力估计值归一化推力hover_thrust_varfloat32—悬停推力估计方差accel_innovfloat32—最近一次加速度融合的新息innovationm/s²accel_innov_varfloat32—该新息的方差m²/s³accel_innov_test_ratiofloat32—归一化新息平方NIS检验比accel_noise_varfloat32—由新息残差估计出的垂直加速度噪声方差validbool—估计结果是否有效原始消息定义原文如下uint64 timestamp # time since system start (microseconds) uint64 timestamp_sample # time of corresponding sensor data last used for this estimate float32 hover_thrust # estimated hover thrust [0.1, 0.9] float32 hover_thrust_var # estimated hover thrust variance float32 accel_innov # innovation of the last acceleration fusion float32 accel_innov_var # innovation variance of the last acceleration fusion float32 accel_innov_test_ratio # normalized innovation squared test ratio float32 accel_noise_var # vertical acceleration noise variance estimated form innovation residual bool valid字段语义与底层实现的对应关系如下hover_thrustEKF 单状态量的当前估计值即_hover_thrust_ekf.getHoverThrustEstimate()的返回值在[0.1, 0.9]范围内硬约束见zero_order_hover_thrust_ekf.hpp中setMinHoverThrust/setMaxHoverThrust的math::constrain限制。hover_thrust_var状态协方差对应getHoverThrustEstimateVar()。valid判定的直接依据之一就是该方差是否小于0.001f归一化推力平方。accel_innov/accel_innov_var/accel_innov_test_ratio来自fuseAccZ()融合步骤保存的_innov、_innov_var、_innov_test_ratio反映最近一次垂直加速度量测与预测模型的偏离程度。accel_noise_var由量测残差在线学习的量测噪声方差_acc_var其更新公式见下文量测噪声自适应小节。valid由 2 秒滞回hysteresis滤波后的有效性标志。注意publishInvalidStatus()分支MulticopterHoverThrustEstimator.cpp在估计失效时会发布一条所有浮点字段均为NAN、仅timestamp有效且validfalse的作废消息消费方必须检查valid字段或对 NAN 做防御。消息产生流程谁在发布、如何触发消息由mc_hover_thrust_estimator模块发布其模块入口为mc_hover_thrust_estimator_main可在 NSH 控制台通过mc_hover_thrust_estimator start启动stop/status为默认支持的子命令见 MulticopterHoverThrustEstimator.cpp。模块是一个基于px4::WorkItem的工作队列任务挂在nav_and_controllers工作队列上由vehicle_local_position主题的发布触发init()中通过_vehicle_local_position_sub.registerCallback()注册回调。其单次运行周期Run()的执行逻辑如下读取vehicle_land_detected更新_landed标志结合vehicle_local_position.dist_bottom 1.f判定_in_air注释说明由于落检测器的landed标志不能保证机体一定脱离地面故用dist_bottom辅助判定。检查parameter_update主题有更新时从参数存储重新加载参数。读取vehicle_status确定_armed状态。计算步长dt基于local_pos.timestamp的相邻时间差并要求dt ∈ (0.001s, 1s)且local_pos.az有限。融合条件_armed _in_air时才执行 EKF 预测与量测更新否则走无效分支——将滞回状态置假若此前_valid为真则发布一条作废消息且未解锁!_armed时调用reset()复位滤波器复位为MPC_THR_HOVER初值、HTE_HT_ERR_INIT初始标准差并重置加速度噪声。融合时读取vehicle_attitude姿态四元数、vehicle_thrust_setpoint推力设定与control_allocator_status未分配推力要求两者时间戳与当前时刻相差小于 20ms。实际参与估计的推力为thrust_body_allocated thrust_setpoint.xyz - unallocated_thrust # 机体系 thrust_allocated(2) q_att.rotateVector(thrust_body_allocated)(2) # 世界系正向上随后调用fuseAccZ(-local_pos.az, -thrust_allocated(2))其中符号约定为向上为正模块头文件注释positive thrust, hover thrust and acceleration UP。有效性判定逻辑MulticopterHoverThrustEstimator.cpp值得单独说明bool valid (_hover_thrust_ekf.getHoverThrustEstimateVar() 0.001f); // The test ratio does not need to pass all the time to have a valid estimate if (!_valid) { valid valid (_hover_thrust_ekf.getInnovationTestRatio() 1.f); } _valid_hysteresis.set_state_and_update(valid, local_pos.timestamp); _valid _valid_hysteresis.get_state();即进入有效态需要同时满足状态方差 0.001与NIS 检验比 1一旦进入有效态后续仅要求状态方差保持低于阈值新息检验偶尔超限不立即判失效并通过 2 秒滞回防止状态在边界附近抖动。底层原理零阶悬停推力 EKF悬停推力估计的核心算法是单状态零阶 EKF实现于 src/modules/mc_hover_thrust_estimator/zero_order_hover_thrust_ekf.hpp 与 zero_order_hover_thrust_ekf.cpp。状态与量测模型状态仅一个悬停推力Th。状态转移为常数模型A 1仅由过程噪声驱动x[k1] x[k] v, v ~ N(0, Q) y[k] h(u, x) w, w ~ N(0, R)量测模型利用悬停时推力与重力平衡的物理关系已知当前推力T[k]与重力加速度g预测的垂直加速度为h(u, x) g * T[k] / Th[k] - g对应偏导数量测矩阵H[k] -g * T[k] / Th[k]²量测值为机体垂直加速度世界系向上为正。predict()仅更新状态协方差_state_var _process_var * dt * dt。量测噪声自适应量测噪声方差R并非固定而是在每次量测更新后由残差在线估计基于 Akhlaghi 等 2017 年提出的自适应卡尔曼滤波噪声协方差调整方法见头文件注释R (1 - alpha) * R alpha * (z² P * H²)其中z为量测残差alpha dt / (noise_learning_time_constant dt)时间常数为 2 秒_noise_learning_time_constant 2.f。实现中残差先经一阶低通时间常数 1 秒去偏updateLpf再计算去偏后的残差平方参与更新并将_acc_var约束在[1, 400]m²/s³。新息检验与恢复逻辑融合步骤fuseAccZ依次计算H、新息方差、新息、卡尔曼增益与 NIS 检验比innov_test_ratio innov² / (gate_size² * innov_var)若innov_test_ratio 1isTestRatioPassing量测通过一致性检验执行状态与协方差更新否则若isLargeOffsetDetected()带符号的检验比低通绝对值超过 0.2说明量测被持续拒绝——可能悬停推力突变或滤波器发散此时执行恢复逻辑bumpStateVariance()_state_var 1e3 * _process_var * dt²增大状态方差以加速重新收敛。状态与协方差更新同样带约束状态_hover_thr constrain(_hover_thr K * innov, _hover_thr_min, _hover_thr_max)协方差_state_var constrain((1 - K*H) * _state_var, 1e-10, 1)。测试验证模块自带 GoogleTest 单测 zero_order_hover_thrust_ekf_test.cpp可通过make tests TESTFILTERzero_order_hover_thrust_ekf运行。测试覆盖了静置收敛testStaticCase/testStaticConvergence、带噪声收敛testStaticConvergenceWithNoise、大加速度噪声与偏差场景testLargeAccelNoiseAndBias、推力与加速度双噪声testThrustAndAccelNoise、悬停推力突变恢复testHoverThrustJump、最小值/最大值钳位testMinMaxHoverThrustClamping以及防止估计值坍缩到 0 的边界用例testHoverThrustNeverReachesZero验证低MPC_THR_HOVER时估计被钉在绝对下限 0.1 而非产生除零。这些用例直接印证了上文所述的量测模型、钳位逻辑与恢复机制。关联参数HTE_* 参数族与调优建议估计器的参数在 src/modules/mc_hover_thrust_estimator/hover_thrust_estimator_params.yaml 中定义模块通过DEFINE_PARAMETERS在 MulticopterHoverThrustEstimator.hpp 中声明并在updateParams()中同步到 EKF参数默认值范围单位含义与调优建议HTE_HT_NOISE0.0036[0.0001, 1.0]归一化推力/s悬停推力过程噪声。调小使估计更稳定调大则允许悬停推力随时间快速变化如载荷快速变化场景HTE_ACC_GATE3.0[1.0, 10.0]SD加速度融合的检验门限即新息一致性检验所用的标准差倍数HTE_HT_ERR_INIT0.1[0.0, 1.0]归一化推力悬停推力状态初始 1-sigma 不确定度。取值越大估计在过程噪声接管前可偏离初始值越远HTE_VXY_THR10.0[1.0, 20.0]m/s水平速度灵敏度降低阈值。超过该速度后量测噪声线性增大以减小有偏量测的影响大升力面如带机翼机型建议设低HTE_VZ_THR2.0[1.0, 10.0]m/s垂直速度灵敏度降低阈值。爬升/下降受气动阻力影响明显的机型建议设低HTE_THR_RANGE0.2[0.01, 0.4]归一化推力相对MPC_THR_HOVER的最大偏差决定估计范围。例如MPC_THR_HOVER0.5时范围即 [0.3, 0.7]。若飞行工况如不同尺寸载荷使悬停推力变化剧烈可调大MPC_THR_HOVER见飞行器参数—归一化推力位置/速度控制器使用的悬停推力设定同时作为估计器的初始值与范围中心实现中updateParams()的具体用法MulticopterHoverThrustEstimator.cpp_hover_thrust_ekf.setProcessNoiseStdDev(_param_hte_ht_noise.get()); if (fabsf(_param_hte_ht_err_init.get() - ht_err_init_prev) FLT_EPSILON) { _hover_thrust_ekf.setHoverThrustStdDev(_param_hte_ht_err_init.get()); } _hover_thrust_ekf.setAccelInnovGate(_param_hte_acc_gate.get()); _hover_thrust_ekf.setMinHoverThrust(_param_mpc_thr_hover.get() - _param_hte_thr_range.get()); _hover_thrust_ekf.setMaxHoverThrust(_param_mpc_thr_hover.get() _param_hte_thr_range.get());注意setMinHoverThrust/setMaxHoverThrust内部还会将请求值再次约束到绝对安全区间[0.1, 0.8]与[0.2, 0.9]这与消息字段hover_thrust的 [0.1, 0.9] 范围一致也保证了MPC_THR_HOVER偏低时估计值不会坍缩到 0对应测试testHoverThrustNeverReachesZero。调优实践要点载荷变化频繁如投掷载荷、挂载不同任务设备增大HTE_HT_NOISE与HTE_THR_RANGE让估计更快跟踪真实悬停推力变化抗干扰需求优先希望估计稳定平滑减小HTE_HT_NOISE大升力面/受阻力影响机型降低HTE_VXY_THR/HTE_VZ_THR提前触发量测噪声放大避免气动干扰把估计带偏收敛速度需要快速收敛时可适当增大HTE_HT_ERR_INIT初值不确定度大滤波初期增益高。消费侧使用建议HoverThrustEstimate属于估计状态/诊断类消息。实际消费时建议始终检查valid仅当valid true且字段非 NAN 时使用hover_thrust作废消息中所有浮点字段为 NAN。关注hover_thrust_var与accel_innov_test_ratio二者是估计健康度的直观指标——方差持续偏大说明估计未收敛检验比持续超 1 说明量测与模型持续不一致可能进入恢复逻辑。结合timestamp_sample对齐数据该字段标注估计所用的传感器数据时刻用于与vehicle_local_position、vehicle_thrust_setpoint等消息做时间对齐分析。调试入口飞行日志ULog中可直接回放该主题需要手动验证算法时可运行模块单测make tests TESTFILTERzero_order_hover_thrust_ekf。小结HoverThrustEstimate消息完整承载了 PX4 多旋翼悬停推力在线估计的状态输出核心估计量hover_thrust及其方差、滤波新息诊断量accel_innov、accel_innov_var、accel_innov_test_ratio、自适应量测噪声方差accel_noise_var以及带滞回的有效性标志valid。其背后是发布者mc_hover_thrust_estimator基于垂直加速度与推力设定的单状态零阶 EKF配合 NIS 门限检验、持续拒测恢复机制与在线噪声学习能够在载荷与气动条件变化时自适应跟踪真实悬停推力。结合HTE_*参数族与单元测试开发者可以针对具体机型完成从理解字段到在线调优的完整闭环。延伸阅读消息定义 msg/HoverThrustEstimate.msg模块实现 src/modules/mc_hover_thrust_estimator/MulticopterHoverThrustEstimator.cppEKF 算法 src/modules/mc_hover_thrust_estimator/zero_order_hover_thrust_ekf.cpp参数定义 src/modules/mc_hover_thrust_estimator/hover_thrust_estimator_params.yaml测试用例 src/modules/mc_hover_thrust_estimator/zero_order_hover_thrust_ekf_test.cpp多语言版本文档见 docs/zh/msg_docs/HoverThrustEstimate.md。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4-Autopilot 飞行阶段估计FlightPhaseEstimation uORB 消息字段、常量与下游应用解析PX4 Autopilot 飞行阶段估计FlightPhaseEstimation uORB 消息字段、常量与下游应用解析 飞行阶段估计Flight Pha嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot 中 EKF2 估计器选择状态EstimatorSelectorStatusuORB 消息深度解析PX4 Autopilot 中 EKF2 估计器选择状态EstimatorSelectorStatusuORB 消息深度解析 EKF2扩展卡尔曼滤波器是嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot BatteryStatus UORB 消息全解析字段语义、枚举定义与电池状态估计源码实现PX4 Autopilot BatteryStatus UORB 消息全解析字段语义、枚举定义与电池状态估计源码实现 battery_status 是 PX4嵌入式物联网机器人自动驾驶智能硬件上一篇Spree Commerce 官方 CLIspree/cli2.x 演进全解析Docker 开发栈、Admin API 客户端与项目生命周期管理下一篇WTF Solidity 第 7 讲mapping 映射类型——Solidity 中的哈希表详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑