陀螺仪与加速度计的姿态融合——互补滤波

这篇具有很好参考价值的文章主要介绍了陀螺仪与加速度计的姿态融合——互补滤波。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。

阅读本文需有一定的知识基础,可以参见作者以前MPU6050的两篇文章:《MPU6050陀螺仪和加速度计数据的获取和校准》、《MPU6050官方DMP的移植和使用》,以及了解四元数的一些基本概念。

1)为什么要进行姿态融合

在之前的文章里,我们讲过一些陀螺仪和加速度计的知识,我们知道,陀螺仪可以获取载体的角速度,由角速度积分,就能得到角度,也就得到了载体的姿态。但是,陀螺仪给出的角速度存在测量误差、噪声和漂移,经过积分运算之后,会形成累积误差,这个误差会随着时间延长越来越大,最终导致偏差太大而无法使用。

另一方面,加速度计可以测量到地球的重力,当载体静止或者匀速运动时,重力的方向就是竖直向下的,通过测量重力加速度的方向,可以获取当前载体的俯仰角、滚转角。但是加速度计容易受到高频噪声的干扰,动态响应慢,只在长时间内数据比较有效。

因此,一般我们使用加速度计的数据来修正陀螺仪,以加速度计获取的实时姿态角来修正陀螺仪的累积误差,就能在短时间和长时间内都能获取比较满意的姿态信息。

我们以下图为例,Z轴向上,约定绕X轴旋转的角度为滚转角;绕Y轴旋转的角度为俯仰角,绕Z轴旋转的角度为偏航角。

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

那么,滚转角(绕X轴转)和俯仰角(绕Y轴转)发生变化时,MPU6050测出来的重力加速度g的方向相对于载体也会发生变化。而加速度计测出来的重力加速度g的方向是实时的,不会受长时间计算累加的影响。所以,我们可以用加速度计测到的g的方向,来修正陀螺仪积分得到的滚转角和俯仰角

而偏航角(绕Z轴转)变化时,MPU6050测到的重力加速度g方向是不会变化的,所以g的方向不能用来修正偏航角。要想修正偏航角,需要测量地磁偏角的传感器信息。

这个用加速度计或磁力计来修正姿态角的过程,一般称为数据融合,有多种方法实现。在之前的文章中,我们使用MPU6050芯片官方提供的DMP库直接获取了融合后的数据;但是这只适用于特定厂家的芯片,而更通用的方法是使用互补滤波或者卡尔曼滤波来实现,本节要讲的就是使用互补滤波的方法,来进行数据融合。

(注意,由于没有引入磁力计的数据,本文使用互补滤波的方法只是修正了俯仰角和滚转角的信息,无法修正偏航角,后续有机会再讲解如何用磁力计修正偏航角)

2)互补滤波的原理

假如我们有两种途径测量某个信号,测得的结果一个带有高频噪声,一个带有低频噪声。我们为了获取更准确的信号,可以把它们的噪声分别滤掉,再合并,就得到了没有噪声的原始信号。具体操作如下图所示:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

这就是互补滤波最基础的理论。

为了使得最后相加的重构信号与我们想要的信号尽量相等,一般要求F1(s)+F2(s) = 1。

具体到我们的实际问题,姿态信息可以通过陀螺仪角速度积分得到,也可以通过加速度计实时测量得到;而且,陀螺仪积分得到的姿态主要包含低频噪声(零偏、累积误差),加速度计得到的姿态主要包含高频噪声。使用互补滤波正好可以融合二者的姿态信息。

依据上面这个框图,我们可以想到以下的姿态融合方法:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

图中ω是角速度,n1和n2为噪声,θ’为融合后的角度。

当我们把滤波器简化为最简单的一个比例系数时,有如下形式:

姿态角 = k*陀螺仪姿态角 + (1-k)*加速度计姿态角

(其中0<k<1,k的选择,取决于我们更相信陀螺仪的数据,还是更相信加速度计的数据)

你可能会很惊讶,这不就是个加权平均吗?就这也能滤波?

别急,它确实没有滤波,但我们先理解一下,再慢慢深入。

我们看看等式右边的两项,由于k小于1,所以陀螺仪姿态角的低频噪声被缩小了k倍;同样,1-k也小于1,所以加速度计姿态角的高频噪声被缩小了1-k倍;二者相加,姿态角的倍数仍为1,而高频和低频的噪声都被缩小了。虽然这个“滤波”效果有点弱,但是这样我们至少得到了一个高频、低频都比原始信号稍好一些的姿态信息,这就实现了高频和低频信号的互补。

实际上,当使用了有效的高通和低通滤波器时,噪声的影响会被进一步减弱。

前人的研究已经帮我们总结出了通用的公式,就是低通滤波器为LPF=C(s)/(C(s)+s),高通滤波器HPF=s/(C(s)+s)。选用不同的C(s)可以形成不同滤波效果。

把算法化成框图的形式,如下图所示:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

