【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波——附3个算法源码

 效果:

MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波


目录

基础知识详解

欧拉角

加速度计(Accelerometer)与姿态测量

陀螺仪(Gyroscope)与姿态测量

姿态解算算法1-互补滤波

姿态解算算法2-四元数法

姿态解算算法3-卡尔曼滤波

组成

1.预测状态方程

2. 预测协方差方程 

3. 卡尔曼增益方程

4. 跟新最优值方程(卡尔曼滤波的输出)

5. 更新协方差方程

MPU6050简介

硬件连接

编程实现-源码下载


基础知识详解

欧拉角

欧拉角:以运动物体建立坐标系,通过绕轴旋转来表示运动物体当前的姿态( Roll - 翻滚角,Pitch - 俯仰角,Yaw - 偏航角)绕着Z轴旋转过的角度叫做yaw偏航角,绕着X轴旋转过的角度叫做roll翻滚角,绕着Y轴旋转过的角度叫做yaw俯仰角。接下来细致讲解去理解这三个角(欧拉角)

可以先考虑一个问题 :比如我们想要在空间中去表示任意一个点的位置,那这个时候我们首先需要建立一个坐标系,需要一个三轴的直角坐标系,就可以使用一个坐标xyz表示空间中任意一个点的位置。

今天所学习的欧拉角的坐标系与我们传统意义上的直角坐标系是有所区别的,对于传统直角坐标系的位置是固定不变的,而欧拉角的直角坐标系会随着物体的旋转和运动一起去运动,如下的一个球,以这个球建立一个坐标系,一开始球的三个轴与XYZ轴是重合的(图1)。首先沿Z轴旋转(图2),再沿X轴旋转(图3),再沿Y轴旋转(图4),经过这三次旋转之后就可以得到空间中的任意姿态,所以就可以使用这三次旋转的角度去表示球的运动姿态,这三个角度就是Roll - 翻滚角,Pitch - 俯仰角,Yaw - 偏航角,也就是所述的欧拉角。

图1

 图1 球的三个轴与XYZ轴重合

图2 球沿Z轴旋转

图3 球沿X轴旋转

图4.球沿Y轴旋转

形象理解:如下图,以飞机本身为参考系建立坐标系,这个坐标系会随着飞机的旋转和运动一起去运动。绕着Z轴旋转的角度叫做yaw偏航角,绕着X轴旋转的角度叫做roll翻滚角,绕着Y轴旋转的角度叫做yaw俯仰角。

绕着Z轴旋转的角度决定飞机在水平方向上的一个朝向,也就是决定了飞机的航向, 比如让机头绕着Z轴旋转一个角度,这个时候的夹角就是yaw偏航角,航向就发生了变化

翻滚角是绕着X轴旋转过的角度,当飞机绕着X轴旋转的时候,就像人在床上打滚的一个动作,所以很形象的把这个角叫做翻滚角

俯仰角就是绕着Y轴旋转过的角度,如果绕着y轴逆时针去旋转,飞机就在点头,绕着y轴顺时针旋转的时候,飞机就在抬头,那一点头一抬头就形象叫做俯仰。

在实际的编码过程中,就是使用欧拉角去表示物体的运动姿态

测量欧拉角的数值有两种方式:1.加速度计 2.陀螺仪。对于这两种方式来说测量欧拉角的结果互有优缺点,所以需要将这两种方式测得的欧拉角结果进行融合来得到更加精确的欧拉角的值

接下来理解一下加速度计和陀螺仪是如何测量欧拉角的

加速度计(Accelerometer)与姿态测量

加速度计就是用来测量加速度的一个传感器,对于mpu6050来说可以测量三个轴向的加速度,分别是沿X轴,y轴,z轴的加速度。有了这三个轴向的加速度后,就可以来计算欧拉角

举飞机例来形象理解三个轴向的加速度

