Foreknowledge about Schur complement can be found here
Initialization
Preparation
As introduced here, we have
J=[∂r1∂tx∂r1∂ty∂r1∂tz∂r1∂ϕx∂r1∂ϕy∂r1∂ϕz∂r1∂a∂r1∂b∂r1∂ρ10...0∂r2∂tx∂r2∂ty∂r2∂tz∂r2∂ϕx∂r2∂ϕy∂r2∂ϕz∂r2∂a∂r2∂b0∂r2∂ρ2...0..........................................∂rN∂tx∂rN∂ty∂rN∂tz∂rN∂ϕx∂rN∂ϕy∂rN∂ϕz∂rN∂a∂rN∂b00...∂rN∂ρN] e=[r1r2...rN]x=[txtytzϕxϕyϕzabρ1ρ2...ρN]=[x1x2], where x1=[txtytzϕxϕyϕzab], x2=[ρ1ρ2...ρN]
In Gauss-Newton, our Hessian matrix can be formulated as
H=JTJ=[∂r1∂tx∂r2∂tx...∂rN∂tx∂r1∂ty∂r2∂ty...∂rN∂ty∂r1∂tz∂r2∂tz...∂rN∂tz∂r1∂ϕx∂r2∂ϕx...∂rN∂ϕx∂r1∂ϕy∂r2∂ϕy...∂rN∂ϕy∂r1∂ϕz∂r2∂ϕz...∂rN∂ϕz∂r1∂a∂r2∂a...∂rN∂a∂r1∂b∂r2∂b...∂rN∂b∂r1∂ρ10...00∂r2∂ρ2...00....00....00....00...0∂rN∂ρN][∂r1∂tx∂r1∂ty∂r1∂tz∂r1∂ϕx∂r1∂ϕy∂r1∂ϕz∂r1∂a∂r1∂b∂r1∂ρ10...0∂r2∂tx∂r2∂ty∂r2∂tz∂r2∂ϕx∂r2∂ϕy∂r2∂ϕz∂r2∂a∂r2∂b0∂r2∂ρ2...0..........................................∂rN∂tx∂rN∂ty∂rN∂tz∂rN∂ϕx∂rN∂ϕy∂rN∂ϕz∂rN∂a∂rN∂b00...∂rN∂ρN]=[H11H12HT12H22] H11=N∑i=1[(∂ri∂tx∂ri∂tx)(∂ri∂tx∂ri∂ty)(∂ri∂tx∂ri∂tz)(∂ri∂tx∂ri∂ϕx)(∂ri∂tx∂ri∂ϕy)(∂ri∂tx∂ri∂ϕz)(∂ri∂tx∂ri∂a)(∂ri∂tx∂ri∂b)(∂ri∂ty∂ri∂tx)(∂ri∂ty∂ri∂ty)(∂ri∂ty∂ri∂tz)(∂ri∂ty∂ri∂ϕx)(∂ri∂ty∂ri∂ϕy)(∂ri∂ty∂ri∂ϕz)(∂ri∂ty∂ri∂a)(∂ri∂ty∂ri∂b)(∂ri∂tz∂ri∂tx)(∂ri∂tz∂ri∂ty)(∂ri∂tz∂ri∂tz)(∂ri∂tz∂ri∂ϕx)(∂ri∂tz∂ri∂ϕy)(∂ri∂tz∂ri∂ϕz)(∂ri∂tz∂ri∂a)(∂ri∂tz∂ri∂b)(∂ri∂ϕx∂ri∂tx)(∂ri∂ϕx∂ri∂ty)(∂ri∂ϕx∂ri∂tz)(∂ri∂ϕx∂ri∂ϕx)(∂ri∂ϕx∂ri∂ϕy)(∂ri∂ϕx∂ri∂ϕz)(∂ri∂ϕx∂ri∂a)(∂ri∂ϕx∂ri∂b)(∂ri∂ϕy∂ri∂tx)(∂ri∂ϕy∂ri∂ty)(∂ri∂ϕy∂ri∂tz)(∂ri∂ϕy∂ri∂ϕx)(∂ri∂ϕy∂ri∂ϕy)(∂ri∂ϕy∂ri∂ϕz)(∂ri∂ϕy∂ri∂a)(∂ri∂ϕy∂ri∂b)(∂ri∂ϕz∂ri∂tx)(∂ri∂ϕz∂ri∂ty)(∂ri∂ϕz∂ri∂tz)(∂ri∂ϕz∂ri∂ϕx)(∂ri∂ϕz∂ri∂ϕy)(∂ri∂ϕz∂ri∂ϕz)(∂ri∂ϕz∂ri∂a)(∂ri∂ϕz∂ri∂b)(∂ri∂a∂ri∂tx)(∂ri∂a∂ri∂ty)(∂ri∂a∂ri∂tz)(∂ri∂a∂ri∂ϕx)(∂ri∂a∂ri∂ϕy)(∂ri∂a∂ri∂ϕz)(∂ri∂a∂ri∂a)(∂ri∂a∂ri∂b)(∂ri∂b∂ri∂tx)(∂ri∂b∂ri∂ty)(∂ri∂b∂ri∂tz)(∂ri∂b∂ri∂ϕx)(∂ri∂b∂ri∂ϕy)(∂ri∂b∂ri∂ϕz)(∂ri∂b∂ri∂a)(∂ri∂b∂ri∂b)] H12=[(∂r1∂tx∂r1∂ρ1)(∂r2∂tx∂r2∂ρ2)...(∂rN∂tx∂rN∂ρN)(∂r1∂ty∂r1∂ρ1)(∂r2∂ty∂r2∂ρ2)...(∂rN∂ty∂rN∂ρN)(∂r1∂tz∂r1∂ρ1)(∂r2∂tz∂r2∂ρ2)...(∂rN∂tz∂rN∂ρN)(∂r1∂ϕx∂r1∂ρ1)(∂r2∂ϕx∂r2∂ρ2)...(∂rN∂ϕx∂rN∂ρN)(∂r1∂ϕy∂r1∂ρ1)(∂r2∂ϕy∂r2∂ρ2)...(∂rN∂ϕy∂rN∂ρN)(∂r1∂ϕz∂r1∂ρ1)(∂r2∂ϕz∂r2∂ρ2)...(∂rN∂ϕz∂rN∂ρN)(∂r1∂a∂r1∂ρ1)(∂r2∂a∂r2∂ρ2)...(∂rN∂a∂rN∂ρN)(∂r1∂b∂r1∂ρ1)(∂r2∂b∂r2∂ρ2)...(∂rN∂b∂rN∂ρN)] H22=[(∂r1∂ρ1)20...00(∂r2∂ρ2)2...000...000...000..0(∂rN∂ρN)2] b=JTe=[∂r1∂tx∂r2∂tx...∂rN∂tx∂r1∂ty∂r2∂ty...∂rN∂ty∂r1∂tz∂r2∂tz...∂rN∂tz∂r1∂ϕx∂r2∂ϕx...∂rN∂ϕx∂r1∂ϕy∂r2∂ϕy...∂rN∂ϕy∂r1∂ϕz∂r2∂ϕz...∂rN∂ϕz∂r1∂a∂r2∂a...∂rN∂a∂r1∂b∂r2∂b...∂rN∂b∂r1∂ρ10...00∂r2∂ρ2...00....00....00....00...0∂rN∂ρN][r1r2...rN]=[∑Ni=1(∂ri∂txri)∑Ni=1(∂ri∂tyri)∑Ni=1(∂ri∂tzri)∑Ni=1(∂ri∂ϕxri)∑Ni=1(∂ri∂ϕyri)∑Ni=1(∂ri∂ϕzri)∑Ni=1(∂ri∂ari)∑Ni=1(∂ri∂bri)∂r1∂ρ1r1∂r2∂ρ2r2...∂rN∂ρNrN]Schur complement
Obviously, we can exploit the spartsiy in H22 to solve δx1 with
(H11−H12H−122HT12)δx1=−(b1−H12H−122b2)and solve δx2 with
δx2=−H−122(b2+HT12δx1)Remember,
H−122=[(∂r1∂ρ1)−20...00(∂r2∂ρ2)−2...000...000...000..0(∂rN∂ρN)−2]Codes
Variable used in CoarseInitializer |
Variable used here | Meaning |
---|---|---|
JbBuffer_new[i][0] |
∂ri∂tx∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][1] |
∂ri∂ty∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][2] |
∂ri∂tz∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][3] |
∂ri∂ϕx∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][4] |
∂ri∂ϕy∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][5] |
∂ri∂ϕz∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][6] |
∂ri∂a∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][7] |
∂ri∂b∂ri∂ρi | 第i 个点提供的计算H12所需的中间量 |
JbBuffer_new[i][8] |
ri∂ri∂ρi | 第i 个点提供的计算b所需的中间量 |
JbBuffer_new[i][9] |
(∂ri∂ρi)2 | 第i 个点提供的计算H22以及H−122所需的中间量 |
Accumulator9 acc9 |
计算H11和b1 | |
Accumulator9 acc9SC |
计算H12H−122HT12和H12H−122b2 | |
Accumulator11 E |
计算总的光度误差 |
Sliding Window Optimization
Preparation
For convenience, we consider only one residual (which is DEFINITELY IMPOSSIBLE) wrt. two frames in the following sections.
As introduced here, we have
J=[∂r∂C∂r∂ξiw∂r∂ai∂r∂ξjw∂r∂aj∂r∂ρ] e=[r]x=[Cξiwaiξjwajρ]=[x1x2], where x1=[Cξiwaiξjwaj], x2=[ρ]
Variable | Meaning |
---|---|
r | single residual |
C=[fxfycxcy] | intrinsic parameters (4 x 1 ) |
ξiw | pose Tiw of frame i (6 x 1 ) |
ai=[aibi] | photometric parameters of frame i (2 x 1 ) |
ξjw | pose Tjw of frame j (6 x 1 ) |
aj=[ajbj] | photometric parameters of frame j (2 x 1 ) |
ρ | inverse depth (1 x 1 ) |
Hessian
H=JTJ=[(∂r∂C)T(∂r∂ξiw)T(∂r∂ai)T(∂r∂ξjw)T(∂r∂aj)T(∂r∂ρ)T][∂r∂C∂r∂ξiw∂r∂ai∂r∂ξjw∂r∂aj∂r∂ρ]=[(∂r∂C)T∂r∂C(∂r∂C)T∂r∂ξiw(∂r∂C)T∂r∂ai(∂r∂C)T∂r∂ξjw(∂r∂C)T∂r∂aj(∂r∂C)T∂r∂ρ(∂r∂ξiw)T∂r∂C(∂r∂ξiw)T∂r∂ξiw(∂r∂ξiw)T∂r∂ai(∂r∂ξiw)T∂r∂ξjw(∂r∂ξiw)T∂r∂aj(∂r∂ξiw)T∂r∂ρ(∂r∂ai)T∂r∂C(∂r∂ai)T∂r∂ξiw(∂r∂ai)T∂r∂ai(∂r∂ai)T∂r∂ξjw(∂r∂ai)T∂r∂aj(∂r∂ai)T∂r∂ρ(∂r∂ξjw)T∂r∂C(∂r∂ξjw)T∂r∂ξiw(∂r∂ξjw)T∂r∂ai(∂r∂ξjw)T∂r∂ξjw(∂r∂ξjw)T∂r∂aj(∂r∂ξjw)T∂r∂ρ(∂r∂aj)T∂r∂C(∂r∂aj)T∂r∂ξiw(∂r∂aj)T∂r∂ai(∂r∂aj)T∂r∂ξjw(∂r∂aj)T∂r∂aj(∂r∂aj)T∂r∂ρ(∂r∂ρ)T∂r∂C(∂r∂ρ)T∂r∂ξiw(∂r∂ρ)T∂r∂ai(∂r∂ρ)T∂r∂ξjw(∂r∂ρ)T∂r∂aj(∂r∂ρ)T∂r∂ρ]=[H11H12HT12H22] H11=[(∂r∂C)T∂r∂C(∂r∂C)T∂r∂ξiw(∂r∂C)T∂r∂ai(∂r∂C)T∂r∂ξjw(∂r∂C)T∂r∂aj(∂r∂ξiw)T∂r∂C(∂r∂ξiw)T∂r∂ξiw(∂r∂ξiw)T∂r∂ai(∂r∂ξiw)T∂r∂ξjw(∂r∂ξiw)T∂r∂aj(∂r∂ai)T∂r∂C(∂r∂ai)T∂r∂ξiw(∂r∂ai)T∂r∂ai(∂r∂ai)T∂r∂ξjw(∂r∂ai)T∂r∂aj(∂r∂ξjw)T∂r∂C(∂r∂ξjw)T∂r∂ξiw(∂r∂ξjw)T∂r∂ai(∂r∂ξjw)T∂r∂ξjw(∂r∂ξjw)T∂r∂aj(∂r∂aj)T∂r∂C(∂r∂aj)T∂r∂ξiw(∂r∂aj)T∂r∂ai(∂r∂aj)T∂r∂ξjw(∂r∂aj)T∂r∂aj] H12=[(∂r∂C)T∂r∂ρ(∂r∂ξiw)T∂r∂ρ(∂r∂ai)T∂r∂ρ(∂r∂ξjw)T∂r∂ρ(∂r∂aj)T∂r∂ρ] H22=[(∂r∂ρ)T∂r∂ρ]=[(∂r∂ρ)2]b
b=JTe=[(∂r∂C)T(∂r∂ξiw)T(∂r∂ai)T(∂r∂ξjw)T(∂r∂aj)T(∂r∂ρ)T]r b1=[r(∂r∂C)Tr(∂r∂ξiw)Tr(∂r∂ai)Tr(∂r∂ξjw)Tr(∂r∂aj)T] b2=[r(∂r∂ρ)T]Implementation
In the real implementation, the author didn’t directly compute ∂r∂ξiw, ∂r∂ξjw, ∂r∂ai and ∂r∂aj. Instead, he used the chain rules
∂r∂ξiw=∂r∂ξji∂ξji∂ξiw ∂r∂ξjw=∂r∂ξji∂ξji∂ξjw ∂r∂ai=∂r∂[−eaji−bji]∂[−eaji−bji]∂ai ∂r∂aj=∂r∂[−eaji−bji]∂[−eaji−bji]∂ajAnd their tranposes are
(∂r∂ξiw)T=(∂ξji∂ξiw)T(∂r∂ξji)T (∂r∂ξjw)T=(∂ξji∂ξjw)T(∂r∂ξji)T (∂r∂ai)T=(∂[−eaji−bji]∂ai)T(∂r∂[−eaji−bji])T (∂r∂aj)T=(∂[−eaji−bji]∂aj)T(∂r∂[−eaji−bji])TDetails about these Jacobians can be found in this post.