视觉SLAM理论到实践系列文章
下面是《视觉SLAM十四讲》学习笔记的系列记录的总链接,本人发表这个系列的文章链接均收录于此
视觉SLAM理论到实践系列文章链接
下面是专栏地址:
视觉SLAM理论到实践专栏
文章目录
- 视觉SLAM理论到实践系列文章
- 视觉SLAM理论到实践系列文章链接
- 视觉SLAM理论到实践专栏
- 前言
- 视觉SLAM理论到实践系列:补充——泊松公式 R ˙ = R ω ∧ \dot{\mathbf{R}}=\mathbf{R}\omega^{\wedge} R˙=Rω∧ 证明
前言
高翔博士的《视觉SLAM十四讲》学习笔记的系列记录
视觉SLAM理论到实践系列:补充——泊松公式 R ˙ = R ω ∧ \dot{\mathbf{R}}=\mathbf{R}\omega^{\wedge} R˙=Rω∧ 证明
如上图所示,在三维空间中,圆周运动所在的平面可以任意选取,我们可以将角速度拓展成一个矢量 ω \mathbf{\omega} ω,其方向垂直于该平面并由右手定则确定。令坐标系的原点在圆周运动的轴上,用位矢 r \bf{r} r 表示点 P P P 的位置,则圆周运动的半径为 r ⊥ = r sin θ r_{⊥}=r\sin\theta r⊥=rsinθ,其中 θ \theta θ 是 r \mathbf{r} r 与 ω \mathbf{\omega} ω 的夹角。所以圆周运动速度的大小为 v = ω r sin θ v=\omega r\sin\theta v=ωrsinθ。根据矢量叉乘的几何定义,有
v = ω × r \bf{v}=\bf{\omega}\times\bf{r} v=ω×r
线速度与角速度的关系还有如下推导
粒子在坐标系中
z
=
h
z = h
z=h 中的平面做圆周运动,圆周运动的半径为
a
a
a,粒子的坐标为:
r
=
(
a
cos
θ
,
a
sin
θ
,
h
)
T
\mathbf{r}=(a\cos\theta,a\sin\theta,h)^T
r=(acosθ,asinθ,h)T
坐标对时间
t
t
t 求导得:
r
˙
=
(
−
a
θ
˙
sin
θ
,
a
θ
˙
cos
θ
,
0
)
⊤
=
[
0
−
θ
˙
0
θ
˙
0
0
0
0
0
]
[
a
cos
θ
a
sin
θ
h
]
=
ω
×
r
\begin{aligned} \dot{\mathbf{r}} &=(-a\dot{\theta}\sin\theta,a\dot{\theta}\cos\theta,0)^\top\\ &=\begin{bmatrix}0&-\dot{\theta}&0\\\dot{\theta}&0&0\\0&0&0\end{bmatrix}\begin{bmatrix}a\cos\theta\\a\sin\theta\\h\end{bmatrix}\\ &=\boldsymbol{\omega}\times\mathbf{r}\end{aligned}
r˙=(−aθ˙sinθ,aθ˙cosθ,0)⊤=
0θ˙0−θ˙00000
acosθasinθh
=ω×r
其中
ω
=
θ
˙
z
\bf{\omega}=\dot{\theta}\mathbf{z}
ω=θ˙z,表示角速度的向量,方向与
z
z
z 轴正方向一致,
∣
θ
˙
∣
|\dot{\theta}|
∣θ˙∣ 是角速度大小,
∣
r
˙
∣
|\dot{\mathbf{r}}|
∣r˙∣ 为线速度大小
对上式取模,得:
∣
r
˙
∣
=
∣
ω
∣
∣
r
∣
sin
ϕ
=
a
∣
θ
˙
∣
|\dot{\mathbf{r}}|=|\boldsymbol{\omega}||\mathbf{r}|\sin\phi=a|\dot{\theta}|
∣r˙∣=∣ω∣∣r∣sinϕ=a∣θ˙∣
也就是中学学过的:线速度大小=角速度大小
×
\times
×半径
这里有两个坐标系,惯性系(inertial frame),也叫世界坐标系,还有一个是物体坐标系(body frame)
为了计算简便,假设两个坐标系的原点为同一个,即只考虑旋转,不考虑坐标系之间的平移
R ˙ = [ ω ] × R \dot{\mathbf{R}}=[\omega]_\times\mathbf{R} R˙=[ω]×R 证明
首先看这样一个公式:
d
d
t
R
=
ω
×
R
\frac{\mathrm{d}}{\mathrm{d}t}\mathbf{R}=\omega\times\mathbf{R}
dtdR=ω×R
第一种证明视角
要证上式就是考虑旋转矩阵按列分块
R
=
[
i
^
j
^
k
^
]
\mathbf{R}=\left[\begin{array}{c|c|c}\mathbf{\hat{i}}&\mathbf{\hat{j}}&\mathbf{\hat{k}}\end{array}\right]
R=[i^j^k^]
即证明
d
d
t
i
^
=
ω
×
i
^
d
d
t
j
^
=
ω
×
j
^
d
d
t
k
^
=
ω
×
k
^
\begin{gathered} \frac{\mathrm{d}}{\mathrm{d}t}\hat{\mathbf{i}} =\omega\times\hat{\mathbf{i}} \\ \frac{\mathrm{d}}{\mathrm{d}t}\mathbf{\hat{j}} =\omega\times\hat{\mathbf{j}} \\ \frac{\mathrm{d}}{\mathrm{d}t}\hat{\mathbf{k}} =\omega\times\hat{\mathbf{k}} \end{gathered}
dtdi^=ω×i^dtdj^=ω×j^dtdk^=ω×k^
我们知道旋转矩阵的每一列都有这样的性质:
∥
u
^
∥
=
1
\|\hat{\mathbf{u}}\|=1
∥u^∥=1
这是因为旋转矩阵是正交矩阵:
R
T
R
=
I
\mathbf{R}^{T}\mathbf{R}=\mathbf{I}
RTR=I
所以
u
^
T
u
^
=
1
\hat{\mathbf{u}}^T\hat{\mathbf{u}}=1
u^Tu^=1,于是我们有:
d
d
t
u
^
T
u
^
=
0
\frac{\mathrm{d}}{\mathrm{d}t}\hat{\mathbf{u}}^T\hat{\mathbf{u}}=0
dtdu^Tu^=0
继而得到:
u
^
⋅
d
d
t
u
^
=
0
\hat{\mathbf{u}}\cdot{\frac{\mathrm{d}}{\mathrm{d}t}}\hat{\mathbf{u}}=0
u^⋅dtdu^=0
这不就说明每一列的
u
^
\hat{u}
u^ 和其微分垂直吗?其微分可以表示为叉乘的形式(保证垂直):
u
^
⋅
(
ω
×
u
^
)
=
0
\hat{\mathbf{u}}\cdot(\omega\times\hat{\mathbf{u}})=0
u^⋅(ω×u^)=0
也即我们有:
d
d
t
u
^
=
ω
×
u
^
\frac{\mathrm{d}}{\mathrm{d}t}\hat{\mathbf{u}}=\omega\times\hat{\mathbf{u}}
dtdu^=ω×u^
于是上式得到了证明。
d
d
t
R
=
ω
×
R
=
[
ω
]
×
R
{\frac{\mathrm{d}}{\mathrm{d}t}}\mathbf{R}=\omega\times\mathbf{R}\quad=[\omega]_{\times}\mathbf{R}
dtdR=ω×R=[ω]×R
式中:
[
ω
]
×
=
[
0
−
ω
z
ω
y
ω
z
0
−
ω
x
−
ω
y
ω
x
0
]
[\omega]_\times=\left[\begin{array}{ccc}0&-\omega_z&\omega_y\\\omega_z&0&-\omega_x\\-\omega_y&\omega_x&0\end{array}\right]
[ω]×=
0ωz−ωy−ωz0ωxωy−ωx0
[
ω
]
×
[\omega]_\times
[ω]× 的定义下同。
第二种证明视角
设惯性系(世界坐标系)下的角标为
W
W
W 或者
w
w
w 或者
I
I
I,本体坐标系下的角标为
B
B
B 或者
b
b
b,Body系的空间中有一个点坐标为
r
B
=
(
x
1
,
y
1
,
z
1
)
T
\mathbf{r}_B=(x_1,y_1,z_1)^T
rB=(x1,y1,z1)T,有下面的关系
r
w
=
R
w
b
r
b
\mathbf{r}_w=\mathbf{R}_{wb}\mathbf{r}_b
rw=Rwbrb
下标
(
)
w
b
()_{wb}
()wb 表示本体坐标系到世界坐标系的变换
两边对时间
t
t
t 求导我们可以得到:
r
˙
w
=
v
w
=
(
d
d
t
R
w
b
)
r
b
=
R
˙
w
b
r
b
\dot{\mathbf{r}}_{w}=\mathbf{v}_{w}=\left({\frac{\mathrm{d}}{\mathrm{d}t}}\mathbf{R}_{wb}\right)\mathbf{r}_{b}=\dot{\mathbf{R}}_{wb}\mathbf{r}_{b}
r˙w=vw=(dtdRwb)rb=R˙wbrb
上式中
v
w
\mathbf{v}_{w}
vw 是世界坐标系下的速度,等式右边没有
r
b
\mathbf{r}_{b}
rb 的导数是因为本体坐标系内观察坐标始终没有变化(这里假设本体坐标系在运动,而坐标不动),导数为0
(若点也在运动,则详见。。。的推导)
于是我们有
v
w
=
ω
w
×
r
w
=
[
ω
w
]
×
R
w
b
r
b
\begin{aligned}\mathbf{v}_w&=\omega_w\times\mathbf{r}_w\\&=[{\omega_w}]_{\times}\mathbf{R}_{wb}\mathbf{r}_b\end{aligned}
vw=ωw×rw=[ωw]×Rwbrb
对比可得
d
d
t
R
w
b
=
[
ω
w
]
×
R
w
b
\begin{aligned}\frac{\mathrm{d}}{\mathrm{d}t}\mathbf{R}_{wb}=[\omega_w]_\times\mathbf{R}_{wb}\end{aligned}
dtdRwb=[ωw]×Rwb
即所谓的
R
˙
=
[
ω
]
×
R
\dot{\mathbf{R}}=[\omega]_\times\mathbf{R}
R˙=[ω]×R
注意,这里的
ω
\omega
ω 是在世界坐标系下的表示,即
ω
w
\omega_w
ωw ,和下面要将的
ω
b
\omega_b
ωb 不同
R ˙ = R ω ∧ \dot{\mathbf{R}}=\mathbf{R}\omega^{\wedge} R˙=Rω∧ 证明
我们经常在论文里看到反过来写的旋转矩阵的导数,这又是为什么呢?
d
d
t
R
=
R
[
ω
]
×
{\frac{\mathrm{d}}{\mathrm{d}t}}\mathbf{R}=\mathbf{R}[\omega]_{\times}
dtdR=R[ω]×
准确地说,这里的
[
ω
]
×
[\omega]_{\times}
[ω]× 应该指的是物体角速度
[
ω
b
]
×
[\omega_b]_{\times}
[ωb]×
d
d
t
R
=
R
[
ω
b
]
×
{\frac{\mathrm{d}}{\mathrm{d}t}}\mathbf{R}=\mathbf{R}[\omega_b]_{\times}
dtdR=R[ωb]×
我们需要搞清楚的是前面所推导和论证的公式准确地说应该描述的是惯性坐标系(世界坐标系)的空间角速度
d
d
t
R
=
[
ω
w
]
×
R
\frac{\mathrm{d}}{\mathrm{d}t}\mathbf{R}=[\omega_{w}]_{\times}\mathbf{R}
dtdR=[ωw]×R
为了方便我们把旋转矩阵的微分写作:
R
˙
=
d
d
t
R
\dot{\mathbf{R}}={\frac{\mathrm{d}}{\mathrm{d}t}}\mathbf{R}
R˙=dtdR
于是我们便得到:
[
ω
w
]
×
=
R
˙
R
−
1
[
ω
b
]
×
=
R
−
1
R
˙
\begin{aligned} {[\omega_{w}]}_{\times}&=\dot{\mathbf{R}}\mathbf{R}^{-1} \\\\ {[\omega_{b}]}_{\times}&=\mathbf{R}^{-1}\dot{\mathbf{R}} \end{aligned}
[ωw]×[ωb]×=R˙R−1=R−1R˙
空间角速度在前面(第二种证明视角)我们已经推导过了,下面我们推导一下物体角速度,根据坐标变换关系我们有:
v
w
=
R
w
b
v
b
ω
w
=
R
w
b
ω
b
\mathbf{v}_w=\mathbf{R}_{wb}\mathbf{v}_b\\\\\omega_w=\mathbf{R}_{wb}\omega_b
vw=Rwbvbωw=Rwbωb
根据前面的
v
w
=
R
˙
w
b
r
b
\mathbf{v}_{w}=\dot{\mathbf{R}}_{wb}\mathbf{r}_{b}
vw=R˙wbrb
则有(为了简便则省去
R
\mathbf{R}
R 的脚标):
R
−
1
v
w
=
R
−
1
R
˙
r
b
\mathbf{R}^{-1}\mathbf{v}_{w}=\mathbf{R}^{-1}\dot{\mathbf{R}}\mathbf{r}_{b}
R−1vw=R−1R˙rb
也即:
v
b
=
R
−
1
R
˙
r
b
=
[
ω
b
]
×
r
b
\mathbf{v}_b=\mathbf{R}^{-1}\mathbf{\dot{R}}\mathbf{r}_b=[\omega_b]_\times\mathbf{r}_b
vb=R−1R˙rb=[ωb]×rb
于是我们便得到:
[
ω
b
]
×
=
R
−
1
R
˙
[\omega_{b}]_{\times}=\mathbf{R}^{-1}\dot{\mathbf{R}}
[ωb]×=R−1R˙
也即证明了:
d
d
t
R
=
R
[
ω
b
]
×
\frac{\mathrm{d}}{\mathrm{d}t}\mathbf{R}=\mathbf{R}[\omega_b]_{\times}
dtdR=R[ωb]×
或者写作
R
˙
=
R
[
ω
b
]
×
=
R
ω
b
∧
\begin{aligned} \dot{\mathbf{R}}&=\mathbf{R}[\omega_b]_{\times}\\\\ &= \mathbf{R}{\omega_b}^{\wedge} \end{aligned}
R˙=R[ωb]×=Rωb∧
其他证明方法
高翔书中有介绍
这里证明了
R
˙
(
t
)
=
ϕ
(
t
0
)
∧
R
(
t
)
=
ϕ
0
∧
R
(
t
)
\dot{\boldsymbol{R}}(t)=\boldsymbol{\phi}(t_0)^{\wedge}\boldsymbol{R}(t)=\boldsymbol{\phi}_0^{\wedge}\boldsymbol{R}(t)
R˙(t)=ϕ(t0)∧R(t)=ϕ0∧R(t)
但书中并未说明
ϕ
0
\phi_0
ϕ0 和
ω
\omega
ω 的关系
这里也是一样的思路
R
T
R
=
I
\mathbf{R}^{T}\mathbf{R}=\mathbf{I}
RTR=I
对左右两边对时间求导数:
R
T
R
˙
+
R
˙
T
R
=
0
[
ω
]
×
=
R
T
R
˙
a
n
d
[
ω
]
×
+
[
ω
]
×
T
=
0
R
˙
=
R
[
ω
]
×
\mathbf{R}^T\dot{\mathbf{R}}+\dot{\mathbf{R}}^T\mathbf{R}=\mathbf{0} \\\\ [\omega]_{\times}=\mathbf{R}^{T}\dot{\mathbf{R}}\quad\mathrm{and}\quad[\omega]_{\times}+[\omega]_{\times}^{T}=\mathbf{0} \\\\ \dot{\mathbf{R}}=\mathbf{R}[\omega]_{\times}
RTR˙+R˙TR=0[ω]×=RTR˙and[ω]×+[ω]×T=0R˙=R[ω]×
事实上,我也可以对下面的式子做同样的操作
R
R
T
=
I
\mathbf{R}\mathbf{R}^{T}=\mathbf{I}
RRT=I
对左右两边对时间求导数:
R
˙
R
T
+
R
R
˙
T
=
0
[
ω
]
×
=
R
˙
R
T
a
n
d
[
ω
]
×
+
[
ω
]
×
T
=
0
R
˙
=
[
ω
]
×
R
\dot{\mathbf{R}}\mathbf{R}^T+\mathbf{R}\dot{\mathbf{R}}^T=\mathbf{0} \\\\ [\omega]_{\times}=\dot{\mathbf{R}}\mathbf{R}^{T}\quad\mathrm{and}\quad[\omega]_{\times}+[\omega]_{\times}^{T}=\mathbf{0} \\\\ \dot{\mathbf{R}}=[\omega]_{\times}\mathbf{R}
R˙RT+RR˙T=0[ω]×=R˙RTand[ω]×+[ω]×T=0R˙=[ω]×R
以上两个都证明可以从数学的定义说明旋转矩阵群
S
O
(
3
)
SO(3)
SO(3) 的李代数是反对称矩阵。然而这样的证明并没有反映究竟是物体角速度还是空间角速度,实际应用中可能会让读者产生困惑,关于物体角速度和空间角速度和旋转矩阵的关系还是要用前面的推导说明。