stm32f4 mpu6050与姿态解算(仅供自己学习使用,学习笔记)

2023-05-16

IMU原理及姿态融合算法详解

    • 一.陀螺仪的组成原理
      • 1)加速度计
      • 2)陀螺仪
      • 3)磁力计
    • 二.椭球拟合
    • 三.姿态的描述
      • 1)坐标系
        • 载体坐标系
        • 当地导航坐标系
        • 载体坐标系
      • 2)四元数
      • 3)欧拉角
      • 4)旋转矩阵
    • 四.传感器的噪声及去除与误差补偿
      • 基本原理
      • 误差补偿
    • 五.传感器数据融合
      • 磁力计数据融合
    • 六.滤波
    • 七.代码分析与融合

一.陀螺仪的组成原理

1)加速度计

MEMS加速度计利用红色的这部分质量,当这一方向上存在加速度时,利用形变,可以检测到电容值的变化,就可推算出这个方向上的加速度了
理
在这里插入图片描述

2)陀螺仪

由于科利奥氏现象,一个物体朝一个方向运动时,如果有外部的角速度,在这个物体系下观察垂直于速度方向的位移,这时候在位移方向会有一个科氏力的作用,测量这个力便能直到角速度W的大小。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在实际的MEME传感器中,大致结构如图,在一个方向保持左右运动,若有旋转的角速度则会在垂直的方向产生科氏力,通过电容的变化来反应这个力的大小便能得到旋转速度的大小。黄色的部分带动红色的负载在Driving Direction上不停的震动这时如果有一个外部的角速度,会产生垂直于Driving Direction的位移,使得最里面的红色和蓝色间的电容值发生变化。

在这里插入图片描述

3)磁力计

在六轴数据融合姿态解算算法中,我们通过理论和实际重力加速度向量来补偿陀螺仪误差。但重力加速度向量垂直于大地坐标系的xoy平面,即平行于Yaw轴转轴,故无法用于修正Yaw轴的角度数据。因此我们引入磁力计数据,由于地球磁场方向在中低纬度地区与地面大致平行,因此通过磁力计数据我们可以有效的修正Yaw轴的角度数据。

但在一部分情况中,复杂的磁场环境会导致九轴数据融合的结果并不能远好于六轴数据,甚至劣于六轴数据融合的结果,比如RoboMaster机器人云台在某些情况下不使用磁力计数据。原因是云台复杂多变的磁场环境会给磁力计引入很大的噪声。综上所述,具体选择九轴还是六轴数据的融合还需要根据具体环境来决定。
磁力计是通过霍尔效应来测量磁场的强度。这个视频中会有详细讲解,可以参考这个视频: https://www.youtube.com/watch?v=eqZgxR6eRjo&feature=youtu.be.
可也以参考这篇文章,这篇文章对内部传感器的原理解释的更加详细充分: http://www.51hei.com/bbs/dpj-92911-1.html.
值得注意的是磁力计解算姿态时不能直接采用公式
anglez=−arctan2(mny,mnx)
而是需要使用加速度计计算出的roll和pitch做一个坐标变换,再带入计算。

这个地方为什么这个不可以直接采用公式?,改日进网址再看一下

二.椭球拟合

由于 x,y,z 三轴的单位存在差异,测量数据的向量顶点会落在椭球面上而非理想状态下的球面上。另外,电路板产生的电磁场会使磁力计测量数据出现偏移,这则会导致椭球的中心不在原点。因此,在磁力计进行椭球拟合是很有必要的。具体椭球拟合算法可以参考https://blog.csdn.net/shenshikexmu/article/details/70143455.

三.姿态的描述

1)坐标系

载体坐标系

当地导航坐标系

当地导航坐标系中常用的有东-北-天坐标系和北-东-地坐标系
东北天坐标系:
X轴:指东;
Y轴:指北;
Z轴:指天;
画了一个大概示意图
在这里插入图片描述

