四元数完全解析及资料汇总
本文原帖出自匿名四轴论坛,附件里的资源请到匿名论坛下载:
http://www.anobbs.com/forum.php
感谢匿名的开源分享,感谢群友的热心帮助。
说什么四元数完全解析其实都是前辈们的解析,小弟真心是一个搬砖的,搬得不好希望大神
们给以批评和指正,在此谢过了。因为本人是小菜鸟一枚,对,最菜的那种菜鸟······所以对四元
数求解姿态角这么一个在大神眼里简单的算法,小弟我还是费了很大劲才稍微理解了那么一点点,
小弟搬砖整理时也是基于小弟的理解和智商的,有些太基础,有些可能错了,大牛们发现了再骂
过我后希望能够给与指正哈。
好,废话到此为止,开始说主体。四元数和姿态角怎么说呢?先得给和我一样的小菜鸟们理
一理思路,小鸟我在此画了一个“思维导图”(我承认我画的丑),四元数解算姿态首先分为两
部分理解:第一部分先理解什么是四元数,四元数与姿态角间的关系;第二部分要理解怎么由惯
性单元测出的加速度和角速度求出四元数,再由四元数求出欧拉角。
图 1 渣渣思维导图
在讲解什么是四元数时,小弟的思维是顺着说的,先由四元数的定义说起,说到四元数与姿
态角间的关系。但在讲解姿态解算时,小弟的思维是逆向的,就是反推回来的,从欧拉角一步步
反推回到惯性器件的测量数据,这样逆向说是因为便于理解,因为实际在工程应用时和理论推导
有很大差别。
实际应用时正确的求解顺序应该为图 1 中序号顺序,即 1->2->3->…….
但在笔者讲解姿态求解时思路是如图 2 的。
图 2 逆向讲解思路
大家在看四元数时最好结合着代码一块看,小弟看的是匿名四轴的代码,感觉写的非常好也
非常清晰,粘出来大家一块观摩。红色部分是核心代码,总共分为八个步骤,和图 1 中的八个步
骤是一一对应的。讲解介绍时也是和代码对比起来讲解的。代码可以去匿名官网上下载,都是开
源的,不是小弟的,所以小弟不方便加在附件中。
//四元数更新姿态
#define Kp 2.0f
#define Ki 0.001f
void ANO_IMU::Quaternion_CF(Vector3f gyro,Vector3f acc, float deltaT)
{
//加速度权重,越大则向加速度测量值收敛越快
//误差积分增益
Vector3f V_gravity, V_error, V_error_I;
//1.重力加速度归一化
acc.normalize();
//2.提取四元数的等效余弦矩阵中的重力分量
Q.vector_gravity(V_gravity);
//3.向量叉积得出姿态误差
V_error = acc % V_gravity;
//4.对误差进行积分
V_error_I += V_error * Ki;
//5.互补滤波,姿态误差补偿到角速度上,修正角速度积分漂移
Gyro += V_error * Kp + V_error_I;
//6.一阶龙格库塔法更新四元数
Q.Runge_Kutta_1st(Gyro, deltaT);
//7.四元数归一化
Q.normalize();
//8.四元数转欧拉角
Q.to_euler(&angle.x, &angle.y, &angle.z);
}
好的,下面搬砖开始!。。。。。。。。嘿咻嘿咻!!!!
一 . 什 么 是 四 元 数 ?
关于四元数的定义摘自秦永元的《惯性导航》,里面有非常好的讲解,大家可以直接看绪论
和第九章就可以。下面我粘贴了部分原文,粘贴的比较多比较详细,应为本人比较笨还爱较真,
所以按本人的风格就要详尽一点,大牛们都可以自动忽略。
四元数定义、表达方式及运算方法——摘自《惯性导航》-秦永元 P289-292
好,关于四元数定义就搬这么多,其他的大家去附件下载《惯性导航》的 pdf 自己看吧。
下面开始搬四元数与姿态解算关系的。。。。。。嘿咻嘿咻~~~~
二 、 四 元 数 与 姿 态 阵 间 的 关 系
从上面我们知道了四元数的定义,可这四个数和我们要求的三个姿态角有什么关系呢?下面
是详细的推导,同样摘自《惯性导航》-秦永元 P292-297。
四元数与姿态阵间的关系——摘自《惯性导航》-秦永元 P292-297