磁力计校正和数据处理

2023-05-16

在飞控涉及到的几个传感器中磁力计因该是属于最简单的传感器。在飞控上一般使用的磁力计传感器芯片是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);

这样就将图形转化成了一个半径为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);

                                            山东大学机器人研究中心
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

磁力计校正和数据处理 的相关文章

  • Docker概述(一)(标贝科技)

    Docker概述 xff08 一 xff09 顺便介绍下 xff1a 我们是一家致力于智能语音交互的AI公司 xff0c 我们提供了语音识别 语音合成 声纹识别 声音复刻 声音转换等技术产品供小伙伴们测试调用 xff0c 感兴趣的 xff0
  • 树莓派网络配置

    1 说明 1 树莓派有线网络配置 1 树莓派系统WIFI 静态IP设置 2 树莓派系统DNS地址 etc resolv conf 开机后被还原为空或者192 168 1 1处理方法 2 环境 软件环境 xff1a 树莓派3 0 系统 硬件环
  • Linux 读写memory操作,devmem直接访问物理内存地址

    1 说明 由于开发需要 xff0c 需要通过memory传输数据 xff0c 所以使用devmem 方式读写数据 xff0c 操作linux 内存数据 devmem的方式是提供给驱动开发人员 xff0c 在应用层能够侦测内存地址中的数据变化
  • Open3D+vs配置以及使用教程

    Open3d 0 8 0 43 Cmake 43 vs2015 1 下载 简要看一下官网 xff1a Open3D Home Page Github主页 xff1a Open3D Github 注意下载版本 xff0c 一定要与vs相匹配
  • 彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0

    通俗的了解IP地址是什么 对于IP地址 xff0c 大家并不陌生 xff0c 特别是在网络访问中我们会经常使用到 xff08 平时对域名如百度的www baidu com的访问 xff0c 本质就是对域名所绑定的IP地址的访问 xff09
  • C3927 “->“: 非函数声明符后不允许尾随返回类型等错误

    C3927 34 gt 34 非函数声明符后不允许尾随返回类型等错误 xff0c 如下所示 xff1a 解决方法 xff1a 在VS2015版本 Visual Studio 2015 Update 2 xff0c 增加一个编译选项 utf
  • c++ nan或inf

    nan xff1a not a number 非数字 注意事项 xff1a 对负数开方sqrt 1 0 对负数求对数 log 1 0 0 0 0 0 0 0 inf inf inf inf inf这些操作都会得到nan 0 0会产生操作异常
  • 膨胀、腐蚀、开、闭运算——数字图像处理中的形态学

    膨胀 腐蚀 开 闭运算是数学形态学最基本的变换 形态学通常用于二值图像 一 膨胀与腐蚀能够实现以下作用 xff1a 1 消除噪声 2 分割出独立的图像元素 xff0c 在图像中连接相邻的元素 3 寻找图像中的明显的极大值区域或者极小值区域
  • c语言中&与&&区别

    c语言中 amp 与 amp amp 的区别 amp xff1a 按照位与操作 xff0c 例如 xff1a 0010 amp 1101 xff0c 结果为0000 amp 是java中的位逻辑运算 xff1a eg xff1a 2 amp
  • 网格搜索法

    网格搜索法是指定参数值的一种穷举搜索方法 xff0c 通过将估计函数的参数通过交叉验证的方法进行优化来得到最优的学习算法 即 xff0c 将各个参数可能的取值进行排列组合 xff0c 列出所有可能的组合结果生成 网格 然后将各组合用于SVM
  • pytorch模型从训练到LibTorch部署(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 1 pytorch和libtorch安装 标贝科技 PyTorch 是Torch7 团
  • C++Debug Assertion Failed!到底出错在哪里?

    总结来说这种错误存在两种情况 xff0c 其一就是野指针 另一种情况就是内存泄露 在调试的时候一定是在自己编写的函数上找错 xff0c 不要一只跟着调试顺序在库函数里找错 注意事项 单步调试找到错误 xff0c 祝好运 以上为百度出来的结果
  • 截止频率概念

    截止频率 fc xff08 1HZ 100HZ xff09 xff0c 代表什么意思 截止频率fc xff0c 用来描述一个滤波器或一个放大器频率特性的指标 一个滤波器或一个放大器 xff0c 当保持输入信号的幅度不变 xff0c 改变信号
  • C语言中EOF什么意思

    在C语言中 xff0c 或更精确地说成C标准函数库中表示文件结束符 xff08 end of file xff09 在while循环中以EOF作为文件结束标志 xff0c 这种以EOF作为文件结束标志的文件 xff0c 必须是文本文件 在文
  • C++里面的LPBYTE是什么意思

    BYTE 为 unsigned char LPBYTE 为 unsigned char
  • ORACLE 字符串聚合函数 strCat

    create or replace type strcat type as object currentstr varchar2 4000 currentseprator varchar2 8 static function ODCIAgg
  • 1.unity3d Astar pathfinding 第一个例子

    1 场景准备 先建立一个scene 添加一个plane xff0c 让其坐标处于 0 0 0 xff0c 并三方向scale都为10 添加一个新的layer xff0c 命名为Ground xff0c 并将上面建立的plane设置为Grou
  • [STM32]开源多功能DAP 脱机烧录器 DAPLink仿真下载器

    网上已经有很多开源脱机烧录器的了 xff0c XVIN1987的很小巧 xff0c 很有参考价值 xff0c 志明的很庞大 xff0c 源码较多较复杂 xff0c 于是自己在无线DAP的基础上 xff0c 添加了脱机烧录功能 xff0c u
  • 全志V3S 入门 RTL8723BS 连接wifi

    开发板 xff1a 荔枝派zero linux xff1a 5 10 rootfs xff1a buildroot 2017 8 1 使用最新的主线linux内核5 10 xff0c 主线5 10内核linux make ARCH 61 a
  • ESP32蓝牙 华为手机容易断连解决

    在长达两年的售后中 xff0c 收到华为手机连接ESP32蓝牙是最容易断开连接的 xff0c 一开始小米手机 苹果手机都没问题 xff0c 就只有华为 xff0c 一连上就断开 xff0c 所以我们认为是APP问题 xff0c 于是我们去找

随机推荐

  • ESP32-S3 LVGL http下载B站头像 JPG显示

    最近在用ESP32S3获取B站JPG头像进行显示 记录一下 xff0c 开发板链接 xff1a ESP32 S3 LVGL 开发板 人工智能语音识别 人脸识别 触摸 音频 淘宝网 taobao com 直接上代码 xff1a 第一种下载方式
  • Docker概述(二)(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 Docker概述 xff08 二 xff09 文章目录 Docker概述 xff08
  • 【串口通信】K210与STM32串口通信、K210与OpenMV串口通信

    串口通信 K210与STM32串口通信 K210与OpenMV串口通信 串口通信前言为何需要串口通信 K210如何进行串口通信K210串口配置K210串口发送相关定义K210串口发送测试K210串口接收相关定义K210串口接收测试 STM3
  • 【ESP32S3系列】1、使用ESP32S3开发板点亮WS2812

    开发板链接 xff1a ESP32 S3 LVGL 开发板BLE人工智能语音人脸识别触摸 音频芯片wifi 淘宝网 taobao com 板子上的LED是WS2812 xff0c 它的引脚分别是 xff1a VDD xff1a 电源 xff
  • win10 使用sonarqube扫描ESP32 C语言工程代码

    社区版的扫描不了C代码 xff0c 所以要找个破解的 项目场景 xff1a 最近项目上霍尼韦尔要求使用sonarqube来扫描代码得出漏洞报告 xff0c 网上找了一圈没有比较容易成功的 xff0c 总结下经验 电脑里要有visual st
  • ESP32 如何引入静态库lib.a

    只需要在Cmakelist txt里这样写 xff1a 如果这个lib正常运行的话需要用到json和lwip相关的函数 xff0c 那就添加一个PRIV REQUIRES 这个component的名字即可
  • OPENMV结合PIX飞控实现四轴定点 循迹 2017电赛

    本文章代码已上传Github xff1a https github com Kevincoooool 2017 Follow 有兴趣的可以加个STAR 自从17年国赛之后 xff0c 自己做了openmv xff0c 加了很多群 xff0c
  • 简易旋转倒立摆设计报告

    完整文档和源码 xff1a https github com Kevincoooool inverted pendulum 43 2017年成都信息工程大学 第六届 电协杯 电子设计竞赛 简易旋转倒立摆及控制装置 xff08 I题 xff0
  • OpenMV-IDE 免KEY提示 编译教程

    很多人在购买了OpenMV之后都没有购买key xff0c 虽然key作为一种捐赠开发者的形式存在 xff0c 但大多数人都是不愿意每次使用都看到那三个提示框的 xff0c 而且不愿意去购买key xff0c 附上我的编译教程 xff1a
  • OpenMV H7也就是OpenMV4来啦 最新

    17年开始做过了四个版本的openmv 可谓是电赛好帮手 开发了两年的openmv xff0c 我的目的就是让openmv变得便宜 目前官方的第四代openmv还在众筹中 xff1a https www kickstarter com pr
  • 开源一个安卓四轴上位机+配套ESP8266 UDP串口通信源码

    手机APP是由匿名四轴遥控器修改而来 xff0c 在原有基础上添加了双摇杆控制和单摇杆控制 数据通过UDP和ESP8266通信 协议可修改 安卓app源码 xff1a https github com Kevincoooool KSTC V
  • c++中函数屏蔽和函数参数屏蔽

    情况一 函数的屏蔽 例如 nbsp nbsp void Function int a int b nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp int c a b 若是不使用函
  • STM32串口之奇偶校验设置

    今天 xff0c 在调试rs485的时候出现了32芯片串口端可以正常发送数据 xff0c 485芯片数据输出端不能发送数据 xff0c 自己查了下485芯片手册 xff0c 发现485芯片有个引脚通过32芯片给出高低电平来控制它是接受还是发
  • 基于AudioQueue实现音频的录制和播放(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 基于AudioQueue实现音频的录制和播放 文章目录 基于AudioQueue实现音
  • webots建立四连杆机构模型

    webots建立四连杆机构模型 使用webots内置的插件构建四连杆机构建立robot形状参考文献 使用webots内置的插件构建四连杆机构 首先 xff0c 可以去官网下载最新的webots xff0c 网址 xff1a https ww
  • STM32使用FREERTOS获取系统时间

    使用CUBE MX生成带有free RTOS操作系统的工程 xff0c 我们经常会使用到系统相对时间 xff0c 尤其是使用其做数据采集的项目中经常需要给你数据打上时间的标签就需要实时获取系统的相对时间 当然 xff0c 我们可以单独开一个
  • 一个简单的C++工程管理的Makefile

    摘要 C C 43 43 代码都需要使用编译器来编译代码生成相应的目标文件 xff0c 在大部分的windows开发中 xff0c 开发者多用商用或开源的集成开发环境 xff08 IDE xff09 xff0c 比如 xff1a visua
  • STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强

    ms5611是同时支持I2C和SPI通信协议的气压计芯片 已经很普遍的被用在飞行器控制板上作为高度传感器 开发过stm32的朋友都知道它的硬件I2C是由bug的 xff0c 一般使用的都是自己编写的软件I2C通信协议 但是其硬件SPI通信却
  • DIY四旋翼(穿越机)软硬件设计

    今天教教大家怎么真正意义上的DIY四旋翼飞行器 xff0c 我将从机架入手DIY穿越机 下面是我的步骤 xff1a 1 设计机架三维图纸 xff1b 2 导出机架的二维图纸并做修改 xff1b 3 设计飞控板 xff1b 4 试飞 step
  • 磁力计校正和数据处理

    在飞控涉及到的几个传感器中磁力计因该是属于最简单的传感器 在飞控上一般使用的磁力计传感器芯片是HMC5883L HMC5983 MPU9250 MAG3110等 这些芯片利用的物理原理都相同 xff0c 只是在精度和数据接口上有些区别 下面