在飞控涉及到的几个传感器中磁力计因该是属于最简单的传感器。在飞控上一般使用的磁力计传感器芯片是HMC5883L、HMC5983、MPU9250、MAG3110等。这些芯片利用的物理原理都相同,只是在精度和数据接口上有些区别。下面简单说说磁力计的原理。
我们的地球都是有磁场存在的,地理的南极是地磁的北极,在地球的每一个区域都是受地磁影响的,可以说地磁无处不在。而且地磁的方向都是一定的,除了在南北极地磁场是从上指到下(或者从下指到上)的,在其他区域基本都是由南指向北的(暂不考虑磁偏角)。这样就给人类的远行活动带了极大的便利。由于地磁场的这个特性我们可以使用罗盘(指南针)很容易的在地球的任何角落辨别出南北,随之另外两个方向东西也能确定下来。磁力计的原理就是使用霍尔元件的原理测量磁场的传感器。在实际的空间中只要不在赤道上空地磁场的方向有从南指向北的分量,还有从上指向下(或者从下指向上的分量)。霍尔元件只能测量一个方向的磁场,所以磁力计要在空间中测量磁场的话要使用三个方向的霍尔传感器测量到三个正交的方向的磁场后合成一个合磁场,再使用这个磁场的方向和地磁场的方向做对比从而可以获得传感器自身的方向和姿态。这些是基于一个比较普遍的假设:在很小的区域可以认为地磁场的方向和大小都是不变的。很小的区域相对于地球来说可能是一个或者几个国家的大小。
下面使用stm32芯片读取hmc5883的磁场数据然后使用matlab对数据进行处理。需要工程代码的可以在留言中留下邮箱号向我要,我看到就会发给你。下面是工程主循环中的代码:

while(1)
        {
        Delay(200);
        X_Data = Single_Read(HMC5983_Write_Addr,0x03);
        X_Data <<= 8;
        X_Data += Single_Read(HMC5983_Write_Addr,0x04);
        Z_Data = Single_Read(HMC5983_Write_Addr,0x05);
        Z_Data <<= 8;
        Z_Data += Single_Read(HMC5983_Write_Addr,0x06);
        Y_Data = Single_Read(HMC5983_Write_Addr,0x07);
        Y_Data <<= 8;
        Y_Data += Single_Read(HMC5983_Write_Addr,0x08);
        printf(“%d %d %d “,X_Data,Y_Data,Z_Data);
        }

读取三轴磁场的数据后按顺序输出数据。在PC端使用串口终端接收数据。在接收数据的过程中不断变化传感器的方向,由三个分量组成的空间向量其实就是地磁场相对于传感器的位置向量。我们在各个位置旋转传感器,这样由每个时刻的向量的端点组成的一个图应该是一个以原点为圆心的球。下面我们采集数据。
数据采集
在MATLAB中数据全部放在数组A中,下面是MATLAB代码:
matlab code
与我们想象的不同,画出来的图形并不是一个球而是一个椭球,中心也不在原点。
椭球
再看看两个轴X、Y之间的图形(三维空间点的投影)。
这里写图片描述
很好!是一个圆,Y轴的数据分布在0的上下,但是X轴的数据偏离了0点。由于传感器在磁场的正反两个方向测量到的数据应该是大小相同符号相反的数据,也就是它应该是一个以原点为圆心的圆。现在这种情况说明数据是有零点漂移的,校正的方法很简单,我们可以通过matlab的数组X可以看出X的最大值是676最小值为-499,对最大值和最小值作和然后除以2就是X需要减去的零点补偿值即:(676-499)/2 = 88.5。然后以后每次采集到的X轴数据减去一个零点漂移值88.5就能校正这个轴的数据。
MATLAB代码:

Y = Y+25;
        再次画图如下:
        jiaozheng
        对Z轴的数据没有在原点对齐所以也需要类似的处理
        这里写图片描述
        做了零点漂移校正后的数据如下:
        这里写图片描述
        matlab代码:
        Z = Z-149.5
        此时我们在代码中需要做的就是对每一次采集到的数据都减去相应的校正值。对单片机编程的C代码应该改成如下:
        X_Data = Single_Read(HMC5983_Write_Addr,0x03);
        X_Data <<= 8;
        X_Data += Single_Read(HMC5983_Write_Addr,0x04);
        X_Data += 25;
        Z_Data = Single_Read(HMC5983_Write_Addr,0x05);
        Z_Data <<= 8;
        Z_Data += Single_Read(HMC5983_Write_Addr,0x06);
        Z_Data -= 149;
        Y_Data = Single_Read(HMC5983_Write_Addr,0x07);
        Y_Data <<= 8;
        Y_Data += Single_Read(HMC5983_Write_Addr,0x08);
        Y_Data += 25;

从上面的数据我们也看到,对于零点漂移校正的三轴数据,仍旧不是一个中心在原点的球,而是一个椭球(半径不同)。X轴上是587,Y轴上是571,Z轴上是638。下面就需要进行椭球校正,这个原理也很简单。由于三个轴上的传感器的测量敏感度不同导致了数据的幅值不同,因此我们需要做的就是以一个轴的数据为标准对其余两个轴的数据进行加权。下面是具体操作:
以X轴为标准
Y = Y*(Xmax-Xmin)/(Ymax-Ymin);
Z = Z*(Xmax-Xmin)/(Zmax-Zmin);

1
    2
    3
    4

这样就将图形转化成了一个半径为587.5的圆球了。
这里写图片描述

对应的单片机的C代码改成:

X_Data = Single_Read(HMC5983_Write_Addr,0x03);
        X_Data <<= 8;
        X_Data += Single_Read(HMC5983_Write_Addr,0x04);
        X_Data += 25;
        Z_Data = Single_Read(HMC5983_Write_Addr,0x05);
        Z_Data <<= 8;
        Z_Data += Single_Read(HMC5983_Write_Addr,0x06);
        Z_Data -= 149;
        Z_Data = Z_Data*(587.5)/638.5;
        Y_Data = Single_Read(HMC5983_Write_Addr,0x07);
        Y_Data <<= 8;
        Y_Data += Single_Read(HMC5983_Write_Addr,0x08);
        Y_Data += 25;

下面如果传感器是水平的,对应飞行器平衡的时候需要求解角度为
Angle = arctan(X_Data/Y_Data);

磁力计校正和数据处理相关推荐

  1. IMU加速度、磁力计校正

    IMU加速度.磁力计校正--椭球拟合 IMU校正以及姿态融合 IMU姿态融合(MPU9250从校正到滤波步骤) STM32F0+MPU9250(with MS5611)的姿态解析算法移植(Mahony ...

  2. IMU加速度、磁力计校正--椭球拟合

    本文为博主"声时刻"原创文章,未经博主允许不得转载. 联系方式:shenshikexmu@163.com 问题 考虑到IMU中,x,y,z轴的度量单位并不相同,假设各轴之间相互直. ...

  3. 第十七届智能车竞赛 - 磁力计角度数据处理

    磁力计角度数据处理 磁力计角度数据处理 一.磁力计校正任务 二.float类型数据的串口收发方式 2.1 float(double)类型数据存储方式复习 2.2 下位机处理 2.3 Python接收串 ...

  4. 基于最小二乘法的磁力计椭球拟合方法

    基于最小二乘法的磁力计椭球拟合方法 在写飞控代码时,必然要对磁力计的测量数据进行校正,本文将介绍一种简单实用的校正方法–基于最小二乘法的椭球拟合方法. 本文椭球拟合部分来自博文IMU加速度.磁力计校正 ...

  5. IMU姿态融合(MPU9250从校正到滤波步骤)

    ref:https://blog.csdn.net/u013236946/article/details/72934934 一.动机 MPU9250包括三轴加速度计.三轴陀螺仪和三轴磁力计.因为加速度 ...

  6. IMU校正以及姿态融合

    本文为博主"声时刻"原创文章,未经博主允许不得转载. 联系方式:shenshikexmu@163.com 缘起 有缘在简极科技兼职两年.接触了IMU,我去的时候那家公司还是一个要把 ...

  7. 基于tiva的匿名飞控学习笔记(1)

    基于tiva的匿名飞控学习笔记(1) 开关状态任务 遥控器数据处理任务 数传数据交换 延时存储任务 开关状态任务 匿名飞控的开关状态任务为函数Swtich_State_Task(u8 dT_ms),定 ...

  8. mahony 互补滤波器

    by luoshi006 上接[互补滤波器],继续学习互补滤波.... 参考: Keeping a Good Attitude: A Quaternion-Based Orientation Filt ...

  9. PX4代码解析(6)

    一.前言 上一节介绍了PX4姿态估计调用函数的流程,这一节分享一下我对PX4姿态解算的解读.首先,要理解PX4姿态解算的程序,要先从传感器的特性入手,这里主要介绍的传感器有加速度计,磁力计,陀螺仪. ...

  10. STM32入门笔记(02):MPU6050、MPU9250、ICM20948及姿态解算(SPL库函数版)

    目录 MPU6050 什么是MPU6050? MPU6050的特点 MPU6050框图 MPU6050初始化 MPU6050寄存器 电源管理寄存器1(0X6B) 陀螺仪配置寄存器(0X1B) 加速度传 ...

最新文章

  1. AngularJS指令封装高德地图组件
  2. Webstorm快捷键整理
  3. 淘淘商城FTP服务器、Redis和solr集群配置
  4. 当医疗健康加上大数据,会碰撞出什么火花?
  5. 异常处理程序和软件异常——Windows核心编程学习手札之二十四
  6. 无监督学习:异常检测与剔除(局部异常因子法 SVM异常检测器)
  7. VTK:IO之ImageReader2Factory
  8. python特性、属性以及私有化
  9. vim捐赠_#PayItBackwards-一位freeCodeCamp毕业生如何向事业捐赠10,000美元
  10. PopTheBubble —测量媒体偏差的产品创意
  11. 容器编排技术 -- Kubernetes kubectl replace 命令详解
  12. FaceShifter:北大微软新方法让换脸更惊艳
  13. Windows 2012部署Exchange2013
  14. IDL实现植被覆盖度计算
  15. 小米note 卡在android,小米Note手机SIM卡怎么安装?小米Note安装手机SIM卡教程
  16. 运筹优化算法工程师面试汇总
  17. Premature end of Content-Length delimited message body 报错原因
  18. 我和王争学设计模式|代理模式
  19. 9 9简单的数独游戏python_如何使用tkinter GUI python创建9*9数独生成器?
  20. 2022李宏毅机器学习hw1--COVID-19 Cases Prediction

热门文章

  1. 恶意程序新趋势-钻粪坑+数签
  2. Python if else elif
  3. 计算机毕业设计java+ssm协同过滤推荐算法的电影资源平台(源码+系统+mysql数据库+Lw文档)
  4. Win7 x64无法安装VS2010 SP1包解决方法
  5. (转载)CruiseControl配置介绍
  6. matlab实现图像的拼接,MATLAB实现图像拼接算法(求助)
  7. 遗传算法多维matlab,MATLAB遗传算法
  8. 2021年下半年系统集成项目管理工程师下午真题及答案解析
  9. 数据库系统概念第六版课后习题-第二章答案
  10. Java连接HBase