基于STM32F407四旋翼无人机---AK8975磁力计(四)

2023-05-16

基于STM32F407四旋翼无人机---AK8975磁力计(四)

  • 磁力计基本介绍
    • 1.2、磁力计原理图
  • 2、磁力计数据获取
  • 3、磁力计椭球拟合校准
    • 3.1、简单介绍椭球拟合

磁力计基本介绍

该模块采用高灵敏度霍尔传感器技术,通过IIC读取X,Y,Z轴的磁力计数据,通过解算磁力计数据得出比较可靠的偏航角,由于只通过MPU6050解算出来的欧拉角,偏航角并不准确,则需要通过磁力计解算出来的偏航角去修正,得到准确的偏航。

1.2、磁力计原理图

磁力计原理图如下:由于IIC可以同时挂3个设备,就可以把MPU6050、MS5611和AK8975用两个普通IO模拟的IIC时序读取数据。
在这里插入图片描述

2、磁力计数据获取

首先定义AK8975的寄存器,通过IIC发送命令获取X,Y,Z轴的磁力计数据:

//读取三轴磁力计数据
 IIC_Read_1Byte(AK8975_ADDR,AK8975_HXL,&AK8975_buffer[0]);
 IIC_Read_1Byte(AK8975_ADDR,AK8975_HXH,&AK8975_buffer[1]);
 IIC_Read_1Byte(AK8975_ADDR,AK8975_HYL,&AK8975_buffer[2]);
 IIC_Read_1Byte(AK8975_ADDR,AK8975_HYH,&AK8975_buffer[3]);
 IIC_Read_1Byte(AK8975_ADDR,AK8975_HZL,&AK8975_buffer[4]);
 IIC_Read_1Byte(AK8975_ADDR,AK8975_HZH,&AK8975_buffer[5]);

 AK8975_temp[1] = ((((int16_t)AK8975_buffer[1])<<8) | AK8975_buffer[0]);//磁力计X轴
 AK8975_temp[0] = ((((int16_t)AK8975_buffer[3])<<8) | AK8975_buffer[2]);//磁力计Y轴
 AK8975_temp[2] = -((((int16_t)AK8975_buffer[5])<<8) | AK8975_buffer[4]);//磁力计Z轴
 
 AK8975.Mag_Adc.x = AK8975_temp[0];
 AK8975.Mag_Adc.y = AK8975_temp[1];
 AK8975.Mag_Adc.z = AK8975_temp[2];

 AK8975.Mag_Val.x = AK8975.Mag_Adc.x - AK8975.Mag_Offset.x;
 AK8975.Mag_Val.y = AK8975.Mag_Adc.y - AK8975.Mag_Offset.y;
 AK8975.Mag_Val.z = AK8975.Mag_Adc.z - AK8975.Mag_Offset.z;
 
 WHY.MAGX = AK8975.Mag_Val.x;
 WHY.MAGY = AK8975.Mag_Val.y;
 WHY.MAGZ = AK8975.Mag_Val.z;

 AK8975_CalOffset();  //判断时候有磁力计校准
 /*由于AK8975只有单次测量模式,所以每次读出数据之后要重新设置模式以便下次读取*/
 IIC_Write_1Byte(AK8975_ADDR,AK8975_CNTL,0x01);

3、磁力计椭球拟合校准

3.1、简单介绍椭球拟合

传统的传感器标定补偿方法主要有四位置法、八位置法等, 存在计算量大、操作复杂、不易实现等不足, 尤其是三轴磁传感器的标定补偿, 对标定设备要求极高, 十分容易引入外界磁干扰, 从而导致结果不准确。加之, 现有多轴矢量传感器性能参数的标定补偿方法主要是针对各单轴传感器的安装误差进行补偿, 而忽略了对多轴矢量传感器中各单轴传感器的零偏误差、灵敏度误差的同时补偿。

