在SLAM中,通常用BA(Bundle Adjustment)来实现多个三维点和不同相机位姿的优化
本文描述如何建立基于点特征的图优化,并推导相应的雅克比矩阵,并用g2o实现相应的类
1. 点特征误差及观测模型
假设相机位姿为
T
c
w
T_{cw}
Tcw表示世界坐标系到相机坐标系的变换,或者表示成
R
c
w
,
t
c
w
R_{cw},t_{cw}
Rcw,tcw。三维空间点表示成
世界坐标下
P
w
=
[
P
x
w
,
P
y
w
,
P
z
w
]
T
P^{w}=\begin{bmatrix} P^{w}_{x}, P^{w}_{y}, P^{w}_{z}\end{bmatrix}^{T}
Pw=[Pxw,Pyw,Pzw]T
相机坐标下
P
c
=
[
P
x
c
,
P
y
c
,
P
z
c
]
T
P^{c}=\begin{bmatrix} P^{c}_{x}, P^{c}_{y}, P^{c}_{z}\end{bmatrix}^{T}
Pc=[Pxc,Pyc,Pzc]T
相机内参为
K
K
K
重投影误差为
e
p
=
p
−
p
′
=
[
u
v
]
−
[
u
′
v
′
]
e_{p}=p-p^{'}=\begin{bmatrix} u \\ v\end{bmatrix}-\begin{bmatrix} u^{'} \\ v^{'}\end{bmatrix}
ep=p−p′=[uv]−[u′v′]
其中
p
p
p为当前图像中提取的点,
p
′
p^{'}
p′为与
p
p
p匹配的三维空间点的投影点,计算方式为
P
c
=
R
c
w
P
w
+
t
c
w
u
′
=
f
x
P
x
c
P
z
c
+
c
x
v
′
=
f
y
P
y
c
P
z
c
+
c
y
\begin{aligned} P^{c}&=R_{cw}P^{w}+t_{cw} \\ u^{'} &= \frac {f_{x}P^{c}_{x}} {P^{c}_{z}}+c_{x} \\ v^{'} &= \frac {f_{y}P^{c}_{y}} {P^{c}_{z}}+c_{y} \end{aligned}
Pcu′v′=RcwPw+tcw=PzcfxPxc+cx=PzcfyPyc+cy
2. 点特征重投影误差关于位姿增量的雅克比矩阵
利用链式法则,可以求得
∂
e
p
∂
δ
ξ
=
∂
e
p
∂
P
c
∂
P
c
∂
δ
ξ
\frac{\partial e_{p}}{\partial \delta\xi}=\frac{\partial e_{p}}{\partial P^{c}}\frac{\partial P^{c}}{\partial \delta\xi }
∂δξ∂ep=∂Pc∂ep∂δξ∂Pc
下面分别计算等式右边两项
这里注意,这里需要涉及到矩阵求导,矩阵求导通常分为分子布局和分母布局,这两种情况只是表达形式的不同,本身并没有两样,下面统一都用分母布局,具体求导结果可以看这篇文章
第一部分
∂
e
p
∂
P
c
=
∂
[
u
−
u
′
v
−
v
′
]
∂
P
c
=
[
∂
(
u
−
u
′
)
∂
P
x
c
∂
(
u
−
u
′
)
∂
P
y
c
∂
(
u
−
u
′
)
∂
P
z
c
∂
(
v
−
v
′
)
∂
P
x
c
∂
(
v
−
v
′
)
∂
P
y
c
∂
(
v
−
v
′
)
∂
P
z
c
]
=
−
[
f
x
P
z
c
0
f
x
P
x
c
P
z
c
2
0
f
y
P
z
c
f
y
P
y
c
P
z
c
2
]
2
×
3
\begin{aligned} \frac{\partial e_{p}}{\partial P^{c}}&= \frac{\partial \begin{bmatrix} u-u^{'}\\ v-v^{'}\end{bmatrix}}{\partial P^{c}} \\ &= \begin{bmatrix} \frac{\partial(u-u^{'})}{\partial P_{x}^{c}} & \frac{\partial(u-u^{'})}{\partial P_{y}^{c}} & \frac{\partial(u-u^{'})}{\partial P_{z}^{c}} \\ \frac{\partial(v-v^{'})}{\partial P_{x}^{c}} & \frac{\partial(v-v^{'})}{\partial P_{y}^{c}} & \frac{\partial(v-v^{'})}{\partial P_{z}^{c}} \end{bmatrix} \\ &= -\begin{bmatrix} \frac{f_{x}}{P_{z}^{c}} & 0 & \frac{f_{x}P_{x}^{c}}{P_{z}^{c2}} \\ 0 & \frac{f_{y}}{P_{z}^{c}} & \frac{f_{y}P_{y}^{c}}{P_{z}^{c2}} \end{bmatrix}_{2 \times 3} \end{aligned}
∂Pc∂ep=∂Pc∂[u−u′v−v′]=⎣
⎡∂Pxc∂(u−u′)∂Pxc∂(v−v′)∂Pyc∂(u−u′)∂Pyc∂(v−v′)∂Pzc∂(u−u′)∂Pzc∂(v−v′)⎦
⎤=−[Pzcfx00PzcfyPzc2fxPxcPzc2fyPyc]2×3
第二部分
∂
P
c
∂
δ
ξ
=
∂
T
c
w
P
w
∂
δ
ξ
=
lim
δ
ξ
→
0
e
x
p
(
δ
ξ
∧
)
T
c
w
P
w
−
T
c
w
P
w
δ
ξ
\begin{aligned} \frac{\partial P^{c}}{\partial \delta\xi} &= \frac{\partial T_{cw}P^{w}}{\partial \delta\xi} \\ &=\lim_{\delta\xi \rightarrow 0} \frac{exp(\delta\xi^{\wedge})T_{cw}P^{w}-T_{cw}P^{w}}{\delta\xi} \end{aligned}
∂δξ∂Pc=∂δξ∂TcwPw=δξ→0limδξexp(δξ∧)TcwPw−TcwPw对
e
x
p
(
δ
ξ
∧
)
exp(\delta\xi^{\wedge})
exp(δξ∧)在
δ
ξ
=
0
\delta\xi=0
δξ=0处一阶泰勒展开,则上式变成
∂
P
c
∂
δ
ξ
=
lim
δ
ξ
→
0
e
x
p
(
δ
ξ
∧
)
T
c
w
P
w
−
T
c
w
P
w
δ
ξ
=
lim
δ
ξ
→
0
(
I
+
δ
ξ
∧
)
T
c
w
P
w
−
T
c
w
P
w
δ
ξ
=
lim
δ
ξ
→
0
δ
ξ
∧
T
c
w
P
w
δ
ξ
\begin{aligned} \frac{\partial P^{c}}{\partial \delta\xi} &=\lim_{\delta\xi\rightarrow 0} \frac{exp(\delta\xi^{\wedge})T_{cw}P^{w}-T_{cw}P^{w}}{\delta\xi} \\ &= \lim_{\delta\xi\rightarrow 0} \frac{(I+\delta\xi^{\wedge})T_{cw}P^{w}-T_{cw}P^{w}}{\delta\xi} \\ &= \lim_{\delta\xi \rightarrow 0} \frac{\delta\xi^{\wedge}T_{cw}P^{w}}{\delta\xi} \end{aligned}
∂δξ∂Pc=δξ→0limδξexp(δξ∧)TcwPw−TcwPw=δξ→0limδξ(I+δξ∧)TcwPw−TcwPw=δξ→0limδξδξ∧TcwPw已知
δ
ξ
∧
=
[
δ
ϕ
∧
δ
ρ
0
T
0
]
\delta\xi^{\wedge}=\begin{bmatrix} \delta\phi^{\wedge} & \delta\rho \\ 0^{T} & 0\end{bmatrix}
δξ∧=[δϕ∧0Tδρ0],则上式变成
∂
P
c
∂
δ
ξ
=
lim
δ
ξ
→
0
δ
ξ
∧
T
c
w
P
w
δ
ξ
=
lim
δ
ξ
→
0
[
δ
ϕ
∧
δ
ρ
0
T
0
]
[
R
c
w
P
w
+
t
c
w
1
]
δ
ξ
\begin{aligned} \frac{\partial P^{c}}{\partial \delta\xi} &= \lim_{\delta\xi \rightarrow 0} \frac{\delta\xi^{\wedge}T_{cw}P^{w}}{\delta\xi} \\ &= \lim_{\delta\xi \rightarrow 0} \frac{\begin{bmatrix} \delta\phi^{\wedge} & \delta\rho \\ 0^{T} & 0\end{bmatrix} \begin{bmatrix} R_{cw}P^{w}+t_{cw} \\ 1\end{bmatrix}}{\delta\xi} \end{aligned}
∂δξ∂Pc=δξ→0limδξδξ∧TcwPw=δξ→0limδξ[δϕ∧0Tδρ0][RcwPw+tcw1]这个地方
P
w
P^{w}
Pw由齐次坐标转换成了非齐次坐标,把最后一行删去,就变成
∂
P
c
∂
δ
ξ
=
lim
δ
ξ
→
0
[
δ
ϕ
∧
δ
ρ
]
(
R
c
w
P
w
+
t
c
w
)
δ
ξ
=
lim
[
δ
ϕ
δ
ρ
]
→
0
δ
ϕ
∧
(
R
c
w
P
w
+
t
c
w
)
+
δ
ρ
[
δ
ϕ
δ
ρ
]
=
[
−
(
R
c
w
P
w
+
t
c
w
)
∧
I
]
=
[
−
P
c
∧
I
]
3
×
6
\begin{aligned} \frac{\partial P^{c}}{\partial \delta\xi} &= \lim_{\delta\xi \rightarrow 0} \frac{\begin{bmatrix} \delta\phi^{\wedge} & \delta\rho \end{bmatrix} (R_{cw}P^{w}+t_{cw})}{\delta\xi} \\ &= \lim_{\begin{bmatrix}\delta\phi \\ \delta\rho \end{bmatrix} \rightarrow 0} \frac{\delta\phi^{\wedge}(R_{cw}P^{w}+t_{cw})+\delta\rho}{\begin{bmatrix} \delta\phi \\ \delta\rho\end{bmatrix}} \\ &= \begin{bmatrix} -(R_{cw}P^{w}+t_{cw})^{\wedge} & I \end{bmatrix} \\ &= \begin{bmatrix} -P^{c\wedge} & I \end{bmatrix}_{3 \times 6} \end{aligned}
∂δξ∂Pc=δξ→0limδξ[δϕ∧δρ](RcwPw+tcw)=[δϕδρ]→0lim[δϕδρ]δϕ∧(RcwPw+tcw)+δρ=[−(RcwPw+tcw)∧I]=[−Pc∧I]3×6其中,
δ
ξ
=
[
δ
ϕ
δ
ρ
]
\delta\xi=\begin{bmatrix}\delta\phi \\ \delta\rho \end{bmatrix}
δξ=[δϕδρ],
δ
ϕ
\delta\phi
δϕ表示旋转矩阵的增量,
δ
ρ
\delta\rho
δρ表示平移向量的增量,当然这里哪个在前哪个在后不会产生很大的影响,只是最终的雅克比矩阵前三列和后三列的位置不同而已。
点特征重投影误差关于位姿增量的雅克比矩阵为
∂
e
p
∂
δ
ξ
=
∂
e
p
∂
P
c
∂
P
c
∂
δ
ξ
=
−
[
f
x
P
z
c
0
f
x
P
x
c
P
z
c
2
0
f
y
P
z
c
f
y
P
y
c
P
z
c
2
]
[
−
P
c
∧
I
]
=
−
[
−
f
x
P
x
c
P
y
c
P
z
c
2
f
x
+
f
x
P
x
c
2
P
z
c
2
−
f
x
P
y
c
P
z
c
f
x
P
z
c
0
−
f
x
P
x
c
P
z
c
2
−
f
y
−
f
y
P
y
c
2
P
z
c
2
f
y
P
x
c
P
y
c
P
z
c
2
f
y
P
x
c
P
z
c
0
f
y
P
z
c
−
f
y
P
y
c
P
z
c
2
]
2
×
6
\begin{aligned} \frac{\partial e_{p}}{\partial \delta\xi} &= \frac{\partial e_{p}}{\partial P^{c}}\frac{\partial P^{c}}{\partial \delta\xi} \\ &= -\begin{bmatrix} \frac{f_{x}}{P_{z}^{c}} & 0 & \frac{f_{x}P_{x}^{c}}{P_{z}^{c2}} \\ 0 & \frac{f_{y}}{P_{z}^{c}} & \frac{f_{y}P_{y}^{c}}{P_{z}^{c2}} \end{bmatrix} \begin{bmatrix} -P^{c\wedge} & I \end{bmatrix} \\ &= -\begin{bmatrix} -\frac{f_{x}P_{x}^{c}P_{y}^{c}}{P_{z}^{c2}} & f_{x}+\frac{f_{x}P_{x}^{c2}}{P_{z}^{c2}} & -\frac{f_{x}P_{y}^{c}}{P_{z}^{c}} & \frac{f_{x}}{P_{z}^{c}} & 0 & -\frac{f_{x}P_{x}^{c}}{P_{z}^{c2}} \\ -f_{y}-\frac{f_{y}P_{y}^{c2}}{P_{z}^{c2}} & \frac{f_{y}P_{x}^{c}P_{y}^{c}}{P_{z}^{c2}} & \frac{f_{y}P_{x}^{c}}{P_{z}^{c}} & 0 & \frac{f_{y}}{P_{z}^{c}} & -\frac{f_{y}P_{y}^{c}}{P_{z}^{c2}} \end{bmatrix}_{2 \times 6} \end{aligned}
∂δξ∂ep=∂Pc∂ep∂δξ∂Pc=−[Pzcfx00PzcfyPzc2fxPxcPzc2fyPyc][−Pc∧I]=−⎣
⎡−Pzc2fxPxcPyc−fy−Pzc2fyPyc2fx+Pzc2fxPxc2Pzc2fyPxcPyc−PzcfxPycPzcfyPxcPzcfx00Pzcfy−Pzc2fxPxc−Pzc2fyPyc⎦
⎤2×6前面的负号主要和误差定义方式有关,这里我们是定义成匹配点减去空间投影点,如果误差是反过来定义的,则前面负号去掉就行。
3. 点特征重投影误差关于三维点坐标的雅克比矩阵
相比之下,误差关于三维点坐标的雅克比矩阵推导就容易多了。同样根据链式法则得
∂
e
p
∂
P
w
=
∂
e
p
∂
P
c
∂
P
c
∂
P
w
\frac{\partial e_{p}}{\partial P^{w}}=\frac{\partial e_{p}}{\partial P^{c}}\frac{\partial P^{c}}{\partial P^{w} }
∂Pw∂ep=∂Pc∂ep∂Pw∂Pc
第一项上一节已经算过了,第二项也容易
∂
P
c
∂
P
w
=
∂
(
R
c
w
P
w
+
t
c
w
)
∂
P
w
=
R
c
w
\begin{aligned} \frac{\partial P^{c}}{\partial P^{w}} &= \frac{\partial (R_{cw}P^{w}+t_{cw})}{\partial P^{w}} \\ &= R_{cw}\end{aligned}
∂Pw∂Pc=∂Pw∂(RcwPw+tcw)=Rcw所以
∂
e
p
∂
P
w
2
×
3
=
∂
e
p
∂
P
c
∂
P
c
∂
P
w
=
−
[
f
x
P
z
c
0
f
x
P
x
c
P
z
c
2
0
f
y
P
z
c
f
y
P
y
c
P
z
c
2
]
R
c
w
\begin{aligned} \frac{\partial e_{p}}{\partial P^{w}} _{2 \times 3} &= \frac{\partial e_{p}}{\partial P^{c}}\frac{\partial P^{c}}{\partial P^{w}} \\ &= -\begin{bmatrix} \frac{f_{x}}{P_{z}^{c}} & 0 & \frac{f_{x}P_{x}^{c}}{P_{z}^{c2}} \\ 0 & \frac{f_{y}}{P_{z}^{c}} & \frac{f_{y}P_{y}^{c}}{P_{z}^{c2}} \end{bmatrix}R_{cw} \end{aligned}
∂Pw∂ep2×3=∂Pc∂ep∂Pw∂Pc=−[Pzcfx00PzcfyPzc2fxPxcPzc2fyPyc]Rcw
4. g2o构建相应的顶点边
更新中
参考文献
[1] 高翔. 视觉SLAM十四讲[M].