0%

gtsam官方文档:The new IMU Factor

本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。

导航状态

定义导航状态为 \(X^n_b=\{R^n_b,P^n_b,V^n_b\}\)

  • 上角标n:导航(navigation)坐标系
  • 下角标b:载体(body)坐标系

下文均省略上下标

矢量场与微分方程

对于导航问题我们用如下微分方程描述 \(\dot X(t)=F(t,X)\)

  • \(F\) :时变矢量场
  • \(\dot X(t)\): 一个三元组的切向量,\(\dot X(t)=[\dot{R}(t, X), \dot{P}(t, X), \dot{V}(t, X)] \in \mathfrak{s0}(3) \times \mathbb{R}^{3} \times \mathbb{R}^{3}\)
  • \(X\) 处由所有切向量组成的空间表示为 \(T_XM\) ,即\(F(t,X) \in T_XM\)
  • \(\dot R=R[\omega ]_X\)

\[ \dot{X}(t)=[\dot{R}(X, t), V(t), \dot{V}(X, t)]=\left[R(t)\left[\omega^{b}(t)\right]_{\times}, V(t), g+R(t) a^{b}(t)\right] \]

局部坐标

基于流形空间的优化基于局部坐标的概念。当初始位姿为\(R_0\),定义一个局部映射\(\Phi _{R_0}(\theta)\) 从局部坐标 \(\theta\in \mathbb{R}^3\) 映射到 \(R_0\) 的邻域: \[ \Phi_{R_{0}}(\theta)=R_{0} \exp \left([\theta]_{\times}\right) \] 局部坐标系\(\theta\) 和切向量是同构的,定义\(\theta=\omega t\),有 \[ \left.\frac{d \Phi_{R_{0}}(\omega t)}{d t}\right|_{t=0}=\left.\frac{d R_{0} \exp \left([\omega t]_{\times}\right)}{d t}\right|_{t=0}=R_{0}[\omega]_{\times} \]

  • 原文这里有一个笔误,反对称矩阵里面应该没有\(t\)

因此,三维向量\(\omega\)表示了在\(SO(3)\)流形上的前进方向,但是仅在\(R_0\)附近的局部坐标系上有效。

类似的,可以定义在\(SE(3)\)上的局部坐标 \(\xi=[\omega t, v t] \in \mathbb{R}^{6}\)与其对应的映射函数 \[ \Phi_{T_{0}}(\xi)=T_{0} \exp \hat{\xi} \]

局部坐标系映射的导数

定义一个\(3\times3\)的雅克比矩阵模拟增量 \(\delta\) 对局部坐标系的影响。 \[ \Phi_{R_{0}}(\theta+\delta) \approx \Phi_{R_{0}}(\theta) \exp \left([H(\theta) \delta]_{\times}\right)=\Phi_{\Phi_{R_{0}}(\theta)}(H(\theta) \delta) \] 这个雅克比的计算仅仅依赖\(\theta\) \[ H(\theta)=\sum_{k=0}^{\infty} \frac{(-1)^{k}}{(k+1) !}[\theta]_{\times}^{k} \]

局部坐标中的数值积分

对于问题\(\dot R(t)=F(R,t)\),我们将其解建模为\(R(t)=\Phi_{R_{0}}(\theta(t))\)

定义 \[ \gamma(\delta)=R(t+\delta)=\Phi_{R_{0}}(\theta(t)+\dot{\theta}(t) \delta) \approx \Phi_{R(t)}(H(\theta) \dot{\theta}(t) \delta) \]

\[ \dot{R}(t)=\left.\frac{d \gamma(\delta)}{d \delta}\right|_{\delta=0}=\left.\frac{d \Phi_{R(t)}(H(\theta) \dot{\theta}(t) \delta)}{d \delta}\right|_{\delta=0}=R[t][H(\theta) \dot{\theta}(t)]_{\times} \]

  • 关于这一节将数值积分内容是导数:数值积分用欧拉法用一阶导数近似迭代计算积分

收缩

\[ \mathcal{R}_{X_{0}}(\zeta)=\left\{\Phi_{R_{0}}(\omega t), P_{0}+R_{0} v t, V_{0}+R_{0} a t\right\} \]

  • \(\zeta=[\omega t, v t, a t]\)
  • \(X_0\)处的切向量为\(\left.\frac{d \mathcal{R}_{X_{0}}(\zeta)}{d t}\right|_{t=0}=\left[R_{0}[\omega]_{\times}, R_{0} v, R_{0} a\right]\)

基于局部坐标的积分

将状态表示为时间的函数 \[ X(t)=\mathcal{R}_{X_{0}}(\zeta(t))=\left\{\Phi_{R_{0}}(\theta(t)), P_{0}+R_{0} p(t), V_{0}+R_{0} v(t)\right\} \]