三轴磁传感器轴间的不正交误差是指由于在制造过程中三个磁传感器的测量轴无法保证两两完全正交所引起, 其不正交角模型如图 1 所示。
在这里插入图片描述
如图 1 所示, ==X0、Y0、Z0 表示理想正交模型中三轴磁传感器的矢量指向; X、Y、Z 表示实际磁传感器三轴的指向; 假设 Z 轴与正交模型中的 Z0 轴重合,且 XOZ 面与 X0OZ0 面重合, α 为 X 轴在 XOZ 面与轴 X0 的夹角; β 为 Y 在 X0OY0 面的投影与 Y0 的夹角; γ 为 Y 与 X0OY0 面的夹角。==由此可建立三轴磁传感器不正交角的数学模型如下:
在这里插入图片描述
三轴加速度传感器坐标系 O-xbybzb 与地理坐标系 O-xgygzg 关系如图 2 所示重力矢量 g垂直向下分别表示载体的俯仰角和滚转角 某姿态下加速度传感器的测量值为 A=(ax,ay,az)T重力矢量在加速度传感器各轴的分量为 :
在这里插入图片描述

理想的三轴加速度传感器在任意姿态下加速度模值,根号下(gx)^2 + (gy)2+(gz)2 是固定值 g遥测量值 A 的轨迹是一个以 1g 为半径的重力圆球面袁实际由于加速度传感器的三轴存在各种误差袁输出轨迹会是一个中心偏离坐标原点的椭球,所以要校准到原点在中心的椭球。

static xyz_t MagMAX = { -100 , -100 , -100 }, MagMIN = { 100 , 100 , 100 }, MagSum;
 static uint16_t cnt_m=0;
  if(Mag_CALIBRATED)
  { 
  if(ABS(AK8975.Mag_Adc.x)<400 && ABS(AK8975.Mag_Adc.y)<400 && ABS(AK8975.Mag_Adc.z)<400)
   {
    MagMAX.x = _MAX(AK8975.Mag_Adc.x, MagMAX.x);
    MagMAX.y = _MAX(AK8975.Mag_Adc.y, MagMAX.y);
    MagMAX.z = _MAX(AK8975.Mag_Adc.z, MagMAX.z);
 
    MagMIN.x = _MIN(AK8975.Mag_Adc.x, MagMIN.x);
    MagMIN.y = _MIN(AK8975.Mag_Adc.y, MagMIN.y);
    MagMIN.z = _MIN(AK8975.Mag_Adc.z, MagMIN.z); 
    if(cnt_m == Calibration_time)
    {
     AK8975.Mag_Offset.x = (int16_t)((MagMAX.x + MagMIN.x) * 0.5f);
     AK8975.Mag_Offset.y = (int16_t)((MagMAX.y + MagMIN.y) * 0.5f);
     AK8975.Mag_Offset.z = (int16_t)((MagMAX.z + MagMIN.z) * 0.5f);

     MagSum.x = MagMAX.x - MagMIN.x;
     MagSum.y = MagMAX.y - MagMIN.y;
     MagSum.z = MagMAX.z - MagMIN.z;
     
     AK8975.Mag_Gain.y = MagSum.x / MagSum.y;
     AK8975.Mag_Gain.z = MagSum.x / MagSum.z;

     Param_SaveMagOffset(&AK8975.Mag_Offset);//保存数据
     cnt_m = 0;
     Mag_CALIBRATED = 0;
     }
    }
    cnt_m++;
  }

由于惯性元件都已经介绍完了,就要利用这些数据做姿态解算了。

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

