目录
1. 案例
背景
使用给定的GITHUB代码和数据,编写主函数以满足要求。(左脚数据正常满足要求,右脚数据无法满足要求;最近也是学习四旋翼飞行器见到了同样的数据类型,所再来深入研究一下)
数据类型
acc_x | acc_y | acc_z | gyr_x | gyr_y | gyr_z |
数据来源
①加速度计(ACC):加速度计是用来测量物体在空间中的加速度,包括由于重力产生的加速度和物体运动产生的加速度。它能够检测物体在X、Y、Z三个轴向上的加速度变化,从而可以计算出物体的速度和位置(通过积分加速度值)。
加速度计简易原理可参考:https://blog.csdn.net/weixin_44702605/article/details/137149974
(其中让我感兴趣的是再保持相对静止不动的情况下,加速度计会显示重力加速度的值)
②陀螺仪(GYR):陀螺仪是用来测量物体的角速度,即物体绕X、Y、Z轴的旋转速度。它能够检测物体的动态变化,比如旋转和倾斜,从而可以计算出物体的角度和姿态。
陀螺仪简易原理可参考:一文读懂系列 —— 陀螺仪 - 知乎 秒懂!陀螺仪的工作原理! - 知乎
坐标系
- 全局坐标系(Global Coordinate System),又称惯性坐标系
- 局部坐标系(Body Coordinate System)
一般的全局坐标系表示地球坐标系,局部坐标系为物体本身的坐标系。局部坐标系作用是为了描述物体在全局坐标系中的位置和姿态,另一方面为物体上的点或其他坐标系提供局部的确定位置和姿态标准。
在标准的右手坐标系中,XYZ正方向通常指的是:
- X轴:从原点向右的方向。
- Y轴:从原点向上的方向。
- Z轴:从原点指向观察者的方向(即从屏幕向外的方向)
上边的描述虽然绕口,但是常见的三维笛卡尔坐标系的向上z轴、向右y轴、向前x轴的坐标系也是标准的右手坐标系。具体可以使用 “大拇指朝向x轴、食指朝向y轴、中指朝向z轴”的判断方式,并且右手手指自然弯曲方向为绕x轴旋转的正方向——逆时针方向。同理,“大拇指朝向y轴、食指朝向z轴、中指朝向x轴”“大拇指朝向z轴、食指朝向x轴、中指朝向y轴”也可以判断逆时针为旋转正方向。
(注:很多的坐标系建立不是依照这个标准右手坐标系建立的,并且旋转的正方向也没有给定,所以之后使用欧拉法时要尤为注意坐标系和旋转正方向!!!)
常见描述两坐标系间关系的方法:
- 三参数法——欧拉角法
- 四参数法——四元数法
- 九参数法——方向余弦法
可参考:四元数、欧拉角和方向余弦的定义及关系_方向余弦 欧拉角 四元数-CSDN博客
角度
-
航向角
(Yaw):是飞行器绕z轴的旋转,也就是飞行器的机头在水平面上的左右偏转。
-
俯仰角
(Pitch):是飞行器绕y轴的旋转,也就是飞行器的机头在垂直面上的上下倾斜。
-
滚转角
(Roll):是飞行器绕x轴的旋转,也就是飞行器机身的左右翻滚。
具体上述角度的直观图像表示参考:
(虽然在飞行器中、
、
的物理含义相同,但是参考链接1中的坐标系是标准的右手坐标系,我们使用的是常见直角坐标系,和参考连接2相同)
(根据不同的xyz轴的位置定义,会导致绕轴旋转的角度定义的不同)
数据处理(以四旋翼为例)
可以先观看后文第二节算法部分,以便理解
为什么同时使用加速度计和陀螺仪?
答:单独使用加速度计会存在抖动噪声较大,无法直接使用;单独使用陀螺仪不易受到抖动影响,但测得的数据是角速度,为获取实际姿态需要进行积分,但是长时间的积分行为会导致积分值逐渐偏离实际值。
姿态求解
假设从全局坐标系中转化到局部坐标系的四元数为,旋转矩阵为
形式。这里的
时使用陀螺仪数据来获取的,也就是说用陀螺仪数据积分获取当前姿态(即局部坐标系)。更新规则为:四元数微分方程的推导和解算实现 - 知乎
其中为采样时间间隔
加速度计获取的数据是局部坐标系下的加速度数据acc_x、acc_y、acc_z,所以需要将该加速度数据转化到全局坐标系下。
首先进行加速度数据归一化
将重力加速度从全局坐标系中转化到局部坐标系,以重力单位向量为例
则重力单位向量在局部坐标系中的分量为
但是单独使用陀螺仪数据会导致随着时间变化积分数据会逐渐偏离实际值,为此使用加速度计数据进行补偿更新。使用陀螺仪数据获取的重力单位向量和加速度计的重力单位向量进行叉乘,求取两向量间的偏差值(为什么能进行叉乘,因为和
都是在局部坐标系中,只是说两个获取来源不一样,存在偏差)
为什么叉乘可以表示误差?
答案来自kimiAI助手,点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/ct50ci10522hogo2v18g
垂直性:叉乘的结果是一个垂直于两个原始向量的向量。这意味着,如果两个向量不平行,它们的叉乘结果将指向它们之间的“偏差”方向。
大小与角度的关系:叉乘的大小等于两个向量的大小乘以它们之间夹角的正弦值。公式为 ∥A×B∥=∥A∥∥B∥sinθ,其中
是两个向量之间的夹角。当两个向量完全平行时,夹角为0,正弦值为0,叉乘结果为零向量,表示没有偏差;当两个向量不平行时,存在一个非零的角度,叉乘结果将有一个非零的大小,表示两个向量之间的偏差。
方向的判定:叉乘结果的符号(正或负)可以告诉我们一个向量旋转到另一个向量的方向。如果结果为正,则表示一个向量逆时针旋转到另一个向量;如果结果为负,则表示顺时针旋转。这可以用来表示两个向量之间的相对方向偏差。
误差表示:在某些应用中,如无人机算法,叉乘被用来表示两个向量之间的误差。例如,如果两个向量分别代表两个不同的参考系中同一物理量的方向,它们的叉乘可以表示这两个参考系之间的偏差。
物理意义:在姿态估计中,单位向量的叉积在物理意义上可以看作是轴角,轴角本身刻画了旋转,也就是叉乘的结果可以看成是旋转误差
有了偏差之后,我们可以对陀螺仪数据进行PI环节调节,以减小误差
并使用调节后的来更新
值。
至此,四元数Q已经获得。也就是说3个欧拉角也可以得到,姿态信息已得到。
位置求解
那么如何获取在全局坐标系中的位置?在全局坐标系中使用加速度计进行积分获得速度,在积分获得具体位置。
首先将加速度计的测得的加速度数据从局部坐标系转化到全局坐标系,旋转矩阵为
的形式
全局坐标系中速度分量
全局坐标系中位置分量
2. 算法
欧拉角法
基本思想就是将两个坐标系的变换分解为绕三个不同的坐标轴的三次连续转动组成的序列。欧拉角的旋转规定为连续两次旋转,必须绕着不同的转动轴旋转,常见的旋转顺序有围绕2轴或3轴的各6种顺序,一共有12种旋转顺规,且不同的旋转顺序会产生不同的效果。
三维笛卡尔坐标系中,以环绕z轴的偏航角、环绕y轴的俯仰角
、环绕x轴的滚转角
来旋转
针对向量
考虑绕Z轴旋转:得到新向量
得
同理,考虑绕Y轴旋转:得到新向量
考虑绕X轴旋转:得到新向量
我们以的旋转顺序为例,进行欧拉角法中两坐标系之间的转化
可以得到转移矩阵 (与下述的四元数法中
的右下角3*3矩阵内容相对应)
为什么欧拉角法需要绕3各轴旋转而不是绕两个轴旋转?
答:对于任意的向量V(除X轴上的向量),通过环绕X、Y轴的两次旋转,可以将V变化到三维空间中任意的一个新向量V'。如果V是X轴上的向量,环绕X轴的旋转无法起到效果,会导致一个自由度的丢失。为了规避这种情况需要进行三次旋转,但是仍然也会有旋转轴和向量重合的情况导致自由度的丢失,因此采用欧拉角法的三次旋转角度也有要求,要不等于90°,避免上边的旋转轴和向量重合的情况。
四元数法
由四个元组成的数
运算关系为:
得到矩阵形式为
即有
如何使用四元数法进行坐标变换?
假设存在坐标系n和坐标系b,使用四元数和共轭四元数
来表示从坐标系b到坐标系n的旋转,那么通过四元数旋转变换得到的向量
将是
在坐标系n中的表示。
其中定义的四元数旋转矩阵为坐标系b到坐标系n的旋转矩阵为
从坐标系n到坐标系b的旋转,四元数(假设
和
是单位四元数,
,则
和
是互逆的)。
其中定义的四元数旋转矩阵为坐标系b到坐标系n的旋转矩阵为
最终有转换矩阵和
互逆
欧拉角法和四元数法联系
旋转矩阵等价
则有欧拉角和四元数
的转换关系为
3. 参考
- 一文读懂系列 —— 陀螺仪 - 知乎
- 秒懂!陀螺仪的工作原理! - 知乎
- 四元数、欧拉角和方向余弦的定义及关系_方向余弦 欧拉角 四元数-CSDN博客
- 欧拉角pitch、yaw,roll的理解_pitch值-CSDN博客
- 做控制要知道的刚体旋转知识(三)欧拉角 - 知乎
- 四元数微分方程的推导和解算实现 - 知乎
- Kimi——https://kimi.moonshot.cn/share/ct50ci10522hogo2v18g