三维空间刚体运动
本文意在明确两个问题:1.如何描述点在不同坐标系间的变换 ⇒ \Rightarrow ⇒ 欧式变换
2.如何对欧式变换进行高效的梯度下降
⇒
\Rightarrow
⇒ 李群李代数
欧式变换
旋转的表示和计算
1.旋转矩阵
通常为 3 阶正交矩阵,用于描述从一个坐标系到另一个坐标系的旋转变换( v ′ = R ⋅ v \mathbf{v}'=\mathbf{R}\cdot\mathbf{v} v′=R⋅v)
常见旋转矩阵
- 绕 x 轴: R x ( θ ) = [ 1 0 0 0 cos θ − sin θ 0 sin θ cos θ ] \mathbf{R}_x(\theta)=\left[\begin{matrix} 1 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta \\ 0 & \sin\theta & \cos\theta \end{matrix} \right] Rx(θ)= 1000cosθsinθ0−sinθcosθ
- 绕 y 轴: R y ( θ ) = [ cos θ 0 sin θ 0 1 0 − sin θ 0 cos θ ] \mathbf{R}_y(\theta)=\left[\begin{matrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0& \cos\theta \end{matrix} \right] Ry(θ)= cosθ0−sinθ010sinθ0cosθ
- 绕 z 轴: R z ( θ ) = [ cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ] \mathbf{R}_z(\theta)=\left[\begin{matrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{matrix} \right] Rz(θ)= cosθsinθ0−sinθcosθ0001
2.旋转向量
由表示旋转轴的单位向量和旋转角度组成的 3 维向量,例如 ( π 6 , 0 , 0 ) (\frac{\pi}{6},0,0) (6π,0,0) 表示绕x轴逆时针旋转 3 0 ∘ 30^\circ 30∘
相较于旋转矩阵更为紧凑,可以使用罗德里格斯公式将旋转向量转换为旋转矩阵
罗德里格斯公式
R = cos θ ⋅ I + ( 1 − cos θ ) ⋅ n n T + sin θ ⋅ n ∧ \mathbf{R}=\cos\theta\cdot\mathbf{I}+(1-\cos\theta)\cdot\mathbf{n}\mathbf{n}^T+\sin\theta\cdot\mathbf{n}^\wedge R=cosθ⋅I+(1−cosθ)⋅nnT+sinθ⋅n∧
推导(没有平板,只能手写了)

当然,对于旋转矩阵转换到旋转向量也有如下公式
θ
=
arccos
t
r
(
R
)
−
1
2
R
n
=
n
\theta=\arccos\frac{tr(R)-1}{2} \qquad Rn=n
θ=arccos2tr(R)−1Rn=n
3.欧拉角
直观的将旋转展示为绕三个不同轴的三次旋转。常用顺序为 Z-X-Y ,或 yaw-pitch-roll
需要注意的是,欧拉角仅适用于演示和理解而非计算(这是因为欧拉角存在无法解决的万向锁问题,这里不展开讲解,有兴趣的可以移步至笔者另一篇文章:传送门)
4.四元数
旋转矩阵用了 9 个量来描述 3 自由度的旋转,具有冗余性;虽然欧拉角和旋转向量都是紧凑的,但具有奇异性。所以我们需要引入一个类似于复数的代数:四元数。
通常定义四元数为 q = ( s + q x i + q y j + q z k ) 或 ( q = [ s , v ] ) \boldsymbol{q}=(s+q_xi+q_yj+q_zk)或(\boldsymbol{q}=[s,v]) q=(s+qxi+qyj+qzk)或(q=[s,v]) ,在 SLAM 中是表示姿态的首选
若有旋转轴的单位向量为
u
=
(
u
x
,
u
y
,
u
z
)
\boldsymbol{u}=(u_x,u_y,u_z)
u=(ux,uy,uz) ,旋转角度为
θ
\theta
θ ,则对应的单位四元数可定义为
q
=
cos
≤
(
θ
2
)
+
sin
(
θ
2
)
(
u
x
i
+
u
y
j
+
u
z
k
)
\boldsymbol{q}=\cos\le(\frac{\theta}{2})+\sin(\frac{\theta}{2})(u_xi+u_yj+u_zk)
q=cos≤(2θ)+sin(2θ)(uxi+uyj+uzk)
-
虚部满足规律:
{ 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 (非交换性) \begin{cases} i^2=j^2=k^2=-1 \\ \begin{aligned} \ ij=k,\quad ji=-k \\jk=i,\quad kj=-i\\ki=j, \quad ik=-j \end{aligned} & \text{(非交换性)} \end{cases} ⎩ ⎨ ⎧i2=j2=k2=−1 ij=k,ji=−kjk=i,kj=−iki=j,ik=−j(非交换性)
-
四元数性质:
s 2 + q x 2 + q y 2 + q z 2 = 1 s^2+q_x^2+q_y^2+q_z^2=1 s2+qx2+qy2+qz2=1 (单位四元数)
q ∗ = s − q x i − q y j − q z k \boldsymbol{q}^*=s-q_xi-q_yj-q_zk q∗=s−qxi−qyj−qzk (共轭四元数)
q ⋅ q ∗ = q ∗ ⋅ q = ∣ ∣ q ∣ ∣ 2 q\cdot \boldsymbol{q}^*=\boldsymbol{q}^*\cdot \boldsymbol{q}=||\boldsymbol{q}||^2 q⋅q∗=q∗⋅q=∣∣q∣∣2
q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 \boldsymbol{q}^{-1}=\frac{\boldsymbol{q}^*}{||\boldsymbol{q}||^2} q−1=∣∣q∣∣2q∗ (逆四元数)
-
四元数运算:
q a q b = [ s a s b − v a T v b , s a v b + s b v a + v a × v b ] \boldsymbol{q_a}\boldsymbol{q_b}=[s_as_b-v_a^Tv_b,~s_av_b+s_bv_a+v_a\times v_b] qaqb=[sasb−vaTvb, savb+sbva+va×vb]
q a ⋅ q b = s a s b + x a x b i + y a y b j + z a z b k \boldsymbol{q_a}\cdot \boldsymbol{q_b}=s_as_b+x_ax_bi+y_ay_bj+z_az_bk qa⋅qb=sasb+xaxbi+yaybj+zazbk
-
四元数的应用:
1.若两个旋转分别为 q 1 \boldsymbol{q_1} q1(先转) 和 q 2 \boldsymbol{q_2} q2(后转),则复合结果为 q ′ = q 2 q 1 \boldsymbol{q}'=\boldsymbol{q_2}\boldsymbol{q_1} q′=q2q1
2.用四元数 q \boldsymbol{q} q 旋转三维向量 v = ( x , y , z ) \boldsymbol{v}=(x,y,z) v=(x,y,z) 时,可将向量视为 v = 0 + x i + y j + z k \boldsymbol{v}=0+xi+yj+zk v=0+xi+yj+zk
选择后向量对应的四元数可表示为 v ′ = q v q − 1 \boldsymbol{v}'=\boldsymbol{q}~v~\boldsymbol{q}^{-1} v′=q v q−1
| 旋转矩阵 | 旋转向量 | 欧拉角 | 四元数 | |
|---|---|---|---|---|
| 优点 | 无奇异性,可直接应用 | 无奇异性,结构紧凑 | 最直观 | 无奇异性,结构紧凑,计算效率高 |
| 缺点 | 存在冗余量 | 需要转换为旋转矩阵或四元数使用 | 存在万向锁,需要转换为旋转矩阵或四元数使用 | 应用需通过公式 v ′ = q v q − 1 \boldsymbol{v}'=\boldsymbol{q}~v~\boldsymbol{q}^{-1} v′=q v q−1 转换 |
刚体运动的统一表述
刚体运动可解释为旋转和平移的总和
→
\rightarrow
→
p
′
=
R
p
+
t
\boldsymbol{p}'=\boldsymbol{R}\boldsymbol{p}+\boldsymbol{t}
p′=Rp+t
由于平移是线性变换,但无法用矩阵乘法表示,所以为了简化运算,需要引入齐次坐标和变换矩阵
齐次坐标
为了统一使用矩阵乘法表示旋转和平移,需要引入引入额外维度以实现矩阵的可加性,比如平移: [ x , y , z ] + [ t 1 , t 2 , t 3 ] = [ x + t 1 , y + t 2 , z + t 3 ] [x,y,z]+ [t1,t2,t3] = [x+t1,y+t2, z+t3] [x,y,z]+[t1,t2,t3]=[x+t1,y+t2,z+t3]无法通过矩阵乘法实现。故引入齐次矩阵
[ 1 0 0 t 1 0 1 0 t 2 0 0 1 t 3 0 0 0 1 ] ⋅ [ x y z 1 ] = [ x + t 1 y + t 2 z + t 3 1 ] \left[ \begin{matrix} 1 & 0 & 0 & t1 \\ 0 & 1 & 0 & t2 \\ 0 & 0 & 1 & t3 \\ 0 & 0 & 0 & 1 \end{matrix} \right] \cdot \left[ \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right]= \left[ \begin{matrix} x+t1 \\ y+t2 \\ z+t3 \\ 1 \end{matrix} \right] 100001000010t1t2t31 ⋅ xyz1 = x+t1y+t2z+t31
变换矩阵
既然现在我们可以用矩阵乘来表示平移了,何不更近一步?将旋转和平移用一个矩阵来表示
[
a
′
1
]
=
[
R
t
0
T
1
]
[
a
1
]
\left[ \begin{matrix} \boldsymbol{a}' \\ 1 \end{matrix} \right]= \left[ \begin{matrix} \boldsymbol{R} & \boldsymbol{t} \\ \boldsymbol{0}^T & 1 \end{matrix} \right] \left[ \begin{matrix} \boldsymbol{a} \\ 1 \end{matrix} \right]
[a′1]=[R0Tt1][a1]
如果要表示变换的叠加,则如下
b
~
=
T
1
a
~
,
c
~
=
T
2
b
~
⇒
c
~
=
T
2
T
1
a
~
\tilde{\boldsymbol{b}}=\boldsymbol{T}_1\tilde{\boldsymbol{a}},~~\tilde{\boldsymbol{c}}=\boldsymbol{T}_2\tilde{\boldsymbol{b}} \quad\Rightarrow\quad\tilde{\boldsymbol{c}}=\boldsymbol{T}_2\boldsymbol{T}_1\tilde{\boldsymbol{a}}
b~=T1a~, c~=T2b~⇒c~=T2T1a~

2995

被折叠的 条评论
为什么被折叠?