定义一个轨迹函数\(\gamma(\delta)\),自变量为时间的增量\(\delta\),每一个\(\delta\)对应状态空间的条轨迹,\(\gamma(\delta)\)表示轨迹簇,并在\(\delta=0\)时通过X(t): \[ \gamma(\delta)=X(t+\delta)=\left\{\Phi_{R_{0}}(\theta(t)+\dot{\theta}(t) \delta), P_{0}+R_{0}\{p(t)+\dot{p}(t) \delta\}, V_{0}+R_{0}\{v(t)+\dot{v}(t) \delta\}\right\} \]

  • \(\Phi_{R_{0}}(\theta(t+\delta))=\Phi_{R_{0}}(\theta(t)+\dot{\theta}(t) \delta)\)
    • 这一步骤是用一阶导数近似,后面两项相同

导航状态的导数可以表示为

\[ \dot{X}(t)=\left.\frac{d \gamma(\delta)}{d \delta}\right|_{\delta=0}=\left[R(t)\left[H(\theta) \dot{\theta}(t)\right]_{\times}, R_{0} \dot{p}(t), R_{0} \dot{v}(t)\right] \]

应用:新的IMU因子

铺垫了这么多 终于进入核心内容了

在Lupton 的论文(On-Manifold Preintegration for Real-Time Visual–Inertial Odometry)中,当不知道导航状态\(X_i\)的状态时,无法对重力加速度进行补偿,因此吧速度拆成重力加速和比力两部分。

  • 注:IMU测的加速度实际上是比力(Specific force)--\(f^b\)
    • \(f^b=R^b_n(a_{ii}^n-g^n)\)
    • 我们真正需要的加速度是相对于惯性系的线性加速度 \(a_{ii}^n=R^n_bf^b+g^n\)
    • 要对重力进行补偿就需要知道载体坐标系相对导航坐标系的相对位姿

对速度项做拆分

  • Lupton 原文的预积分拆法表达

\[ v_{t 2}^{n}=v_{t 1}^{n}+\int_{t 1}^{t 2}\left(R_{b t}^{n}\left(f_{t}^{b}-b i a s_{f}^{o b s}\right)+g^{n}\right) d t=v_{t 1}^{n}+\int_{t 1}^{t 2} g^{n} d t+R_{b t 1}^{n} \int_{t 1}^{t 2}\left(R_{b t}^{b t 1}\left(f_{t}^{b}-b i a s_{f}^{o b s}\right)\right) d t \]

​ 把原文这个式子左右两边同乘\(R^{bt1}_n\)\[ v_{t 2}^{bt 1}=v_{t 1}^{bt}+R^{bt1}_n\int_{t 1}^{t 2} g^{n} d t+ \int_{t 1}^{t 2}\left(R_{b t}^{b t 1}\left(f_{t}^{b}-b i a s_{f}^{o b s}\right)\right) d t\tag{1} \]

  • 本文档的表达 \(v(t)=v_g(t)+v_a(t)\)

    进一步的

\[ \begin{aligned} &\dot{v}_{g}(t)=R_{i}^{T} g \\ &\dot{v}_{a}(t)=R_{b}^{i}(t) a^{b}(t) \end{aligned} \]

​ 这里的公式和\((1)\)中相同。

对位置项做拆分

  • Lupton原文的拆法

\[ p_{t 2}^{n}=p_{t 1}^{n}+(t 2-t 1) v_{t 1}^{n}+\iint_{t 1}^{t 2}\left(R_{b t}^{n}\left(f_{t}^{b}-b i a s_{f}^{o b s}\right)+g^{n}\right) d t^{2}= p_{t 1}^{n}+(t 2-t 1) v_{t 1}^{n}+\iint_{t 1}^{t 2} g^{n} d t^{2}+R_{b t 1}^{n} \iint_{t 1}^{t 2}\left(R_{b t}^{b t 1}\left(f_{t}^{b}-b i a s_{f}^{o b s}\right)\right) d t^{2} \]

​ 把原文这个式子左右两边同乘\(R^{bt1}_n\)\[ p_{t 2}^{bt1}= p_{t 1}^{bt1}+(t 2-t 1) v_{t 1}^{bt1}+R_{n}^{bt1}\iint_{t 1}^{t 2} g^{n} d t^{2}+ \iint_{t 1}^{t 2}\left(R_{b t}^{b t 1}\left(f_{t}^{b}-b i a s_{f}^{o b s}\right)\right) d t^{2} \tag{2} \]

  • gtsam文档拆法表达

\[ \begin{aligned} &p(t)=p_{i}(t)+p_{g}(t)+p_{v}(t) \\ &\dot{p}_{i}(t)=R_{i}^{T} V_{i} \\ &\dot{p}_{g}(t)=v_{g}(t)=R_{i}^{T} g t \\ &\dot{p}_{v}(t)=v_{a}(t) \end{aligned} \]

​ 这个式子和\((2)\)本质相同。

