ST意法半导体
直播中

李辉

8年用户 1422经验值
私信 关注
[问答]

ST的IMU和地磁计用motionfx库融合后航向角异常的原因?

传感器IMU是LSM6DSL型号,磁强计是LIS3MDL型号,使用motionfx库进行姿态解算,遇到航向角不准确的问题。我查看地磁计的值是正常的,但是航向角不正常:例如传感器指向正北,地磁计X轴是40uT,Y轴是0uT,但是航向角是300度,稍微振动传感器改变加速度计的值和陀螺仪的值后航向角稳定为270度,我不理解为啥磁场输入正常但是航向角输出异常呢?查阅资料得知改变倾角后,融合算法会通过加速度计和陀螺仪动态调整重力矢量的投影,强制地磁数据重新参与计算,覆盖错误的水平补偿,修正了航向角。这是motionfx库的bug还是我的配置哪里有问题?配置如下:MFX_knobs_t的ATime和MTime和FrTime为默认值,LMode=1,modx=1,output_type=0和1都试过问题一致。acc_orientation和gyro_orientation和mag_orientation也尝试过不同的配置,问题仍然存在!地磁计和IMU都校准过了。同时由于传感器的数据手册中没有明确给出XYZ正极的位置,因此我不知道orientation配置的是否正确,能否帮我确认下传感器芯片的极性?或者告诉我测试方法。
顺时针旋转传感器360度查看地磁计变化,北东南西,X轴是40uT、0、-40、0,Y轴是0、40、0、-40,Z轴始终是-20uT。这么看地磁计正常吗?地磁计已经校准了,北半球+地磁芯片丝印面朝天,Z轴-20uT是正常的吗?像IMU芯片丝印面朝天,加速度计Z轴是+1g。找不到问题头绪,已经卡一个星期了。请问图片里面硬件极性我标记的对吗?




回帖(1)

郝埃连

2025-4-27 17:15:55

针对您在使用ST的LSM6DSL IMU和LIS3MDL磁力计结合motionfx库时遇到的航向角异常问题,以下是可能的原因及解决方案:




1. 传感器坐标系对齐问题



  • 现象:磁力计X/Y轴数据正常,但航向角偏差显著(如正北显示300度)。

  • 原因:  

    • IMU与磁力计的物理安装方向与motionfx库预设的坐标系不一致(如X/Y轴反向或交换)。  

    • 库中未正确配置传感器的轴映射(Axis Remapping)。  


  • 解决方案:  

    • 检查LSM6DSL和LIS3MDL的物理安装方向,确保与库中坐标系定义一致(参考数据手册的“机械布局”章节)。  

    • 在代码中显式配置传感器的轴映射(如使用motionfx_set_axis函数调整X/Y/Z极性或交换轴)。





2. 磁力计校准不充分



  • 现象:磁力计静态数据看似正常(如X=40uT, Y=0uT),但动态融合后航向角突变。  

  • 原因:  

    • 未补偿硬铁干扰(Hard Iron)或软铁干扰(Soft Iron),导致磁力计数据在动态融合时引入偏差。  

    • 校准过程未覆盖全姿态范围(如俯仰/横滚角变化时校准失效)。  


  • 解决方案:  

    • 重新执行完整的磁力计校准:  

    • 硬铁校准:在无磁干扰环境中,绕所有轴旋转设备,记录磁力计数据的最小/最大值,计算偏移量。  

    • 软铁校准:通过椭圆拟合或库提供的校准工具(如ST的Unico GUI)补偿各轴灵敏度差异。  

    • 确保校准后的磁力计数据在任意姿态下均满足:

      $$sqrt{M_x^2 + M_y^2 + M_z^2} approx text{地磁场强度(如50μT)}$$





3. motionfx库配置参数错误



  • 现象:振动后航向角修正(如270度),可能与动态调整重力投影有关。  

  • 原因:  

    • 加速度计/陀螺仪噪声参数(acc_stddev, gyro_stddev)设置不合理,导致磁力计权重过低。  

    • 未启用磁力计融合标志(如MFX_ENGINE_ENABLE_MAG未激活)。  

    • 姿态融合算法(如四元数更新频率、截止频率)参数不当。  


  • 解决方案:  

    • 检查并确认以下关键参数:  
      MotionFX_Engine_Config config = {
      .gyro_stddev = 0.01f,   // 陀螺仪噪声(典型值:0.01-0.1 rad/s)
      .acc_stddev = 0.05f,    // 加速度计噪声(典型值:0.05-0.2 m/s²)
      .mag_stddev = 0.5f,     // 磁力计噪声(典型值:0.5-5 μT)
      .fusion_period = 0.01f, // 融合周期(与采样率一致)
      .enable_mag = 1,        // 启用磁力计融合
      };

    • 调整mag_stddev降低磁力计噪声权重,或增大加速度计/陀螺仪噪声以提升磁力计贡献。





4. 重力矢量投影异常



  • 现象:振动后航向角修正,可能与加速度计动态调整重力投影有关。  

  • 原因:  

    • 静态时加速度计噪声或滤波不当,导致重力矢量估计错误,影响磁力计的水平分量补偿。  

    • 振动时加速度计检测到动态加速度,触发算法临时依赖陀螺仪和磁力计,强制修正航向。  


  • 解决方案:  

    • 提高加速度计低通滤波截止频率(如从10Hz增至30Hz),抑制高频振动噪声。  

    • 检查motionfx中重力矢量估计逻辑(如motionfx_update函数是否正确处理静态/动态场景)。





5. 库版本或算法限制



  • 现象:航向角在特定条件下(如静态)持续偏差,可能为库的已知问题。  

  • 原因:  

    • motionfx库早期版本存在磁力计融合逻辑缺陷(如未正确处理磁干扰恢复)。  

    • 算法对磁力计数据的依赖程度不足(如优先依赖陀螺仪积分)。  


  • 解决方案:  

    • 升级至ST最新版motionfx库(如v2.0+)。  

    • 对比测试其他算法(如Madgwick/Mahony),确认是否为库特定问题。





验证步骤




  1. 静态测试:  



    • 将设备水平静置,检查航向角是否接近真实值(如正北0度)。  

    • 输出磁力计原始数据并验证其方向(X/Y应接近地磁场水平分量)。




  2. 动态测试:  



    • 绕Z轴缓慢旋转设备,观察航向角是否平滑变化。  

    • 快速晃动设备后静置,检查航向角是否收敛到正确值。




  3. 数据记录:  



    • 使用ST的Unico或STM32CubeMonitor实时记录传感器数据及融合结果,分析异常时刻的输入输出关系。






总结


问题更可能源于传感器坐标系对齐库参数配置错误,而非motionfx本身的bug。建议优先检查轴映射和校准,其次优化噪声参数。若问题仍存,可联系ST支持并提供测试数据以进一步诊断。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分