摘要:介绍如何描述刚体在三维空间中的运动
文章目录
1. 旋转矩阵
1.1 点、向量和坐标系
向量
a
a
a 在三维空间的坐标表示为:
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=[e_{1},e_{2},e_{3}]\begin{bmatrix}a_{1}\\a_{2}\\a_{3}\end{bmatrix}=a_1e_1+a_2e_2+a_3e_3
a=[e1,e2,e3]
a1a2a3
=a1e1+a2e2+a3e3
该空间的基为
(
e
1
,
e
2
,
e
3
)
(e_1,e_2,e_3)
(e1,e2,e3),这里的
(
a
1
,
a
2
,
a
3
)
T
(a_1,a_2,a_3)^T
(a1,a2,a3)T为向量
a
a
a在此基下的坐标。
坐标的运算方式为:
- 加减法:各自坐标相加
- 内积(点乘):
a ⋅ b = a T b = ∑ i = 1 3 a i × b i = ∣ a ∣ ∣ b ∣ cos < a , b > a\cdot b=a^{T}b=\sum_{i=1}^{3}a_{i}\times b_{i}=|a||b|\cos<a,b> a⋅b=aTb=∑i=13ai×bi=∣a∣∣b∣cos<a,b>, 且 a ⋅ b = b ⋅ a a\cdot b=b\cdot a a⋅b=b⋅a - 外积(叉乘):
即
a
×
b
=
∣
a
∣
∣
b
∣
sin
<
a
,
b
>
a\times b=|a||b|\sin<a,b>
a×b=∣a∣∣b∣sin<a,b>,方向垂直于向量
a
a
a、
b
b
b组成的平面,遵循右手定则。
性质:
a
×
b
=
−
b
×
a
a\times b=-b\times a
a×b=−b×a,记为下列公式,这是一个反对称矩阵,满足
A
T
=
−
A
A^T=-A
AT=−A,
∧
\wedge
∧记作反对称符号。
a
∧
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
a^{\wedge}= \begin{bmatrix}0&-a_3&a_2\\a_3&0&-a_1\\-a_2&a_1&0\end{bmatrix}
a∧=
0a3−a2−a30a1a2−a10
1.2 坐标系间的欧氏变换
(1)
刚体运动:两个坐标系之间的运动由一个旋转加上一个平移组成
对于同一个向量
p
p
p,它在世界坐标系下的坐标
p
w
p_w
pw和在相机坐标系下的坐标
p
c
p_c
pc是不同的。这个变换关系由变换矩阵
T
T
T来描述
(2)
对于坐标系旋转变换,假设原坐标系和现坐标系单位正交基底分别为
[
e
1
,
e
2
,
e
3
]
[e_1,e_2,e_3]
[e1,e2,e3] 和
[
e
1
′
,
e
2
′
,
e
3
′
]
[e_1^{\prime},e_2^{\prime},e_3^{\prime}]
[e1′,e2′,e3′] , 坐标分别为
[
a
1
,
a
2
,
a
3
]
T
[a_1,a_2,a_3]^T
[a1,a2,a3]T 和
[
a
1
′
,
a
2
′
,
a
3
′
]
T
[a_1^{\prime},a_2^{\prime},a_3^{\prime}]^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
′
]
\left.[\boldsymbol{e}_1,\boldsymbol{e}_2,\boldsymbol{e}_3]\left[\begin{array}{c}a_1\\a_2\\a_3\end{array}\right.\right]=[\boldsymbol{e}_1^{\prime},\boldsymbol{e}_2^{\prime},\boldsymbol{e}_3^{\prime}]\left[\begin{array}{c}a_1^{\prime}\\a_2^{\prime}\\a_3^{\prime}\end{array}\right]
[e1,e2,e3]
a1a2a3
=[e1′,e2′,e3′]
a1′a2′a3′
将上式两端分别左乘
[
e
1
T
e
2
T
e
3
T
]
\begin{bmatrix}e^T_1\\e^T_2\\e^T_3\end{bmatrix}
e1Te2Te3T
得到,
[
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
′
\left.\left[\begin{array}{c}a_1\\a_2\\a_3\end{array}\right.\right]=\left[\begin{array}{ccc}\boldsymbol{e}_1^T\boldsymbol{e}_1^{\prime}&\boldsymbol{e}_1^T\boldsymbol{e}_2^{\prime}&\boldsymbol{e}_1^T\boldsymbol{e}_3^{\prime}\\\boldsymbol{e}_2^T\boldsymbol{e}_1^{\prime}&\boldsymbol{e}_2^T\boldsymbol{e}_2^{\prime}&\boldsymbol{e}_2^T\boldsymbol{e}_3^{\prime}\\\boldsymbol{e}_3^T\boldsymbol{e}_1^{\prime}&\boldsymbol{e}_3^T\boldsymbol{e}_2^{\prime}&\boldsymbol{e}_3^T\boldsymbol{e}_3^{\prime}\end{array}\right]\left[\begin{array}{c}a_1^{\prime}\\a_2^{\prime}\\a_3^{\prime}\end{array}\right]\overset{\mathrm{def}}{\operatorname{=}}\boldsymbol{R}\boldsymbol{a}^{\prime}
a1a2a3
=
e1Te1′e2Te1′e3Te1′e1Te2′e2Te2′e3Te2′e1Te3′e2Te3′e3Te3′
a1′a2′a3′
=defRa′
矩阵
R
\boldsymbol{R}
R即为旋转矩阵 (Rotation Matrix)
性质:
将满足此性质的矩阵集合定义为特殊正交群:
S
O
(
n
)
=
{
R
∈
R
n
×
n
∣
R
R
T
=
I
,
det
(
R
)
=
1
}
\mathrm{SO}(n)=\left\{\boldsymbol{R}\in\mathbb{R}^{n\times n}\mid\boldsymbol{R}\boldsymbol{R}^\mathrm{T}=\boldsymbol{I},\det(\boldsymbol{R})=1\right\}
SO(n)={R∈Rn×n∣RRT=I,det(R)=1}
(3)旋转加平移
可以将三维空间的刚体运动分解为平移(平移向量 t t t)以及旋转运动, a 1 = R 12 a 2 + t 12 a_1=\boldsymbol{R}_{12}\boldsymbol{a}_2+\boldsymbol{t}_{12} a1=R12a2+t12
这里的 R 12 \boldsymbol{R}_{12} R12 是指“把坐标系 2 的向量变换到坐标系 1” 中,下标从右往左读。
1.3 变换矩阵与齐次坐标
多次变换之后,引用齐次坐标和变换矩阵
a
a
a到
c
c
c的变换为:
a
′
=
R
a
+
t
→
[
a
′
1
]
=
[
R
t
0
T
1
]
[
a
1
]
=
d
e
f
T
[
a
1
]
a^{\prime}=Ra+t \to \begin{bmatrix}a^{\prime}\\\\1\end{bmatrix}=\begin{bmatrix}R&t\\\\\mathbf{0}^\mathrm{T}&1\end{bmatrix}\begin{bmatrix}a\\\\1\end{bmatrix}\overset{\mathrm{def}}{\operatorname*{=}}T\begin{bmatrix}a\\\\1\end{bmatrix}
a′=Ra+t→
a′1
=
R0Tt1
a1
=defT
a1
三维向量尾部添加1,称为齐次坐标。
T
\boldsymbol{T}
T为变换矩阵(Transform Matrix),旋转与平移都在这个矩阵中,左上角为旋转矩阵,右侧为平移向量,左下角为
0
0
0 向量,右下角为
1
1
1。这种矩阵又称为特殊欧氏群(Special Euclidean Group):
S
E
(
3
)
=
{
T
=
[
R
t
0
T
1
]
∈
R
4
×
4
∣
R
∈
S
O
(
3
)
,
t
∈
R
3
}
\left.\mathrm{SE}(3)=\left\{\boldsymbol{T}=\begin{bmatrix}\boldsymbol{R}&\boldsymbol{t}\\\boldsymbol{0}^\mathrm{T}&1\end{bmatrix}\right.\in\mathbb{R}^{4\times4}|\boldsymbol{R}\in\mathrm{SO}(3),\boldsymbol{t}\in\mathbb{R}^3\right\}
SE(3)={T=[R0Tt1]∈R4×4∣R∈SO(3),t∈R3}
其逆方向变换为:
T
−
1
=
[
R
T
−
R
T
t
0
T
1
]
\boldsymbol{T}^{-1}=\begin{bmatrix}\boldsymbol{R}^\mathrm{T}&-\boldsymbol{R}^\mathrm{T}\boldsymbol{t}\\\mathbf{0}^\mathrm{T}&1\end{bmatrix}
T−1=[RT0T−RTt1]
齐次坐标简介:
2. 旋转向量与欧拉角
2.1 旋转向量
三维空间中刚体运动有六个自由度 (旋转和平移各三个)。显然无论是上述的旋转矩阵 (9个量)还是变换矩阵 (16个量),都有很大的冗余;并且,矩阵中的元素相互关联,这不利于后续的非线性优化计算。因此我们希望找到一种更为紧凑的表达方式。
任意旋转都可以同一个旋转轴和一个旋转角来刻画,
则使用旋转向量来表达:即向量方向为旋转轴,其模长为旋转角。
罗德里格斯公式描述了旋转矩阵和旋转向量之间的关系:
R
=
cos
(
θ
I
)
+
(
1
−
cos
θ
)
n
n
T
+
sin
(
θ
n
∧
)
\boldsymbol{R}=\cos(\theta\boldsymbol{I})+(1-\cos\theta)\boldsymbol{n}\boldsymbol{n}^T+\sin(\theta\boldsymbol{n}^\wedge)
R=cos(θI)+(1−cosθ)nnT+sin(θn∧)
反之:
θ
=
arccos
t
r
(
R
)
−
1
2
\theta=\arccos\frac{\mathfrak{tr}(\boldsymbol{R})-1}2
θ=arccos2tr(R)−1
其中,
t
r
(
R
)
tr(\boldsymbol{R})
tr(R)表示求迹,即矩阵主对角线元素之和。
由于旋转轴在旋转过程中是不动的,则有
R
n
=
n
\boldsymbol{Rn}=\boldsymbol{n}
Rn=n
这说明转轴
n
\boldsymbol{n}
n是矩阵
R
\boldsymbol{R}
R特征值为 1 对应的特征向量,由此可以求出向量
n
\boldsymbol{n}
n的值。
2.2 欧拉角
欧拉角直观的将旋转分解为X\Y\Z三个轴上的转动,常用和顺序为ZYX旋转,等价于“偏航-俯仰-滚转”(yaw-pitch-roll):
- 绕物体的Z轴旋转,得到偏航角yaw
- 绕旋转之后的Y轴旋转,得到俯仰角pitch
- 绕旋转之后的X轴旋转,得到滚转角roll
此时可以使用向量
[
y
,
p
,
r
]
T
[y,p,r]^T
[y,p,r]T描述任意旋转
万向锁问题:即当俯仰角为
±
90
°
±90°
±90°时,第三次旋转轴和第一次旋转轴重合,使系统丢失了一个自由度,这被称为奇异性问题。因此欧拉角在SLAM较少使用。
旋转向量也存在奇异性,当0超过2π时会产生周期性,这时将其限定在2π范围内便可以避免。
3. 四元数
3.1 四元数定义
紧凑又没有奇异性的三维空间旋转表达方式,但是不够直观运算稍微复杂些。
与复数类比,四元数是一种扩展的复数。
二维空间下,在复数平面空间,结合欧拉公式
e
i
θ
=
cos
θ
+
i
sin
θ
e^{i\theta}=\cos\theta+i\sin\theta
eiθ=cosθ+isinθ,如下图,向量
z
z
z旋转
9
0
∘
90^{\circ}
90∘,相当于乘上
i
i
i
三维空间中,采用四元数描述旋转。
四元数具有一个实部,三个虚部(分别对应z,y,z轴):
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
\boldsymbol{q}=q_0+q_1i+q_2j+q_3k
q=q0+q1i+q2j+q3k
写成向量形式:
q
=
[
s
,
v
]
,
s
=
q
0
∈
R
,
v
=
[
q
1
,
q
2
,
q
3
]
T
∈
R
3
q=[s,\boldsymbol{v}],s=q_0\in\mathbb{R},\boldsymbol{v}=[q_1,q_2,q_3]^T\in\mathbb{R}^3
q=[s,v],s=q0∈R,v=[q1,q2,q3]T∈R3
并且,虚部之间满足:
{
i
2
=
j
2
=
k
2
=
−
1
i
j
=
k
,
j
i
=
−
k
j
k
=
i
,
k
j
=
−
i
k
i
=
j
,
i
k
=
−
j
\left.\left\{\begin{array}{c}i^2=j^2=k^2=-1\\ij=k,ji=-k\\jk=i,kj=-i\\ki=j,ik=-j\end{array}\right.\right.
⎩
⎨
⎧i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
当四元数的实部为0时,称为虚四元数(分别对应三维坐标),此时,可以用来表示三维空间中的点。
3.2 四元数的计算
现有两个四元数
q
a
,
q
b
q_a,q_b
qa,qb,它们的向量表示为
[
s
a
,
v
a
]
T
,
[
s
b
,
v
b
]
T
[s_a,\boldsymbol{v}_a]^{\mathrm{T}},[s_b,\boldsymbol{v}_b]^{\mathrm{T}}
[sa,va]T,[sb,vb]T, 或者原始四元数表示为:
q
a
=
s
a
+
x
a
i
+
y
a
j
+
z
a
k
,
q
b
=
s
b
+
x
b
i
+
y
b
j
+
z
b
k
q_a=s_a+x_ai+y_aj+z_ak,\quad q_b=s_b+x_bi+y_bj+z_bk
qa=sa+xai+yaj+zak,qb=sb+xbi+ybj+zbk
- 加法:对应部分相加乘法:每一项相乘,最后相加
- 模长:各项系数平方和再开方;并且两个四元数乘积的模等于各自模的乘积,即 ∥ q 1 q 2 ∥ = ∥ q 1 ∥ ⋅ ∥ q 2 ∥ \|q_1q_2\|=\|q_1\|\cdot\|q_2\| ∥q1q2∥=∥q1∥⋅∥q2∥ ,模长为1的四元数称为单位四元数
- 共轭:实部相等,虚部互为相反数: q a ∗ = [ s a , − v a ] T q_a^*=[s_a,-v_a]^T qa∗=[sa,−va]T。并且, q ∗ q = q q ∗ = [ s 2 + v T v q^*q=qq^*=[s^2+\boldsymbol{v}^T\boldsymbol{v} q∗q=qq∗=[s2+vTv, 0 ] T \mathbf{0}]^T 0]T
- 逆: q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 q^{-1}=q^*/||q||^2 q−1=q∗/∣∣q∣∣2,则 q − 1 q = q q − 1 = 1 q^{-1}q=qq^{-1}=1 q−1q=qq−1=1,同时, ( q a q b ) − 1 = q a − 1 q b − 1 (q_aq_b)^{-1}=q_a^{-1}q_b^{-1} (qaqb)−1=qa−1qb−1
- 数乘: k q = [ k s , k v ] T k\boldsymbol{q}=[ks,k\boldsymbol{v}]^T kq=[ks,kv]T
3.3 四元数表示旋转
三维空间任意一点均可用一个纯虚四元数来表示:
p
=
[
0
,
v
]
T
p=[0,v]^T
p=[0,v]T,
用单位四元数
q
q
q表示三维空间中任意一个旋转,旋转以后得到
p
′
p^{\prime}
p′,则:
p
′
=
q
p
q
−
1
p^{\prime}=qpq^{-1}
p′=qpq−1
p
′
p^\prime
p′的虚部为旋转后的点的坐标。
3.4 四元数与其他旋转表示法的转换
角轴(旋转向量)到四元数:
q
=
[
c
o
s
θ
2
,
n
x
s
i
n
θ
2
,
n
y
s
i
n
θ
2
,
n
z
s
i
n
θ
2
]
\boldsymbol{q}=[cos\frac\theta2,n_xsin\frac\theta2,n_ysin\frac\theta2,n_zsin\frac\theta2]
q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ]
四元数到角轴(旋转向量):
{
θ
=
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 \\ [n_x,n_y,n_z]^T=[q_1,q_2,q_3]^T/sin\frac\theta2 \end{cases}
{θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]T/sin2θ
四元数到旋转矩阵:
{
R
=
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
θ
=
2
arccos
s
\begin{cases} \boldsymbol{R}=\boldsymbol{v}\boldsymbol{v}^\mathrm{T}+s^2\boldsymbol{I}+2s\boldsymbol{v}^\wedge+\left(\boldsymbol{v}^\wedge\right)^2 \\ \theta=2\arccos s \end{cases}
{R=vvT+s2I+2sv∧+(v∧)2θ=2arccoss