北东地坐标系:
X轴:指北;
Y轴:指东;
Z轴:指地;
在这里插入图片描述

载体坐标系

与导航坐标系类似,常用的载体坐标系也有如下两种:
前右下坐标系—对应北东地导航坐标系
X轴:指向载体前进方向;
 Y轴:指向载体右侧;
 Z轴:指向下
右前上坐标系—对应东北天导航坐标系
X轴:指向载体右侧;
 Y轴:指向载体前进方向;
 Z轴:指向上

2)四元数

我理解的四元数是用1,i,j,k来表示四维球的坐标和旋转
比如说复数是在一维平面内的,复数的运算实际上是线的伸缩和旋转,扩展到三维坐标系中,设三维坐标系中有一个单位为1的圆球,当三维的球映射在二维的坐标系中,球的上半部分会映射在xyij的单位圆内,而圆的下半部分会映射在那个圆以外的地方直至无穷远,坐标轴zk穿过的圆球上方的那个点映射在原点,对应的圆球下方的那个点,映射在无穷远处,于是在三维坐标系中1,i,j,-1,-i,-j代表的其实是一个圆,拓展到四维球,给原点乘一个i,就相当于把圆点拉向i的那个点,乘两个i以后,整个球就会变成里子被翻到外面的状态,,乘四个i以后,球就回到了原来的那个状态,我画了一个大致图,有点简陋,这就是我对四元数乘法的理解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四元数有以下运算规则
j∗k=i,k∗j=−i;
j∗k=i,k∗j=−i;
k∗i=j,i∗k=−j;
i∗i=j∗j=k∗k=i∗j∗k=−1
其中
i旋转代表X轴与Y轴相交平面中X轴正向向Y轴正向的旋转
j旋转代表Z轴与X轴相交平面中Z轴正向向X轴正向的旋转
k旋转代表Y轴与Z轴相交平面中Y轴正向向Z轴正向的旋转
-i、-j、-k分别代表i、j、k旋转的反向旋转
一个四元数可以写作
(刚刚开始写,不太会写數學公式)
q 1 ( w 1 + x i + y j + z k ) q1(w1+xi+yj+zk) q1(w1+xi+yj+zk)

其中

w 2 + x 2 + y 2 + z 2 = 1 w^{2}+x^{2}+y^{2}+z^{2}=1 w2+x2+y2+z2=1
四元数的模:也表示原点到那个点的距离在这里插入图片描述
通过四元数反解欧拉角
得到四元数后,可以通过四元数的值反解出机体坐标系的欧拉角,这里省略推导过程直接给出公式:在这里插入图片描述

这里就先简单写到这里,具体更详细的可以参考这篇文章https://blog.csdn.net/AndrewFan/article/details/62057519.

3)欧拉角

使用欧拉角会出现万向节锁死的问题具体可以参考这篇文章https://blog.csdn.net/AndrewFan/article/details/60981437#.
因为会出现万向节锁死的问题,所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定

欧拉角的直观表现可以参考这篇https://www.zhihu.com/question/47736315.
以下为我自己对欧拉角的理解,用欧拉角表示旋转时,有两组坐标,一个是全局坐标,一个是局部坐标,旋转步骤为:
1.物体绕全局的z轴旋转
2.物体再绕自己的x轴旋转
3.最后再绕自己的z轴旋转

在这里插入图片描述
总结以下三点:
旋转的正方向为:从旋转轴看的逆时针方向
旋转的顺序为:Z-X-Y
对应的欧拉角:Yaw-Pitch-Roll
每当用到欧拉角时,我们必须明确的表示出夹角的顺序,指定其参考轴
欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。
Yaw(偏航):欧拉角向量的y轴
Pitch(俯仰):欧拉角向量的x轴
Roll(翻滚): 欧拉角向量的z轴

4)旋转矩阵