基于STM32F407四旋翼无人机---AK8975磁力计(四) 的相关文章

  • 嵌入式Linux开发8——UART串口通讯

    1 背景知识 1 1 UART通讯格式 串口全称叫做串行接口 xff0c 通常也叫做 COM 接口 xff0c 串行接口指的是数据一个一个的顺序传输 xff0c 通信线路简单 使用两条线即可实现双向通信 xff0c 一条用于发送 xff0c
  • 二叉树笔记

    二叉树 二叉搜索 xff08 排序 查找 xff09 树 二叉查找树 xff08 Binary Search Tree xff09 xff0c xff08 又 xff1a 二叉搜索树 xff0c 二叉排序树 xff09 它或者是一棵空树 x
  • C++面试常见题目

    C 43 43 面试常见题目 c 43 43 编译过程自动类型推导auto和decltype重载 重写 xff08 覆盖 xff09 和隐藏的区别C 43 43 构造函数和析构函数能调用虚函数吗volatile关键词运算符重载格式noexe
  • 计算机网络面试常问问题

    C 43 43 面试 计算机网络常见问题 计算机网络常见问题TCP IP协议笔记TCPTCP的特点及目的序列号与确认应答提高可靠性为什么是三次握手和四次挥手滑动窗口流量控制拥塞控制TCP粘包问题 httphttp和https的区别https
  • Trajectory generation for quadrotor while tracking a moving target in cluttered environment

    四旋翼在杂波环境下跟踪运动目标的轨迹生成 摘要1 文章主要贡献2 前言2 1 轨迹公式2 2 实现结构 3 跟踪轨迹生成3 1 标称路径点生成3 2 可行路径点生成3 3 安全飞行走廊生成3 4 代价函数3 5 强制约束3 6 求解跟踪轨迹
  • 翻译-Frustum PointNets for 3D Object Detection from RGB-D Data

    Frustum PointNets for 3D Object Detection from RGB D Data 摘要介绍相关工作从RGB D数据中检测三维物体基于前视图图像的方法 xff1a 基于鸟瞰图的方法 基于3D的方法 点云的深度
  • Online Trajectory Generation of a MAV for Chasing a Moving Target in 3D Dense Environments

    微型无人机的在线轨迹生成 xff0c 用于在3D密集环境中追踪运动目标 摘要一 介绍二 相关工作A 在障碍物环境中追逐B 通过预先规划安全地生成轨迹 三 问题陈述A 问题设置B 能力C 命名 IV 视点生成A 可见度指标B 具有安全性和可见
  • 配置目标跟踪开源项目traj_gen_vis踩过的坑

    项目地址 https github com icsl Jeon traj gen vis 安装依赖需注意的问题 traj gen with qpoases 需安装ros分支的代码 xff08 这个作者并没有指出 xff0c 坑 xff09
  • cmake arm-none-eabi-gcc for stm32 cpp project

    尝试把原有的stm32工程F1canBootloader用cmake来管理 xff0c 遇到了以下几个坑 xff1a 1 报错 xff0c undefined reference to 96 dso handle 39 CMakeFiles
  • 网络攻防之wireshark抓取登录信息

    使用wireshark抓取登录信息 简介 xff1a Wireshark xff08 前称Ethereal xff09 是一个网络封包分析软件 网络封包分析软件的功能是撷取网络封包 xff0c 并尽可能显示出最为详细的网络封包资料 Wire
  • 头文件互相包含所引发的的问题(深入剖析)

    今天写程序出现了一个让人蛋疼的错误 xff0c 后来发现是由于头文件互相包含所引起的 原本只是简单的以为头文件互相包含只会触发 xff0c 头文件的递归包含 即 xff0c A包含B xff0c 所以才A的头文件里会将B的头文件内容拷贝过来
  • C++11异步操作future和aysnc 、function和bind

    C 43 43 11异步操作future和aysnc function和bind 前言异步操作std future和std aysnc 介绍std future和std aysnc的使用Demostd packaged task 介绍std
  • C++文件服务器项目—FastDFS—1

    C 43 43 文件服务器项目 FastDFS 1 前言1 项目架构2 分布式文件系统2 1 传统文件系统2 2 分布式文件系统 3 FastDFS介绍3 1 fdfs概述3 2 fdfs框架中的三个角色3 3 fdfs三个角色之间的关系3
  • C++文件服务器项目—Redis—2

    C 43 43 文件服务器项目 Redis 2 前言1 数据库类型1 1 基本概念1 2 关系 非关系型数据库搭配使用 2 redis基础知识点2 1 redis安装2 2 redis中的两个角色2 3 redis中数据的组织格式2 4 r
  • C++文件服务器项目—Nginx—3

    C 43 43 文件服务器项目 Nginx 3 前言1 Nginx一些基本概念1 1 Nginx初步认识1 2 正向代理概念理解1 3 反向代理概念理解 2 Nginx的安装与配置2 1 Nginx与相关依赖库的安装2 2 Nginx相关的
  • C++文件服务器项目—FastCGI—4

    C 43 43 文件服务器项目 FastCGI 4 前言1 CGI 概念理解2 FastCGI 概念理解3 FastCGI和spawn fcgi安装4 FastCGI和 Nginx的关系5 Nginx数据转发 修改配置文件6 spawn f
  • C++文件服务器项目—Nginx+FastDFS插件—5

    C 43 43 文件服务器项目 Nginx 43 FastDFS插件 5 前言1 文件上传下载流程1 1 文件上传流程1 2 文件下载流程1 3 文件下载优化流程 2 Nginx和fastDFS插件2 1 安装Nginx和fastdfs n
  • C++文件服务器项目—数据库表设计 与 后端接口设计—6

    C 43 43 文件服务器项目 数据库表的设计 6 前言1 数据库建表1 1 用户信息表 user info1 2 文件信息表 file info1 3 用户文件列表表 user file list1 4 用户文件数量表 user file
  • C语言中宏定义的使用

    1 引言 预处理命令可以改变程序设计环境 提高编程效率 它们并不是 C 语言本身的组成部分 不能直接对 它们进行编译 必须在对程序进行编译之前 先对程序中这些特殊的命令进行 预处理 经过预处理后 程序就不再包括预处理命令了 最后再由编译程序
  • C++文件服务器项目—项目总结与反向代理—7

    C 43 43 文件服务器项目 项目总结与反向代理 7 1 项目总结2 项目提炼3 web服务器的反向代理4 存储节点的反向代理 组件介绍基本写完了 xff0c 后续进行深入 本专栏知识点是通过零声教育的线上课学习 xff0c 进行梳理总结

