PX4飞控融合磁罗盘源码解析(1) PX4源码版本commit hash41c6dcaf705f40983a196fc53b39b69ce2788146代码结构src/modules/ekf2/EKF/aid_sources/magnetometer/mag_control.cpp预处理// mag对齐标志if(!_control_status_prev.flags.in_air_control_status.flags.in_air){_control_status.flags.mag_aligned_in_flightfalse;}// 是否可用_fc.mag.available_params.ekf2_mag_type!static_castint32_t(MagFuseType::NONE);// 是否使用if(!_fc.mag.intended()){stopMagFusion();return;}状态估计// 噪声初始化// XYZ Measurement uncertainty. Need to consider timing errors for fast rotationsconstfloatR_MAGmath::max(sq(_params.ekf2_mag_noise),sq(0.01f));// calculate intermediate variables used for X axis innovation variance, observation Jacobians and Kalman gainsVector3f mag_innov;Vector3f innov_var;// Observation jacobian and Kalman gain vectorsVectorState H;sym::ComputeMagInnovInnovVarAndHx(_state.vector(),P,mag_sample.mag,R_MAG,FLT_EPSILON,mag_innov,innov_var,H);updateAidSourceStatus(aid_src,mag_sample.time_us,// sample timestampmag_sample.mag,// observationVector3f(R_MAG,R_MAG,R_MAG),// observation variancemag_innov,// innovationinnov_var,// innovation variancemath::max(_params.ekf2_mag_gate,1.f));// innovation gate世界磁场模型( WMM)更新boolwmm_updatedfalse;if(global_origin().isInitialized()){boolorigin_newer_than_last_mag(global_origin().getProjectionReferenceTimestamp()aid_src.time_last_fuse);if(global_origin_valid()(origin_newer_than_last_mag||(isLocalHorizontalPositionValid()isTimedOut(_wmm_mag_time_last_checked,10e6)))){if(updateWorldMagneticModel(_gpos.latitude_deg(),_gpos.longitude_deg())){wmm_updatedtrue;}_wmm_mag_time_last_checked_time_delayed_us;}elseif(origin_newer_than_last_mag){// use global origin to update WMMif(updateWorldMagneticModel(global_origin().getProjectionReferenceLat(),global_origin().getProjectionReferenceLon())){wmm_updatedtrue;}}}合成计算z轴若飞控参数 EKF2_SYNT_MAG_Z 为enabled且 WMM 数据有效用 XY 测量 地磁场模型计算合成 Z 分量避免强磁干扰if(_params.ekf2_synt_mag_z(_params.ekf2_decl_typeGeoDeclinationMask::USE_GEO_DECL)(_wmm_earth_field_gauss.isAllFinite()_wmm_earth_field_gauss.longerThan(0.f))){mag_sample.mag(2)calculate_synthetic_mag_z_measurement(mag_sample.mag,_wmm_earth_field_gauss);_control_status.flags.synthetic_mag_ztrue;}else{_control_status.flags.synthetic_mag_zfalse;}融合模式决策{constboolmag_consistent_or_no_ne_aiding_control_status.flags.mag_heading_consistent||!isNorthEastAidingActive();constboolcommon_conditions_passing_control_status.flags.mag((_control_status.flags.yaw_alignmag_consistent_or_no_ne_aiding)||(!_control_status.flags.ev_yaw!_control_status.flags.yaw_align))!_control_status.flags.mag_fault!_control_status.flags.mag_field_disturbed!_control_status.flags.ev_yaw!_control_status.flags.gnss_yaw(!_control_status.flags.yaw_manual||_control_status.flags.mag_aligned_in_flight)!_control_status.flags.constant_pos;_control_status.flags.mag_3Dcommon_conditions_passing(_params.ekf2_mag_typestatic_castint32_t(MagFuseType::AUTO))_control_status.flags.mag_aligned_in_flight;_control_status.flags.mag_hdgcommon_conditions_passing((_params.ekf2_mag_typestatic_castint32_t(MagFuseType::HEADING))||(_params.ekf2_mag_typestatic_castint32_t(MagFuseType::AUTO)!_control_status.flags.mag_3D));}if(_control_status.flags.mag_dec){// observation variance (rad**2)constfloatR_DECLsq(0.5f);if((_params.ekf2_decl_typeGeoDeclinationMask::USE_GEO_DECL)PX4_ISFINITE(_wmm_declination_rad)){// using declination from the world magnetic modelfuseDeclination(_wmm_declination_rad,R_DECL,update_all_states,update_tilt);}elseif((_params.ekf2_decl_typeGeoDeclinationMask::SAVE_GEO_DECL)PX4_ISFINITE(_params.ekf2_mag_decl)(fabsf(_params.ekf2_mag_decl)0.f)){// using previously saved declinationfuseDeclination(math::radians(_params.ekf2_mag_decl),R_DECL,update_all_states,update_tilt);}else{// if there is no aiding coming from an inertial frame we need to fuse some declination// even if we dont know the value, its better to fuse 0 than nothingfloatdeclination_rad0.f;fuseDeclination(declination_rad,R_DECL);}}}解决地磁干扰问题下面是地磁干扰处理的完整决策与操作流程图轻微干扰中度干扰严重干扰保留航向完全禁用检测到地磁干扰干扰强度评估启用合成Z轴EKF2_SYNT_MAG_Z enabled调大传感器噪声EKF2_MAG_NOISE 增大切换融合模式EKF2_MAG_TYPE 调整使用WMM模型计算Z轴XY测量 地磁场模型降低磁力计权重增加观测方差R_MAG选择融合策略MAG_HDG模式仅使用航向信息MAG_NONE模式停止磁力计融合参数调整完成状态估计更新卡尔曼滤波融合输出稳定姿态干扰问题解决根据代码逻辑首先使能EKF2_SYNT_MAG_Z然后调大传感器噪声修改融合方式为。