上面这个框图对于理解互补滤波的原理比较直观,但是等效为下图这种形式时,更接近于编程实现的思想:(有兴趣的可以推导一下,两种框图是等效的)

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

当选择不同的C(s)时,可以获得不同的滤波效果,C(s)为常数时,就是一阶滤波器;C(s)为a+b/s时就是二阶滤波器。

3)互补滤波用于姿态融合的编程实现

当求解姿态角时,必须要有一些四元数的知识,可以认为四元数等价于滚转角、俯仰角、偏航角。之所以要使用四元数,是因为它可以简化姿态更新的计算过程。基本上现在网上的开源代码都是以四元数来表征姿态角的。本文不去深究四元数的理论,只是拿来使用。

我们来看一下最经典互补滤波算法是如何实现的,这段代码被广泛应用在开源四轴飞行器上,它的核心部分如下:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

ax、ay、az是加速度计测得的三个方向的加速度,gx、gy、gz是陀螺仪测得的三个方向的角速度。

首先,将ax、ay、az进行单位化,因为我们只需要使用它们求角度,不关心它们的大小,单位化的操作就是第65~68行,其中sqrt函数是求平方根:

       norm = sqrt(ax*ax + ay*ay + az*az);

       ax = ax / norm;

       ay = ay / norm;

       az = az / norm;

然后,第72~74行,是依据当前的姿态来计算重力加速度;静止或匀速直线运动时,重力产生的加速度在地面东北天坐标系的xyz三个方向上分量是[0,0,g],再乘以姿态转换矩阵,就得到了机体坐标系下的加速度:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

用四元数表示的姿态转移矩阵是:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

所以,转换矩阵的最后一列,就是在载体坐标系下的加速度(忽略了倍数g):

       vx = 2*(q1q3 - q0q2);

       vy = 2*(q0q1 + q2q3);

       vz = q0q0 - q1q1 - q2q2 + q3q3 ;

由于这个计算过程是通过已有的姿态转移矩阵算出来的,所以,它是包含了陀螺仪的角度信息的,那么它与加速度计的测量原始量ax、ay、az之间会比较接近但会有偏差。我们知道了这个偏差后,就可以用加速度计的测量值来修正已有的姿态了。

计算偏差的过程就是第77~79行,这里是用向量的外积作为向量之间的偏差:

       ex = (ay*vz - az*vy) ;

       ey = (az*vx - ax*vz) ;

       ez = (ax*vy - ay*vx) ;

注意,上一节的框图中,是通过角度θ1(s)-θ’(s)来计算偏差的,而这里的代码实现,是将θ’(s)反算到了三个轴的加速度vx、vy、vz之后,再计算三个轴的加速度误差,效果也是一样的,这样也是为了简化计算。

现在我们已经得到了框图中的θ1(s)-θ’(s)等效量ex、ey、ez,接下来就要选择合适的C(s)来确定滤波函数了。这部分代码中实现的,是使用的二阶滤波,取的C(s)=Kp+Ki/s,也就是用“误差”和“误差的积分”共同去修正角速度,Kp和Ki是两个由用户确定的常数,代码如下:

       exInt = exInt + ex * Ki;  //对误差进行积分,也就是每周期累加

       eyInt = eyInt + ey * Ki;

       ezInt = ezInt + ez * Ki; 

       gx = gx + Kp*ex + exInt;  //将误差PI(比例和积分项)补偿到陀螺仪角速度

       gy = gy + Kp*ey + eyInt;

       gz = gz + Kp*ez + ezInt;  

细心的朋友可能发现了,这与PID控制中只使用了PI环节是一样的,有比例项和积分项。所以,代码里也用Kp和Ki两个参数来表示。

执行完这里,就已经完成了加速度计对陀螺仪的修正。上一节的框图就只剩下最后一步,积分一次就能得到新的姿态角了。

我们使用四元数更新姿态时,不是使用积分累加的方法,而有另一种方法:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

具体为什么如上面计算,用角速度和周期可以更新四元数,这里不深入探讨了,有兴趣可以找资料深入了解。

最后,有需要的话,可以用更新后的四元数,通过反三角函数来求取当前的姿态角:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

这段代码在使用时,只要周期性地获取陀螺仪和加速度计的数据、调用互补滤波函数、

更新四元数、计算姿态角即可。

测试一下互补滤波的效果,取Kp=10,Ki=0.008,初始时z轴向上保持5s进行MPU6050传感器自校正,然后每100ms获取一次MPU6050的测量数据,进行互补滤波,计算姿态角,送到上位机显示。

可以看到,经过较长时间后,俯仰和滚转角都可以保持正确,不会产生误差累积和漂移,说明陀螺仪的数据得到了加速计的修正;而偏航角是不能实时修正的,会慢慢越偏越大:

互补滤波,嵌入式软件,姿态控制,算法,stm32,单片机

好了,关于互补滤波姿态融合的知识,就讲到这里了。由于篇幅所限,文中的代码只是截取了核心片段进行讲解,完整的工程代码可以免费提供下载交流。