更详细的导航坐标系与载体坐标系之间的姿态旋转矩阵可参考这篇文章https://blog.csdn.net/zht2370201/article/details/89313370?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161530989616780266271997%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161530989616780266271997&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-89313370.first_rank_v2_pc_rank_v29&utm_term=%E4%B8%9C%E5%8C%97%E5%A4%A9%E5%9D%90%E6%A0%87%E7%B3%BB%E5%AE%9A%E4%B9%89.
对于两个三维点 p1(x1,y1,z1),p2(x2,y2,z2),由点 p1 经过旋转矩阵 R 旋转到 p2,(旋转矩阵为正交矩阵)
(由于我不会打數學公式,所以只能搬别人的了)

在这里插入图片描述
绕x轴旋转:
在这里插入图片描述
绕y轴旋转:

在这里插入图片描述

绕z轴旋转:
在这里插入图片描述

任意旋转矩阵(欧拉角):
在这里插入图片描述

解方程得:
在这里插入图片描述
还有的文章说使用欧拉角的话套用欧拉微分方程就可以了

在这里插入图片描述

https://blog.csdn.net/yeppchan/article/details/83992434.
可以参考这篇文章

用四元数表示旋转矩阵可以表示为
在这里插入图片描述

其中:
在这里插入图片描述

对应四元数为:
在这里插入图片描述

也可写成有序数对形式,即2.1旋转公式中的:

在这里插入图片描述

四.传感器的噪声及去除与误差补偿

基本原理

对角速度进行积分可以得到角度,但是积分会使结果有误差。对加速度积分,然后正交分解可以得到角度,但是电机旋转震动会给加速度计的数据带来高频噪声,将两个数据进行融合,用加速度计来补偿角度的误差
设有大地坐标下的重力加速度 g,利用矩阵的逆坐标变换后得到机体坐标系下的重力加速度
不难看出,将重力加速度向量变换至机体坐标系后,恰好是矩阵的最后一列。这样一来,我们就得到了由描述刚体姿态的四元数推导出的理论重力加速度向量 v^ 。另外,我们还可以通过加速度计测量出实际重力加速度向量 v。
在这里插入图片描述
理论重力加速度和实际重力加速度的误差主要来自于陀螺仪数据产生的角速度误差引起的,所以可以根据理论重力加速度和实际重力加速度的误差来补偿陀螺仪数据中的误差,将隐藏在四元数中的误差显化,解算出较为准确的姿态

误差补偿

计算向量间的夹角一般有两种方法内积(点乘)和外积(叉乘),考虑到向量外积模的大小与向量夹角呈正相关,故通过计算外积来得到向量方向差值 θ:
在这里插入图片描述
首先先将两向量单位化
在这里插入图片描述
考虑到实际情况中理论向量 v^ 和实际向量 v 偏差角不会超过45°,而当θ在±45°内时,sinθ 与θ的值非常接近,因此上式可进一步简化为:
在这里插入图片描述
得到向量偏差后,即可通过构建PI补偿器来计算角速度补偿值
在这里插入图片描述
其中,比例项用于控制传感器的“可信度”,积分项用于消除静态误差。KP越大,意味着通过加速度计得到误差后补偿越显著,即是越信任加速度计。反之KP越小时,加速度计对陀螺仪的补偿作用越弱,也就越信任陀螺仪。而积分项则用于消除角速度测量值中的有偏噪声,故对于经过零篇矫正的角速度测量值,一般选取很小的KI。最后将补偿值补偿给角速度测量值,带入四元数差分方程中即可更新当前四元数。
最后还需要通过四元数反解出欧拉角

在这里插入图片描述

五.传感器数据融合

磁力计数据融合

六.滤波

七.代码分析与融合

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

