四轴之互补滤波与四元数算法最详细分析

有人问我关于四元数姿态解算算法的分析,每次都解释好久,今日空闲,特发一帖,供大家参考。本分析将结合程序,分析姿态解算思路,由于能力有限,难免有错误之处请谅解,同时希望能够抛砖引玉,得到大神指点。再此感谢圆点博士提供资料参考。

为尊重原创,转载请注明原出处,谢谢。

原创:冰三点水

关键字:姿态解算 互补滤波 四元数

下面进入正题。

第一部分 传感器说明

通常我们开源小四轴使用mpu6050姿态传感器,可以输出三轴加速度和三轴角速度数据。角速度数据就是x、y、z三个轴的旋转角速度。而加速度是沿三个轴的加速度,这个加速度计测量的是比力。这里对于加速度计有个重点,我们想象这样一个模型,在太空中有一个盒子,盒子里连着三轴弹簧,力感应球位于弹簧连接点,在外太空失重时,三条弹簧伸缩量为0,x = y = z= 0;

当在重力场内,盒子静置与地面时,力感应球收到重力的吸引孤儿有一个轴的弹簧有伸缩变化,或者说当盒子(加速度计)静置时会有一个输出,大小等于重力,这就是我们说的比力。(感谢第七实验室的图片)

在四轴的惯性导航中,我们认为四轴是平滑运动,也就是说我们忽略了加速度计测量的和运动带来的影响,而认为加速度计测量的就是重力(比力)不包括和运动,这是互补滤波是局限性所在,补偿方法请自行分析。(感谢投笔从容提供思路)

实际上,我们单单通过三轴角速度就可以得到四元数,进而将四元数转换成欧拉角,也就是姿态角,问题是陀螺仪会有积分漂移,得到的角度会有误差,这时候我们就引入加速度计对陀螺仪数据进行校正,以得到更准确的角度。不过这时yaw,也会存在误差,在误差不能忽略的使用情况下,我们就需要用磁力计了。

第二部分 四元数

二维平面内的旋转可以用复数表示(即a+bi),三维空间内的旋转需要用四元数(即a+bi+cj+dk)来表示,而不是我们猜测的类似于三元数(a+bi+cj)表示。注意四元数表示的是一个旋转。如果我们得到了四元数,只要通过一个公式就可以将四元数转换到欧拉角,得到我们需要的姿态。那么怎么得到四元数呢?

我们常听说四元数微分方程,这个方程的输入是角速度数据,我们只要输入角速度数据,就可以更新四元数数据。

上图为程序实现的对四元数微分方程的解。这个方程是怎么来的呢?由于机体的运动,四元数Q也是变化的,换句话说,q0 q1 q2q3是时间的函数。我们把四元数写成三角形式,

这里有角度量 ,然后对这个式子进行求导,然后进行一下相应的转换,这里提供一个四路,细节就不讲了。上面的程序是解这个方程的常用方法。

第三部分 四元数到欧拉角

四元数到欧拉角有公式,对于一个固定的欧拉角旋转顺序有相应的公式。程序上实现起来比较容易

程序中的57.3是个转换系数,是弧度和角度的转换系数。

这个公式具体请参考秦永元老师的惯性导航。

第四部分 互补滤波

到目前为止,我们已经可以通过四元数微分方程得到四元数,在通过四元数到欧拉角的转换得到四轴的姿态,但是为了得到更加准确的姿态,我们引入了加速度计。

在IMU程序中我们刚开始看到的往往是将加速度原始数据归一化。

归一化后的ax、ay、az的平方和为1,各自方向不变,也就是合向量的方向不变,模等于1,这是个重点。

建立小四轴坐标系

这个很简单,所谓的建立小四轴坐标系不过是把世界坐标系下的重力向量(0 0 1)转换到小四轴坐标系下而已。图就不画了,有想要的@我。

R为小四轴坐标系,b为世界坐标系,是方向余弦矩阵

这个方向余弦矩阵是怎么来的呢?

请参考惯性导航或下面链接

http://www.doc88.com/p-893241688972.html

互补滤波这个部分到目前为止还没进入正题。(楼主已经写的好烦啊。。。。。。)

目前的进度是建立了小四轴坐标系。

接下来是重点!

将刚才转移到小四轴坐标系下的重力向量和机体加速度计测量的重量向量叉乘!

得到一个误差向量。这个误差向量是有物理意义的。叉乘等于|A|*|B|*sin(角度),转移到小四轴坐标系的重力向量模为1,加速度计测量的重力向量经过归一化也为1,那么叉乘的结果之与角度有关,并且角度越大,误差向量的莫越大!归一化的目的在这里体现。向量的叉乘还包括方向信息,还是一个向量,有人认为,在固定的采样计算时间内的按一定方向转过这些误差向量,也可以看作成角速度(来自黑暗骑士)这读者自己揣摩吧。总之,我们就是通过这个误差向量来修正陀螺仪数据的。

