《视觉SLAM十四讲》第三章阅读笔记(一)

《视觉SLAM十四讲》第三章阅读笔记(一)

第三章主要描述三维空间的刚体运动,主要的描述的方式为旋转矩阵、四元数和欧拉角。本文中将介绍三种之间的转换方式以及Eigen库和ROS系统中的关于旋转矩阵、四元数和欧拉角的具体表达和之间转换。,且本文都是基于右手系进行推导。

两个坐标系之间的变换

1.旋转矩阵

定义一个三维旋转矩阵R,用来表示两个坐标之间的坐标变换关系,同时也是一个行列式为1的正交矩阵,因此可以定义三维空间的李群SO(3)。
S O ( 3 ) = { R ∈ R n × n | R R T = I , d e t ( R ) = 1 } SO(3)=\{\bm{R}\in\mathbb{R^{n\times{n}}}|\bm{RR}^{T}=\bm{I},det(\bm{R})=1\} SO(3)={RRn×nRRT=I,det(R)=1}
在SLAM系统里面,车体的旋转运动会体现到相机的旋转,当然前提是将车体和相机之间的连接看成刚性连接,意味着当相机测出旋转运动时,可以反推出车体的运动,从而求出车体的位姿。然而通常情况下,旋转矩阵不足以表达出车体的运动,在车辆行驶过程中,除了旋转还有平移运动,因此还需要引入平移向量t。则有:
T = [ R t   0 T 1 ] \bm{T}=\begin{bmatrix} \bm{R}&\bm{t} \\\ 0^{\bm{T}} & 1 \end{bmatrix} T=[R 0Tt1]
这里引入的是齐次坐标系,然而为何引入齐次坐标呢?首先需要解答的第一个问题是什么是齐次坐标,齐次坐标就是在原有坐标基础上再加一个维度,如:
( x , y ) → ( x , y , 1 ) (x,y)\rightarrow (x,y,1) (x,y)(x,y,1)
( x , y , z ) → ( x , y , z , 1 ) (x,y,z)\rightarrow(x,y,z,1) (x,y,z)(x,y,z,1)
如果直线l可以用直线方程ax+by+c=0来表示的话,该直线用向量表示的话,记做:
l = ( x , y , 1 ) T l=(x,y,1)^{T} l=(x,y,1)T
则直线的坐标可以设置成 P = ( x , y , 1 ) P=(x,y,1) P=(x,y,1)直线方程则为两点之间的点乘也就是内积。
a x + b y + c × 1 = ( a , b , c ) T ( x , y , 1 ) = l T ∗ P ′ = 0 ax+by+c\times1 =(a,b,c)^{T}(x,y,1)=l^{T}*P^{\prime}=0 ax+by+c×1=(a,b,c)T(x,y,1)=lTP=0
同样地,在三维空间内假设平面方程A为
a x + b y + c z + d = 0 , P = ( x , y , z , 1 ) ax+by+cz+d=0,P=(x,y,z,1) ax+by+cz+d=0P=xyz1
a x + b y + c z + d = ( a , b , c , d ) T ( x , y , z , 1 ) = A T ∗ P ′ = 0 ax+by+cz+d=(a,b,c,d)^{T}(x,y,z,1)=A^{T}*P^{\prime}=0 ax+by+cz+d=(a,b,c,d)T(x,y,z,1)=ATP=0
普通坐标转换成齐次坐标时

如果(x,y,z)是个点,则变为(x,y,z,1);
如果(x,y,z)是个向量,则变为(x,y,z,0)
齐次坐标转换成普通坐标时
如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)
具体可见:齐次坐标的理解
使用齐次坐标可以将欧式变换中的加法转换为乘法,如二维平面点 x = [ u , v ] x=[u,v] x=[uv],平移量为 t = [ t u , t v ] t=[tu,tv] t=[tu,tv],变换后的点应为:
x ′ → [ u ′   v ′ ] = [ u + t u   v + t v ] = x + t x^{\prime}\rightarrow \begin{bmatrix} u ^{\prime}\\\ v^{\prime} \end{bmatrix}= \begin{bmatrix} u+t{u} \\\ v+t_{v} \end{bmatrix}=x+t x[u v]=[u+tu v+tv]=x+t
将齐次坐标作为替代,重写写为:
x ′ → [ u ′   v ′   1 ] = [ 1 0 u   0 1 v   0 0 1 ] [ u   v   1 ] = T x x^{\prime}\rightarrow \begin{bmatrix} u ^{\prime}\\\ v^{\prime}\\\ 1 \end{bmatrix}=\begin{bmatrix} 1 &0 &u\\\ 0 &1 &v\\\ 0&0 &1\end{bmatrix} \begin{bmatrix} u \\\ v\\\ 1 \end{bmatrix}=\bm{T}\bm{x} xu v 1=1 0 0010uv1u v 1=Tx