如果觉得有用可以关注作者微信公众号“小白白学电子”,有更多内容分享,在公众号可以找到所有代码和资料下载地址。文章来源地址https://www.toymoban.com/news/detail-778298.html

到了这里,关于陀螺仪与加速度计的姿态融合——互补滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 6轴陀螺仪姿态解算

    之前看过学长姿态解算相关代码,因为要做平衡车的项目,希望陀螺仪处理数据能够达到很好的效果,大概2个星期前,看的学长代码,当时把大部分代码看懂是用来干什么的,但原理还是一窍不通,没办法,太高深了hhhhh。用学长的代码很顺利就完成了基本工作,但当时调

    2023年04月08日
    浏览(35)
  • 三轴陀螺仪解算姿态(四元数)

    三轴陀螺仪可以测量载体在三个轴上的角速度分量,对这些角速度进行积分就可以得到旋转的角度,应用到载体上就可以得到载体的姿态。 假设导航坐标系为东北天,载体坐标系为右前上。 初始载体坐标系和导航坐标系重合,对应的四元数为q=[1,0,0,0],使用此四元数表示 载

    2024年02月05日
    浏览(42)
  • 【QT】OpenGL显示六轴陀螺仪3D实时姿态

    https://blog.csdn.net/qq_35629971/article/details/126203543?spm=1001.2014.3001.5506 新建一个qt的空白工程,附带UI界面,我的工程名称就叫my_3d UI界面可以可以放一些自己想要的按键、文本或者其他控件。这个不影响3D效果的展示,这些控件都会展示在3D效果图的上层,不会被3D效果覆盖 首先我们

    2024年02月02日
    浏览(44)
  • mpu6050六轴陀螺仪dmp姿态解算-C语言移植(stm32+hal)

    官方库源文件: 1 移植官方6个库文件 2 修改inv_mpu.h中结构体 3 修改inv_mpu.c 4 修改 inv_mpu_motion_driver.c 5 keil中增加宏定义 6 移植核心[修改inv_mpu.c|inv_mpu_motion_driver.c]

    2024年02月14日
    浏览(44)
  • 三轴加速度计解算姿态(四元数)

    当传感器载体静止时,加速度计只会输出重力加速度,可以凭此来计算载体的俯仰角和滚转角。 假设导航坐标系为东北天,载体坐标系为右前上。 初始载体坐标系和导航坐标系重合,对应的四元数为q=[1,0,0,0],使用此四元数表示 载体在导航坐标系下的旋转 。 先将四元数转为

    2024年02月15日
    浏览(47)
  • 陀螺仪LSM6DSV16X与AI集成(3)----读取融合算法输出的四元数

    LSM6DSV16X 特性涉及到的是一种低功耗的传感器融合算法(Sensor Fusion Low Power, SFLP). 低功耗传感器融合(SFLP)算法: 该算法旨在以节能的方式结合加速度计和陀螺仪的数据。传感器融合算法通过结合不同传感器的优势,提供更准确、可靠的数据。 6轴游戏旋转向量: SFLP算法能

    2024年02月03日
    浏览(42)
  • 【stm32】stm32学习笔记(江科大)-详解stm32获取Mpu6050陀螺仪和加速度

    目录 I2C 起始条件: 终止条件:  发送一个字节 接收一个字节  接收发送应答  代码 I2C I2C.C I2C.h Mpu6050 Mpu6050.c Mpu6050.h Mpu6050Reg.h main.c 结果   要想获取Mpu6050陀螺仪和加速度那就需要了解一下Mpu6050。Mpu6050使用的是I2C通讯 先了解一下 起始条件: SCL高电平期间,SDA从高电平切换

    2024年02月16日
    浏览(67)
  • Android使用陀螺仪

    在Android应用中使用陀螺仪可以帮助实现各种功能,比如游戏控制、虚拟现实体验、运动追踪等。以下是使用Android陀螺仪的基本步骤: 获取传感器服务 : 首先,需要获取设备上的陀螺仪传感器服务。可以通过 SensorManager 类来获取。 注册监听器 : 使用 SensorManager 注册一个陀

    2024年04月26日
    浏览(33)
  • 平衡小车——陀螺仪

    可以通过MPU6050获取加速度信息 可以通过DMP库获取角度信息 MPU6050 MPU6050是一种常用的集成电路(IC),结合了3轴陀螺仪和3轴加速度计。它用于各种需要运动跟踪和感应的电子项目和设备。MPU6050由英飞凌科技公司(InvenSense)制造,现在已被TDK收购。它的一些主要特点包括:

    2024年02月02日
    浏览(40)
  • 陀螺仪MPU6050(IIC&源码)

    1. 陀螺仪 1.1   什么是陀螺仪? 检测角度变化的一个装置。 1.1.1  有什么用?? 用于检测角度变化,用角度变化的值判断物体的运动轨迹。 1.1.2  我们怎么用? 我们是使用这个装置(或者说设备)获取到数据,再使用这个数据得到我们想要的信息。 这里我使用陀螺仪获取板

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包