如下图,当前飞机的姿态是斜向上的,假设飞机当前是匀速直线运动或静止,那么对于飞机只受一个力也就是重力,重力产生的加速度就是重力加速度g(9.8米每秒方)方向是垂直于地面向下所以可以以它为参考来计算欧拉角。

计算欧拉角之前,首先沿着三个轴向对重力加速度g进行分解就会得到三个轴向的加速度也就是ax,ay,az(ax,ay,az就是加速度计在三个轴向上的一个读数)

图5 飞机模型图 

接着就可以使用这三个ax,ay,az数来计算欧拉角。

需要注意使用加速度计来计算欧拉角只能算出roll翻滚角和pitch俯仰角,当飞机的方向大体处于水平方向时是没有办法通过加速度计的方式去计算yaw偏航角

接下来形象理解roll翻滚角和pitch俯仰角的计算

形象理解roll翻滚角的计算

在计算之前,我们形象来逆着图5x轴方向看(飞机尾部向里看)如下所示的主视图。在主视图中粉红色的线是重力加速度g,右边红色箭头是az重力加速度g在z轴上的一个分量,左边红色箭头是ay就是重力加速度g在y轴上的一个分量。

在如下主视图中,飞机是在逆时针旋转了一个角度α也就是翻滚角roll,夹角α的对边就是ay,临边是az,所以可以通过三角关系来求出夹角α也就是翻滚角roll,通过来计算出翻滚角roll

形象理解pitch俯仰角的计算

接着看一下右视图(逆着图5y轴往左看),在右视图中粉红色箭头表示重力加速度g,角度β就是pitch俯仰角的相反数也就是-pitch(因为规定pitch是绕着图5y轴逆时针旋转过的角度,而β角是顺时针旋转的,所以要取一个负号)。

β角的对边是ax,领边是az,所以使用三角关系就得到了β角也就是俯仰角

加速度计测量方式的优缺点

缺点:外部震动会引入噪声(白噪声)。因为在实际的情况下,运动的物体可能处于变速运动,而且也可能受到周围各个方向上的力从而使物体产生震动,如果产生震动其实就是一种变速运动,变速运动就会有加速度所以会产生各个方向上随机的加速度,那反应在波形上如下所示是x轴上的加速度的实测的曲线,在曲线上就会看到各种各样的毛刺,这些毛刺就是周围震动产生的影响,毛刺的出现是随机的而且幅度大小也随机所以类似于一种白噪声,所以只使用重力加速度去计算欧拉角是不够的,需要引入其它的测量方法

接下来讲解理解一下陀螺仪的测量物体运动的姿态

陀螺仪(Gyroscope)与姿态测量

陀螺仪就是使用角动量守恒物理定律所制作的一种传感器用来测量角速度。陀螺仪能够测量绕轴旋转的角速度,单位°/s

对于mpu6050可以输出三个轴向的角速度,分别是gx,gy,gz。gx就是飞机绕着x轴逆时针旋转的角速度,gy就是绕着y轴逆时针旋转的角速度,gz就是绕着z轴旋转的角速度。例如从mpu6050传感器中读出gx的值是720,也就是意味着飞机模型每秒会绕着x轴旋转两周。

有了角速度后可以进行计算欧拉角, 接下来理解一下计算过程

以pitch俯仰角为例理解角速度计算欧拉角

我们知道pitch俯仰角是绕y轴旋转过的角度,gy是绕y轴逆时针旋转的角速度,所以gy就是pitch俯仰角的一个导数(角速度等于角度关于时间的导数,不理解的看下方灰色块补充处),对pitch俯仰角求导就得到了gy。如下图,假设灰色线是pitch俯仰角的一个曲线,gy就代表曲线上的切线也就是曲线的斜率

如下,在t0时刻开始经过∆t时间到t1新时刻的pitch俯仰角=t0时刻的pitch俯仰角+gy乘∆t(∆t时间很短所以在∆t时间内曲线的斜率保持不变,又角速度等于角度关于时间的导数,所以gy乘∆t就等于∆t时间的pitch俯仰角)

 综上,把这个规律总结为一个公式,新角度=上次角度+角速度x间隔时间 ,进而就求出了欧拉角