stm32f4 mpu6050与姿态解算(仅供自己学习使用,学习笔记) 的相关文章

  • Maven-3.6.1下载与环境搭建(解决IDEA兼容问题)及其配置

    Maven 3 6 1下载与环境搭建 xff08 解决IDEA兼容问题 xff09 及配置 Maven下载路径配置系统环境路径配置测试 Maven的文件目录结构解析IDEA中Maven的配置IDEA中Maven的全局配置 注意 xff1a
  • 构建一个arm裸板轻量级的printf

    构建一个arm裸板轻量级的printf span class token keyword typedef span span class token keyword char span span class token operator s
  • 二维小游戏,飞机大战,图片素材

    二维小游戏 xff0c 飞机大战 xff0c 图片素材 高清大图下载链接 https download csdn net download qq 45706825 15042600
  • hallib_RTC

    RTC 一 配置参数 1 2 只有使能RTC之后才能选LSE 二 编写应用代码 1 在mspinit里面加上这个函数 xff0c 打开秒中断 xff0c 这个函数在 h文件里面 span class token function HAL R
  • hullib_Tim3TiggerAdc1

    Tim3TiggerAdc1 只有Tim3才可以用更新 xff08 TIM TRGO UPDATE xff09 触发adc xff0c 其他定时器都要用输出比较模式才可以 一 cubmax配置 1 配置tim3为500ms更新 xff0c
  • hullib_AdcBase

    AdcBase 也就是不用中断 xff0c 每次用软件触发的简单操作 一 cubmax配置 1 选好通道就可以了 xff0c 其他都不用管 二 需要编写的代码 1 在main函数while里面写上 span class token keyw
  • hullib_eeprom

    EEPROM 这个模拟iic真的搞了好久啊 xff0c 最后发现这个24c02写完之后至少要延时4ms再来读才可以 xff0c 要不然读的时候都是NACK 一 时序 自己看数据手册吧
  • hullib_PwmCapture

    PwmCapture 需要两个channel 一 cubemx配置 一个上升沿捕获 xff0c 一个下降沿捕获 打开中断 二 自己写的代码 1 开启两个通道的中断 span class token function HAL TIM IC S
  • 2021-03-16

    hullib Rtc 获取时间之后必须获取日期他才会有时间 HAL RTC GetTime amp hrtc amp sTime RTC FORMAT BIN HAL RTC GetDate amp hrtc amp sDate RTC F
  • hullib_PwmOutput

    hullib PwmOutput 一 cubmx需要配置的 1 这里一定是pwm Generation 而不是pwm outcompare 使用定时器的PWM模式只能在4个通道产生频率相同但占空比不同的输出信号 使用定时器的输出比较模式可以
  • 计算机类非全日制研究生

    北京市 10002 中国人民大学 院系所专业研究方向考试范围 159 信息学院 xff08 专业学位 xff09 085400 专业学位 电子信息 02 软件工程领域 xff08 非全 xff09 详情 159 信息学院 xff08 专业学
  • 史上最详细的Docker 镜像的制作-上传-拉取--部署(阿里云)

    Docker 镜像的制作 上传 拉取 部署 一 镜像 xff08 images xff09 1 什么是镜像 xff1f 2 镜像的组成和用途 xff08 1 xff09 Dockerfile xff08 2 xff09 scratch xf
  • 机动目标跟踪-Singer模型,当前统计模型,交互多模型与卡尔曼滤波的结合

    文章目录 非机动目标跟踪算法原理一 Singer 模型算法二 当前统计模型算法三 交互多模型算法 实验仿真一 低机动情况1 1 Singer模型参数设置1 2 当前统计模型参数设置1 3交互多模型参数设置1 4 对比分析 二 一般机动情况2
  • 用大白话解析函数调用,系统调用和API之间的关系

    一 官方的解释 大概了解一下 函数调用 函数调用是计算机编或运行时 xff0c 使用某个函数来完成相关命令 系统调用 系统调用是用户在程序中使用 访管指令 调用由操作系统提供的子功能集合 API 应用编程接口 xff08 Applicati
  • docker删除所有容器和镜像

    确保自己有权限 xff0c 一般先执行下面的命令获取管理员权限 span class token function sudo span span class token function su span 1 杀死运行的容器 xff1a sp
  • Docker镜像制作与仓库搭建

    Docker 1 xff0c docker镜像制作2 xff0c docker仓库搭建 1 xff0c docker镜像制作 docker官方和个人发布的镜像由于版本等各种原因 xff0c 漏洞较多 xff0c 已统计Docker Hub超
  • 2019年全国大学生电子设计竞赛赛题分享与浅析

    0 ti杯2019年全国大学生电子设计竞赛赛题已于今晨公布 其中赛题分为本科组与高职高专组 xff1a 本科组 xff1a A 电动小车动态无线充电系统 B 巡线机器人 C 线路负载及故障检测装置 D 简易电路特性测试仪 E 基于互联网的信
  • springboot整合canal实现对mysql数据库实时监控

    canal Canal介绍Mysql环境准备安装canalspringboot整合canal Canal介绍 官网地址 xff1a https github com alibaba canal canal k n l xff0c 译意为水道
  • tensorflow2.6.0安装 another metric with the same name already exists

    终端直接输入pip install tensorflow 61 61 2 6 0 但是这里有一点问题 span class token keyword import span os span class token keyword impo
  • Java编程心得体会

    初次学习Java编程的心得与体会 之前学习过c语言 xff0c python编程 xff0c 对比Java编程首先感觉到的区别就是Java环境配置比较复杂 xff0c 编程工具安装比较麻烦 课堂上老师讲到首先下载安装jdk xff0c 然后