通过PI运算来融合陀螺仪和加速度数据。

如果Kp = Ki = 0就是完全相信陀螺仪数据。

将融合后的角速度输入到四元数微分方程 就得到四元数,进而得到欧拉角。

至于为什么四元数又归一化处理,为因为引入误差向量后四元数失去了规范化,请参考惯性导航。

最后在说两句

得到的原始角速度数据需要乘一个系数转换成实际的角速度(弧度每秒),而加速度不需要,因为加速度归一化后与大小无关了。

分析完毕。

笔者能力有限,希望能够给各位带来启发,而不是误人子弟,同时欢迎大神指正其中的错误。

为尊重原创,转载请注明原出处,谢谢。

时间: 2024-10-21 05:04:10

四轴之互补滤波与四元数算法最详细分析的相关文章

OpenStack_Swift源码分析——Ring的rebalance算法源代码详细分析

今天有同学去百度,带回一道面试题,和大家分享一下: 打印: n=1 1 n=2 3 3 2 4 1 1 4 5 5 n=3 7 7 7 7 6 8 3 3 2 6 8 4 1 1 6 8 4 5 5 5 8 9 9 9 9 提供一段参考程序: <pre name="code" class="cpp">// ConsoleApplication1.cpp: 主项目文件. #include "stdafx.h" #include &quo

红黑树(一)之原理和算法的详细分析【转】

本文转载自:http://www.cnblogs.com/skywang12345/p/3245399.html R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). 红黑树的特性:(1)每个节点或者是黑色,或者是红色.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果

互补滤波原理

对mpu6050来说,加速度计对四轴飞行器的加速度比较敏感,取瞬时值计算倾角误差比较大:而陀螺仪积分得到的角度则不受加速度的影响,但是随着时间的增加积分漂移和温度漂移带来的误差比较大.那么要怎么弥补这两个缺点呢?那就要用到互补滤波了. 这里讲的互补滤波就是在短时间内采用陀螺仪得到的角度做为最优,定时对加速度采样来的角度进行取平均值来校正陀螺仪的得到的角度.也就是说,短时间内用陀螺仪比较准确,以它为主:长时间用加速度计比较准确,这时候加大它的比重,这就是互补了. 那么滤波在哪里?加速度计要滤掉高频

【下位机软件】平均值滤波之鬼斧神工算法

平均值滤波之鬼斧神工算法 摘自:http://www.cnblogs.com/ifpga/archive/2012/10/07/2713530.html 在十种经典软件滤波算法中,可以看到很多算法都是平均值滤波算法变种,事实上最常用的也还是平均值滤波算法.但传统的平均值滤波算法很占内存,每次运算都要求累加和,再求平均值,导致运算效率不高. 今天介绍一种超简洁超高效的平均滤波算法,此算法是以前搞单片机时一老师所创(单片机上的内存简直是寸土寸金),仅仅用三个变量,就完成了平均值滤波的计算.刚开始看到

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析 分治法 思想 1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 2. divide-and-conquer(P) { if(|P| <= n0)adhoc(P); divide P into samller subinstances P1,P2...,Pk; for(int i = 1;i < k;i++) { yi = divide-and-conquer(Pi); } retu

一个日期算法的原理分析

1.问题描述 在 OSC 问答频道有一个问题:时间算法:帮忙解答下 简单的复述一遍就是能够通过如下式子来计算month月day日是一年的第几天. 闰年是 day_of_year=(275*month)/9 - (month+9)/12 + day - 30 非闰年比这个少1天.可以简单的验证,这个式子中每个部分计算后都取整,整个结果总是对的. 我们知道1.3.5.7.8.10.12都是31天,2月的天数有点诡异,其他都是30天,正常情况下我们写程序会写很多if来判断月份,进而计算累积的天数.但是

机器学习day16 机器学习实战Apriori算法进行关联分析

上一章学习了非监督学习的聚类,聚类算法可以将不同性质的分类分开.这两天学习了apriori算法进行关联分析,感觉是目前最难理解的一章了,并且书中还有个很坑爹的错误,作者存在很大的疏忽. Apriori算法关联分析:从大规模数据集中寻找物品间的隐含关系被称作关联分析或者关联规则学习. 关联分析应用1:我们以前学习的是根据特性进行分类或者回归预测,并没有挖掘特性之间的关系,关联分析可以用于分析数据集中特性之间的关系,可以得到哪些特性频繁的共同出现或者特性之间的关系(比如出现特性A就会很大几率出现特性