3D数学笔记——四元数

四元数

在了解四元数旋转之前,先要了解四元数,所以在此对四元数做个简单的讨论。

  • 定义 

          四元数和复数的定义很相似(但是这里并不打算讨论复数,如果有不明白复数的可以进行百度。),唯一的区别就是四元数有3个虚部,而复数只有一个。所有的四元数q都可以写成一下形式:

                                                     q  = a  + bi + cj +dk

其中

                                                     i^2 = j^2 = k^2 = ijk = -1

根据该公式得出

                                                    \\ij=k=-ji \\jk=i=-kj \\ki=j=-ik       

与复数类型,因为四元数其实就是对基\begin{Bmatrix} 1,i,j,k \end{Bmatrix} 的线性组合,四元数也可以写成向量形式

                                                                     

  • 模长(范数)

          仿照复数的定义,我们可以暂时将一个四元数q = a + bi + cj + dk的模长定义为

                                                                 \left \|q \right \|=\sqrt[\sqrt[\sqrt[]{a^2+b^2+c^2+d^2}

          还可以表示为 q = [s, v] :

                                                         

  • 加减法

             与复数类似,四元数的加法只需要将分量相加就可以了,如果我们有两个四元数q1 = a + bi + cj + dk,q2 = e + f i + gj + hk,那么它们的和为:

                                             

减法同理

                                                 

  • 数乘

       如果我们有一个四元数 q = a + bi + cj + dk 和一个标量s,那么它们的乘积为:
                                                 

  • 四元数乘法

        四元数乘法不遵守交换律,也就是说一般 情况下 q1q2\neq q2q1,这也就有了左乘和右乘的区别,如果是q1q2,那么我们就说[q2左乘以q1],如果是q2q1,那我们就说[q2右乘以q1].  除了交换律之外,我们经常使用的结合律和分配率在四元数内都是成立的。

       那么如果有两个四元数q1 = a + bi + cj + dk 和 q2 = e + f i + gj + hk,那么它们的乘积为

                                               

    现在我们利用定义中的公式来进行化简

                                                 

     现在我们来把他写成矩阵形式

                                                 

     我们进一步整理公式

                                        

    注意,如果令v=\begin{bmatrix} b\\ c\\ d \end{bmatrix}u=\begin{bmatrix} f\\ g\\ h \end{bmatrix},那么

                                                                      

        因此q1q2的结果可以用向量点乘和叉乘的形式表示出来

                                                  

 

  • 纯四元数

         在我们正式进入四元数旋转讨论之前,我们还需要更多关于四元数的定义,如果一个四元数能写成这样的形式

                                                                 

          那我们则称v是一个纯四元数,既仅有虚部的四元数,因为纯四元数近有虚部的3D向量决定,我们可以将任意的3D向量转换成纯四元数,在本文中,如果一个3D向量v,那么不加粗、没有上标的 v 则为它对应的纯四元数 v = [0, v].

          纯四元数有一个很重要的特性:如果有两个纯四元数v = [0, v], u = [0, u],那么

                                                              

 

  • 逆和共轭

         因为四元数是不遵守交换律的,我们通常不会将两个四元数相除写为 p q 的形式.取 而代之的是将乘法的逆运算定义为 pq−1 或者 q −1 p,注意它们的结果一般是不同的. 其中,q −1 是 q 的逆(Inverse),我们规定:

                                                            

这也就是说:

                                                            

     所以,右乘 q 的逆运算为右乘 q −1,左乘 q 的逆运算为左乘 q −1,这个与矩阵的性 质非常相似.

     显然,要在无数的四元数中寻找一个满足 qq−1 = q −1 q = 1 的 q −1 是非常困难的, 但是实际上我们可以使用四元数共轭的一些性质来获得 q −1.

    我们定义,一个四元数 q = a + bi + ck + dj 的共轭为 q ∗ = a − bi − cj − dk(q ∗ 读作 「q star」).如果用标量向量有序对的形式来定义的话,q = [s, v] 的共轭为 q ∗ = [s, −v]. 共轭四元数的一个非常有用的性质就是:      

可以看到,这最终的结果是一个实数,而它正是四元数模长的平方:

                                                    

因为 (q ∗ ) ∗ = [s, −(−v)] = [s, v] = q,

                                                       

所以我们得到,q ∗ q = qq∗.这个特殊的乘法是遵守交换律的.

如果你还记得之前四元数逆的定义的话:

                          

用这种办法寻找一个四元数的逆会非常高效,我们只需要将一个四元数的虚部改变 符号,除以它模长的平方就能获得这个四元数的逆了.如果 ∥q∥ = 1,也就是说 q 是 一个单位四元数 (Unit Quaternion),那么:

                                                                      

 

open3d是一个用于处理三维数据(点云、三维模型等)的开源库。点云配准是将两个或多个点云数据进行对齐的过程,以便在一个全局坐标系下进行比较、分析或重建。其中,四元数法是一种常用的点云配准方法。 四元数是一种用四个实数表示的扩充复数,可以用于描述旋转变换。在点云配准中,使用四元数法是因为其具有以下优势: 第一,四元数具有紧凑的表示形式,只需要四个实数即可表示旋转变换,相较于旋转矩阵的九个实数表示方式节省了存储空间,降低了计算复杂度。 第二,四元数法能够有效地避免了“万向锁”问题。万向锁是指在使用欧拉角进行坐标变换时,由于旋转过程中会出现奇点,导致旋转角度无法精确表示的问题。而四元数法不会出现这个问题,具有更好的数值稳定性。 在open3d中,点云配准的四元数法通常有以下几个步骤: 首先,计算两个点云之间的特征描述子,例如FPFH(Fast Point Feature Histograms)或SHOT(Signature of Histograms of Orientations)。这些描述子能够表示点云的局部几何信息。 然后,根据特征描述子的相似性,寻找初始的点对应关系。 接下来,通过最小化点云之间的误差指标,例如最小化点到平面的距离或最小化点到点的距离,来优化点对应关系,并计算出旋转矩阵。 将旋转矩阵转换为四元数表示,即可完成点云的配准过程。 四元数法是open3d中常用的点云配准方法之一,其能够高效地实现点云的准确对齐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值