总的来说,IMU预积分因子由一下三项组成 \[ \begin{aligned} \dot{\theta}(t) &=H(\theta(t))^{-1} \omega^{b}(t) \\ \dot{p}_{v}(t) &=v_{a}(t) \\ \dot{v}_{a}(t) &=R_{b}^{i}(t) a^{b}(t) \end{aligned} \] 从零开始,一直到时间\(t_{ij}\),有\(R_{b}^{i}(t)=\text{exp}([\theta(t)]_\times)\),用局部坐标向量表示为 \[ \zeta\left(t_{i j}\right)=\left[\theta\left(t_{i j}\right), p\left(t_{i j}\right), v\left(t_{i j}\right)\right]=\left[\theta\left(t_{i j}\right), R_{i}^{T} V_{i} t_{i j}+R_{i}^{T} \frac{g t_{i j}^{2}}{2}+p_{v}\left(t_{i j}\right), R_{i}^{T} g t_{i j}+v_{a}\left(t_{i j}\right)\right] \] \(X_j\)的导航状态可以表达为 \[ X_{j}=\mathcal{R}_{X_{i}}\left(\zeta\left(t_{i j}\right)\right)=\left\{\Phi_{R_{0}}\left(\theta\left(t_{i j}\right)\right), P_{i}+V_{i} t_{i j}+\frac{g t_{i j}^{2}}{2}+R_{i} p_{v}\left(t_{i j}\right), V_{i}+g t_{i j}+R_{i} v_{a}\left(t_{i j}\right)\right\} \]

用欧拉法求解微分方程

欧拉法求解微分方程的原理就是用一阶导数近似来计算积分,有以下三个式子

\[ \begin{aligned} \theta_{k+1}=\theta_{k}+\dot{\theta}\left(t_{k}\right) \Delta_{t} &=\theta_{k}+H\left(\theta_{k}\right)^{-1} \omega_{k}^{b} \Delta_{t} \\ p_{k+1}=p_{k}+\dot{p}_{v}\left(t_{k}\right) \Delta_{t} &=p_{k}+v_{k} \Delta_{t} \\ v_{k+1}=v_{k}+\dot{v}_{a}\left(t_{k}\right) \Delta_{t} &=v_{k}+\exp \left(\left[\theta_{k}\right]_{\times}\right) a_{k}^{b} \Delta_{t} \end{aligned} \] 其中\(\theta_{k} \triangleq \theta\left(t_{k}\right), p_{k} \triangleq p_{v}\left(t_{k}\right), v_{k} \triangleq v_{a}\left(t_{k}\right)\)

进一步提高位置的精度,引入二阶导数计算(加速度)

\[ \begin{aligned} \theta_{k+1} &=\theta_{k}+H\left(\theta_{k}\right)^{-1} \omega_{k}^{b} \Delta_{t} \\ p_{k+1} &=p_{k}+v_{k} \Delta_{t}+R_{k} a_{k}^{b} \frac{\Delta_{t}^{2}}{2} \\ v_{k+1} &=v_{k}+R_{k} a_{k}^{b} \Delta_{t} \end{aligned} \]

噪声(协方差矩阵)传递

定义\(t_k\)时刻的导航状态为\(\zeta_k=[\theta_k,p_k,v_k]\)\[ \zeta_{k+1}=f\left(\zeta_{k}, a_{k}^{b}, \omega_{k}^{b}\right) \] 噪声的传递可以表达为 \[ \Sigma_{k+1}=A_{k} \Sigma_{k} A_{k}^{T}+B_{k}\Sigma_{\eta}^{a d} B_{k}+C_{k} \Sigma_{\eta}^{g d} C_{k} \]

  • \(\Sigma_{k+1}\): \(t_{k+1}\)时刻的协方差矩阵,\(9\times9\)大小

  • \(\Sigma_{k}\): \(t_{k}\)时刻的协方差矩阵,\(9\times9\)矩阵

  • \(\Sigma_{\eta}^{a d}\)测量加速度引入的噪声,\(3\times3\)矩阵

  • \(\Sigma_{\eta}^{g d}\)测量角速度引入的噪声,\(3\times3\)矩阵

  • \[ A_{k} \approx\left[\begin{array}{ccc} I_{3 \times 3}-\frac{\Delta_{t}}{2}\left[\omega_{k}^{b}\right]_{\times} &0 & 0\\ R_{k}\left[-a_{k}^{b}\right]_{\times} H\left(\theta_{k}\right) \frac{\Delta_{t}}{2} & I_{3 \times 3} & I_{3 \times 3} \Delta_{t} \\ R_{k}\left[-a_{k}^{b}\right]_{\times} H\left(\theta_{k}\right) \Delta_{t} &0 & I_{3 \times 3} \end{array}\right] \]

  • \[ B_{k}=\left[\begin{array}{c} 0_{3 \times 3} \\ R_{k} \frac{\Delta_{t}}{2} \\ R_{k} \Delta_{t} \end{array}\right], \quad C_{k}=\left[\begin{array}{c} H\left(\theta_{k}\right)^{-1} \Delta_{t} \\ 0_{3 \times 3} \\ 0_{3 \times 3} \end{array}\right] \]