1.相机成像原理
相机成像原理本质上就是点在世界坐标系、相机坐标系、像平面坐标系和像素平面坐标系四个坐标系中间的矩阵变换。
总体图如下:
矩阵关系可写作:
z
c
[
u
v
1
]
=
[
1
d
x
0
U
2
0
1
d
y
V
2
0
0
1
]
[
f
0
0
0
0
f
0
0
0
0
1
0
]
[
R
T
0
3
T
1
]
[
x
w
y
w
z
w
1
]
z_c\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx} & 0 & \frac{U}{2}\\ 0 & \frac{1}{dy} & \frac{V}{2} \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}\begin{bmatrix} R & T \\ 0^T_3 & 1 \end{bmatrix}\begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
zc
uv1
=
dx1000dy102U2V1
f000f0001000
[R03TT1]
xwywzw1
- 世界坐标系——>相机坐标系:
上述坐标的变换关系可以写为:
[
x
c
y
c
z
c
1
]
=
[
R
T
0
3
T
1
]
[
x
w
y
w
z
w
1
]
\begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R & T \\ 0^T_3 & 1 \end{bmatrix}\begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
xcyczc1
=[R03TT1]
xwywzw1
2. 相机坐标系——>像平面坐标系
相机坐标系中的某点会投影在相机的成像平面上,利用针孔成像原理,空间任意一点
p
c
p_c
pc与图像点
p
p
p之间的关系,
p
c
p_c
pc与相机光心
o
c
o_c
oc的连线为
o
c
p
c
o_cp_c
ocpc,与像面的交点p即为空间点
p
c
p_c
pc在图像平面上的投影。
在已知相机焦距
f
f
f的情况下,可得:
x
x
c
=
y
y
c
=
f
z
c
\frac{x}{x_c}=\frac{y}{y_c}=\frac{f}{z_c}
xcx=ycy=zcf
则
p
c
p_c
pc和
p
p
p的关系可以如下:
z
c
[
x
y
1
]
=
[
f
0
0
0
0
f
0
0
0
0
1
0
]
[
x
c
y
c
z
c
1
]
z_c\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}\begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix}
zc
xy1
=
f000f0001000
xcyczc1
3. 像平面坐标系——>像素坐标系
像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点。
由于图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,故两单位之间存在下面的变换关系:
1
p
i
x
e
l
∗
d
x
=
1
m
m
u
与
x
1
p
i
x
e
l
∗
d
y
=
1
m
m
v
与
y
\begin{array}{ll} 1pixel * dx = 1mm & u与x\\ 1pixel * dy = 1mm & v与y \end{array}
1pixel∗dx=1mm1pixel∗dy=1mmu与xv与y
故
(
u
,
v
)
(u,v)
(u,v)与
(
x
,
y
)
(x,y)
(x,y)之间的变换关系如下:
[
u
v
1
]
=
[
1
d
x
0
U
2
0
1
d
y
V
2
0
0
1
]
[
x
y
1
]
\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx} & 0 & \frac{U}{2}\\ 0 & \frac{1}{dy} & \frac{V}{2} \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}
uv1
=
dx1000dy102U2V1
xy1
2 旋转平移
2.1 李群和李代数
2.2 罗德里格斯公式
- 旋转的分解:
由上图可知:
v → = v → ∣ ∣ + v → ⊥ \overrightarrow{v}=\overrightarrow{v}_{||}+\overrightarrow{v}_\bot v=v∣∣+v⊥
对与 v → ∣ ∣ \overrightarrow{v}_{||} v∣∣来说,因为其与 u → \overrightarrow{u} u平行,所以其旋转仍然为其本身。
对于 v → ⊥ \overrightarrow{v}_{\bot} v⊥来说,看下图:
其旋转为:
w
→
=
u
→
×
v
→
⊥
v
→
⊥
′
=
v
→
v
+
v
→
w
′
=
c
o
s
θ
v
→
⊥
+
s
i
n
θ
w
→
=
c
o
s
θ
v
→
⊥
+
s
i
n
θ
(
u
→
×
v
→
⊥
)
\begin{array}{ll} \overrightarrow{w}=\overrightarrow{u}\times \overrightarrow{v}_{\bot} \\ \begin{aligned} \overrightarrow{v}_{\bot}^{'}&=\overrightarrow{v}_{v}+\overrightarrow{v}_{w}^{'}\\&=cos\theta\overrightarrow{v}_{\bot}+sin\theta\overrightarrow{w}\\&=cos\theta\overrightarrow{v}_{\bot}+sin\theta(\overrightarrow{u}\times\overrightarrow{v}_{\bot}) \end{aligned} \end{array}
w=u×v⊥v⊥′=vv+vw′=cosθv⊥+sinθw=cosθv⊥+sinθ(u×v⊥)
也就是说
v
→
⊥
\overrightarrow{v}_{\bot}
v⊥旋转
θ
\theta
θ角度后的结果如下:
v
→
⊥
′
=
c
o
s
θ
v
→
⊥
+
s
i
n
θ
(
u
→
×
v
→
⊥
)
\overrightarrow{v}^{'}_{\bot}=cos\theta\overrightarrow{v}_{\bot}+sin\theta(\overrightarrow{u}\times\overrightarrow{v}_{\bot})
v⊥′=cosθv⊥+sinθ(u×v⊥)
又因为:
v
→
∣
∣
′
=
v
→
∣
∣
=
(
u
→
⋅
v
→
)
u
→
v
→
⊥
=
v
→
−
(
u
→
⋅
v
→
)
u
→
u
→
×
v
→
⊥
=
u
→
×
v
→
\begin{aligned} &\overrightarrow{v}^{'}_{||}=\overrightarrow{v}_{||}=(\overrightarrow{u}\cdot \overrightarrow{v} )\overrightarrow{u} \\ &\overrightarrow{v}_{\bot}=\overrightarrow{v}-(\overrightarrow{u}\cdot \overrightarrow{v} )\overrightarrow{u} \\ &\overrightarrow{u}\times\overrightarrow{v}_{\bot}=\overrightarrow{u}\times\overrightarrow{v} \end{aligned}
v∣∣′=v∣∣=(u⋅v)uv⊥=v−(u⋅v)uu×v⊥=u×v
通过上述可得:
v
′
=
v
∣
∣
′
+
v
⊥
′
=
(
u
⋅
v
)
u
+
c
o
s
θ
(
v
−
(
u
⋅
v
)
u
)
+
s
i
n
θ
(
u
×
v
)
=
c
o
s
θ
v
+
(
1
−
c
o
s
θ
)
(
u
⋅
v
)
u
+
s
i
n
θ
(
u
×
v
)
=
v
+
(
1
−
c
o
s
θ
)
∗
u
×
(
u
⋅
v
)
+
s
i
n
θ
(
u
×
v
)
\begin{array}{ll} \begin{aligned} \mathbf{v}^{'}&=\mathbf{v}^{'}_{||}+\mathbf{v}_{\bot}^{'} \\ &=(\mathbf{u}\cdot \mathbf{v} )\mathbf{u}+ cos\theta(\mathbf{v}-(\mathbf{u}\cdot \mathbf{v} )\mathbf{u})+sin\theta(\mathbf{u}\times\mathbf{v})\\ &=cos\theta\mathbf{v}+(1-cos\theta)(\mathbf{u}\cdot\mathbf{v})\mathbf{u}+sin\theta(\mathbf{u}\times\mathbf{v})\\ &=v+(1-cos\theta)*\mathbf{u}\times(\mathbf{u}\cdot\mathbf{v})+sin\theta(\mathbf{u}\times\mathbf{v}) \end{aligned} \end{array}
v′=v∣∣′+v⊥′=(u⋅v)u+cosθ(v−(u⋅v)u)+sinθ(u×v)=cosθv+(1−cosθ)(u⋅v)u+sinθ(u×v)=v+(1−cosθ)∗u×(u⋅v)+sinθ(u×v)
上述公式称作罗德里格斯公式。
2.3 2D旋转
在进行2D旋转讨论之前,我们首先要了解复数和矩阵之间的关系:
-
复数乘法和矩阵之间的关系:
z 1 = a + b i z 2 = c + d i 𝑧 1 𝑧 2 = 𝑎 𝑐 − 𝑏 𝑑 + 𝑎 𝑑 𝑖 + 𝑏 𝑐 𝑖 = 𝑎 𝑐 − 𝑏 𝑑 + ( 𝑏 𝑐 + a d ) i \begin{array}{ll} z_1 = a + bi\\ z_2 = c + di \\ 𝑧_1𝑧_2 = 𝑎𝑐 − 𝑏𝑑 + 𝑎𝑑𝑖 + 𝑏𝑐𝑖= 𝑎𝑐 − 𝑏𝑑+ (𝑏𝑐 + ad)i \end{array} z1=a+biz2=c+diz1z2=ac−bd+adi+bci=ac−bd+(bc+ad)i
如果仔细观察就能发现,复数相乘的结果其实也是一个矩阵与向量相乘的
结果,也就是说:
z 1 z 2 = 𝑎 𝑐 − 𝑏 𝑑 + ( 𝑏 𝑐 + a d ) i = [ a − b b a ] [ c d ] z_1z_2 = 𝑎𝑐 − 𝑏𝑑+ (𝑏𝑐 + ad)i = \begin{bmatrix} a & -b \\ b & a \end{bmatrix}\begin{bmatrix} c \\ d \end{bmatrix} z1z2=ac−bd+(bc+ad)i=[ab−ba][cd][ c d ] \begin{bmatrix} c \\ d \end{bmatrix} [cd]为z_2的向量形式, [ a − b b a ] \begin{bmatrix} a & -b \\ b & a \end{bmatrix} [ab−ba]为z_1的矩阵形式。接下来如果我们将 z 1 z_1 z1和 z 2 z_2 z2用矩阵形式表示并相乘的话,可以得到下式:
z 1 z 2 = [ a − b b a ] [ c − d d c ] = [ a c − b d − ( b c + a d ) b c + a d a c − b d ] z_1z_2=\begin{bmatrix} a & -b \\ b & a \end{bmatrix}\begin{bmatrix} c & -d \\ d & c \end{bmatrix}=\begin{bmatrix} ac - bd & -(bc + ad) \\ bc + ad & ac - bd \end{bmatrix} z1z2=[ab−ba][cd−dc]=[ac−bdbc+ad−(bc+ad)ac−bd]
可以观察到结果 [ a c − b d − ( b c + a d ) b c + a d a c − b d ] \begin{bmatrix} ac - bd & -(bc + ad) \\ bc + ad & ac - bd \end{bmatrix} [ac−bdbc+ad−(bc+ad)ac−bd]为 a c − b d + ( b c + a d ) i ac - bd + (bc+ad)i ac−bd+(bc+ad)i的矩阵形式。
所以我们可以所以矩阵的乘法来表示复数的乘法。
下面为1和i的矩阵形式:
1 = [ 1 0 0 1 ] i = [ 0 − 1 1 0 ] \begin{array}{ll} 1 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \\ i = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \end{array} 1=[1001]i=[01−10] -
复数相乘和2D旋转的联系
通过上面的推导我们可以发现,复数相乘和矩阵相乘是可以等价的,那么也就可以将复数与2D旋转联系到一起。
观察上图我们可得:
z = a + b i = [ a − b b a ] = a 2 + b 2 [ a a 2 + b 2 − b a 2 + b 2 b a 2 + b 2 a a 2 + b 2 ] = a 2 + b 2 [ c o s θ − s i n θ s i n θ c o s θ ] = [ a 2 + b 2 0 0 a 2 + b 2 ] [ c o s θ − s i n θ s i n θ c o s θ ] = [ ∣ ∣ z ∣ ∣ 0 0 ∣ ∣ z ∣ ∣ ] [ c o s θ − s i n θ s i n θ c o s θ ] \begin{aligned} z &= a + bi = \begin{bmatrix} a & -b \\ b & a \end{bmatrix} \\&= \sqrt{a^2 + b^2}\begin{bmatrix} \frac{a}{\sqrt{a^2 + b^2}} & \frac{-b}{\sqrt{a^2 + b^2}} \\ \frac{b}{\sqrt{a^2 + b^2}} & \frac{a}{\sqrt{a^2 + b^2}} \end{bmatrix} \\ &= \sqrt{a^2 + b^2}\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\\&= \begin{bmatrix} \sqrt{a^2 + b^2} & 0\\ 0 & \sqrt{a^2 + b^2} \end{bmatrix}\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \\ &= \begin{bmatrix} ||z|| & 0\\ 0 & ||z|| \end{bmatrix}\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \end{aligned} z=a+bi=[ab−ba]=a2+b2[a2+b2aa2+b2ba2+b2−ba2+b2a]=a2+b2[cosθsinθ−sinθcosθ]=[a2+b200a2+b2][cosθsinθ−sinθcosθ]=[∣∣z∣∣00∣∣z∣∣][cosθsinθ−sinθcosθ]我们将原本的矩阵变形为了两个变换矩阵的复合,其中左边的 [ ∣ ∣ z ∣ ∣ 0 0 ∣ ∣ z ∣ ∣ ] \begin{bmatrix} ||z|| & 0\\ 0 & ||z|| \end{bmatrix} [∣∣z∣∣00∣∣z∣∣]
是缩放矩阵,而右边的 [ c o s θ − s i n θ s i n θ c o s θ ] \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} [cosθsinθ−sinθcosθ]则是我们熟悉的2D旋转矩阵。接下来我们测试一下,旋转矩阵对1和i的影响,也就是 [ 1 0 ] \begin{bmatrix} 1 \\ 0 \end{bmatrix} [10]和 [ 0 1 ] \begin{bmatrix} 0 \\ 1 \end{bmatrix} [01]。
[ c o s θ − s i n θ s i n θ c o s θ ] [ 1 0 ] = [ c o s θ s i n θ ] − − − − − − − − − − − − − [ c o s θ − s i n θ s i n θ c o s θ ] [ 0 1 ] = [ − s i n θ c o s θ ] \begin{array}{ll} \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\begin{bmatrix} 1 \\ 0 \end{bmatrix}=\begin{bmatrix} cos\theta \\ sin\theta \end{bmatrix} \end{array} \\ ------------- \\ \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\begin{bmatrix} 0 \\ 1 \end{bmatrix}=\begin{bmatrix} -sin\theta \\ cos\theta \end{bmatrix} [cosθsinθ−sinθcosθ][10]=[cosθsinθ]−−−−−−−−−−−−−[cosθsinθ−sinθcosθ][01]=[−sinθcosθ]
旋转图如下:
也就是说,单位旋转矩阵会将被旋转向量逆时针旋转 θ \theta θ。
如果不是单位旋转矩阵的话,会对被旋转向量进行一个尺度的缩放。
总结上述推导,可以得出:复数的相乘其实是旋转与缩放变换的复合.如果有一个复数 z = a + b 𝑖 z = a+b𝑖 z=a+bi,
那么 z z z 与任意一个复数 c c c相乘都会将 c c c逆时针旋转 θ = a t a n 2 ( b , a ) \theta = atan2(b, a) θ=atan2(b,a),并将
其缩放 ∣ ∣ z ∣ ∣ = a 2 + b 2 ||z||=\sqrt{a^2+b^2} ∣∣z∣∣=a2+b2倍。 -
复数的极坐标形式:
根据欧拉公式可知:
c o s θ + i s i n θ = e i θ cos\theta + isin\theta = e^{i\theta} cosθ+isinθ=eiθ
也就是说:
z = a + b i = = ∣ ∣ z ∣ ∣ ( c o s θ + i s i n θ ) = ∣ ∣ z ∣ ∣ e i θ z = a + bi = =||z||(cos\theta + isin\theta)=||z||e^{i\theta} z=a+bi==∣∣z∣∣(cosθ+isinθ)=∣∣z∣∣eiθ
如果我们定义 r = ∣ ∣ z ∣ ∣ r=||z|| r=∣∣z∣∣,我们就得到了复数的极坐标形式:
z = r e i θ z=re^{i\theta} z=reiθ
现在复数的定义就与实部与虚部的两个分量 a a a, b b b无关了,我们可以使用一
个缩放因子 r r r 和旋转角度 θ \theta θ的形式来定义任意一个复数,而且它旋转与缩放的性质仍然存在。
v ′ = r e i θ v v^{'} = re^{i\theta}v v′=reiθv
2.4 3D旋转
加粗的符号为向量
-
1.欧拉角
-
2.轴角式
通常情况下,如果我们说绕着一个向量 u 旋转,我们其实指的是绕着 u u u所指的方向进行旋转。向量是同时具有大小和方向的量,但是在旋转中,其大小并不重要。我们可以说绕着 u 1 = [ 0 0 1 ] T u_1 = \begin{bmatrix} 0 & 0 & 1 \end{bmatrix}^T u1=[001]T这个轴进行旋转,也可以说绕着 u 2 = [ 0 0 2 ] T u_2 = \begin{bmatrix} 0 & 0 & 2 \end{bmatrix}^T u2=[002]T旋转。即使这两个向量完全不同,但是它们指向的都是同一个方向(即 𝑧 轴的方向)
轴角式的旋转和罗德里格斯公式的推导一致。
-
3.四元数
-
四元数的定义
四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。所有的四元数 q ∈ H q\isin{H} q∈H( H H H代表四元数的发现者 William Rowan Hamilton)都可以。
q = a + b i + c j + d k q=a + bi + cj + dk q=a+bi+cj+dk
其中
i 2 = j 2 = k 2 = i j k = − 1 i^2=j^2=k^2=ijk=-1 i2=j2=k2=ijk=−1
与复数类似,四元数可以写作向量形式:
q = [ a b c d ] q=\begin{bmatrix} a\\ b\\ c\\ d \end{bmatrix} q= abcd 在描述四元数时,我们经常将四元数写作:
q = [ s , v ] q=[s, \mathbf{v}] q=[s,v]
将实部和虚部分开,表示为标量和向量的有序对形式。 -
四元数的性质
-
模长
和复数类似,四元数的模长(范数)可以表示为:
∣ ∣ q ∣ ∣ = a 2 + b 2 + c 2 + d 2 ||q||=\sqrt{a^2+b^2+c^2+d^2} ∣∣q∣∣=a2+b2+c2+d2 -
四元数乘法和矩阵之间的联系
四元数不满足乘法交换律。和复数类似,四元数之间的乘法也可以写作矩阵的形式:
q 1 q 2 = ( a + b i + c j + d k ) ( e + f i + g j + h k ) = a e + a f i + a g j + a h k + 𝑏 𝑒 𝑖 + 𝑏 𝑓 𝑖 2 + 𝑏 𝑔 𝑖 𝑗 + 𝑏 h 𝑖 𝑘 + 𝑐 𝑒 𝑗 + 𝑐 𝑓 𝑗 𝑖 + 𝑐 𝑔 𝑗 2 + 𝑐 h 𝑗 𝑘 + 𝑑 𝑒 𝑘 + 𝑑 𝑓 𝑘 𝑖 + 𝑑 𝑔 𝑘 𝑗 + 𝑑 h 𝑘 2 \begin{aligned} q_1q_2&=(a+bi+cj+dk)(e+fi+gj+hk)\\ &=ae+afi+agj+ahk+𝑏𝑒𝑖+ 𝑏𝑓𝑖^2\\&+𝑏𝑔𝑖𝑗+𝑏ℎ𝑖𝑘+𝑐𝑒𝑗 + 𝑐𝑓𝑗𝑖 +𝑐𝑔𝑗2 \\&+ 𝑐ℎ𝑗𝑘+𝑑𝑒𝑘 + 𝑑𝑓𝑘𝑖 + 𝑑𝑔𝑘𝑗 + 𝑑ℎ𝑘2 \end{aligned} q1q2=(a+bi+cj+dk)(e+fi+gj+hk)=ae+afi+agj+ahk+bei+bfi2+bgij+bhik+cej+cfji+cgj2+chjk+dek+dfki+dgkj+dhk2
化简得:
q 1 q 2 = ( 𝑎 𝑒 − 𝑏 𝑓 − 𝑐 𝑔 − 𝑑 h ) + ( 𝑏 𝑒 + 𝑎 𝑓 − 𝑑 𝑔 + 𝑐 h ) 𝑖 + ( 𝑐 𝑒 + 𝑑 𝑓 + 𝑎 𝑔 − 𝑏 h ) 𝑗 + ( 𝑑 𝑒 − 𝑐 𝑓 + 𝑏 𝑔 + 𝑎 h ) k \begin{aligned} q_1q_2=&(𝑎𝑒 − 𝑏 𝑓 − 𝑐𝑔 − 𝑑ℎ)+\\ &(𝑏𝑒 + 𝑎 𝑓 − 𝑑𝑔 + 𝑐ℎ)𝑖+\\ &(𝑐𝑒 + 𝑑 𝑓 + 𝑎𝑔 − 𝑏ℎ)𝑗+\\ &(𝑑𝑒 − 𝑐 𝑓 + 𝑏𝑔 + 𝑎ℎ)k\\ \end{aligned} q1q2=(ae−bf−cg−dh)+(be+af−dg+ch)i+(ce+df+ag−bh)j+(de−cf+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_1q_2=\begin{bmatrix} a & -b & -c & -d\\ b & a & -d & c\\ c & d & a & -b\\ d & -c & b & a/ \end{bmatrix}\begin{bmatrix} e \\ f\\ g\\ h \end{bmatrix} q1q2= abcd−bad−c−c−dab−dc−ba/ efgh
由于四元数不满足乘法交换律,故 q 2 q 1 q_2q_1 q2q1如果将 q 1 q_1 q1表示成矩阵的形式为不同的形式:
q 2 q 1 = [ a − b − c − d b a d − c c − d a b d c − b a ] [ e f g h ] q_2q_1=\begin{bmatrix} a & -b & -c & -d\\ b & a & d & -c\\ c & -d & a & b\\ d & c & -b & a \end{bmatrix}\begin{bmatrix} e\\ f\\ g\\ h \end{bmatrix} q2q1= abcd−ba−dc−cda−b−d−cba efgh -
Graßmann积
假设 q 1 = [ a , b , c , d ] T = [ a v ] q_1=[a,b,c,d]^T=\begin{bmatrix} a \\ \mathbf{v} \end{bmatrix} q1=[a,b,c,d]T=[av], q 2 = [ e , f , g , h ] T = [ e u ] q_2=[e,f,g,h]^T=\begin{bmatrix} e \\ \mathbf{u} \end{bmatrix} q2=[e,f,g,h]T=[eu],
那么根据上面四元数的乘积可以得出:
q 1 q 2 = [ a e − v ⋅ u a u + e v + v × u ] q_1q_2=\begin{bmatrix} ae- \mathbf{v}\cdot\mathbf{u} \\ a\mathbf{u}+e\mathbf{v}+\mathbf{v}\times\mathbf{u} \end{bmatrix} q1q2=[ae−v⋅uau+ev+v×u]
其中:
v ⋅ u = b f + c g + d h v × u = ( 𝑐 h − 𝑑 𝑔 ) i − ( 𝑏 h − 𝑑 𝑓 ) j + ( 𝑏 𝑔 − 𝑐 𝑓 ) k \begin{aligned} \mathbf{v}\cdot\mathbf{u}&=bf+cg+dh \\ \mathbf{v}\times\mathbf{u}&= (𝑐 ℎ − 𝑑𝑔)i − (𝑏 ℎ − 𝑑𝑓 )j + (𝑏 𝑔 − 𝑐 𝑓 )k \end{aligned} v⋅uv×u=bf+cg+dh=(ch−dg)i−(bh−df)j+(bg−cf)k -
纯四元数乘积
v u = [ 0 − v ⋅ u 0 + v × u ] = [ − v ⋅ u v × u ] vu=\begin{bmatrix} 0-\mathbf{v}\cdot\mathbf{u}\\ 0+\mathbf{v}\times\mathbf{u} \end{bmatrix}=\begin{bmatrix} -\mathbf{v}\cdot\mathbf{u}\\ \mathbf{v}\times\mathbf{u} \end{bmatrix} vu=[0−v⋅u0+v×u]=[−v⋅uv×u]
-
共轭和逆
共轭:q = a + b i + c j + d k q ∗ = a − b i − c j − d k q = [ s v ] q ∗ = [ s − v ] q=a+bi+cj+dk \\ q^*=a-bi-cj-dk\\ q=\begin{bmatrix} s \\ \mathbf{v} \end{bmatrix}\\ q^*=\begin{bmatrix} s \\ -\mathbf{v} \end{bmatrix} q=a+bi+cj+dkq∗=a−bi−cj−dkq=[sv]q∗=[s−v]
共轭四元数有个重要的性质:
q q ∗ = [ s 2 + v ⋅ v 0 ] qq^*=\begin{bmatrix} s^2 + \mathbf{v}\cdot\mathbf{v} \\ 0 \end{bmatrix} qq∗=[s2+v⋅v0]
也就是说结果为一个实数: q q ∗ = s 2 + x 2 + y 2 + z 2 = ∣ ∣ q ∣ ∣ 2 qq^*=s^2+x^2+y^2+z^2=||q||^2 qq∗=s2+x2+y2+z2=∣∣q∣∣2
同理可以得到: q ∗ q = s 2 + x 2 + y 2 + z 2 = ∣ ∣ q ∣ ∣ 2 = q q ∗ q^*q=s^2+x^2+y^2+z^2=||q||^2=qq^* q∗q=s2+x2+y2+z2=∣∣q∣∣2=qq∗也就是说这个特殊的乘法是遵守交换律的。而且可以通过这个性质获得逆。
逆:
q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q^{-1}=\frac{q^*}{||q||^2} q−1=∣∣q∣∣2q∗
如果 ∣ ∣ q ∣ ∣ 2 ||q||^2 ∣∣q∣∣2等于1,那么: q − 1 = q ∗ q^{-1}=q^* q−1=q∗
-
进行推导前,先说出四元数旋转的结论:
任何向量 v v v沿着以单位向量定义的旋转轴 u u u旋转 θ \theta θ度之后的 v ′ v^{'} v′可以使用四元数乘法来获得。令 v = [ 0 v ] v=\begin{bmatrix} 0 \\ \mathbf{v} \end{bmatrix} v=[0v], q = [ c o s ( 1 2 θ ) s i n ( 1 2 θ ) u ] q=\begin{bmatrix} cos(\frac{1}{2}\theta) \\ sin(\frac{1}{2}\theta)\mathbf{u} \end{bmatrix} q=[cos(21θ)sin(21θ)u],那么:
v ′ = q v q ∗ = q v q − 1 v^{'}=qvq*=qvq^{-1} v′=qvq∗=qvq−1
注意这里仅仅使用向量形式表示四元数而已,下面的运算是四元数的运算,不是所谓的向量运算。接下来进行推导:
首先 v = [ 0 v ] v=\begin{bmatrix} 0 \\ \mathbf{v} \end{bmatrix} v=[0v], u = [ 0 u ] u=\begin{bmatrix} 0 \\ \mathbf{u} \end{bmatrix} u=[0u], v = v ⊥ + v ∣ ∣ = [ 0 v ⊥ ] + [ 0 v ∣ ∣ ] v=v_{\perp}+v_{||}=\begin{bmatrix} 0 \\ \mathbf{v}_\perp \end{bmatrix}+\begin{bmatrix} 0 \\ \mathbf{v}_{||} \end{bmatrix} v=v⊥+v∣∣=[0v⊥]+[0v∣∣]第一步对 v ∣ ∣ v_{||} v∣∣旋转:
v ∣ ∣ v_{||} v∣∣旋转不变。第二步对 v ⊥ v_{\perp} v⊥旋转:
在前面轴角式的推到中,我们得到:
v ⊥ ′ = c o s θ v ⊥ + s i n θ ( u × v ⊥ ) \mathbf{v}^{'}_{\bot}=cos\theta\mathbf{v}_{\bot}+sin\theta(\mathbf{u}\times\mathbf{v}_{\bot}) v⊥′=cosθv⊥+sinθ(u×v⊥)
由于:
u v ⊥ = [ − u ⋅ v ⊥ u × v ⊥ ] uv_{\bot}=\begin{bmatrix} -\mathbf{u}\cdot\mathbf{v}_{\bot}\\ \mathbf{u}\times\mathbf{v}_{\bot} \end{bmatrix} uv⊥=[−u⋅v⊥u×v⊥]
因为 v ⊥ \mathbf{v}_{\bot} v⊥正交与 u \mathbf{u} u,所以上述公式可以变为:u v ⊥ = [ 0 u × v ⊥ ] = u × v ⊥ uv_{\bot}=\begin{bmatrix} 0\\ \mathbf{u}\times\mathbf{v}_{\bot} \end{bmatrix}=\mathbf{u}\times\mathbf{v}_{\bot} uv⊥=[0u×v⊥]=u×v⊥
所以:
v ⊥ ′ = c o s θ v ⊥ + s i n θ ( u v ⊥ ) = ( c o s θ + u s i n θ ) v ⊥ {v}^{'}_{\bot}=cos\theta{v}_{\bot}+sin\theta(uv_{\bot})=(cos\theta+usin\theta)v_{\bot} v⊥′=cosθv⊥+sinθ(uv⊥)=(cosθ+usinθ)v⊥令 q = c o s θ + u s i n θ q=cos\theta+usin\theta q=cosθ+usinθ,上式变为:
v ′ = q v ⊥ v^{'}=qv_{\bot} v′=qv⊥如果我们能构造一个四元数 q q q,那么我们就能完成这个旋转了。
q = c o s θ + u s i n θ = c o s θ + i u x s i n θ + j u y s i n θ + k u z s i n θ q=cos\theta+usin\theta=cos\theta+iu_{x}sin\theta+ju_{y}sin\theta+ku_{z}sin\theta q=cosθ+usinθ=cosθ+iuxsinθ+juysinθ+kuzsinθ
如果 u \mathbf{u} u的模长为1,那么构造的q为单位四元数,它所代表的变换并不会对原向量进行缩放,是一个纯旋转。第三步获得 v ′ v^{'} v′的结果:
v ′ = v ∣ ∣ ′ + v ⊥ ′ = v ∣ ∣ + q v ⊥ v^{'}=v^{'}_{||}+v^{'}_{\bot}=v_{||}+qv_{\bot} v′=v∣∣′+v⊥′=v∣∣+qv⊥
其中 q = [ c o s θ u s i n θ ] q=\begin{bmatrix} cos\theta\\ usin\theta \end{bmatrix} q=[cosθusinθ]第四步将化简为最终结果:
因为:
v ′ = v ∣ ∣ + q v ⊥ = 1 v ∣ ∣ + q v ⊥ = p p − 1 v ∣ ∣ + p p v ⊥ v^{'}=v_{||}+qv_{\bot}=1v_{||}+qv_{\bot}=pp^{-1}v_{||}+ppv_{\bot} v′=v∣∣+qv⊥=1v∣∣+qv⊥=pp−1v∣∣+ppv⊥
其中 q = p 2 q=p^2 q=p2,则 p = [ c o s ( 1 2 θ ) u s i n ( 1 2 θ ) ] p=\begin{bmatrix}cos(\frac{1}{2}\theta) \\ usin(\frac{1}{2}\theta) \end{bmatrix} p=[cos(21θ)usin(21θ)]
因为 u u u为单位3维向量,则 p p p为单位四元数,故可得:
p − 1 = p ∗ p^{-1}=p^{*} p−1=p∗将上式带入之前的等式可得:
v ′ = p p − 1 v ∣ ∣ + p p v ⊥ = p p ∗ v ∣ ∣ + p p v ⊥ v^{'}=pp^{-1}v_{||}+ppv_{\bot}=pp^{*}v_{||}+ppv_{\bot} v′=pp−1v∣∣+ppv⊥=pp∗v∣∣+ppv⊥在化简上述公式之前,我们还需要知道两个性质:
-
假设 v ∣ ∣ = [ 0 v ] v_{||}=\begin{bmatrix}0 \\ \mathbf{v} \end{bmatrix} v∣∣=[0v]是一个纯四元数,而 q = [ α β u ] q=\begin{bmatrix}\alpha \\ \beta\mathbf{u} \end{bmatrix} q=[αβu],其中 u u u是一个单位向量,𝛼, 𝛽 ∈ R.在这种条件下,如果 v ∣ ∣ v_{||} v∣∣ 平行于 u u u,那么 𝑞 𝑣 ∣ ∣ = 𝑣 ∣ ∣ 𝑞 𝑞𝑣_{||} = 𝑣_{||} 𝑞 qv∣∣=v∣∣q
-
假设 v ⊥ = [ 0 v ] v_{\bot}=\begin{bmatrix}0 \\ \mathbf{v} \end{bmatrix} v⊥=[0v]是一个纯四元数,而 q = [ α β u ] q=\begin{bmatrix}\alpha \\ \beta\mathbf{u} \end{bmatrix} q=[αβu],其中 u u u是一个单位向量,𝛼, 𝛽 ∈ R.在这种条件下,如果 v ⊥ v_{\bot} v⊥正交于 u u u,那么 𝑞 𝑣 ∣ ∣ = 𝑣 ∣ ∣ 𝑞 ∗ 𝑞𝑣_{||} = 𝑣_{||}𝑞^{*} qv∣∣=v∣∣q∗
通过上述得到的引理,我们可以将 v ′ = p p ∗ v ∣ ∣ + p p v ⊥ v^{'}=pp^{*}v_{||}+ppv_{\bot} v′=pp∗v∣∣+ppv⊥化简为:
v ′ = p p ∗ v ∣ ∣ + p p v ⊥ = p v ∣ ∣ p ∗ + p v ⊥ p ∗ = p ( v ∣ ∣ + v ⊥ ) p ∗ = p v p ∗ v^{'}=pp^{*}v_{||}+ppv_{\bot}=pv_{||}p^{*}+pv_{\bot}p^{*}=p(v_{||}+v_{\bot})p^{*}=pvp^{*} v′=pp∗v∣∣+ppv⊥=pv∣∣p∗+pv⊥p∗=p(v∣∣+v⊥)p∗=pvp∗
其中 p = [ c o s ( 1 2 θ ) u s i n ( 1 2 θ ) ] p=\begin{bmatrix}cos(\frac{1}{2}\theta) \\ usin(\frac{1}{2}\theta) \end{bmatrix} p=[cos(21θ)usin(21θ)], u u u为单位3维向量。推导完成。
如果我们想要获得角度,只需要:
θ 2 = a r c c o s ( a ) \frac{\theta}{2}=arccos(a) 2θ=arccos(a)
如果要求单位向量:
u = b s i n ( a r c c o s ( a ) ) \mathbf{u}=\frac{\mathbf{b}}{sin(arccos(a))} u=sin(arccos(a))b -