这一章开始有一些数学公式上的推导和定义的理解,但是还不算太难😀
三维空间刚体运动
旋转矩阵
1.点,向量和坐标系
-
点是指空间中的基本元素,向量是指某点指向某点的有方向的箭头,而点和向量都只有在坐标系中讨论才有意义。
-
复习一下线代的知识,关于向量的运算!
-
基底:不共线的向量e 1 _1 1,e 2 _2 2叫做这一平面内所有向量的一组基底,平面上任何向量(包括零向量)都可以用基底表示。
空间中也是如此,任意向量a在空间的一组基(e 1 _1 1,e 2 _2 2,e 3 _3 3)有这样一个坐标: a = [ e 1 e 2 e 3 ] [ a 1 a 2 a 3 ] = a 1 e 1 + a 2 e 2 + a 3 e 3 a = \begin{bmatrix}e_1&e_2&e_3\end{bmatrix} \begin{bmatrix}a_1\\a_2\\a_3\end{bmatrix} = a_1e_1 + a_2e_2 + a_3e_3 a=[e1e2e3]⎣⎡a1a2a3⎦⎤=a1e1+a2e2+a3e3 -
坐标系:右手系为伸开右手,大拇指是X轴正方向,食指是Y轴正方向,其他三个手指是Z轴正方向,左手系同理。
-
向量内积:内积可理解为第一个向量投影到第二个向量上(无所谓向量的顺序),可以表示为 a ⋅ b = a T b = ∑ i = 1 3 a i b i = ∣ a ∣ ∣ b ∣ c o s < a , b > a , b ∈ R 3 a\cdot b = a^Tb = \sum_{i=1}^3 a_ib_i = |a||b|cos<a,b>\\a,b \in R^3 a⋅b=aTb=i=1∑3aibi=∣a∣∣b∣cos<a,b>a,b∈R3
-
向量外积: a a a和 b b b的外积结果是一个法向量,垂直于 a a a和 b b b构成的平面。
还有一个用途是通过两个向量的外积,生成第三个垂直于 a a a, b b b的法向量,从而构建X、Y、Z坐标系。
外积可以表示为 a × b = [ e 1 e 2 e 3 a 1 a 2 a 3 b 1 b 2 b 3 ] = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b = d e f a a\times b = \begin{bmatrix}e_1&e_2&e_3 \\ a_1&a_2&a_3 \\ b_1&b_2&b_3 \end{bmatrix} = \begin{bmatrix} a_2b_3 - a_3b_2 \\ a_3b_1-a_1b_3 \\ a_1b_2 - a_2b_1 \end{bmatrix} = \begin{bmatrix}0&-a_3&a_2 \\ a_3&0&-a_1 \\ -a_2&a_1&0\end{bmatrix}b\stackrel{def}{=} a a×b=⎣⎡e1a1b1e2a2b2e3a3b3⎦⎤=⎣⎡a2b3−a3b2a3b1−a1b3a1b2−a2b1⎦⎤=⎣⎡0a3−a2−a30a1a2−a10⎦⎤b=defa^ b b b
式中^符号,可以理解为反对称符号,将向量a写成一个矩阵,这样两个向量的乘法就变成了矩阵和向量的乘法,把它变成线性运算。
-
2.坐标系间的欧式变换
- 欧式变换:由两个坐标系间的旋转和平移运动组成。
- 描述坐标系间的运动:旋转矩阵和平移矩阵
- 书中关于旋转矩阵的推导:用一个正交正交基
(
e
1
,
e
2
,
e
3
)
(e_1,e_2,e_3)
(e1,e2,e3)很形象的代表一个三维坐标系,现在这个坐标系动了一下,变成
(
e
1
′
,
e
2
′
,
e
3
′
)
(e_1',e_2',e_3')
(e1′,e2′,e3′),而曾经在坐标系中有一个向量小a,自身在坐标系中的位置也随着坐标系在变化,前后变化是
[
a
1
a
2
a
3
]
T
和
[
a
1
′
a
2
′
a
3
′
]
T
\begin{bmatrix} a_1&a_2&a_3\end{bmatrix}^T和\begin{bmatrix} a_1'&a_2'&a_3'\end{bmatrix}^T
[a1a2a3]T和[a1′a2′a3′]T。
接下来的推导其实很简单,正交基和这个向量在坐标系的位置相乘就等于向量本身,所以可以得出
[ e 1 e 2 e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ e 2 ′ e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] \begin{bmatrix} e_1&e_2&e_3\end{bmatrix} \begin{bmatrix} a_1\\a_2\\a_3\end{bmatrix} = \begin{bmatrix} e_1'&e_2'&e_3'\end{bmatrix} \begin{bmatrix} a_1'\\a_2'\\a_3'\end{bmatrix} [e1e2e3]⎣⎡a1a2a3⎦⎤=[e1′e2′e3′]⎣⎡a1′a2′a3′⎦⎤
将等式简化,可以两边同时左乘 [ e 1 e 2 e 3 ] T \begin{bmatrix} e_1&e_2&e_3\end{bmatrix}^T [e1e2e3]T,这样左边的系数就会变为1,整个式子会变成这个样子
[ a 1 a 2 a 3 ] = [ e 1 T e 1 ′ e 1 T e 2 ′ e 1 T e 3 ′ e 2 T e 1 ′ e 2 T e 2 ′ e 2 T e 3 ′ e 3 T e 1 ′ e 3 T e 2 ′ e 3 T e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] = d e f R a ′ \begin{bmatrix} a_1\\a_2\\a_3\end{bmatrix} = \begin{bmatrix} e_1^Te_1'&e_1^Te_2'&e_1^Te_3'\\e_2^Te_1'&e_2^Te_2'&e_2^Te_3'\\e_3^Te_1'&e_3^Te_2'&e_3^Te_3'\end{bmatrix} \begin{bmatrix} a_1'\\a_2'\\a_3'\end{bmatrix}\stackrel{def}{=}Ra' ⎣⎡a1a2a3⎦⎤=⎣⎡e1Te1′e2Te1′e3Te1′e1Te2′e2Te2′e3Te2′e1Te3′e2Te3′e3Te3′⎦⎤⎣⎡a1′a2′a3′⎦⎤=defRa′
是的,中间那一大块就是旋转矩阵了。
看上去比较复杂难懂,但其实旋转矩阵就是绕三个轴的基本旋转的序列复合。
- 平移矩阵
同理,平移矩阵也是在三个轴方向不同移动的复合。坐标系1到坐标系2的平移移动中,向量a在两个坐标系下的坐标为 a 1 , a 2 a_1,a_2 a1,a2,它们的关系是:
a 1 = R 12 a 2 + t 12 a_1 = R_{12}a_2+t_{12} a1=R12a2+t12
其中 R 12 R_{12} R12指坐标系2的向量变换到坐标系1中, t 12 t_{12} t12指从坐标系1到坐标系2的平移向量。
- 书中关于旋转矩阵的推导:用一个正交正交基
(
e
1
,
e
2
,
e
3
)
(e_1,e_2,e_3)
(e1,e2,e3)很形象的代表一个三维坐标系,现在这个坐标系动了一下,变成
(
e
1
′
,
e
2
′
,
e
3
′
)
(e_1',e_2',e_3')
(e1′,e2′,e3′),而曾经在坐标系中有一个向量小a,自身在坐标系中的位置也随着坐标系在变化,前后变化是
[
a
1
a
2
a
3
]
T
和
[
a
1
′
a
2
′
a
3
′
]
T
\begin{bmatrix} a_1&a_2&a_3\end{bmatrix}^T和\begin{bmatrix} a_1'&a_2'&a_3'\end{bmatrix}^T
[a1a2a3]T和[a1′a2′a3′]T。
3.变换矩阵与齐次坐标
- 变换矩阵:当我们拥有旋转矩阵和平移矩阵后,人们更喜欢用一个统一简单的形式来描述欧式变换,这就诞生了变换矩阵: T = [ R t 0 T 1 ] T =\begin{bmatrix}R&t\\0^T&1 \end{bmatrix} T=[R0Tt1]
- 齐次坐标:当旋转矩阵和平移矩阵并排放在一起形成一个4X3的矩阵时,一切都显得那么不和谐,所以我们在三维向量底部添加1,使之变为4X4的向量,称为齐次坐标。
旋转向量和欧拉角
用几何的方式来描述旋转
- 旋转向量:是一个三维向量,其方向与旋转轴一致,长度等于旋转角。相比起旋转矩阵来说可以更紧凑简洁的描述旋转信息。
旋转向量到旋转矩阵的转换——由罗德里格斯公式完成。
R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ^ R =cos{\theta}I+(1-cos{\theta})nn^T + sin{\theta}n\hat{} R=cosθI+(1−cosθ)nnT+sinθn^
转角 θ = arccos t r ( R ) − 1 2 {\theta} = \arccos {tr(R) - 1\over2} θ=arccos2tr(R)−1,转轴 R n = n Rn = n Rn=n,因此,转轴n是矩阵R特征值对应的特征向量。 - 欧拉角:假设一架飞机在天上飞行,飞机正前方为X轴,飞机右侧为Y轴,正上方为Z轴,那么可以把任意的旋转分解为这三个轴上的转角。
- 绕飞机的Z轴旋转,得到偏航角yaw;
- 绕旋转后的Y轴旋转,得到俯仰角pitch;
- 绕旋转后的X轴旋转,得到滚转角roll。
用这样三个分离的转角欧拉角,可以很形象的看到旋转的变化,不像矩阵那样难懂。
- 万向锁:选择±90°作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。
对万向锁的理解:在网上有解释比较详细,是以手机为例,长边为X轴,短边为Y轴,屏幕方向为Z轴,假如绕Y轴不是90度,那么手机可以任意旋转;假如绕Y轴旋转了90度,接下来的旋转不管是绕X轴还是绕Z轴,Z轴会永远平行与桌面。
四元数
人们喜欢紧凑,精巧的表达旋转的方式,同时既不像旋转矩阵那样有兀余性,又不像欧拉角那样有奇异性,这就诞生了四元数,其在计算机图形学,物理学上有大量的应用。
- 什么是四元数:四元数是数学家Hamilton找到的一种扩展的复数,形如
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
q = q_0+q_1i+q_2j+q_3k
q=q0+q1i+q2j+q3k(其中,
i
2
=
k
2
=
j
2
=
i
j
k
=
−
1
i^2 = k^2 = j^2 = ijk = -1
i2=k2=j2=ijk=−1),四元数也可以写成标量和向量的有序对形式,即实部与虚部分开,并用一个三维的向量表示虚部。
q = [ s , v ] ( v = [ x y z ] s , x , y , z ∈ R ) q = [s,v] \space (v = \begin{bmatrix} x\\y\\z \end {bmatrix} s,x,y,z \in R) q=[s,v] (v=⎣⎡xyz⎦⎤s,x,y,z∈R) - 四元数的简单理解:复数的运算可以形象的表示在二维中向量的运动,两个复数相乘实际上是旋转与缩放的组合。到三维空间中,也有相应的四元数可以表示向量的旋转。
- 四元数表示旋转:
定义点p(x,y,z),点p用虚四元数表示为 p = [ 0 , x , y , z ] T = [ 0 , v ] T p = \begin{bmatrix}0,x,y,z \end {bmatrix}^T = \begin{bmatrix}0,v \end {bmatrix}^T p=[0,x,y,z]T=[0,v]T,这样可以看作四元数三个虚部与空间中的三个轴对应,旋转后的点 p ′ = q p q − 1 p' = qpq^{-1} p′=qpq−1,最后把 p ′ p' p′的虚部取出,即为旋转之后点的坐标。- 四元数到旋转矩阵的变换关系:设
q
=
[
s
,
v
]
T
q = [s,v]^T
q=[s,v]T
则有 R = v v T = s 2 I + 2 s v ^ + ( v ^ ) 2 R =vv^T = s^2I+2sv\hat{} + (v\hat{}\space)^2 R=vvT=s2I+2sv^+(v^ )2 - 四元数到旋转向量的转换公式: { θ = 2 a r c c o s q 0 [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / s i n θ 2 \begin{cases} \theta = 2arccosq_0\\ \begin{bmatrix} n_x,n_y,n_z \end{bmatrix} ^T = \begin{bmatrix} q_1,q_2,q_3 \end{bmatrix} ^T /sin {\theta\over 2 }\end{cases} {θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]T/sin2θ
- 四元数到旋转矩阵的变换关系:设
q
=
[
s
,
v
]
T
q = [s,v]^T
q=[s,v]T
相似,仿射,射影变换
- 相似变换:允许物体均匀缩放。
T s = [ s R t 0 T 1 ] T_s = \begin{bmatrix} sR&t\\0^T&1 \end{bmatrix} Ts=[sR0Tt1] - 仿射变换:对物体平移+线性变换,平行关系,比例关系都不变。
T A = [ A t 0 T 1 ] T_A = \begin{bmatrix} A&t\\0^T&1 \end{bmatrix} TA=[A0Tt1] - 射影变换(透视变换),像油画里的透视关系一样,满足近大远小。
T P = [ A t a T v ] T_P = \begin{bmatrix} A&t\\a^T&v \end{bmatrix} TP=[AaTtv]