所以就有了下面三个公式,其中t表示新角度的时间,新角度时间t减去∆t就是上次角度的时间

陀螺仪计算欧拉角的优缺点

 优点:准确、无干扰。因为陀螺仪是使用角动量守恒原理来制作的传感器,因此不会受到外部震动的影响,所以短期的测量结果是非常准确的

缺点:误差会累积。因为可以从公式中得知新角度是使用上一次的角度作为依据进行计算的,而新计算的角度在下一次的运算过程中又会被作为计算更新角度的计算依据,所以计算过程是一个迭代的过程,若在迭代的过程中某一次的运算产生了误差,那么这个误差就会被累积下去,当不断累积这个误差时我们计算的欧拉角的值就会跟实际的值产生偏移,这个就是误差累积。
如下图所示是实测的一个曲线,其中粉红色曲线是实测的gy值也就是绕y轴旋转的角速度,黄色线是实测pitch 俯仰角的值,红色线是我们通过上面公式所计算出的新角度pitch 俯仰角的值。可以看到刚开始时计算的俯仰角和实测 俯仰角是重合的,然后随着时间的延长,这个误差会逐渐累积,计算值和实测值之间的差距会越来越大,最终会完全偏离实际值

补充***理解角速度等于角度关于时间的导数***

角速度(ω)表示每单位时间角度的变化率,其单位是rad/s。

角度(θ)表示物体在转动过程中转过的角大小,其单位是rad(弧度)。

两者之间的关系为:ω = dθ/dt   其中,dθ是角度θ在时间dt内的变化量。这表示角速度ω等于角度θ关于时间t的导数。

通过这个关系式,可以推导出:θ = ∫ωdt   即角度等于角速度ω关于时间t的积分。

综上:

如果给出角度θ与时间t的函数,可以通过求导获得角速度ω与时间t的关系。

如果给定角速度ω随时间t的函数表达式,可以通过积分求出角度θ与时间t的关系。

总结: 

加速度计和陀螺仪的优缺点正好相反,是可以互相补足的,加速度计时使用反正切值直接推导出的欧拉角所以长期来看不存在漂移,陀螺仪是使用迭代的方式进行计算的所以误差会累积即长期会漂移严重

综上,接下来将加速度计和陀螺仪这两个测量结果结合起来从而得到一个更精确的欧拉角

姿态解算算法1-互补滤波

数据融合,首先计算陀螺仪和加速度计的欧拉角测量结果,然后将这两个结果前面都乘一个系数权重相加就得到了融合之后的最终结果。

陀螺仪前面权重是α,加速度计前面权重是1-α,例如α=0.98,加速度计的权重就是0.02。在实际的使用过程中可以微调α的值来让融合之后获得更好的性能。

数据融合具体计算过程如下: 

通过加速度计来计算出欧拉角中roll翻滚角和pitch俯仰角的值

 通过陀螺仪读出三轴的角速度gx,gy,gz,就可以使用原来的角度+角速度乘以∆t算出新的角度,这样就通过陀螺仪计算出了三个欧拉角Roll翻滚角,Pitch俯仰角,Yaw偏航角

然后对两组测量欧拉角的结果进行融合,通过陀螺仪和加速度计的欧拉角测量结果,将这两个结果前面都乘一个系数权重相加就得到了融合之后的欧拉角的最终结果。

权重α的取值问题

α的值越大就代表越信任陀螺仪的测量结果,反之则代表越信任加速度计的测量结果,α不易取太大也不易取太小,α的取值可以用下面这个公式,其中∆t代表读取传感器的时间间隔(例如以200Hz的频率去读数取mpu6050的测量结果,这时的读取的间隔就是5ms,这个不理解的可以看下面的灰色块补充处理解)

接下来讲一下关于上面公式中的τ的含义

 下图中紫色线表示使用陀螺仪计算的一个结果,红色线表示使用加速度计计算的结果,粉红色表示融合后的结果。

