初始化总体流程如下:
q c 0 b k = q c 0 c k ⊗ q b c − 1 \mathbf{q}_{c_{0} b_{k}}=\mathbf{q}_{c_{0} c_{k}} \otimes \mathbf{q}_{b c}^{-1} qc0bk=qc0ck⊗qbc−1
s p ‾ c 0 b k = s p ‾ c 0 c k − R c 0 b k p b c s \overline{\mathbf{p}}_{c_{0} b_{k}}=s \overline{\mathbf{p}}_{c_{0} c_{k}}-\mathbf{R}_{c_{0} b_{k}} \mathbf{p}_{b c} spc0bk=spc0ck−Rc0bkpbc
关于字母下标
相邻两时刻 k , k + 1 k, k+1 k,k+1 之间有: IMU 旋转积分 q b k b k + 1 \mathbf{q}_{b_{k} b_{k+1}} qbkbk+1, 视觉测量 q c k c k + 1 \mathbf{q}_{c_{k} c_{k+1}} qckck+1 。则有:
所以
q b k b k + 1 ⊗ q b c = q b c ⊗ q c k c k + 1 \mathbf{q}_{b_{k} b_{k+1}} \otimes \mathbf{q}_{b c}=\mathbf{q}_{b c} \otimes \mathbf{q}_{c_{k} c_{k+1}} qbkbk+1⊗qbc=qbc⊗qckck+1
上式可写成:
( [ q b k b k + 1 ] L − [ q c k c k + 1 ] R ) q b c = Q k + 1 k ⋅ q b c = 0 \left(\left[\mathbf{q}_{b_{k} b_{k+1}}\right]_{L}-\left[\mathbf{q}_{c_{k} c_{k+1}}\right]_{R}\right) \mathbf{q}_{b c}=\mathbf{Q}_{k+1}^{k} \cdot \mathbf{q}_{b c}=\mathbf{0} ([qbkbk+1]L−[qckck+1]R)qbc=Qk+1k⋅qbc=0
其中, [ ⋅ ] L , [ ⋅ ] R [\cdot]_{L},[\cdot]_{R} [⋅]L,[⋅]R 表示 left and right quaternion multiplication 。
将多个时刻线性方程(6)累计起来,并加上鲁棒核权重得到:
[ w 1 0 ⋅ Q 1 0 w 2 1 ⋅ Q 2 1 ⋮ w N N − 1 ⋅ Q N N − 1 ] q b c = Q N ⋅ q b c = 0 \left[\begin{array}{c} w_{1}^{0} \cdot \mathbf{Q}_{1}^{0} \\ w_{2}^{1} \cdot \mathbf{Q}_{2}^{1} \\ \vdots \\ w_{N}^{N-1} \cdot \mathbf{Q}_{N}^{N-1} \end{array}\right] \mathbf{q}_{b c}=\mathbf{Q}_{N} \cdot \mathbf{q}_{b c}=\mathbf{0} ⎣⎢⎢⎢⎡w10⋅Q10w21⋅Q21⋮wNN−1⋅QNN−1⎦⎥⎥⎥⎤qbc=QN⋅qbc=0
其中:
w k + 1 k = { 1 , r k + 1 k < threshold threshold r k + 1 k , otherwise w_{k+1}^{k}=\left\{\begin{array}{ll} 1, & r_{k+1}^{k}<\text { threshold } \\ \frac{\text { threshold }}{r_{k+1}^{k}}, & \text { otherwise } \end{array}\right. wk+1k={1,rk+1k threshold ,rk+1k< threshold otherwise
由旋转矩阵和轴角之间的关系tr(R) = 1 + 2 cos θ
,能得到角度误差 r的计算为:
r k + 1 k = acos ( ( tr ( R ^ b c − 1 R b k b k + 1 − 1 R ^ b c R c k c k + 1 ) − 1 ) / 2 ) r_{k+1}^{k}=\operatorname{acos}\left(\left(\operatorname{tr}\left(\hat{\mathbf{R}}_{b c}^{-1} \mathbf{R}_{b_{k} b_{k+1}}^{-1} \hat{\mathbf{R}}_{b c} \mathbf{R}_{c_{k} c_{k+1}}\right)-1\right) / 2\right) rk+1k=acos((tr(R^bc−1Rbkbk+1−1R^bcRckck+1)−1)/2)
注意:
- 带上冒号的表示估计值
- 求解同样采用 SVD 分解,即最小奇异值对应的奇异向量。(如果倒数第二个奇异值比较小,那么表示估计的值并不是特别有效,噪声太大)
这里认为相机估计是准确的,陀螺仪被认为不准确(带有bias)
如果外参数 q b c \mathbf{q}_{b c} qbc 已标定好,利用旋转约束,可估计陀螺仪 bias:
arg min δ b g ∑ k ∈ B ∥ 2 ⌊ q c 0 b k + 1 − 1 ⊗ q c 0 b k ⊗ q b k b k + 1 ⌋ x y z ∥ 2 \arg \min _{\delta \mathbf{b} g} \sum_{k \in B}\left\|2\left\lfloor\mathbf{q}_{c_{0} b_{k+1}}^{-1} \otimes \mathbf{q}_{c_{0} b_{k}} \otimes \mathbf{q}_{b_{k} b_{k+1}}\right\rfloor_{x y z}\right\|^{2} argδbgmink∈B∑∥∥∥∥2⌊qc0bk+1−1⊗qc0bk⊗qbkbk+1⌋xyz∥∥∥∥2
其中, B B B 表示所有的图像关键坝集合,另有预积分的一阶泰勒近似:
q b k b k + 1 ≈ q ^ b k b k + 1 ⊗ [ 1 1 2 J b 9 q δ b g ] \mathbf{q}_{b_{k} b_{k+1}} \approx \hat{\mathbf{q}}_{b_{k} b_{k+1}} \otimes\left[\begin{array}{c} 1 \\ \frac{1}{2} \mathbf{J}_{b^{9}}^{\mathbf{q}} \delta \mathbf{b}^{g} \end{array}\right] qbkbk+1≈q^bkbk+1⊗[121Jb9qδbg]
公式为普通的最小二乘问题,求取雅克比矩阵,构建正定方程 H X = b \mathbf{H X}=\mathbf{b} HX=b 即可以求解。
注意这里是将bias的的bias积分进入累加的
几何约束(前期知识)
考虑相机坐标系 c 0 c_{0} c0 为世界坐标系, 则利用外参数 q b c , t b c \mathbf{q}_{b c}, \mathbf{t}_{b c} qbc,tbc 构建等式
q c 0 b k = q c 0 c k ⊗ q b c − 1 s p ‾ c 0 b k = s p ‾ c 0 c k − R c 0 b k p b c \begin{aligned} \mathbf{q}_{c_{0} b_{k}} &=\mathbf{q}_{c_{0} c_{k}} \otimes \mathbf{q}_{b c}^{-1} \\ s \overline{\mathbf{p}}_{c_{0} b_{k}} &=s \overline{\mathbf{p}}_{c_{0} c_{k}}-\mathbf{R}_{c_{0} b_{k}} \mathbf{p}_{b c} \end{aligned} qc0bkspc0bk=qc0ck⊗qbc−1=spc0ck−Rc0bkpbc
其中, s s s 为尺度因子, p ‾ \overline{\mathbf{p}} p 表示非米制 单位的轨迹。上面等式等价于
p ‾ c 0 b k = p ‾ c 0 c k − 1 s R c 0 b k p b c p ‾ c 0 c k = 1 s R c 0 b k p b c + p ‾ c 0 b k \begin{array}{l} \overline{\mathbf{p}}_{c_{0} b_{k}}=\overline{\mathbf{p}}_{c_{0} c_{k}}-\frac{1}{s} \mathbf{R}_{c_{0} b_{k}} \mathbf{p}_{b c} \\ \overline{\mathbf{p}}_{c_{0} c_{k}}=\frac{1}{s} \mathbf{R}_{c_{0} b_{k}} \mathbf{p}_{b c}+\overline{\mathbf{p}}_{c_{0} b_{k}} \end{array} pc0bk=pc0ck−s1Rc0bkpbcpc0ck=s1Rc0bkpbc+pc0bk
需要估计的变量
X I = [ v 0 b 0 , v 1 b 1 , ⋯ v n b n , g c 0 , s ] ⊤ \mathcal{X}_{I}=\left[\mathbf{v}_{0}^{b_{0}}, \mathbf{v}_{1}^{b_{1}}, \cdots \mathbf{v}_{n}^{b_{n}}, \mathbf{g}^{c_{0}}, s\right]^{\top} XI=[v0b0,v1b1,⋯vnbn,gc0,s]⊤
其中:
- v k b k \mathbf{v}_{k}^{b_{k}} vkbk 表示 k k k 时刻 body 坐标系的速度在 body 坐标系下的表示。
- g c 0 \mathrm{g}^{c_{0}} gc0 为重力向量在第 0 帧相机坐标系下的表示。
- s s s 表示尺度因子,将视觉轨迹拉伸到米制单位。
回顾:预积分量约束
α b i b j = q b i w ( p w b j − p w b i − v i w Δ t + 1 2 g w Δ t 2 ) β b i b j = q b i w ( v j w − v i w + g w Δ t ) \begin{array}{l} \boldsymbol{\alpha}_{b_{i} b_{j}}=\mathbf{q}_{b_{i} w}\left(\mathbf{p}_{w b_{j}}-\mathbf{p}_{w b_{i}}-\mathbf{v}_{i}^{w} \Delta t+\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}\right) \\ \boldsymbol{\beta}_{b_{i} b_{j}}=\mathbf{q}_{b_{i} w}\left(\mathbf{v}_{j}^{w}-\mathbf{v}_{i}^{w}+\mathbf{g}^{w} \Delta t\right) \end{array} αbibj=qbiw(pwbj−pwbi−viwΔt+21gwΔt2)βbibj=qbiw(vjw−viw+gwΔt)
将世界坐标系 w w w 换成相机初始时刻坐标系 c 0 c_{0} c0 有
α b k b k + 1 = R b k c 0 ( s ( p ‾ c 0 b k + 1 − p ‾ c 0 b k ) + 1 2 g c 0 Δ t k 2 − R c 0 b k v k b k Δ t k ) β b k b k + 1 = R b k c 0 ( R c 0 b k + 1 v k + 1 b k + 1 + g c 0 Δ t k − R c 0 b k v k b k ) \begin{aligned} \boldsymbol{\alpha}_{b_{k} b_{k+1}} &=\mathbf{R}_{b_{k} c_{0}}\left(s\left(\overline{\mathbf{p}}_{c_{0} b_{k+1}}-\overline{\mathbf{p}}_{c_{0} b_{k}}\right)+\frac{1}{2} \mathbf{g}^{c_{0}} \Delta t_{k}^{2}-\mathbf{R}_{c_{0} b_{k}} \mathbf{v}_{k}^{b_{k}} \Delta t_{k}\right) \\ \boldsymbol{\beta}_{b_{k} b_{k+1}} &=\mathbf{R}_{b_{k} c_{0}}\left(\mathbf{R}_{c_{0} b_{k+1}} \mathbf{v}_{k+1}^{b_{k+1}}+\mathbf{g}^{c_{0}} \Delta t_{k}-\mathbf{R}_{c_{0} b_{k}} \mathbf{v}_{k}^{b_{k}}\right) \end{aligned} αbkbk+1βbkbk+1=Rbkc0(s(pc0bk+1−pc0bk)+21gc0Δtk2−Rc0bkvkbkΔtk)=Rbkc0(Rc0bk+1vk+1bk+1+gc0Δtk−Rc0bkvkbk)
将【几何约束(前期知识)】部分公式代入上面进行简单整理有:
α b k b k + 1 = s R b k c 0 ( p ‾ c 0 c k + 1 − p ‾ c 0 c k ) − R b k c 0 R c 0 b k + 1 p b c + p b c + 1 2 R b k c 0 g c 0 Δ t k 2 − v k b k Δ t k \begin{aligned} \boldsymbol{\alpha}_{b_{k} b_{k+1}}=& s \mathbf{R}_{b_{k} c_{0}}\left(\overline{\mathbf{p}}_{c_{0} c_{k+1}}-\overline{\mathbf{p}}_{c_{0} c_{k}}\right) \\ &-\mathbf{R}_{b_{k} c_{0}} \mathbf{R}_{c_{0} b_{k+1}} \mathbf{p}_{b c}+\mathbf{p}_{b c}+\frac{1}{2} \mathbf{R}_{b_{k} c_{0}} \mathbf{g}^{c_{0}} \Delta t_{k}^{2}-\mathbf{v}_{k}^{b_{k}} \Delta t_{k} \end{aligned} αbkbk+1=sRbkc0(pc0ck+1−pc0ck)−Rbkc0Rc0bk+1pbc+pbc+21Rbkc0gc0Δtk2−vkbkΔtk
将待估计变量放到方程右边, 有:
z ^ b k + 1 b k = [ α ^ b k b k + 1 − p b c + R b k c 0 R c 0 b k + 1 p b c β ^ b k b k + 1 ] = H b k + 1 b k X I k + n b k + 1 b k \hat{\mathbf{z}}_{b_{k+1}}^{b_{k}}=\left[\begin{array}{c} \hat{\boldsymbol{\alpha}}_{b_{k}} b_{k+1}-\mathbf{p}_{b c}+\mathbf{R}_{b_{k} c_{0}} \mathbf{R}_{c_{0} b_{k+1}} \mathbf{p}_{b c} \\ \hat{\boldsymbol{\beta}}_{b_{k} b_{k+1}} \end{array}\right]=\mathbf{H}_{b_{k+1}}^{b_{k}} \mathcal{X}_{I}^{k}+\mathbf{n}_{b_{k+1}}^{b_{k}} z^bk+1bk=[α^bkbk+1−pbc+Rbkc0Rc0bk+1pbcβ^bkbk+1]=Hbk+1bkXIk+nbk+1bk
公式中:
X I k = [ v k b k , v k + 1 b k + 1 , g c 0 , s ] ⊤ H b k + 1 b k = [ − I Δ t k 0 1 2 R b k c 0 Δ t k 2 R b k c 0 ( p ‾ c k + 1 c 0 − p ‾ c k c 0 ) − I R b k c 0 R c 0 b k + 1 R b k c 0 Δ t k 0 ] \begin{aligned} \mathcal{X}_{I}^{k} &=\left[\mathbf{v}_{k}^{b_{k}}, \mathbf{v}_{k+1}^{b_{k+1}}, \mathbf{g}^{c_{0}}, s\right]^{\top} \\ \mathbf{H}_{b_{k+1}}^{b_{k}} &=\left[\begin{array}{cccc} -\mathbf{I} \Delta t_{k} & \mathbf{0} & \frac{1}{2} \mathbf{R}_{b_{k} c_{0}} \Delta t_{k}^{2} & \mathbf{R}_{b_{k} c_{0}}\left(\overline{\mathbf{p}}_{c_{k+1}}^{c_{0}}-\overline{\mathbf{p}}_{c_{k}}^{c_{0}}\right) \\ -\mathbf{I} & \mathbf{R}_{b_{k} c_{0}} \mathbf{R}_{c_{0} b_{k+1}} & \mathbf{R}_{b_{k} c_{0}} \Delta t_{k} & \mathbf{0} \end{array}\right] \end{aligned} XIkHbk+1bk=[vkbk,vk+1bk+1,gc0,s]⊤=[−IΔtk−I0Rbkc0Rc0bk+121Rbkc0Δtk2Rbkc0ΔtkRbkc0(pck+1c0−pckc0)0]
转化成线性最小二乘问题对状态量进行求解:
min X I ∑ k ∈ B ∥ z ^ b k + 1 b k − H b k + 1 b k X I k ∥ 2 \min _{\mathcal{X}_{I}} \sum_{k \in \mathcal{B}}\left\|\hat{\mathbf{z}}_{b_{k+1}}^{b_{k}}-\mathbf{H}_{b_{k+1}}^{b_{k}} \mathcal{X}_{I}^{k}\right\|^{2} XImink∈B∑∥∥∥z^bk+1bk−Hbk+1bkXIk∥∥∥2
疑问:为什么需要优化重力向量
在STEP 3中利用公式求解重力向量 g c 0 \mathbf{g}^{c_{0}} gc0 过程中,并没有加入模长限制 ∣ g c 0 ∥ = 9.81 \mid g^{c_{0}} \|=9.81 ∣gc0∥=9.81 。 三维变量 g c 0 \mathbf{g}^{c_{0}} gc0 实际只有两个自由度。
重力向量参数化
三维向量自由度为 2,可以采用球面坐标进行参数化: 东北天=XYZ,这里的w1应该属于010也就是北
g ^ c 0 = ∥ g ∥ ⋅ g ‾ ^ c 0 ^ c 0 + w 1 b ⃗ 1 + w 2 b ⃗ 2 \hat{\mathrm{g}}^{c_{0}}=\|g\| \cdot \hat{\hat{\overline{\mathbf{g}}}^{c_{0}}}^{c_{0}}+w_{1} \vec{b}_{1}+w_{2} \vec{b}_{2} g^c0=∥g∥⋅g^c0^c0+w1b1+w2b2
其中:
w 1 , w 2 w 1, w 2 w1,w2 为待优化变量。
g ^ c 0 \hat{\mathrm{g}}^{c_{0}} g^c0 为重力向量在第 0 帧相机坐标系下的表示。
g ‾ ^ c 0 \hat{\overline{\mathbf{g}}}^{c_{0}} g^c0 表示方向向量
b ⃗ 1 = { ( g ‾ ^ c 0 × [ 1 , 0 , 0 ] ) , g ^ c 0 ≠ [ 1 , 0 , 0 ] ⊤ ( g ‾ ^ c 0 × [ 0 , 0 , 1 ] ) , otherwise b ⃗ 2 = g ‾ ^ c 0 × b ⃗ 1 \begin{array}{l} \vec{b}_{1}=\left\{\begin{array}{ll} \left(\hat{\overline{\mathbf{g}}}^{c_{0}} \times[1,0,0]\right), & \hat{\mathbf{g}}^{c_{0}} \neq[1,0,0]^{\top} \\ \left(\hat{\overline{\mathbf{g}}}^{c_{0}} \times[0,0,1]\right), & \text { otherwise } \end{array}\right. \\ \vec{b}_{2}=\hat{\overline{\mathbf{g}}}^{c_{0}} \times \vec{b}_{1} \end{array} b1=⎩⎨⎧(g^c0×[1,0,0]),(g^c0×[0,0,1]),g^c0=[1,0,0]⊤ otherwise b2=g^c0×b1
将公式代入STEP 3 的公式(13), 待优化变量变为:
X I k = [ v k b k v k + 1 b k + 1 g c 0 s ] → [ v k b k v k + 1 b k + 1 w c 0 s ] \mathcal{X}_{I}^{k}=\left[\begin{array}{c} \mathbf{v}_{k}^{b_{k}} \\ \mathbf{v}_{k+1}^{b_{k+1}} \\ \mathbf{g}^{c_{0}} \\ s \end{array}\right] \rightarrow\left[\begin{array}{c} \mathbf{v}_{k}^{b_{k}} \\ \mathbf{v}_{k+1}^{b_{k+1}} \\ \mathbf{w}^{c_{0}} \\ s \end{array}\right] XIk=⎣⎢⎢⎡vkbkvk+1bk+1gc0s⎦⎥⎥⎤→⎣⎢⎢⎡vkbkvk+1bk+1wc0s⎦⎥⎥⎤
STEP 3中公式(13)中的观测方程变为:
z ^ b k + 1 b k = [ α b k b k + 1 − p b c + R b k c 0 R c 0 b k + 1 p b c − 1 2 R b k c 0 Δ t k 2 ∥ g ∥ ⋅ g ^ c 0 β b k b k + 1 − R b k c 0 Δ t k ∥ g ∥ ⋅ g ^ c 0 ] \hat{\mathbf{z}}_{b_{k+1}}^{b_{k}}=\left[\begin{array}{c} \boldsymbol{\alpha}_{b_{k} b_{k+1}}-\mathbf{p}_{b c}+\mathbf{R}_{b_{k} c_{0}} \mathbf{R}_{c_{0} b_{k+1}} \mathbf{p}_{b c}-\frac{1}{2} \mathbf{R}_{b_{k} c_{0}} \Delta t_{k}^{2}\|g\| \cdot \hat{\mathbf{g}}^{c_{0}} \\ \boldsymbol{\beta}_{b_{k} b_{k+1}}-\mathbf{R}_{b_{k} c_{0}} \Delta t_{k}\|g\| \cdot \hat{\mathbf{g}}^{c_{0}} \end{array}\right] z^bk+1bk=[αbkbk+1−pbc+Rbkc0Rc0bk+1pbc−21Rbkc0Δtk2∥g∥⋅g^c0βbkbk+1−Rbkc0Δtk∥g∥⋅g^c0]
采用最小二乘对 X I \mathcal{X}_{I} XI 进行重新优化。
计算到这儿,我们得到了重力加速度相对于相机初始时刻坐标系向量 g ^ c 0 \hat{\mathrm{g}}^{c_{0}} g^c0。当然,重力向量相对于世界坐标系的绝对向量我们是一直知道的就是 g = [ 0 , 0 , 9.81 ] T \boldsymbol{g}=[0,0,9.81]^{T} g=[0,0,9.81]T,根据这两个重力向量我们就可以知道相机坐标系相对于世界坐标系的关系了,以此为依据将这两个坐标系对齐。
步骤如下:
u = g ^ c 0 × g ^ w ∥ g ^ c 0 × g ^ w ∥ , θ = atan 2 ( ∥ g ^ c 0 × g ^ w ∥ , g ^ c 0 ⋅ g ^ w ) \mathbf{u}=\frac{\hat{\mathbf{g}}^{c_{0}} \times \hat{\mathbf{g}}^{w}}{\left\|\hat{\mathbf{g}}^{c_{0}} \times \hat{\mathbf{g}}^{w}\right\|}, \quad \theta=\operatorname{atan} 2\left(\left\|\hat{\mathbf{g}}^{c_{0}} \times \hat{\mathbf{g}}^{w}\right\|, \hat{\mathbf{g}}^{c_{0}} \cdot \hat{\mathbf{g}}^{w}\right) u=∥g^c0×g^w∥g^c0×g^w,θ=atan2(∥g^c0×g^w∥,g^c0⋅g^w)
这里的 u \bf{u} u是旋转轴。通过将两个重力加速度量叉乘可以得到一个垂直于两个重力向量的向量,以此作为旋转轴,根据向量内积求解两个重力向量的夹角,根据轴角转化为旋转矩阵。就得到了两个坐标系之间的旋转。
简述视觉初始化过程
一些容易疑惑的点
深蓝学院手写VIO课程