随机推荐

  • https相关内容

    https相关内容 前言基础概念理解https传输过程 前言 本文写https相关内容 xff0c 持续补充 基础概念理解 对称加密 加解密秘钥是同一个 非对称加密 公钥 私钥 sa gt 公钥私钥都是两个数字ecc gt 椭圆曲线 两个点
  • TinyKv介绍

    TinyKv介绍 前言tinykv架构代码结构如何去写TinyKv参考内容 前言 开一个新坑 xff0c 将tinykv的4个project全部实现 虽然今天我点进去看的时候就萌生退意 好在没有放弃之前 xff0c 把project1完成了
  • TinyKv Project1 Standalone KV

    TinyKv Project1 Standalone KV 前言Project1 StandaloneKV 文档翻译文档的重点内容StandAloneStorageWriteReader Server单元测试 前言 project1还是比较
  • TinyKv Project2 PartA RaftKV

    TinyKv Project2a RaftKV 前言Project2 RaftKV 文档翻译Project2A重点内容抛出RaftLogRaftLog结构体字段详解RaftLog核心函数详解 RaftRaft 驱动规则Msg的作用与含义Ms
  • TinyKv Project2 PartB RaftKV

    TinyKv Project2 PartB RaftKV 前言Project2 PartB RaftKV 文档翻译PartB 到底想让我们做什么 xff1f 分析要实现的函数到底要干什么事情proposeRaftCommand 将上层命令打
  • TinyKv Project2 PartC RaftKV

    TinyKv Project2 PartC RaftKV 前言Project2 PartC RaftKV 文档翻译raft节点如何自动的compact压缩自己的entries日志生成快照与快照收收发日志压缩与快照收发总结疑难杂症 前言 pr
  • TinyKv Project3 PartA Multi-raft KV

    TinyKv Project3 PartA Multi raft KV 前言Project3 PartA Multi raft KV 文档翻译Add RemoveLeaderTransfer 前言 Project3是整个项目最难的部分 xf
  • TinyKv Project3 PartB Multi-raft KV

    TinyKv Project3 PartB Multi raft KV 前言Project3 PartB Multi raft KV 文档翻译发送请求LeaderTransfer 禅让ConfChange 集群成员变更Split regio
  • TinyKv Project3 PartC Multi-raft KV

    TinyKv Project3 PartC Multi raft KV 前言Project3 PartC Multi raft KV 文档翻译processRegionHeartbeatSchedule 前言 3C要求我们实现调度 3c按照
  • nodejs api学习:fs.createReadStreame()

    作用 这个api的作用是打开一个可读的文件流并且返回一个fs ReadStream对象 参数 createReadStream path option 该用来打开一个可读的文件流 xff0c 它返回一个fs ReadStream对象 64
  • TinyKv Project4 Transactions

    TinyKv Project4 Transactions 前言Project4 Transactions 文档翻译Project 4 TransactionsTinyKV中的事务Part APart BPart C Percolator x
  • sealos issue #2157 debug 思路流程记录

    sealos issues 2157 debug思路流程 前言分析issue剖析源码解决方案总结 前言 这个项目蛮有意思的 xff0c sealos 是以 kubernetes 为内核的云操作系统发行版 boss上看到 gt 沟通 gt 解
  • 系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?

    系统设计场景题 MySQL使用InnoDB xff0c 通过二级索引查第K大的数 xff0c 时间复杂度是多少 xff1f 前言明确场景对齐表的结构分析时间复杂度执行一条 select 语句 xff0c 期间发生了什么 xff1f 分析性能
  • 《嵌入式系统》 |(四) STM32软件架构 知识梳理

    系列索引 嵌入式系统 嵌入式系统 重点知识梳理 目录 CMSIS软件架构库文件说明 CMSIS软件架构 CMSIS概述 CMSIS软件架构由四层 xff1a 用户应用层 操作系统及中间件接口层 CMSIS层和硬件层 由三部分构成 核内外设访
  • Cmake链接第三方库的三种方法

    Cmake链接第三方库的三种方法 本文介绍链接第三方库的3种方法 以OpenBLAS举例 使用的工程名称为Test lib xff08 可执行文件名字 xff09 xff0c 主程序为library c 代码中的各路径请自行替代 xff1a
  • SADP功能使用

    SADP主要使用的是链路层多播及UDP多播的原理进行实现的 1 链路层多播 span class token function socket span span class token punctuation span PF PACKET
  • MatlabR2022b + Visual Studio环境配置

    在Matlab中输入 mex setup c 43 43 命令确认MEX使用VS2022编译环境 VC 43 43 目录 包含目录 添加 D Matlab2022b extern include VC 43 43 目录 库目录 添加 D M
  • ROS小车自主导航

    在进行ROS小车自主导航时 xff0c 需要用到三维可视化软件rviz xff0c 然而出现了问题 问题 xff1a 在运行rosrun rviz rviz xff0c 导入自己导航的程序后 xff0c 需要通过2D Pose Estima
  • SIYI AK28 遥控器接收机的SBUS口与STM32通讯

    SBUS介绍 SBUS是Futaba公司定义的一种串口通信协议 xff0c Futaba的产品应用越来越广泛 xff0c 不论是航模 xff0c 无人机 xff0c 还是机器人 xff0c 遥控车 xff0c 总能有它的身影 SBUS是一个
  • 基于STM32F407四旋翼无人机---AK8975磁力计(四)

    基于STM32F407四旋翼无人机 AK8975磁力计 xff08 四 xff09 磁力计基本介绍1 2 磁力计原理图 2 磁力计数据获取3 磁力计椭球拟合校准3 1 简单介绍椭球拟合 磁力计基本介绍 该模块采用高灵敏度霍尔传感器技术 xf