在三维空间内,SLAM存在存在着旋转和平移,考虑世界坐标系中的向量a,经过一次旋转(用 R 描述)和一次平移 t 后,得到了 a′,那么把旋转和平移合到一起,有:
a ′ = R a + t \bm{a}^{\prime}=\bm{R}\bm{a}+\bm{t} a=Ra+t
其中,t 称为平移向量。相比于旋转,平移部分只需把这个平移量加到旋转之后的坐标上,
显得非常简洁。通过上式,我们用一个旋转矩阵 R 和一个平移向量 t 完整地描述了一个欧氏空间的坐标变换关系。
引入齐次坐标和变换矩阵重写:
[ a ′   1 ] = [ R t   0 T 1 ] [ a   1 ] ≜ T [ a   1 ] \begin{bmatrix} \bm{a} ^{\prime}\\\ 1 \end{bmatrix}=\begin{bmatrix} \bm{R}&\bm{t} \\\ 0^{\bm{T}} & 1 \end{bmatrix}\begin{bmatrix} \bm{a} \\\ 1 \end{bmatrix}\triangleq \bm{T}\begin{bmatrix} \bm{a} \\\ 1 \end{bmatrix} [a 1]=[R 0Tt1][a 1]T[a 1]
同样地,特殊欧氏群为:
S E ( 3 ) = { T = [ R t   0 T 1 ] ∈ R 4 × 4 | R ∈ S O ( 3 ) , t ∈ R 3 } SE(3)=\{\bm{T=\begin{bmatrix} \bm{R}&\bm{t} \\\ 0^{\bm{T}} & 1 \end{bmatrix}}\in\mathbb{R^{4\times4}}|\bm{R}\in SO(3),t\in\mathbb{R}^{3}\} SE(3)={T=[R 0Tt1]R4×4RSO(3),tR3}

2.旋转向量

使用旋转矩阵来表示三维空间的变换存在以下缺点:
1.SO(3) 的旋转矩阵有九个量,但一次旋转只有三个自由度。因此这种表达方式是冗
余的。同理,变换矩阵用十六个量表达了六自由度的变换。
2.旋转矩阵自身带有约束:正交矩阵,且行列式为 1。变换矩阵也是如此。当
估计或优化一个旋转矩阵/变换矩阵时,这些约束会使得求解变得更困难。
引入一个新的概念:旋转向量,即用一个旋转轴和一个旋转角来刻画。关键关键问题在于旋转矩阵和旋转向量之间的转换。
接下来关于罗德里格斯公式(Rodrigues’s Formula)的推导
首先给出推导的结果,即罗德里格斯公式(Rodrigues’s Formula )。
R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ∧ R=cos\theta\bm{I}+(1-cos\theta)\bm{nn^T}+sin\theta\bm{n^{\land}} R=cosθI+(1cosθ)nnT+sinθn
使用旋转矩阵表示的R
R = [ r x x r x y r x z   r y x r y y r y z   r z x r z y r z z ] R=\begin{bmatrix} r_{xx} &r_{xy} & r_{xz} \\\ r_{yx} & r_{yy} & r_{yz} \\\ r_{zx} & r_{zy} &r_{zz} \end{bmatrix} R=rxx ryx rzxrxyryyrzyrxzryzrzz
上述已经描述过,旋转矩阵为标准的正交矩阵且矩阵的行列式为1,下式表达:
R T R = R − 1 R = E \bm{R}^{T}\bm{R}=\bm{R}^{-1}\bm{R}=\bm{E} RTR=R1R=E
∣ R ∣ = 1 |\bm{R}|=1 R=1
假设原坐标系基向量矩阵为 B,旋转后的坐标系基向量矩阵为 C。
B = [ b x , b y , b z ] = [ 1 0 0   0 1 0   0 0 1 ] \bm{B}=[b_{x},b_{y},b{z}]=\begin{bmatrix} 1 &0 & 0 \\\ 0& 1 & 0 \\\ 0 & 0 &1\end{bmatrix} B=[bx,by,bz]=1 0 0010001
C = R B \bm{C}=\bm{R}\bm{B} C=RB

