龙格库塔(Runge-Kutta)法求四元数微分方程

Posted herr_edoc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了龙格库塔(Runge-Kutta)法求四元数微分方程相关的知识,希望对你有一定的参考价值。

文章目录

一、背景知识

陀螺仪是一种测量角运动的装置,在导航、运动检测、姿态检测等方面有着非常广泛的应用。在惯性测量单元(IMU)中,陀螺仪起主要作用,加速度计往往用来辅助,通过滤波算法和融合算法可以由IMU输出的数据得到物体的姿态。事实上,如果陀螺仪的性能足够好,就可以只通过对陀螺仪得到准确的姿态了。这篇文章要解决的问题就是如何用陀螺仪的数据得到物体的姿态。

1. 坐标系

陀螺仪输出的是角速度,那么对角速度积分是不是就能得到物体在空间中的姿态呢?事实上并非如此,在这里需要理解三个坐标系:世界坐标系、载体坐标系和惯性坐标系。
世界坐标系又称作宇宙坐标系或者全局坐标系,是其他坐标系的参考系,我们可以在世界坐标系下去描述其他坐标系或者物体的位置和姿态。
载体坐标系,又称作机体坐标系、物体坐标系等,顾名思义,这个坐标系是物体上的坐标系,会跟随物体的运动而运动。以手机为例,一般会在手机上建立如下所示的右手坐标系,这个坐标系就是一个载体坐标系。陀螺仪安装在手机上,如果忽略芯片本身和安装带来的非正交误差的话,可以认为陀螺仪的坐标系和手机的坐标系是同一个坐标系。所以,陀螺仪输出的角速度实际上是手机载体坐标系的角速度,直接对陀螺仪角速度积分得到的不是我们从世界坐标系看到的手机的姿态角度。需要将陀螺仪角速度转换到惯性坐标系,然后再积分才能得到物体的姿态。

惯性坐标系是为了简化世界坐标系和载体坐标系的转化而产生的。两个直角坐标系的关系包括旋转和位移。惯性坐标系的原点和载体坐标系的原点是同一个,所以通过旋转关系,两个坐标系就能够重合。而惯性坐标系通过位移就能够和世界坐标系重合。

2. 四元数

表示一个物体的姿态有很多种方法,最主流的方法有欧拉角、旋转矩阵、轴角,以及四元数。这些表示方法各有优缺点,但综合来说,四元数是一种非常适合在工程上表示姿态的方法。四元数可以理解成复数的扩展,它有一个实部和三个虚部,表示成 q = w + x ∗ i + y ∗ j + z ∗ k q=w+x\\asti+y\\astj+z\\astk q=w+xi+yj+zk,其中 i ∗ i = − 1 , j ∗ j = − 1 , k ∗ k = − 1 , i ∗ j ∗ k = − 1 i\\asti=-1,j\\astj=-1,k\\astk=-1,i\\astj\\astk=-1 ii=1,jj=1,kk=1,ijk=1。四元数有自己一套运算法则和性质,后面在其他文章具体阐述,这里介绍几个重要的点。

四元数的矩阵形式

类似复数,四元数也有模长或者称为2-范数,即 ∥ q ∥ = w 2 + x 2 + y 2 + z 2 \\beginVmatrixq\\endVmatrix=\\sqrt w^2+x^2+y^2+z^2 q=w2+x2+y2+z2 ,如果 ∥ q ∥ = 1 \\beginVmatrixq\\endVmatrix=1 q=1,则称这个四元数位单位四元数,单位四元数有如下性质: q − 1 = q ∗ q^-1=q^\\ast q1=q
假设两个四元数相乘 q 1 q 2 q_1q_2 q1q2,其中 q 1 = a + b ∗ i + c ∗ j + d ∗ k q_1=a+b\\asti+c\\astj+d\\astk q1=a+bi+cj+dk q 2 = e + f ∗ i + g ∗ j + h ∗ k q_2=e+f\\asti+g\\astj+h\\astk q2=e+fi+gj+hk,则
q 1 ∗ q 2 = a e + a f ∗ i + a g ∗ j + a h ∗ k + b e ∗ i − b f + b g ∗ k − b h ∗ j + c e ∗ j − c f ∗ k − c g + c h ∗ i + d e k + d f ∗ j − d g ∗ i − d h = ( a e − b f − c g − d h ) + ( b e + a f − d g + c h ) ∗ i ( c e + d f + a g − b h ) ∗ j ( d e − c f + b g + a h ) ∗ k \\beginaligned q_1 * q_2 = & ae + af * i + ag * j + ah * k + \\\\ & be * i - bf + bg * k - bh * j + \\\\ & ce * j - cf * k - cg + ch * i + \\\\ & dek + df * j - dg * i - dh \\\\ =& (ae - bf - cg - dh) + \\\\ & (be + af - dg + ch) * i \\\\ & (ce + df + ag - bh) * j \\\\ & (de - cf + bg + ah) * k \\endaligned q1q2==ae+afi+agj+ahk+beibf+bgkbhj+cejcfkcg+chi+dek+dfjdgidh(aebfcgdh)+(be+afdg+ch)i(ce+df+agbh)j(decf+bg+ah)k
上面的结果可以写成一个方阵和一个列矩阵相乘:
q 1 ∗ q 2 = ∣ a − b − c − d b a − d c c d a − b d − c b a ∣ ∣ e f g h ∣ q_1 * q_2 = \\beginvmatrixa&-b&-c&-d\\\\b&a&-d&c\\\\c&d&a&-b\\\\d&-c&b&a\\endvmatrix \\beginvmatrixe\\\\f\\\\g\\\\h\\endvmatrix q1q2=abcdbadccdabdcb

以上是关于龙格库塔(Runge-Kutta)法求四元数微分方程的主要内容,如果未能解决你的问题,请参考以下文章

四阶龙格库塔(Runge-Kutta)求解微分方程-多种编程语言

Runge-Kutta龙格-库塔法求解微分方程matlab仿真

四阶龙格库塔(Runge-Kutta)求解微分方程-多种编程语言

基于龙格-库塔法Runge-Kutta的常微分方程的求解matlab仿真

求编程达人帮忙用matlab编程用龙格库塔方法解微分方程

matlab代码实现四阶龙格库塔求解微分方程