可以看到对于陀螺仪计算的结果的变化趋势是对的,但是和真实值(红色线)之间存在着较大的偏移,对于红色线来说大体的趋势是对的但是有一些毛刺噪声,对两组数据进行融合得到粉红色的曲线,粉红色线就比较好的反应了运动姿态

τ值就等于加速度计对陀螺仪纠偏移的一个时间,τ时间越短代表收敛的速度就越快,就越接近于加速度计的测量结果,τ的时间越长代表收敛的速度就越慢,就越接近于陀螺仪的测量结果,所以τ要取一个合适的值,一般τ取值为0.1s

补充***200Hz是5ms ***

每秒二百次,每次二百分之一秒,二百分之一秒就是0.005秒。一秒等于一千毫秒,所以一个周期就是五毫秒,五毫秒还等于五千微秒

姿态解算算法2-四元数法

四元数法 (又称四参数法) 。英国数学家W.R.Haminlton 在1843 年在数学中引入了四元数。但直到20 世纪60 年代末期这种方法还没有得到实际应用,随着空间技术、计算技术SINS 技术的发展,四元数才引起人们的重视。求解四元数微分方程要解四个微分方程。虽然要比解欧拉微分方程多一个方程,但其优越性在于计算量小、精度高、可避免奇异性,该方法是目前研究的重点之一。由于方向余弦法在对载体姿态动力学求解时会产生歪斜、刻度和漂移误差等,然而,SINS 中在进行姿态求解时估计出这些误差是很重要的。与方向余弦法相比,四元数法的优点在于不仅歪斜误差等于零;而且刻度误差的推导很简单,能得出便于进一步分析的解析表达式,而方向余弦法只有在特殊的情况下才能分析和检测到刻度误差,且不能得出通用的结论。通过从不同角度对欧拉角法、方向余弦法和四元数法进行对比。结果表明四元数法具有最佳的性能。

顾名思义,四元数是由四个元构成的数。

其中,q0、q1、q2、q3是实数,i、j、k即使互相正交的单位向量,又是虚单位向量

四元数详细推到余请看参考链接: 无人机四元数解算姿态角解析

姿态解算算法3-卡尔曼滤波

采用递归的方法解决线性滤波问题,只需要当前的测量值和前一个采样周期的估计值就能进行状态估计,需要的存储空间小,每一步的计算量小。

如下蓝色的波形是实际测得的数据,红色的波形是经 Kalman 滤波后的数据波形。

注:这里是实际应用激光测距传感器(TOF)vl53l0x 测得的距离数据。

组成

1.预测状态方程

由 系统状态变量k-1时刻的最优值 和 系统输入 计算出k时刻的 系统预测值

        ①. X k-1|k-1 为k-1时刻的输出。
  ②. 当X为一维数据时,Fk的值是1。
  ③. 一维数据下(uk=0时):系统预测值 = 系统状态变量k-1时刻的最优值。 


2. 预测协方差方程 

根据 k-1时刻的系统协方差 预测 k时刻系统协方差

①. 当X为一维数据时,Fk的值是1。

3. 卡尔曼增益方程

根据(k时刻) 协方差矩阵的预测值 计算 卡尔曼增益

①. 当 Pk|k-1 为一个一维矩阵时,Hk 是1。

4. 跟新最优值方程(卡尔曼滤波的输出)

根据 状态变量的预测值 和 系统测量值 计算出 k时刻状态变量的最优值。 

①. 当 Pk|k-1 为一个一维矩阵时,Hk 是1。 

5. 更新协方差方程

为了求 k时刻的协方差矩阵。(为得到k+1时刻的卡尔曼输出值做准备)

①. 当 Pk|k-1 为一个一维矩阵时,Hk 是1。 

参考链接:卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用_卡尔曼滤波算法c语言-CSDN博客

MPU6050简介