C = [ r x x r x y r x z   r y x r y y r y z   r z x r z y r z z ] [ b x , b y , b z ] \bm{C}=\begin{bmatrix} r_{xx} &r_{xy} & r_{xz} \\\ r_{yx} & r_{yy} & r_{yz} \\\ r_{zx} & r_{zy} &r_{zz} \end{bmatrix}[b_{x},b_{y},b{z}] C=rxx ryx rzxrxyryyrzyrxzryzrzz[bx,by,bz]
假设一个单位向量
n = [ n x , n y , n z ] n=[n_{x},n_{y},n_{z}] n=[nx,ny,nz]
在这里插入图片描述
考虑向量旋转,其中 v v v作为原向量, v r o t v_{rot} vrot为旋转后的向量。先通过点积得到 v v v n n n方向的平行分量 v ∣ ∣ v_{||} v:
v ∣ ∣ = ( v ⋅ n ) n v_{||}=(v\cdot n)n v=(vn)n
再通过叉乘得到与 k k k正交的两个向量 v ⊥ v_{\perp} v w w w
v ⊥ = v − v ∥ = v − ( v ⋅ k ) k = − k × ( k × v ) ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ v_{\perp} = v - v_{\parallel } = v - (v \cdot k)k = -k \times (k \times v) \cdot \cdot \cdot \cdot \cdot \cdot v=vv=v(vk)k=k×(k×v)
w = k × v w = k \times v w=k×v
根据图中可以得出:
v r o t = v ∥ + c o s ( θ ) v ⊥ + s i n ( θ ) w v_{rot}=v_{\parallel}+cos(\theta)v_{\perp}+sin(\theta)w vrot=v+cos(θ)v+sin(θ)w
反对称矩阵可见反对成矩阵
n n n的反对称矩阵为:
n ∧ = [ 0 − n z n y   n z 0 − n x   − n y n x 0 ] n^{\land}=\begin{bmatrix} 0&-n_z & n_{y} \\\ n_{z} & 0 & -n_{x} \\\ -n_{y} & n_{x} &0 \end{bmatrix} n=0 nz nynz0nxnynx0其中
n × v = n ∧ v n\times v=n^{\land}v n×v=nv
因此,可以得到以下公式
v ∥ = v + n × ( n × v ) v_{\parallel}=v+n\times (n\times v) v=v+n×(n×v)
所以可以得到
v r o t = v + n × ( n × v ) − c o s ( θ ) k × ( k × v ) + s i n ( θ ) k × v v_{rot}=v+n\times (n\times v)-cos(\theta)k\times (k\times v)+sin(\theta)k\times v vrot=v+n×(n×v)cos(θ)k×(k×v)+sin(θ)k×v
根据叉积矩阵性质:
v r o t = v + ( 1 − c o s ( θ ) ( n ∧ ) 2 v + s i n ( θ ) ( n ∧ ) 2 v v_{rot}=v+(1-cos(\theta)(n^{\land})^2v+sin(\theta)(n^{\land})^2v vrot=v+(1cos(θ)(n)2v+sin(θ)(n)2v
v r o t = ( I + ( 1 − c o s ( θ ) ) ( n ∧ ) 2 v + s i n ( θ ) ( n ∧ ) 2 v v_{rot}=(I+(1-cos(\theta))(n^{\land})^2v+sin(\theta)(n^{\land})^2v vrot=(I+(1cos(θ))(n)2v+sin(θ)(n)2v
B B B, C C C代入可知:
B = ( I + ( 1 − c o s ( θ ) ) ( n ∧ ) 2 + s i n ( θ ) n ∧ ) C ⇔ R = I + ( 1 − c o s ( θ ) ) ( n ∧ ) 2 + s i n ( θ ) n ∧ B=(I+(1-cos(\theta))(n^{\land})^2+sin(\theta)n^{\land})C \Leftrightarrow \bm{R}=I+(1-cos(\theta))(n^{\land})^2+sin(\theta)n^{\land} B=(I+(1cos(θ))(n)2+sin(θ)n)CR=I+(1cos(θ))(n)2+sin(θ)n
同时,反过来计算,从旋转矩阵到旋转向量的转换。对于转角 θ \theta θ,对每一项取迹有
t r ( R ) = c o s θ t r ( I ) + ( 1 − c o s θ ) t r ( n n T ) + s i n θ t r ( n ∧ ) = 3 c o s θ + ( 1 − c o s θ ) = 1 + 2 c o s θ tr(\bm{R})=cos\theta tr(\bm{I})+(1-cos\theta )tr (\bm{nn}^{T})+sin\theta tr(\bm{n}^{\land})=3cos\theta +(1-cos\theta)=1+2cos\theta tr(R)=cosθtr(I)+(1cosθ)tr(nnT)+sinθtr(n)=3cosθ+(1cosθ)=1+2cosθ
符号 ∧ ^\land 为反对称矩阵转换符。
因此:
θ = a r c o s ( t r ( R ) − 1 2 ) \theta=arcos(\frac{tr(\bm{R})-1}{2}) θ=arcos(2tr(R)1)
关于转轴 n n n,由于旋转轴上的向量在旋转后不发生改变,说明:
R n = n \bm{Rn}=\bm{n} Rn=n

参考:
罗德里格斯公式 理解、推导

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值