通过空间角速度积分更新旋转矩阵及四元数的公式推导

最近开始着手做硕士毕设课题,需要用到IMU采集姿态信息用以提取手势,本着亲身实践的目的,我决定自己写算法实现姿态的融合,由于IMU运动过程中的加速度计输出叠加了非重力项,然后这就必然绕不开使用原始传感器的角速度数据来对姿态进行积分运算。

这里值得一提的是,看到网络上好多博客的做法都是对单个欧拉角直接积分,事实上这种做法是错误的,四元数4个参数就可以表示姿态,欧拉角凭什么可以只用3个角度变量表示姿态,是因为欧拉角表示法还有旋转顺序这一条,同一组3个角度,旋转顺序不同,最终的姿态也不同,如果直接对单个欧拉角进行积分,顺序就会错乱,最终的效果无法保证,当然我没有试验过,这里只是从理论上说明一下。


 正文.

一、旋转矩阵求导和积分

3维旋转矩阵表示的是空间物体的姿态,线速度不会改变物体姿态,只有角速度才会。我们先将旋转矩阵由求极限求导的公式列出来,如式(1):

(1)R˙=limt0R(t+t)R(t)t

由于Δt前后矩阵仍然是旋转矩阵,所以必然存在另一个旋转变换矩阵使得该积分前的旋转矩阵左乘该变换矩阵可以得到积分后的旋转矩阵,公式表达如式(2):

(2)R(t+t)=Rk(θ)R(t)

在上式(2)中变换矩阵用轴角的形式表示,即绕着转轴K(下标所示)旋转Δθ角。将(2)代入(1)中,我们得到式(3):

(3)R˙=(limt0Rk(θ)Et)R(t)

当Δt趋于0,即Δθ趋于0时,可以对轴角参数表示的姿态矩阵(《机器人学》.Craig原书公式 .2.80)进行简化,得到式(4):

(4)Rk(θ)=[1kzθkyθkzθ1kxθkyθkxθ1]

再将式(4)代入式(3),得到式(5):

(5)R˙=[0kzθ˙kyθ˙kzθ˙0kxθ˙kyθ˙kxθ˙0]R(t)

上式(5)中的矩阵称为角速度反对称矩阵,矩阵的每一项分别表示角速度在X-Y-Z轴上的分量,可由角速度向量叉乘的形式得到,于是最终的由空间角速度和时间积分得到的旋转矩阵表示的姿态由式(6)得到:

(6)R(t+t)=[1ωztωytωzt1ωxtωytωxt1]R(t)


 二、四元数求导和积分

由公式(6)知道旋转矩阵的积分形式后,再根据四元数与旋转矩阵相互转化的公式(我目前用这种方法只算出了q4,其它三个元素这样算很麻烦,后面有计算步骤是使用四元数直接微分算得,下面的计算就权当两种形式的积分之间的相互验证吧),我们可以很快的推算出四元数的角速度积分形式,步骤如下:

首先我们列出旋转矩阵转化为四元数的公式(7)-(10):

(7)q1=r32r234q4

(8)q2=r13r314q4

(9)q3=r21r124q4

(10)q4=121+r11+r22+r33

 上式中,q4为四元数的实数项,其它为虚数项,接下来我们直接利用式(6),将其矩阵相乘得到积分后的矩阵表示,即式(11):

(11)R(t+t)=[1ωztωytωzt1ωxtωytωxt1][m11m12m13m21m22m23m31m32m33]

我以求取新的Q4为例,说明计算的方法,其它三项原理相同,最后我会放出完整的积分公式。下式中,我将以小写字母m表示积分前的矩阵元素,小写字母r表示积分后的矩阵元素,大写字母Q表示新的四元数,小写q表示积分前的四元数。在式(10)中我们知道,计算q4需要r11,r22,r33,把式(11)乘开即可得到以上三项的表达式分别为:

(12)r11=m11+t(ωzm21+ωym31)

(13)r22=m22+t(ωzm12ωxm32)

(14)r33=m33+t(ωym13+ωxm23)

将以上三式代入式(10)可以得到:

(15)Q4=121+m11+m22+m33tωz(m21m12)tωy(m13m31)tωx(m32m23)

 进一步变形我们可以得到:

(16)Q4=121+m11+m22+m331+tωz(m21m12)tωy(m13m31)tωx(m32m23)1+m11+m22+m33

将式(7)-(10)代入式(16)中,可得到:

(17)Q4=q41+ωztq3ωytq2ωxtq1q4

进一步针对1+x形式的函数进行泰勒展开取前两项,并应用于式(17)得到近似的解(Δt趋于0时):

(17)Q4=q4+12t(ωzq3ωyq2ωxq1)

直接使用四元数微分的计算方法

有四元数的表示形式Q=cos(θ2)+n^sin(θ2),对其求导得到式(18):

(18)dQdt=12sin(θ2)dθdt+dn^dtsin(θ2)+n^12cos(θ2)dθdt

上式中n^表示的为旋转轴,在积分或者微分的一瞬间,角速度为恒定值,故只有角度变换,dn^dt为0,同时有n^dθdt=ωEωE表示在世界坐标系中的物体转动的角速度。在上式中,提取12ωE,两外两项相加即为四元数Q,于是有:

 (19)dQdt=12ωEQ

上式中" * "表示4元数乘法。另外设在物体坐标系中的角速度表示为ωO,由坐标变换的四元数表示法得到:

(20)ωE=QωOQ

上式中Q*为Q的共轭四元数,Q**Q=1,将上式代入到式(19)得到

 (21)dQdt=12QωO

将式(20)用四元数乘法展开可得微分的形式:

(22)dQdt=12[0ωxωyωzωx0ωzωyωyωz0ωxωzωyωx0][q4q1q2q3]

然后我们将式(22)代入到微分求极限中,最终可获得积分形式:

(23)Q=[q4q1q2q3]+t2[ωxq1ωyq2ωzq3ωxq4ωyq3+ωzq2ωxq3+ωyq4ωzq1ωxq2+ωyq1+ωzq4]

可以看到上式中第一项和我们先前推导的公式相同,但需要注意的是,两者公式中的角速度并不是同一个参考系下的,所以两种方法算出的四元数后3项形式是不同的,至于为什么角速度参考坐标系不同却能得到同一个形式,留给读者去探索吧!

 


 三、Matlab代码验证

https://github.com/ShieldQiQi/Kalman-Filter-Demos

 
posted @   我叫平沢唯  阅读(6940)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示