mpu6050会测量角速度、加速度、温度三种不同的物理量,芯片内部有陀螺仪、加速度计、温度计,这三个传感器测量的模拟量经过AD转换成数字信号,得到gx,gy,gz,ax,ay,az,t温度,这些物理量会进入DMP进行运算,DMP是可编程的器件,可以将程序下载到DMP里对传入的数据进行处理(一般情况下不用),然后通过I2C接口去配置芯片的一些参数和读出测量结果。

阅读产品说明书和寄存器手册可参考进行编程,会放在资料包,后面会讲编程

需要注意,MPU6050没有磁力计,所以偏航角会有漂移。建议使用四元数法的程序

硬件连接

接五个引脚到主控芯片,分别是VCC、GND、SCL(主i2c时钟)、SDA(主i2c数据)和AD0(使用软件I2C可以不接此引脚)。

其中VCC接3.3v。SCL和SDA可查阅主控芯片的数据手册了解引脚。同时SCL和SDA需要外接上拉电阻4.7k(因为I2c接口使用的是开漏输出模式)。GND接电源地。AD0是地址选择引脚(mpu6050为从机),接电源地GND。

MPU6050剩余的XDA、XCL和INT引脚悬空,不接线。XDA和XCL引脚用于将6轴传感器拓展到9轴(接磁力计)INT是中断引脚,每当一个Sample的数据采集完成后发送脉冲

在数据手册中可查找到I2C的SCL和SDA引脚 。

编程实现-源码下载

包含完整3个算法源码+工程文件+上位机软件+模块参考资料

源码下载地址:https://download.csdn.net/download/m0_61712829/89087094?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89087094?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C++]map set

一、set 1、概念 set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部&…

C:数据结构之链栈(不带头)

目录 前序 准备工作 函数声明 函数接口 1.初始化 2.创造节点 3. 判断栈空 4.入栈 5.出栈 6.取栈顶元素 7.销毁栈 8. 获取栈的元素个数 总结 前序 链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。 准备工作 老规…

Python | Leetcode Python题解之第22题括号生成

题目: 题解: class Solution:def generateParenthesis(self, n: int) -> List[str]:if n 0:return []total_l []total_l.append([None]) # 0组括号时记为Nonetotal_l.append(["()"]) # 1组括号只有一种情况for i in range(2,n1): …

SpringBoot和Vue2项目配置https协议