相关新闻

最新新闻

ICM-42688-P与PIC18F47K42在运动检测与工业监测中的应用

ICM-42688-P与PIC18F47K42在运动检测与工业监测中的应用

1. ICM-42688-P与PIC18F47K42的黄金组合解析 在机器人控制和工业监测领域,传感器与微控制器的选型直接决定了系统性能上限。ICM-42688-P这款6轴IMU(惯性测量单元)与PIC18F47K42微控制器的组合,正在成为高精度运动检测系统的标配方…

2026/7/3 13:03:13
NBTExplorer:Minecraft数据管理的终极图形化编辑器

NBTExplorer:Minecraft数据管理的终极图形化编辑器

NBTExplorer:Minecraft数据管理的终极图形化编辑器 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款功能强大的开源NBT编辑器&#xf…

2026/7/3 13:03:13
东北寒区对讲机四季标准化养护实操指南 降低设备季节性故障损耗

东北寒区对讲机四季标准化养护实操指南 降低设备季节性故障损耗

东北全域冬长夏短,春季大风扬沙、夏季沿江高湿、秋季昼夜温差骤升、冬季零下三十余度极寒,特殊气候持续损耗无线对讲设备,多数单位仅在设备故障后维修,缺少分季节前置养护流程,出现冬季续航跳水、喇叭杂音、接口氧化、…

2026/7/3 13:03:13
3分钟学会QQ音乐加密文件解密:qmcdump终极使用指南

3分钟学会QQ音乐加密文件解密:qmcdump终极使用指南

3分钟学会QQ音乐加密文件解密:qmcdump终极使用指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 还在为QQ…

2026/7/3 13:03:13
2026年长沙vi企业形象设计费用依设计复杂度及服务内容而定

2026年长沙vi企业形象设计费用依设计复杂度及服务内容而定

导语在当今竞争激烈的商业环境中,企业形象设计对于企业的发展至关重要。VI(Visual Identity)企业形象设计作为其中的关键部分,能够帮助企业树立独特的品牌形象,增强市场竞争力。2026年,长沙的VI企业形象设计…

2026/7/3 13:03:13
全行业涨幅第一!2026年AI通信开启网络底层重构大周期

全行业涨幅第一!2026年AI通信开启网络底层重构大周期

01概念重构与技术跃迁:AI通信是数智融合与算网协同的系统工程AI通信的界定并非简单的通信AI技术叠加,而是从底层逻辑到上层应用的全栈融合。数智一体化系统框架覆盖数据采集、处理、模型开发、应用构建到运维监控的全生命周期管理,为网络自智…

2026/7/3 12:58:13

周新闻

月新闻