前言
四元数是一种常见表示物体旋转状态的方式q=w+xi+yj+zk
四元数常用于各种姿态控制等各种常见应用场景
- 比起九个数的旋转矩阵计算更快,数据量更小
- 避开了欧拉角的万向锁问题
- 插值特性
四元数公式推导
期望效果
对于四元数在旋转状态上的应用,我们希望用一个四元数q作用在一个三维向量v得到的新三维向量v能够表示原向量绕某一轴旋转角度θ后的结果。
基础理论
在四元数体系中,通过共轭乘法来达到这个效果
v′=q⋅v⋅q−1
v为向量v的四元数形式v=0+vxi+vyj+vzk
这种形式既能保留向量长度,也能把向量绕指定轴旋转到新的方向。
当 q 是单位四元数时,q−1 就是它的共轭,因此这个变换不会改变向量的模长,只会改变它的方向。
更直观地说,单位四元数可以看作“旋转的编码”。左乘 q 会把向量带入一个新的旋转状态,而右乘 q−1 则把结果重新投回三维空间中。
详细推导
我们先设旋转抽为单位向量n^=(nx,ny,nz),旋转角为θ
1.构造单位四元数q
从上文的期望效果可知,q需要包含旋转轴的方向信息才能达到绕旋转轴这一目标,还需要一个标量来包含角度信息,就可以猜测出一个基本结构
q=α+β⋅(nxi+nyj+nzk)
又因为q得是一个单位量就可以进一步得到
q=cosϕ+sinϕ⋅(nxi+nyj+nzk)
2.从共轭乘法及作用效果角度进一步推导
现在,我们把一个垂直于旋转轴 n^ 的向量 v⊥ 代入共轭乘法。
设 v⊥ 是 v⊥ 对应的纯四元数。利用四元数乘法法则(特别是 i2=j2=k2=−1 以及 ij=k,ji=−k 等规则),可以证明一个关键的恒等式:
对于一个纯四元数 u(即实部为0),如果它垂直于旋转轴(即 u⋅n^=0),那么:
n^⋅u=u⋅n^(这里的点乘是四元数乘法)
并且 (n^)2=−1(因为 n^ 是单位长度的纯四元数)。
利用这些性质,我们可以计算 q⋅v⊥⋅q−1:
首先,q⋅v⊥=(cosϕ+sinϕ⋅n^)⋅v⊥=cosϕ⋅v⊥+sinϕ⋅(n^⋅v⊥)
然后,右乘 q−1=cosϕ−sinϕ⋅n^:
q⋅v⊥⋅q−1=(cosϕ⋅v⊥+sinϕ⋅(n^⋅v⊥))⋅(cosϕ−sinϕ⋅n^)=cos2ϕ⋅v⊥−cosϕsinϕ⋅v⊥⋅n^+sinϕcosϕ⋅(n^⋅v⊥)−sin2ϕ⋅(n^⋅v⊥)⋅n^
利用 v⊥⋅n^=−n^⋅v⊥(因为两者垂直且都是纯四元数),以及 (n^⋅v⊥)⋅n^=v⊥(可以验证),上式化简为:
=v⊥⋅cos(2ϕ)+(n^⋅v⊥)⋅sin(2ϕ)
v⊥⋅cos(2ϕ)+(n^⋅v⊥)⋅sin(2ϕ)是向量v⊥绕旋转轴n^旋转角度2ϕ的三维向量旋转公式结果
由此可以得出ϕ与我们期望的旋转角度θ的关系,ϕ=θ/2
总结
至此我们就完美得出了q=w+xi+yj+zk的实际含义
q=cos2θ+sin2θ⋅(nxi+nyj+nzk)