随机推荐

  • Ubuntu18.04+ROS-melodic环境 px4+move_base仿真遇到的问题

    前前后后安了三个虚拟机 xff0c 折腾了快一个月了吧 第四次用双系统终于实现了 每次都有不同的坑 1 错误 xff1a gz symbol lookup error usr lib x86 64 linux gnu libgazebo c
  • 【谷粒学院】项目总结

    做谷粒学院这个项目大概花了2个多月的时间 xff0c 期间遇到了很多问题 xff0c 想要记录下来 xff0c 希望可以对别人有所帮助 首先谷粒学院项目我是不太推荐时间紧张的友友拿来做为毕设项目的 xff0c 原因是里面涉及到的技术 服务很
  • 完美解决make -f Makefile.unx报错问题 +Centos

    这里写自定义目录标题 本人亲测成功 导读 xff1a 我用这个命令主要是针对编译hadoop的 xff0c 其中有个isa l安装 xff0c 是英特尔 ISA L技术即 xff08 Intel Intelligent Storage Ac
  • 关于Gitee创建存储库多人协作流程

    关于Gitee创建存储库多人协作流程 主要解决在IDEA工具开发下通过Gtiee多人协作 xff0c 共同开发 前期准备 IDEA xff1a IDEA当前文档使用版本为2021 3 1 Git xff1a IDEA安装Gitee插件 流程
  • ajax上传文件,图片并显示与删除(spring boot)

    思路 xff1a 先上传文件然后在读出来 之前本人都是用form提交上传文件 xff0c 现在写个ajax的文件上传 先看下效果 xff1a 上传并在页面显示 关键代码 xff1a 在启动类里面加入 span class token com
  • opencv-python——调用摄像头或导入视频实现颜色识别并画框

    采用opencv进行颜色识别有个好处就是他的框可以是具有角度的长方体框 xff0c 不局限于平行点的 文章目录 颜色识别实现过程1 调用摄像头 导入视频或读入照片2 找出所需颜色对应的HSV阈值3 找出二值化后的图片中的特征点并进行画框 完
  • Ubuntu18.04——python2安装opencv4.1版本并代替ROS自带的低版本opencv

    软件环境 Ubuntu 18 04系统ROS melodic 查看安装ROS默认安装的CV2位置 改个名 xff0c 不要是cv2就ok xff1a 查看是否移除 可以发现还有一个cv2的so文件 xff0c 所以我们需要将这个也移除 改个
  • 直流电机驱动电路设计-----学习笔记

    直流电机驱动电路的设计目标 在直流电机驱动电路的设计中 xff0c 主要考虑一下几点 xff1a 1 功能 xff1a 电机是单向还是双向转动 需不需要调速 对于单向的电机驱动 xff0c 只要用一个大功率三极管或场效应管或继电器直接带动电
  • ROS——问题解决:rqt工具包中image_view消失;bash: rosrun rqt_image_view未找到命令

    重装rqt工具 span class token function sudo span span class token function apt get span span class token function install spa
  • VS Code——Git插件使用指南

    文章目录 一 基于VScode本地新建工程并上传到Github1 新建工程文件夹并用Vscode打开该文件夹2 初始化存储库3 暂存更改4 提交暂存更改5 同步到Github中6 在Github中查看项目 二 Git clone到本地后进行
  • Ubuntu18.04——查看CPU, GPU,内存利用率

    htop查看CPU和内存利用率 sudo apt install htop 启动htop htop 查看NVIDIA GPU利用率 nvidia smi 以每秒1次的刷新频率实时查看 nvidia smi l 1
  • Ubuntu18.04——基于X86和Arm安装并配置Realsense-ros环境

    文章目录 基础安装1 安装ROS2 安装Realsense驱动以及依赖库 xff08 1 xff09 X86安装librealsense更新 xff08 2 xff09 Arm编译安装librealsense xff08 或者Apt无法下载
  • 【Rt-Thread】STM32输出PWM

    1 实验目标 STM32输出不同频率的占空比为50 的PWM信号 xff0c 控制蜂鸣器音调 2 硬件部分 2 1 模块介绍 xff08 1 xff09 主控芯片 F405RGT6 xff08 2 xff09 蜂鸣器 低电平触发 2 2 接
  • 考研复试实用指南

    Preface 考研初试已经结束 xff0c 但是考研这场仗还没打完 xff0c 接下来 xff0c 我们将走入复试的战场 考研复试并不是走过场 xff0c 是有严格的淘汰比例的 xff1b 考研复试并不是关系网 xff0c 是有公开而透明
  • 2020oop第一次练习 6-3 字符串 - 6. 查找子串(BF算法) (10分)

    C语言标准函数库中包括 strstr 函数 xff0c 在主串中查找子串 作为练习 xff0c 我们自己编写一个功能与之相同的函数 函数原型 char StrStr const char txt const char pat 说明 xff1
  • 信号量——二值信号量

    信号量 二值信号量 信号量简介 信号量是操作系统的重要部分 xff0c 信号量一般用来进行资源管理和任务同步 FreeRTOS中信号量分为二值信号量 互斥信号量 计数信号量和递归互斥信号量 xff0c 应用场景各不同 二值信号量 二值信号量
  • switch case语句的用法

    switch case语句的用法 我们首先来看一下switch case 语句的一般形式是怎样的 span class token keyword switch span xff08 表达式 xff09 xff5b span class t
  • C++容器作为函数形参进行使用

    C 43 43 容器作为函数形参进行使用 如这个编程题 xff1a 该题是对容器的简单应用 xff0c 由于数组在定义的时候要么用列表初始化间接告诉编译器数组的大小 xff0c 要么在定义的时候直接定义它的大小如 xff1a int arr
  • 任正非被遗漏的讲话:怎么做一个谦虚的领导者?(转)

    任正非曾在市场大会做过一个叫 做谦虚的领导者 的讲话 xff0c 少有媒体和社会层面的关注 xff0c 甚至内部也未有什么波澜 但细看起来 xff0c 这个讲话基本上是华为的管理纲要 xff0c 如 xff1a 以利润为中心 xff1b 建
  • stm32f4 mpu6050与姿态解算(仅供自己学习使用,学习笔记)

    IMU原理及姿态融合算法详解 一 陀螺仪的组成原理1 xff09 加速度计2 xff09 陀螺仪3 xff09 磁力计 二 椭球拟合三 姿态的描述1 坐标系载体坐标系当地导航坐标系载体坐标系 2 四元数3 欧拉角4 xff09 旋转矩阵 四