Quaternion简记

q=(x,y,z,w)=(u,w)
u是虚部向量,w是实部,当然,也可以标记为(a+bi+cj+dk),这时a是实部,b,c,d是虚部向量
以下是在quaternion上的相等加减乘除的定义
(u,a)=(v,b) 紧当u=v a=b时成立
(u,a)±(v,b)=(u±v,a±b)
(u,a)(v,b)=(av+bu+u×v,ab-u·v)

乘法略显怪异,但之后你会发现这样定义的乘法是很有用的
令p=(u,p4)=(p1,p2,p3,p4) q=(v,q4)=(q1,q2,q3,q4),乘法展开,其中
u×v = (p2q3-p3q2,p3q1-p1q3,p1q2-p2q1)
u·v = p1q1+p2q2+p3q3

r=pq

r1=p4q1 + q4p1 + p2q3 - p3q2 = q1p4 - q2p3 + q3p2 + q4p1
r2=p4q2 + q4p2 + p3q1 - p1q3 = q1p3 + q2p4 - q3p1 + q4p2
r3=p4q3 + q4p3 + p1q2 - p2q1 =-q1p2 + q2p1 + q3p4 + q4p3
r4=p4q4 - p1q1 - p2q2 - p3q3 =-q1p1 - q2p2 - q3p3 + q4p4
于是乘法就可以写成矩阵形式(column major,pre multiply)
[ p4 -p3  p2  p1][q1]
[ p3  p4 -p1  p2][q2]
[-p2  p1  p4  p3][q3]
[-p1 -p2 -p3 p4][q4]

乘法的特殊性质

i=(1,0,0,0),j=(0,1,0,0),k=(0,0,1,0)

ii = jj = kk = ijk = -1
ij = k = -ji
jk = i = -kj
ki = j = -ik
这些性质可用乘法矩阵形式轻松验证

identity quaternion
e=(0,0,0,1),可用乘法矩阵验证pe=ep

分配率
p(q+r)=pq+pr (q+r)p=qp+rp

实部为零quaternion称为pure quaternion

scalar mulitplication
s(p1,p2,p3,p4)=(0,0,0,s)(p1,p2,p3,p4)=(sp1,sp2,sp3,sp4)=(p1,p2,p3,p4)s

conjugate and norm(共轭,模)
conjugate is denoted by q*
q* = -q1-q2-q3+q4 = (-u,q4)
性质
(pq)* = q*p*
(p+q)* = p* + q*
(q*)* = q
(sq*) = sq* s是real number
q+q* = (u,q4) + (-u,q4) = (0,2q4)
qq* = q*q = q1q1 + q2q2 + q3q3 + q4q4 = (‖u‖)^2 + q4q4

norm (模,长度)
‖q‖ = square root(qq*)
当‖q‖ = 1时,称q为unit quaternion
norm有一下性质
‖q*‖ = ‖q‖
(‖pq‖)^2 = (‖p‖)^2(‖q‖)^2)
所以,unit quaternion相乘结果也是unit quaternion;‖p‖ = 1时 ‖pq‖ = ‖q‖

inverse(逆)quaternion
由于quaternion的乘法不可交换,所以不能定义除法运算
inverse is denoted by q^-1= q* / (‖q‖)^2
如果q是unite quaternion,可得q^-1 = q*,即conjugate就是inverse,inverse就是conjugate
inverse特性
(q^-1)^-1 = q
pq^-1 = q^-1p^-1

polar(极坐标)形式
q=(q1,q2,q3,q4)=(u,q4)如果是unit quaternion
可得
(‖q‖)^2=(‖u‖)^2 + (q4)^2 = 1
同样根据三角函数关系
(sin(θ))^2 + (cos(θ))^2 = 1
得到
θ∈[0,π]
sin(θ) = ‖u‖
cos(θ) = q4
假设n是u的同向unit vector,得到
n = u/‖u‖ = u/sin(θ)
所以
u = sin(θ)n
所以
q = (sin(θ)n,cos(θ))
观察可得,只需要取-θ,就可得到q的conjugate q*

旋转
假设如下
q=(u,w)是unit quaternion
v是3d vector,v可以想象为pure quaternion p=(v,0)
考虑以下
qpq^-1 = qpq* (因为unit quaternion q^-1=q*)
=(u,w)(v,0)(-u,w)
=(u,w)(wv-v×u,v·u)
为简化书写,令
a=w
b=v·u
m=u
n=wv-v×u
得到
=(m,a)(n,b)
=(an+bm+m×n,ab-m·n)
观察real part实部
ab-m·n
= w(v·u)-u·(wv-v×u)
= w(v·u)-u·wv+u·(v×u)
= w(v·u)-w(v·u)+0
= 0
u·(v×u) = 0是因为v×u得到的肯定会与u正交,正交dot就等于0
观察vector part虚部
an+bm+m×n
= w(wv-v×u)+(v·u)u+u×(wv-v×u)
= wwv-wv×u+(v·u)u+u×wv+u×(u×v)
= wwv+u×wv+(v·u)u+u×wv+u×(u×v)
= wwv+2(u×wv)+(v·u)u+u×(u×v)
= wwv+2(u×wv)+(v·u)u+(u·v)u-(u·u)v
= (ww-u·u)v+2w(u×v)+2(u·v)u
= (ww-u·u)v+2(u·v)u+2w(u×v)
所以
qpq* = ((ww-u·u)v+2(u·v)u+2w(u×v),0)
观察可知,qpq*的结果是一个vector,pure quaternion
由于q是unit quaternion,把q写成极坐标形式
q=(sin(θ)n,cos(θ)) ‖n‖=1 θ∈[0,π]
代入可得
qpq* = ((cos(θ))^2-(sin(θ))^2)v+2(sin(θ)n·v)sin(θ)n+2cos(θ)(sin(θ)n×v)
= ((cos(θ))^2-(sin(θ))^2)v+2(sin(θ))^2(n·v)n+2cos(θ)sin(θ)(n×v)
通过倍角公式
(cos(θ))^2-(sin(θ))^2 = cos(2θ)
2cos(θ)sin(θ) = sin(2θ)
cos(2θ) = 1-2sin^2(θ)
所以
qpq* = cos(2θ)v+(1-cos(2θ))(n·v)n+sin(2θ)(n×v)
所以,qpq^-1就是v绕n旋转2θ的结果,即Rq(v) = qvq^-1
可以这样应用,假如你要绕n转θ,那么q=(sin(θ/2)n,cos(θ/2))

写成矩阵形式,或旋转矩阵转换成quaternion
都是一些简单推导,略

多个旋转quaternion的复合
unit quaternion前提
Rq(Rp(v))=(qp)v(qp)^-1

至此,可知quaternion可表示一个旋转,使用quaternion可以解决euler angles的gimbal lock问题
gimbal lock的产生和quaternion的解决可参考
http://en.wikipedia.org/wiki/Gimbal_lock#Gimbal_lock_in_applied_mathematics

原文地址:https://www.cnblogs.com/rickerliang/p/2803915.html