姿态解算知识点1——四元数互补滤波求解欧拉角

2024-01-18 15:48

本文主要是介绍姿态解算知识点1——四元数互补滤波求解欧拉角,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.目标

  • 求四元数q0、q1、q2、q3;

  • 求解飞行器、机器人的欧拉角pitch、roll、yaw;

2.算法总框图

       

 

3.四元数数学模型及公式推导

 

上面的b系就是机体坐标系,R系可以认为是导航坐标系(即地理坐标系n)。

 

4. 四元数更新代码实现

/******************************************************************************* Function Name : update_quaternion
* Description    : 更新四元数,使用互补滤波
* Input         : ax/ay/az: IMU加速度原始采样值, gx/gy/gz:IMU陀螺仪原始采样值
* Output       : None
* Return       : None******************************************************************************/
float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f;//四元数
static float exInt = 0, eyInt = 0, ezInt = 0;
static void update_quaternion(float ax, float ay, float az, float gx, float gy, float gz)
{float norm;float vx, vy, vz;float ex, ey, ez;float q0q0 = q0*q0;float q0q1 = q0*q1;float q0q2 = q0*q2;float q1q1 = q1*q1;float q1q3 = q1*q3;float q2q2 = q2*q2;float q2q3 = q2*q3;float q3q3 = q3*q3;if(ax*ay*az==0)return;// 第一步:对加速度数据进行归一化norm = sqrt(ax*ax + ay*ay + az*az);ax = ax / norm;ay = ay / norm;az = az / norm;// 第二步:DCM矩阵旋转vx = 2*(q1q3 - q0q2);vy = 2*(q0q1 + q2q3);vz = q0q0 - q1q1 - q2q2 + q3q3 ;// 第三步:在机体坐标系下做向量叉积得到补偿数据ex = ay*vz - az*vy ;ey = az*vx - ax*vz ;ez = ax*vy - ay*vx ;// 第四步:对误差进行PI计算,补偿角速度exInt = exInt + ex * Ki;eyInt = eyInt + ey * Ki;ezInt = ezInt + ez * Ki;gx = gx + Kp*ex + exInt;gy = gy + Kp*ey + eyInt;gz = gz + Kp*ez + ezInt;// 第五步:按照四元数微分公式进行四元数更新q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;//规范化Pitch、Roll轴四元数norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);q0 = q0/norm;q1 = q1/norm;q2 = q2/norm;q3 = q3/norm;
}

 

5.四元数转欧拉角

我们一般这样定义,pitch为俯仰角,roll为航向角,yaw为翻滚角。

地理坐标系定义遵循右手螺旋定则,描述如下:

            

显然地理坐标系一般有两种定义方式。

方式一:可以选择x轴朝右,y轴朝前,z轴垂直向上 俗称:东北天 --- 右前上,如下图:

                 

 

地理坐标系

载体坐标系

欧拉角

范围

方向

X

E

θ- Pitch

-90° ~ +90°

绕X轴旋转

Y

N

γ- Roll

-180° ~ +180°

绕Y轴旋转

Z

U

ψ- Yaw

-180° ~ +180°

绕Z轴旋转


pitch = asinf(2*q0*q1 + 2*q2*q3)*57.3

roll = atan2f(-2*q1*q3 + 2*q0*q2, -2*q1*q1 - 2*q2*q2 + 1)* 57.3

yaw = -atan2f(-2*q2*q1 + 2*q0*q3, -2*q1*q1 -2*q3*q3 + 1)* 57.3

 

方式二:也可以选择x轴朝右,y轴朝前,z轴垂直向上 俗称:北东地 --- 前右下,如下图:

                    

 

地理坐标系

载体坐标系

欧拉角

范围

方向

X

N

θ- Roll

-180° ~ +180°

绕X轴旋转

Y

E

γ- Pitch

-90° ~ +90°

绕Y轴旋转

Z

D

ψ- Yaw

-180° ~ +180°

绕Z轴旋转

pitch = asinf(2*q1*q3 - 2*q0*q2)*57.3

roll = atan2f(2*q2*q3 + 2*q0*q1, -2*q1*q1 - 2*q2*q2 + 1)*57.3;

yaw = -atan2f(2*q1*q2 + 2*q0*q3, -2*q2*q2 -2*q3*q3 + 1)*57.3

 

本文算法选择的是x轴朝右,y轴朝前,z轴垂直向上,东北天 --- 右前上。

6.数据曲线

  • 机体在沿水平面运动时俯仰角曲线效果图

红色曲线-静态角度,有明显的正态分布白噪声;

绿色曲线-融合后的角度,基本不受噪声影响,比较稳定

 

  • 机体朝前向上抬起时俯仰角曲线效果图

红色曲线-静态角度,有明显的波动噪声;

绿色曲线-融合后的角度,基本不受噪声影响,而且跟随特性良好

 

7.源代码

FIR滤波源代码-C语言

欧拉角微分方程算法代码

8.参考文献

  • 惯性导航——秦永元
  • 惯性导航基本原理——刘保中

 

这篇关于姿态解算知识点1——四元数互补滤波求解欧拉角的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619495

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

6.4双边滤波

目录 实验原理 示例代码1 运行结果1 实验代码2 运行结果2 实验原理 双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在Op

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。