【视觉SLAM十四讲】三维空间刚体运动

三维空间刚体运动

本文意在明确两个问题:1.如何描述点在不同坐标系间的变换 ⇒ \Rightarrow 欧式变换

​ 2.如何对欧式变换进行高效的梯度下降 ⇒ \Rightarrow 李群李代数

欧式变换

旋转的表示和计算

1.旋转矩阵

通常为 3 阶正交矩阵,用于描述从一个坐标系到另一个坐标系的旋转变换( v ′ = R ⋅ v \mathbf{v}'=\mathbf{R}\cdot\mathbf{v} v=Rv

常见旋转矩阵

  • 绕 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θ0sinθ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θ0sinθ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θ0sinθ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+(1cosθ)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)

  1. 虚部满足规律:

    { 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(非交换性)

  2. 四元数性质:

    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=sqxiqyjqzk (共轭四元数)

    q ⋅ q ∗ = q ∗ ⋅ q = ∣ ∣ q ∣ ∣ 2 q\cdot \boldsymbol{q}^*=\boldsymbol{q}^*\cdot \boldsymbol{q}=||\boldsymbol{q}||^2 qq=qq=∣∣q2

    q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 \boldsymbol{q}^{-1}=\frac{\boldsymbol{q}^*}{||\boldsymbol{q}||^2} q1=∣∣q2q (逆四元数)

  3. 四元数运算:

    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=[sasbvaTvb, 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 qaqb=sasb+xaxbi+yaybj+zazbk

  4. 四元数的应用:

    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 q1

旋转矩阵旋转向量欧拉角四元数
优点无奇异性,可直接应用无奇异性,结构紧凑最直观无奇异性,结构紧凑,计算效率高
缺点存在冗余量需要转换为旋转矩阵或四元数使用存在万向锁,需要转换为旋转矩阵或四元数使用应用需通过公式 v ′ = q   v   q − 1 \boldsymbol{v}'=\boldsymbol{q}~v~\boldsymbol{q}^{-1} v=q v q1 转换

刚体运动的统一表述

刚体运动可解释为旋转和平移的总和 → \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] [a1]=[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~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值