1、SpringBoot项目 ① 去你自己的云申请并下载好相关文件,SpringBoot下载的是Tomcat(默认),Vue2下载的是Nginx ② 将下载的压缩包里面的.pfx后缀文件拷贝到项目的resources目录下 ③ 编辑配置文件 (主要是框里面的内…

【GN】《Group Normalization》

ECCV-2018 Facebook AI Research 更多论文解读,可参考【Paper Reading】 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Image Classification in ImageNet5.3 Object Detecti…

小程序打开空白的问题处理

小程序打开是空白的,如下: 这个问题都是请求域名的问题: 一、检查服务器域名配置了 https没有,如果没有,解决办法是申请个ssl证书,具体看这里 https://doc.crmeb.com/mer/mer2/4257 二、完成第一步后&#…

vmware esxi6.0安装配置操作

系统安装及配置 在服务器上安装ESXI 6.0 提示是否继续安装 如果不想安装,按ESC后再按F11即可,稍后电脑会重启. 继续安装,则按回车键 按F11同意声明继续 选择将EXSI 安装到哪个硬盘上,我这里使用的是虚拟机,所以只有这一个选项 选择默认键盘布局,默认的美国键盘即可 设置root…

AI大模型探索之路-应用篇1:Langchain框架概述—快速构建大模型应用

目录 一、什么是LangChain? 二、LangChain解决了哪些问题? 三、LangChain总体架构 四、代码实践样例 总结 一、什么是LangChain? 为大模型应用提供简便之道。 LangChain,专为构建庞大的语言模型应用程序设计的框架&#xff0…

应用方案 | 低功率接地故障断路器(GFI)控制芯片D4147简介

应用领域 D4147主要用于三线制GFCI输出接口、GFCI芯片断路器、便携式GFCI线路等领域的产品,侦测并防护火线对地故障和零线对负载短路故障。 功能介绍 D4147 为低功率接地故障断路器(GFI)控制器芯片,用于检测危险的接地故障电流路径…

基于JSP+Mysql+HTml+Css仓库出入库管理系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

个人求职简历(精选8篇)

HR浏览一份简历也就25秒左右,如果你连「好简历」都没有,怎么能找到好工作呢? 如果你不懂得如何在简历上展示自己,或者觉得怎么改简历都不出彩,那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

Altair® Access™ 面向研究人员和工程师的 HPC 作业提交门户

Altair Access™ 面向研究人员和工程师的 HPC 作业提交门户 Access 具有一个简单、强大且统一的界面,可以从中提交和监控远程集群、云或其他资源的相关作业,使工程师和研究人员能够专注于主要活动,减少在应用程序运行及数据移动上投入的时间。…

朴素模式匹配算法

什么是字符串的模式匹配? 字符串模式匹配:在主串中找到与模式串相同的字串,并返回其所在位置 算法思想: 算法思想为:从主串S的第一个字符起,与模式串T的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串的下一…

微服务项目sc2024通用Base工程

1. cloud-provider-payment8001 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…

STM32 H7系列学习笔记

必备的API知识 第 1 步&#xff1a;系统上电复位&#xff0c;进入启动文件 startup_stm32h743xx.s&#xff0c;在这个文件里面执行复位中断服务程序。 在复位中断服务程序里面执行函数 SystemInit&#xff0c;在system_stm32h7xx.c 里面。*之后是调用编译器封装好的函数&…

Java基础入门--第十一章--JDBC(Java Database Connection)Java数据库连接

JDBC 11.1 什么是JDBC11.1.1 JDBC概述11.1.2 JDBC驱动程序 11.2 JDBC的常用API11.3 JDBC编程11.3.1 JDBC 编程步骤11.3.2 实现第一个JDBC程序 我的MySQL的root密码: root 11.1 什么是JDBC 11.1.1 JDBC概述 JDBC的全称是Java数据库连接&#xff08;Java Database Connectivit…

为什么用核心板与底板模式开发智能产品?小米SU7坐舱域控制器PCB设计的新选择

随着科技的飞速发展&#xff0c;智能产品市场的竞争日益激烈。如何在最短的时间内&#xff0c;以最低的成本&#xff0c;打造出性能卓越的产品&#xff0c;成为了各大企业面临的重要课题。近日&#xff0c;小米SU7智能汽车的发布为我们提供了一个全新的视角——通过核心板与底板…

算法:多重背包问题dp

文章目录 一、多重背包问题特点1.1、多重背包问题的特征1.2、解决多重背包问题的基本方法典型例题&#xff1a;AcWing——多重背包问题I 1.3、二进制优化1.3.1、二进制优化的思想1.3.2、多重背包问题的二进制优化 一、多重背包问题特点 多重背包问题是背包问题的又一变种&…

钢条切割问题:动态规划算法的典型应用

一、引言 在工业生产和物流管理中&#xff0c;钢条切割问题是一个常见的优化问题。企业在购买长钢条并将其切割为短钢条出售时&#xff0c;往往面临着如何切割以最大化利润的问题。这个问题不仅关系到企业的成本控制和利润最大化&#xff0c;也涉及到资源的有效利用和生产效率…

QA:缺少VC运行时库导致VisualBox和XShell运行出错

前言 启动软件时&#xff0c;特别是绿色版软件&#xff0c;有时会遇到“缺少xxx.dll文件”&#xff0c;导致软件启动失败。 注&#xff1a;xxx.dll是动态链接库&#xff08;DLL&#xff09;文件&#xff0c;包含了程序运行所需的函数和资源。 内容 象上面这种类型的错误&…