MSCKF3讲:后端理论推导(上)

news2024/9/22 13:35:08

MSCKF3讲:后端理论推导(上)

文章目录


  写在前面,这篇论文中C表示旋转矩阵,或者把q变为旋转矩阵的意思。

1 MSCKF中的状态变量

  下面G表示世界系,I表示IMU坐标系(作为body系),cam0表示左目相机系。关于坐标系表示的申明,下面这种表达方式 G I R ^I_G{R} GIR等价于 R I G {R}_{IG} RIG,是一种常见的转换关系。

IMU状态:

(4+3+3+3+3)×1 = 16×1
X I = [ G I q ˉ T b g T G v I T b a T G p I T ] T \mathbf{X}_\mathrm{I}=\begin{bmatrix}^I_G\bar{q}^T&\mathbf{b}_g^T&^G\mathbf{v}_I^T&\mathbf{b}_a^T&^G\mathbf{p}_I^T\end{bmatrix}^T XI=[GIqˉTbgTGvITbaTGpIT]T

  • G I q ˉ T ^I_G\bar{q}^T GIqˉT表示 the rotation from frame {G} to frame {I},描述世界系到惯性系的旋转,用单位四元数表示,4维。因为是JPL,局部坐标系,所以是 q I G q_{IG} qIG而不是 q G I q_{GI} qGI
  • G p I T ^G\mathbf{p}_I^T GpIT G v I T ^G\mathbf{v}_I^T GvIT表示位置和速度,即平移量,the IMU position and velocity with respect to {G},在世界系下表示。
  • b g T \mathbf{b}_g^T bgT b a T \mathbf{b}_a^T baT分别表示the biases affecting the gyroscope and accelerometer measurements,即陀螺仪和加速度计的偏差。

cam0状态:

  利用滑动窗口来记录的,不只是一帧的相机姿态。at any time instant the EKF state vector comprises (i) the evolving IMU state (ii)a history of up to N max past poses of the camera
X C = [ T m T ⋯ T n T ] T \mathbf{X}_\mathrm{C}=\begin{bmatrix}\mathbf{T}_m^T\cdots\mathbf{T}_n^T\end{bmatrix}^T XC=[TmTTnT]T
  注意相机的每个T都是由 C q G ^C{q}_G CqG G p C a m 0 ^G\mathbf{p}_{Cam0} GpCam0表示(C也是cam0,简单表示,(4+3)×1×N

IMUcam0间状态关系

(4+3)×1
C I q ⊤ I p C ⊤ _C^I\mathbf{q}^\top\quad{}^I\mathbf{p}_C^\top CIqIpC

2 微分方程递推(数值解)

微分方程

{ y ′ ( x ) = f ( x , y ) , x ∈ I = ( a , b ) y ( x 0 ) = y 0 \left.\left\{\begin{array}{l}y^{\prime}(x)=f(x,y),\quad x\in I=(a,b)\\y\left(x_0\right)=y_0\end{array}\right.\right. {y(x)=f(x,y),xI=(a,b)y(x0)=y0

在这里插入图片描述

拉格朗日中值定理

y ( x n + 1 ) − y ( x n ) h = y ′ ( x + θ h ) \frac{y\left(x_{n+1}\right)-y\left(x_{n}\right)}h=y^{\prime}(x+\theta h) hy(xn+1)y(xn)=y(x+θh)

欧拉法:本质一阶泰勒,线性近似求导

y ( x i + Δ x ) = y ( x i ) + y ′ ( x i ) Δ x + y ′ ′ ( x i ) 2 ! Δ x 2 + ⋯ + y ( n ) ( x i ) n ! Δ x n + O ( Δ x n + 1 ) y\left(x_i+\Delta x\right)=y\left(x_i\right)+y^{\prime}\left(x_i\right)\Delta x+\frac{y^{\prime\prime}\left(x_i\right)}{2!}\Delta x^2+\cdots+\frac{y^{\left(n\right)}\left(x_i\right)}{n!}\Delta x^n+O\left(\Delta x^{n+1}\right) y(xi+Δx)=y(xi)+y(xi)Δx+2!y′′(xi)Δx2++n!y(n)(xi)Δxn+O(Δxn+1)

y ( x i + Δ x ) − y ( x i ) Δ x + O ( Δ x ) = f ( x i , y ( x i ) ) \frac{y\left(x_{i}+\Delta x\right)-y\left(x_{i}\right)}{\Delta x}+O(\Delta x)=f\left(x_{i},y\left(x_{i}\right)\right) Δxy(xi+Δx)y(xi)+O(Δx)=f(xi,y(xi))

{ y i + 1 = y i + ℏ f ( x i , y i ) , i = 0 , 1 , ⋯ n − 1 y 0 = y ( x 0 ) \left.\left\{\begin{array}{l}y_{i+1}=y_i+\hbar f\left(x_i,y_i\right),\quad i=0,1,\cdots n-1\\y_0=y\left(x_0\right)\end{array}\right.\right. {yi+1=yi+f(xi,yi),i=0,1,n1y0=y(x0)

在这里插入图片描述

四阶龙格库塔法

{ y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( x n , y n ) k 2 = f ( x n + h 2 , y n + h 2 k 1 ) k 3 = f ( x n + ℏ 2 , y n + ℏ 2 k 2 ) k 4 = f ( x n + h , y n + h k 3 ) \left.\left\{\begin{array}{l}y_{n+1}=y_n+\frac h6\left(k_1+2\boldsymbol{k}_2+2k_3+k_4\right)\\k_1=f\left(x_n,y_n\right)\\k_2=f\left(x_n+\frac h2,y_n+\frac h2k_1\right)\\k_3=f\left(x_n+\frac\hbar2,y_n+\frac\hbar2\boldsymbol{k}_2\right)\\\boldsymbol{k}_4=\boldsymbol{f}\left(\boldsymbol{x}_n+\boldsymbol{h},\boldsymbol{y}_n+\boldsymbol{h}\boldsymbol{k}_3\right)\end{array}\right.\right. yn+1=yn+6h(k1+2k2+2k3+k4)k1=f(xn,yn)k2=f(xn+2h,yn+2hk1)k3=f(xn+2,yn+2k2)k4=f(xn+h,yn+hk3)

3 IMU状态预测

  预测是对状态估计量state进行迭代预测,而不是误差状态向量Error State(用来更新),但协方差是根据误差状态的运动模型进行更新。

  每一帧的IMU观测数据,需要对 X I X_I XI中的姿态 G I q T _G^Iq^T GIqT、速度 G v I T ^Gv_I^T GvIT和位置 G p I T ^Gp_I^T GpIT进行预测,偏差 b a , b g b_a,b_g ba,bg保持不变。

b g ( t + Δ t ) = b g ( t ) , b a ( t + Δ t ) = b a ( t ) , g ( t + Δ t ) = g ( t ) . \begin{aligned}\boldsymbol b_g(t+\Delta t)&=\boldsymbol{b}_g(t),\\\boldsymbol{b}_a(t+\Delta t)&=\boldsymbol{b}_a(t),\\\boldsymbol{g}(t+\Delta t)&=\boldsymbol{g}(t).\end{aligned} bg(t+Δt)ba(t+Δt)g(t+Δt)=bg(t),=ba(t),=g(t).
  这里相直接给出了离散时间下的IMU偏差的运动学方程,没有给出从连续时间到离散的推导(实际上因为偏置的导数是一个高斯过程,其均值是0,所以离散条件下,偏置保持不变)。

3.1 连续时间下IMU状态运动学方程(微分方程)

  这部分参考论文A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation之3.1节

① 状态(理想值)

注意下面式子描述了IMU状态真值的运动学变化,包括了均值和协方差

G I q ˉ ˙ ( t ) = 1 2 Ω ( ω ( t ) ) G I q ˉ ( t ) , b ˙ g ( t ) = n w g ( t ) v ˙ I ( t ) = G a ( t ) , b ˙ a ( t ) = n w a ( t ) , p ˙ I ( t ) = G v I ( t ) \begin{aligned} {^{I}_{G}\dot{\bar{q}}(t)}&=\frac{1}{2}\boldsymbol{\Omega}\big(\boldsymbol{\omega}(t)\big)_{G}^{I}\bar{q}(t),&\dot{\mathbf{b}}_{g}(t)&=\mathbf{n}_{wg}(t)\\\dot{\mathbf{v}}_{I}(t)&={}^{G}\mathbf{a}(t),&\dot{\mathbf{b}}_{a}(t)&=\mathbf{n}_{wa}(t),&\dot{\mathbf{p}}_{I}(t)&={}^{G}\mathbf{v}_{I}(t)\end{aligned} GIqˉ˙(t)v˙I(t)=21Ω(ω(t))GIqˉ(t),=Ga(t),b˙g(t)b˙a(t)=nwg(t)=nwa(t),p˙I(t)=GvI(t)

  其中矩阵 Ω ( ω ) {\Omega}(\boldsymbol{\omega}) Ω(ω)
Ω ( ω ) = [ − ⌊ ω × ⌋ ω − ω T 0 ] , ⌊ ω × ⌋ = [ 0 − ω z ω y ω z 0 − ω x − ω y ω x 0 ] \boldsymbol{\Omega}(\boldsymbol{\omega})=\begin{bmatrix}-\lfloor\boldsymbol{\omega}\times\rfloor&\boldsymbol{\omega}\\-\boldsymbol{\omega}^T&0\end{bmatrix},\quad\lfloor\boldsymbol{\omega}\times\rfloor=\begin{bmatrix}0&-\omega_z&\omega_y\\\omega_z&0&-\omega_x\\-\omega_y&\omega_x&0\end{bmatrix} Ω(ω)=[ω×ωTω0],ω×= 0ωzωyωz0ωxωyωx0
  角速度 ω m {\omega}_m ωm和加速度 a m {a}_m am的测量值:
ω m = ω + C ( G I q ˉ ) ω G + b g + n g a m = C ( G I q ˉ ) ( G a − G g + 2 ⌊ ω G × ⌋ G v I + ⌊ ω G × ⌋ 2 p I ) + b a + n a \begin{aligned}&\mathbf{\omega}_m=\mathbf{\omega}+\mathbf{C}(_G^I\bar{q})\mathbf{\omega}_G+\mathbf{b}_g+\mathbf{n}_g\\&\mathbf{a}_m=\mathbf{C}(_G^I\bar{q})(^G\mathbf{a}-^G\mathbf{g}+2\lfloor\omega_G\times\rfloor^G\mathbf{v}_I+\lfloor\omega_G\times\rfloor^2\mathbf{p}_I)+\mathbf{b}_a+\mathbf{n}_a\end{aligned} ωm=ω+C(GIqˉ)ωG+bg+ngam=C(GIqˉ)(GaGg+2ωG×GvI+ωG×2pI)+ba+na
  上面 ω G \mathbf{\omega}_G ωG论文中指the IMU measurements incorporate the effects of the planet’s rotation受到行星自转的影响,但是大部分实现中都没有考虑这个!

  一般来说,如果把IMU放在车体中央,可以省略其它元素对加速度干扰,即加速度 a m {a}_m am可以表示为下式
a m = C ( G I q ˉ ) ( G a − G g ) + b a + n a \begin{aligned}&\mathbf{a}_m=\mathbf{C}(_G^I\bar{q})(^G\mathbf{a}-^G\mathbf{g})+\mathbf{b}_a+\mathbf{n}_a\end{aligned} am=C(GIqˉ)(GaGg)+ba+na

② 状态(测量值)

  对上面公式取均值之后,就可以得到IMU状态测量值运动学公式,注意高斯过程和高斯噪声的均值皆为0,所以下面偏置导数和噪声均值皆可置零。下面 C q ^ = C ( G I q ⃗ ^ ) , a ^ = a m − b ^ a a n d ω ^ = ω m − b ^ g − C q ^ ω G . \mathbf{C}_{\hat{q}}=\mathbf{C}(_{G}^{I}\hat{\vec{q}}),\mathbf{\hat{a}}=\mathbf{a}_{m}-\hat{\mathbf{b}}_{a}\mathrm{and}\boldsymbol{\hat{\omega}}=\boldsymbol{\omega}_{m}-\hat{\mathbf{b}}_{g}-\mathbf{C}_{\hat{q}}\boldsymbol{\omega}_{G}. Cq^=C(GIq ^),a^=amb^aandω^=ωmb^gCq^ωG.

G I q ˉ ^ ˙ = 1 2 Ω ( ω ^ ) G I q ˉ ^ , b ^ g = 0 3 × 1 , G v ^ ˙ I = C q ^ T a ^ − 2 ⌊ ω G × ⌋ G v ^ I − ⌊ ω G × ⌋ 2 G p ^ I + G g b ^ ˙ a = 0 3 × 1 , G p ^ ˙ I = G v ^ I \begin{gathered} {}_{G}^{I}\dot{\hat{\bar{q}}}=\frac{1}{2}\boldsymbol{\Omega}(\hat{\boldsymbol{\omega}})_{G}^{I}\hat{\bar{q}},\quad\hat{\mathbf{b}}_{g}=\mathbf{0}_{3\times1}, \\ {}^{G}\dot{\hat{\mathbf{v}}}_{I}=\mathbf{C}_{\hat{q}}^{T}\hat{\mathbf{a}}-2\lfloor\boldsymbol{\omega}_{G}\times\rfloor{}^{G}\hat{\mathbf{v}}_{I}-\lfloor\boldsymbol{\omega}_{G}\times\rfloor{}^{2G}\hat{\mathbf{p}}_{I}+{}^{G}\mathbf{g} \\ \dot{\hat{\mathbf{b}}}_{a}=\mathbf{0}_{3\times1},\quad G\dot{\hat{\mathbf{p}}}_{I}=G\hat{\mathbf{v}}_{I} \end{gathered} GIqˉ^˙=21Ω(ω^)GIqˉ^,b^g=03×1,Gv^˙I=Cq^Ta^2ωG×Gv^IωG×2Gp^I+Ggb^˙a=03×1,Gp^˙I=Gv^I

  代码实现并没有考虑行星自转以及加速度相关影响,本质上就是最简单的IMU运动模型,对应论文Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight公式(1)

在这里插入图片描述

3.2 离散时间下IMU状态运动学方程(差分方程)

  从连续到离散,不论是对于状态方程,还是误差状态方程,都很简单(比如状态方程中,如果只是使用欧拉法去进行积分,那么速度平移等公式就像是高中物理一般)

  这个过程也是卡尔曼滤波的第一步:预测均值(Propagation Equations)

3.2.1 预测姿态 G I q T _G^Iq^T GIqT

  论文Indirect Kalman Filter for 3D Attitude Estimation1.6节给出了具体推导,0阶和1阶的区别就是在于在单位时间内角速度是否变化。0阶不变,一直是 ω ( t k ) {\omega}(t_k) ω(tk),1阶用两个时间点取了均值
ω ˉ = ω ( t k + 1 ) + ω ( t k ) 2 \bar{\boldsymbol{\omega}}=\frac{\boldsymbol{\omega}(t_{k+1})+\boldsymbol{\omega}(t_k)}2 ωˉ=2ω(tk+1)+ω(tk)

  MSCKF中使用的是**0阶积分(假设角速度在单位时间内恒定不变)**,其中 ω ^ = ω m − b ^ g \hat{\omega}=\omega_m-\hat{b}_g ω^=ωmb^g
∣ ω ^ ∣ > 1 0 − 5  时:  G I q ^ ( t + Δ t ) = ( cos ⁡ ( ∣ ω ^ ∣ 2 Δ t ) ⋅ I 4 × 4 + 1 ∣ ω ^ ∣ sin ⁡ ( ∣ ω ^ ∣ 2 Δ t ) ⋅ Ω ( ω ^ ) ) G I q ^ ( t ) ∣ ω ^ ∣ ≤ 1 0 − 5  时:  G I q ^ ( t + Δ t ) = ( I 4 × 4 − Δ t 2 Ω ( ω ^ ) ) G I q ^ ( t ) \begin{aligned}&|\hat{\omega}|>10^{-5}\text{ 时: }^I_G\hat{q}(t+\Delta t)=\left(\cos\left(\frac{|\hat{\omega}|}2\Delta t\right)\cdot I_{4\times4}+\frac1{|\hat{\omega}|}\sin\left(\frac{|\hat{\omega}|}2\Delta t\right)\cdot\Omega(\hat{\omega})\right) {^I_G\hat{q}}(t)\\&|\hat{\omega}|\leq10^{-5}\text{ 时: }^I_G\hat{q}(t+\Delta t)=\left(I_{4\times4}-\frac{\Delta t}2\Omega(\hat{\omega})\right){^I_G\hat{q}(t)}\end{aligned} ω^>105 GIq^(t+Δt)=(cos(2ω^Δt)I4×4+ω^1sin(2ω^Δt)Ω(ω^))GIq^(t)ω^105 GIq^(t+Δt)=(I4×42ΔtΩ(ω^))GIq^(t)

  姿态 G I q T _G^Iq^T GIqT的预测利用了角速度!其中 ω ^ = ω m − b ^ g \hat{\omega}=\omega_m-\hat{b}_g ω^=ωmb^g。下标m表示测量值,测量值减去一个偏差表示理想值。(这里和高博新书表示略有不同,一般都是 ω m = ω ^ + b ^ g {\omega}_m=\hat\omega+\hat{b}_g ωm=ω^+b^g,即测量 = 理想值 + 偏差)。

3.2.2 预测速度 G v I T ^Gv_I^T GvIT和位置 G p I T ^Gp_I^T GpIT

  要注意的是,一个点在不同坐标系下的速度矢量并不相同,不是一个矢量在不同坐标系中的表达(参考高博新书)。我们一般说的速度,都是指机器人本身在世界系下的速度,其相对于自身坐标系,速度一直都是0。

  注意这里的速度和位置都是在世界系下的矢量,加速度是在IMU系下的量,所以要变换到世界系下,还有 g = ( 0 , 0 , − 9.8 ) g = (0,0,-9.8) g=(0,0,9.8)。下标m值测量值。
p ^ ˙ ( t ) = v ^ ( t ) v ^ ˙ ( t ) = q ^ ( t ) a ^ + g a ^ = a m − b ^ a \begin{gathered}\dot{\hat{\mathrm{p}}}(\mathrm{t})=\hat{\mathrm{v}}(\mathrm{t})\\\dot{\hat{\mathrm{v}}}(\mathrm{t})=\hat{\mathrm{q}}(\mathrm{t})\hat{a}+\mathrm{g}\\\hat{a}=a_m-\hat{b}_a\end{gathered} p^˙(t)=v^(t)v^˙(t)=q^(t)a^+ga^=amb^a

  姿态的预测采用了比较简单的欧拉法,即认为角速度在单位时间内恒定不变。对于速度和位置的预测,采用了更加平滑的龙格库塔法
v ^ ( t + Δ t ) = v ^ ( t ) + Δ t 6 ( k v 1 + 2 k v 2 + 2 k v 3 + k v 4 ) k v 1 = R ^ ( t ) a ^ + g k v 2 = R ^ ( t + Δ t / 2 ) a ^ + g k v 3 = R ^ ( t + Δ t / 2 ) a ^ + g k v 4 = R ^ ( t + Δ t ) a ^ + g p ^ ( t + Δ t ) = p ^ ( t ) + Δ t 6 ( k p 1 + 2 k p 2 + 2 k p 3 + k p 4 ) k p 1 = v ^ ( t ) k p 2 = v ^ ( t ) + k v 1 Δ t / 2 k p 3 = v ^ ( t ) + k v 2 Δ t / 2 k p 4 = v ^ ( t ) + k v 3 Δ t \begin{aligned} &\hat{v}(t+\Delta t)=\hat{v}(t)+\frac{\Delta t}6\left(k_{v_1}+2k_{v_2}+2k_{v_3}+k_{v_4}\right) \\ &k_{v_1}=\hat{R}(t)\hat{a}+g \\ &k_{v_2}=\hat{R}(t+\Delta t/2)\hat{a}+g \\ &k_{v_3}=\hat{R}(t+\Delta t/2)\hat{a}+g \\ &k_{v_4}=\hat{R}(t+\Delta t)\hat{a}+g \\ &\hat{p}(t+\Delta t)=\hat{p}(t)+\frac{\Delta t}6\left(k_{p_1}+2k_{p_2}+2k_{p_3}+k_{p_4}\right) \\ &k_{p_1}=\hat{v}(t) \\ &k_{p_2}=\hat{v}(t)+k_{v_1}\Delta t/2 \\ &k_{p_3}=\hat{v}(t)+k_{v_2}\Delta t/2 \\ &k_{p_4}=\hat{v}(t)+k_{v_3}\Delta t \end{aligned} v^(t+Δt)=v^(t)+6Δt(kv1+2kv2+2kv3+kv4)kv1=R^(t)a^+gkv2=R^(t+Δt/2)a^+gkv3=R^(t+Δt/2)a^+gkv4=R^(t+Δt)a^+gp^(t+Δt)=p^(t)+6Δt(kp1+2kp2+2kp3+kp4)kp1=v^(t)kp2=v^(t)+kv1Δt/2kp3=v^(t)+kv2Δt/2kp4=v^(t)+kv3Δt

  速度 G v I T ^Gv_I^T GvIT和位置 G p I T ^Gp_I^T GpIT的预测利用了加速度

4 IMU误差状态预测

  IMU更新时用龙格库塔法得到了新的IMU状态

  我们现在还要递推什么?递推IMU误差协方差矩阵。实际更新的算法使用了ESKF,维护的是误差状态,因此要推出新一时刻的误差状态协方差与上⼀时刻误差状态协方差及传感器误差协方差的关系

  下面结论参考论文A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation

  误差怎么表示?

  理想数值 = 估计数值 + 误差

4.1 连续时间下 误差状态

4.1.1 推导过程

① 旋转

  四元数的推导比较麻烦,参考Indirect Kalman Filter for 3D Attitude Estimation 2.4节 Continuous Time Error State Equations

② 速度

​ 区分清楚估计值就是利用测量值估计的一个数

在这里插入图片描述

③ 平移

  平移的导数即速度
G δ p ˙ I = G δ v I ^G\delta\mathbf{\dot p}_I = ^G\delta\mathbf{v}_I Gδp˙I=GδvI

④ 偏置

  IMU噪声模型中说的很清楚了,偏差的导数是高斯过程(0均值)。
δ b ˙ = n w \delta\dot{\mathbf{b}}=\mathbf{n_w} δb˙=nw

4.1.2 结论

  写成矩阵形式
δ x ˙ = F c ⋅ δ x + G c ⋅ n \dot{\delta\mathbf{x}}=\mathbf{F}_c\cdot\delta\mathbf{x}+\mathbf{G}_c\cdot\mathbf{n} δx˙=Fcδx+Gcn
  变量:
δ x = ( G I δ θ ⊤ δ b g ⊤ G δ v I ⊤ δ b a ⊤ G δ p I ⊤ C I δ θ ⊤ I δ p C ⊤ ) ⊤ \left.\delta\mathbf{x}=\left(\begin{array}{cccccc}^I_G\delta\boldsymbol{\theta}^\top&\delta\mathbf{b}_g^\top&^G\delta\mathbf{v}_I^\top&\delta\mathbf{b}_a^\top&^G\delta\mathbf{p}_I^\top&{}^I_C\delta\boldsymbol{\theta}^\top&{}^I\delta\mathbf{p}_C^\top\end{array}\right.\right)^\top δx=(GIδθδbgGδvIδbaGδpICIδθIδpC)

n = ( n g n w g n a n w a ) ⊤ \left.\mathbf{n}=\left(\begin{array}{ccc}\mathbf{n_g}&\mathbf{n_{wg}}&\mathbf{n_a}&\mathbf{n_{wa}}\end{array}\right.\right)^\top n=(ngnwgnanwa)

矩阵F注意点:

① 速度:即第三行,忽略了相关因素影响,3.1中①中描述了

② 外参:相机与IMU的转换,这个是不变的,所以第6、7行都是0

③ 这里只是5个变量,S-MSCKF论文以及代码中都还有外参两个自变量,所以F实际是21*21矩阵。7个变量,每个都是3×3

④ 参见Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight公式(2)

F = ( − ⌊ ω ^ × ⌋ − I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 − C ( C I q ^ ) ⊤ ⌊ a ^ × ⌋ 0 3 × 3 0 3 × 3 − C ( G I q ^ ) ⊤ 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 ) \mathbf{F}=\begin{pmatrix}-\lfloor\hat{\boldsymbol{\omega}}_{\times}\rfloor&-\mathbf{I}_{3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\-C\left( ^{I}_{C}\hat{\mathbf{q}}\right)^\top\left\lfloor\hat{\mathbf{a}}_{\times}\right\rfloor&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&-C\left( ^{I}_{G}{\hat{\mathbf{q}}}\right)^\top&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{I}_{3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3} \end{pmatrix} F= ω^×03×3C(CIq^)a^×03×303×303×303×3I303×303×303×303×303×303×303×303×303×303×3I303×303×303×303×3C(GIq^)03×303×303×303×303×303×303×303×303×303×303×3


G = ( − I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 − C ( G I q ^ ) ⊤ 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 ) \left.\mathbf{G}=\left(\begin{array}{cccc}-\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&-C\left(^{I}_{G}\hat{\mathbf{q}}\right)^\top&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{I}_3\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{array}\right.\right) G= I303×303×303×303×303×303×303×3I303×303×303×303×303×303×303×3C(GIq^)03×303×303×303×303×303×303×303×3I303×303×3

补充:关于速度,考虑对于加速度a的各种影响,则F是下式,这里省略了6、7行的0矩阵,矩阵G是相同的。A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation公式(10)

F = [ − ⌊ ω ^ × ⌋ − I 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 − C q ^ T ⌊ a ^ × ⌋ 0 3 × 3 − 2 ⌊ ω G × ⌋ − C q ^ T − ⌊ ω G × ⌋ 2 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 I 3 0 3 × 3 0 3 × 3 ] \left.\mathbf{F}=\left[\begin{array}{ccccc}-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor&-\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\-\mathbf{C}_{\hat{q}}^T\lfloor\hat{\mathbf{a}}\times\rfloor&\mathbf{0}_{3\times3}&-2\lfloor\omega_G\times\rfloor&-\mathbf{C}_{\hat{q}}^T&-\lfloor\omega_G\times\rfloor^2\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{I}_3&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{array}\right.\right] F= ω^×03×3Cq^Ta^×03×303×3I303×303×303×303×303×303×32ωG×03×3I303×303×3Cq^T03×303×303×303×3ωG×203×303×3

注意:我们并不会直接使用F和G去预测等等,而是在求解离散时间下协方差时利用。

4.2 离散时间下误差状态

  参考Indirect Kalman Filter for 3D Attitude Estimation 2.5节 Discrete Time Error State Equations

  对一个线性系统做离散化,是由固定的通解的(见线性系统理论笔记),如下
δ x ( t + Δ t ) = Φ ( t + Δ t , t ) δ x t + ∫ t t + Δ t Φ ( t + Δ t , τ ) G c ( τ ) n ( τ ) d τ \delta\mathbf{x}(t+\Delta t)=\boldsymbol{\Phi}\left(t+\Delta t,t\right)\delta\mathbf{x}_t+\int_t^{t+\Delta t}\boldsymbol{\Phi}(t+\Delta t,\tau)\mathbf{G}_\mathbf{c}(\tau)\mathbf{n}(\tau)d\tau δx(t+Δt)=Φ(t+Δt,t)δxt+tt+ΔtΦ(t+Δt,τ)Gc(τ)n(τ)dτ
  把一个连续系统离散化,在线性系统理论中讲过,系统矩阵 F F F变为了 状态转移矩阵$ \Phi(t+\Delta t,t)= exp(Ft)$
Φ ( t + Δ t , t ) = exp ⁡ ( F c Δ t ) = I 6 × 6 + F c Δ t + 1 2 ! F c 2 Δ t 2 + … \begin{aligned} \Phi(t+\Delta t,t)& =\exp\left(\mathbf{F}_{c}\Delta t\right) \\ &=\mathbf{I}_{6\times6}+\mathbf{F}_{c}\Delta t+\frac{1}{2!}\mathbf{F}_{c}^{2}\Delta t^{2}+\ldots \end{aligned} Φ(t+Δt,t)=exp(FcΔt)=I6×6+FcΔt+2!1Fc2Δt2+
  其中幂指数(对应代码):
F c = [ − ⌊ ω ^ × ⌋ − I 3 × 3 0 3 × 3 0 3 × 3 ] , F c 2 = [ ⌊ ω ^ × ⌋ 2 ⌊ ω ^ × ⌋ 0 3 × 3 0 3 × 3 ] F c 3 = [ − ⌊ ω ^ × ⌋ 3 − ⌊ ω ^ × ⌋ 2 0 3 × 3 0 3 × 3 ] , F c 4 = [ ⌊ ω ^ × ⌋ 4 ⌊ ω ^ × ⌋ 3 0 3 × 3 0 3 × 3 ] \begin{aligned}&\mathbf{F}_c=\begin{bmatrix}-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor&-\mathbf{I}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\quad,\quad\mathbf{F}_c^2=\begin{bmatrix}\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^2&\lfloor\hat{\boldsymbol{\omega}}\times\rfloor\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\\&\mathbf{F}_c^3=\begin{bmatrix}-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^3&-\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^2\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\quad,\quad\mathbf{F}_c^4=\begin{bmatrix}\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^4&\lfloor\hat{\boldsymbol{\omega}}\times\rfloor^3\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\end{bmatrix}\end{aligned} Fc=[ω^×03×3I3×303×3],Fc2=[ω^×203×3ω^×03×3]Fc3=[ω^×303×3ω^×203×3],Fc4=[ω^×403×3ω^×303×3]
  代入通解,可得到:
δ x t + Δ t = ( I 6 × 6 + F c Δ t + 1 2 ! F c 2 Δ t 2 + … ) δ x t + ∫ t t + Δ t Φ ( t + Δ t , τ ) G c ( τ ) n ( τ ) d τ \delta\mathbf{x}_{t+\Delta t}=(\mathbf{I}_{6\times6}+\mathbf{F}_c\Delta t+\frac1{2!}\mathbf{F}_c^2\Delta t^2+\ldots)\delta\mathbf{x}_t+\int_t^{t+\Delta t}\mathbf{\Phi}(t+\Delta t,\tau)\mathbf{G}_\mathbf{c}(\tau)\mathbf{n}(\tau)d\tau δxt+Δt=(I6×6+FcΔt+2!1Fc2Δt2+)δxt+tt+ΔtΦ(t+Δt,τ)Gc(τ)n(τ)dτ

  • 均值

  在MSCKF中,误差状态的均值实际上没有被使用,所以相关的论文里面也没有给出均值的推导,不过,把连续变为离散是一件较为容易的事情,参考状态,类似于下面形式(高博新书给出的,但具体肯定是有所差别的,看是否利用高阶的积分来推导,如龙格库塔法 )
δ p ( t + Δ t ) = δ p + δ v Δ t , δ υ ( t + Δ t ) = δ v + ( − R ( a ~ − b a ) ∧ δ θ − R δ b a + δ g ) Δ t − η v , δ θ ( t + Δ t ) = E x p ( − ( ω ~ − b g ) Δ t ) δ θ − δ b g Δ t − η θ , δ b g ( t + Δ t ) = δ b g + η b g , δ b a ( t + Δ t ) = δ b a + η b a , \begin{aligned} \delta\boldsymbol{p}(t+\Delta t)& =\delta\boldsymbol{p}+\delta\boldsymbol{v}\Delta t, \\ \delta\boldsymbol{\upsilon}(t+\Delta t)& =\delta\boldsymbol{v}+(-\boldsymbol{R}(\tilde{\boldsymbol{a}}-\boldsymbol{b}_a)^{\wedge}\delta\boldsymbol{\theta}-\boldsymbol{R}\delta\boldsymbol{b}_a+\delta\boldsymbol{g})\Delta t-\boldsymbol{\eta}_v, \\ \delta\boldsymbol{\theta}(t+\Delta t)& =\mathrm{Exp}\left(-(\tilde{\boldsymbol{\omega}}-\boldsymbol{b}_g)\Delta t\right)\delta\boldsymbol{\theta}-\delta\boldsymbol{b}_g\Delta t-\boldsymbol{\eta}_\theta, \\ \delta\boldsymbol{b}_{g}(t+\Delta t)& =\delta\boldsymbol{b}_g+\boldsymbol{\eta}_{bg}, \\ \begin{aligned}\delta\boldsymbol{b}_{a}(t+\Delta t)\end{aligned}& =\delta\boldsymbol{b}_{a}+\boldsymbol{\eta}_{ba}, \end{aligned} δp(t+Δt)δυ(t+Δt)δθ(t+Δt)δbg(t+Δt)δba(t+Δt)=δp+δvΔt,=δv+(R(a~ba)δθRδba+δg)Δtηv,=Exp((ω~bg)Δt)δθδbgΔtηθ,=δbg+ηbg,=δba+ηba,

  • 协方差矩阵(IMU)-------高斯运算,

  写在前面,其实这里的状态转移矩阵会经过可观测性约束进行一定的修改!见6.4.

   实际上是对离散化后的方程分两步计算,一个是前面状态转移矩阵线性协方差计算,再加上后面高斯噪声的协方差。(两个都符合高斯分布,所以协方差计算也符合)。-----这里也说明,虽然我们不用连续时间下的误差状态,但是会利用这个FG矩阵,这也是为什么前面会求解。

P k + 1 ∣ k = Φ k P k ∣ k Φ k T + Q d , k Φ k = Φ ( t k + 1 , t k ) = exp ⁡ ( ∫ t k t k + 1 F ( τ ) d τ ) Q d , k = ∫ t k t k + 1 Φ ( t k + 1 , τ ) G c ( τ ) Q c G c T ( τ ) Φ T ( t k + 1 , τ ) d τ \begin{gathered}\mathbf{P}_{k+1|k}=\Phi_k\mathbf{P}_{k|k}\Phi_k^T+\mathbf{Q}_{d,k} \\\Phi_k=\Phi(t_{k+1},t_k)=\exp\left(\int_{t_k}^{t_{k+1}}\mathbf{F}(\tau)d\tau\right)\\ \mathbf{Q}_{d,k}=\int_{t_k}^{t_{k+1}}\boldsymbol{\Phi}\left(t_{k+1},\tau\right)\mathbf{G}_c(\tau)\mathbf{Q}_c\mathbf{G}_c^\mathrm{T}(\tau)\boldsymbol{\Phi}^\mathrm{T}\left(t_{k+1},\tau\right)\mathrm{d}\tau\end{gathered}\\ Pk+1∣k=ΦkPkkΦkT+Qd,kΦk=Φ(tk+1,tk)=exp(tktk+1F(τ)dτ)Qd,k=tktk+1Φ(tk+1,τ)Gc(τ)QcGcT(τ)ΦT(tk+1,τ)dτ

   Q c Q_c Qc噪声带来的协方差。噪声是⾼斯白噪声,且不同时刻是独立的(所以每个变量至只与自身相关,与其它无关,也就是协方差矩阵非对角线元素全是0),因此连续时间系统噪声协方差矩阵由
Q c = E [ n ( t + τ ) n T ( t ) ] = [ N r 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 N w r 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 N a 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 N w a ] = [ σ r c 2 ⋅ I 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 σ w c 2 ⋅ I 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 σ a c 2 ⋅ I 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 0 3 × 3 σ w a c 2 ⋅ I 3 × 3 ] \begin{gathered} \mathbf{Q}_c \left.=E\left[\mathbf{n}(t+\tau)\mathbf{n}^\mathrm{T}(t)\right]=\left[\begin{array}{cccc}\mathbf{N}_\mathrm{r}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{N}_\mathrm{wr}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{N}_\mathrm{a}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{N}_\mathrm{wa}\end{array}\right.\right]= \\ \left.\left[\begin{array}{cccc}\sigma_{r_c}^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\sigma_{w_c}^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\sigma_{a_c}^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times3}\\\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\mathbf{0}_{3\times3}&\sigma_{w_{ac}}^2\cdot\mathbf{I}_{3\times3}\end{array}\right.\right] \end{gathered} Qc=E[n(t+τ)nT(t)]= Nr03×303×303×303×3Nwr03×303×303×303×3Na03×303×303×303×3Nwa = σrc2I3×303×303×303×303×3σwc2I3×303×303×303×303×3σac2I3×303×303×303×303×3σwac2I3×3

  • 实际上的协方差矩阵还有相机的影响

P k + 1 ∣ k = ( P I I k + 1 ∣ k Φ k P I C k ∣ k P I C k ∣ k ⊤ Φ k ⊤ P C C k ∣ k ) \left.\mathbf{P}_{k+1|k}=\left(\begin{matrix}\mathbf{P}_{II_{k+1|k}}&\mathbf{\Phi}_{k}\mathbf{P}_{IC_{k|k}}\\\mathbf{P}_{IC_{k|k}}^\top\mathbf{\Phi}_{k}^\top&\mathbf{P}_{CC_{k|k}}\end{matrix}\right.\right) Pk+1∣k=(PIIk+1∣kPICkkΦkΦkPICkkPCCkk)

  递推阶段关于相机的加持都是0,也就是这个阶段关于相机状态部分是“不动”。但是公共部分是需要改变的,因为IMU部分变了
P k + 1 ∣ k = ( P I I k + 1 ∣ k Φ k P I C k ∣ k P I C k ∣ k ⊤ Φ k ⊤ P C C k ∣ k ) \left.\mathbf{P}_{k+1|k}=\left(\begin{matrix}\mathbf{P}_{II_{k+1|k}}&\mathbf{\Phi}_{k}\mathbf{P}_{IC_{k|k}}\\\mathbf{P}_{IC_{k|k}}^{\top}\mathbf{\Phi}_{k}^{\top}&\mathbf{P}_{CC_{k|k}}\end{matrix}\right.\right) Pk+1∣k=(PIIk+1∣kPICkkΦkΦkPICkkPCCkk)

4.3 状态增广

4.3.2 什么是状态增广?

其次,搞明白什么是状态增广

状态增广:cam新来了⼀帧,状态跟协方差矩阵会有哪些变化

  在没有图像进来时,对IMU状态进行预测,并计算系统误差状态协方差矩阵;在有图像进来时,根据相机与IMU的相对外参计算当前相机的位姿。然后将最新的相机状态加入到系统状态向量中去,然后扩增误差状态协方差矩阵

① 利用最新imu状态和外参计算当前相机位姿

G C q ^ = I C q ^ ⊗ G I q ^ , G p ^ C = G p ^ C + C ( G I q ^ ) ⊤ I p ^ C \left._G^C\hat{\mathbf{q}}={}_I^C\hat{\mathbf{q}}\otimes{}_G^I\hat{\mathbf{q}},\quad{}^G\hat{\mathbf{p}}_C={}^G\hat{\mathbf{p}}_C+C\left(\begin{matrix}^I_G\hat{\mathbf{q}}\end{matrix}\right.\right)^\top{}^I\hat{\mathbf{p}}_C GCq^=ICq^GIq^,Gp^C=Gp^C+C(GIq^)Ip^C

② 相机位姿分别对imu状态和外参的雅可比,扩展误差状态协方差
P ( 21 + 6 ( N + 1 ) ) × ( 21 + 6 ( N + 1 ) ) = [ I 21 + 6 N J 6 × ( 21 + 6 N ) ] P ( 21 + 6 N ) × ( 21 + 6 N ) [ I 21 + 6 N J 6 × ( 21 + 6 N ) ] T = [ P P J T J P J P J T ] \begin{gathered} P^{(21+6(N+1))\times(21+6(N+1))} \left.=\left[\begin{array}{c}I_{21+6N}\\J_{6\times(21+6N)}\end{array}\right.\right]P^{(21+6N)\times(21+6N)}\left[\begin{array}{c}I_{21+6N}\\J_{6\times(21+6N)}\end{array}\right]^T \\ \left.=\left[\begin{array}{cc}P&PJ^T\\JP&JPJ^T\end{array}\right.\right] \end{gathered} P(21+6(N+1))×(21+6(N+1))=[I21+6NJ6×(21+6N)]P(21+6N)×(21+6N)[I21+6NJ6×(21+6N)]T=[PJPPJTJPJT]

①雅可比推导

  关于雅可比,维度6*(21+6N)6N是指对之前的外参的雅可比,全为0.行维表示 R c w R_{cw} Rcw t w c t_{wc} twc分别对 x ~ I = ( G I θ ~ ⊤ b ~ g ⊤ G v ~ I ⊤ b ~ a ⊤ G p ~ I ⊤ I θ ~ C ⊤ I p ~ C ⊤ ) ⊤ \tilde{\mathbf{x}}_{I}=\begin{pmatrix}^I_{G}\tilde{\boldsymbol{\theta}}^{\top}&&\tilde{\mathbf{b}}_{g}^{\top}&&^{G}\tilde{\mathbf{v}}_{I}^{\top}&&\tilde{\mathbf{b}}_{a}^{\top}&&^{G}\tilde{\mathbf{p}}_{I}^{\top}&&^{I}\tilde{\boldsymbol{\theta}}_{C}^{\top}&^{I}\tilde{\mathbf{p}}_{C}^{\top}\end{pmatrix}^{\top} x~I=(GIθ~b~gGv~Ib~aGp~IIθ~CIp~C)的雅可比,故此共21列。可以分为两部分,如下公式所示

J = ( J I 0 6 × 6 N ) \mathbf{J}=\begin{pmatrix}\mathbf{J}_I&\mathbf{0}_{6\times6N}\end{pmatrix} J=(JI06×6N)

原论文给出的公式如下,但是和代码对不上?

J I = ( C ( I G q ^ ) 0 3 × 9 0 3 × 3 I 3 0 3 × 3 − C ( I G q ^ ) ⊤ ⌊ I p ^ C × ⌋ 0 3 × 9 I 3 0 3 × 3 I 3 ) \mathbf{J}_I=\begin{pmatrix}C\left(\frac{I}{G}\hat{\mathbf{q}}\right)&\mathbf{0}_{3\times9}&\mathbf{0}_{3\times3}&\mathbf{I}_{3}&\mathbf{0}_{3\times3}\\-C\left(\frac{I}{G}\hat{\mathbf{q}}\right)^\top\lfloor{}^{I}\hat{\mathbf{p}}_{C\times}\rfloor&\mathbf{0}_{3\times9}&\mathbf{I}_{3}&\mathbf{0}_{3\times3}&\mathbf{I}_{3}\end{pmatrix} JI=(C(GIq^)C(GIq^)Ip^C×03×903×903×3I3I303×303×3I3)

代码中应该是下面这样的

J = [ R c b 0 0 0 0 I 0 ( R w b t b c ) ∧ 0 0 0 I 0 R w b ] \left.J=\left[\begin{array}{cccccccc}R_{cb}&\mathbf{0}&\mathbf{0}&\mathbf{0}&\mathbf{0}&\mathbf{I}&\mathbf{0}\\(R_{wb}t_{bc})^{\wedge}&\mathbf{0}&\mathbf{0}&\mathbf{0}&\mathbf{I}&\mathbf{0}&R_{wb}\end{array}\right.\right] J=[Rcb(Rwbtbc)0000000II00Rwb]

下面求下具体的雅可比
在这里插入图片描述

② 扩展误差状态协方差

直接把雅可比乘进去就好

在这里插入图片描述

4.3.3 为什么要状态增广

  IMU Propagation只改变IMU状态向量和其对应的协方差,与相机无关;而Measurement Updata的观测模型是残差相对于相机状态的观测模型,与IMU状态没有直接关联。状态扩增就相当于相机和IMU状态之间的桥梁,通过关联协方差 P I C P_{IC} PIC描述相机和IMU状态之间的关系,每一个相机状态都与IMU状态形成关联,这样在观测更新相机状态的同时,会间接更新IMU状态。

5 状态更新

5.1 理论分析

  理想数值 = 估计数值(预测的状态) + 误差 (误差状态协方差矩阵)

  预测过程包括对名义状态的预测(IMU 积分)以及对误差状态的预测
δ x p r e d = F δ x , P p r e d = F P F ⊤ + Q . \begin{aligned}\delta x_{\mathrm{pred}}&=F\delta x,\\P_{\mathrm{pred}}&=FPF^\top+Q.\end{aligned} δxpredPpred=Fδx,=FPF+Q.
  考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测,其观测方程为抽象的 h,那么可以写为
z = h ( x ) + v , v ∼ N ( 0 , V ) , z=h(x)+v,v\sim\mathcal{N}(0,V), z=h(x)+v,vN(0,V),

  在 ESKF 中,我们当前拥有名义状态 x 的估计以及误差状态 δx 的估计,且希望更新的是误差状态,因此要计算投影误差相对于误差状态的雅可比矩阵
H = ∂ h ∂ δ x ∣ x p r e d = ∂ δ z ∂ z ^   ∂ z ^ ∂ x ^   ∂ x ^ ∂ δ x =   ∂ z ^ ∂ x ^   ∂ x ^ ∂ δ x =   ∂ z ^ ∂ x ^ H=\left.\frac{\partial h}{\partial\delta\boldsymbol{x}}\right|_{x_{\mathrm{pred}}} \\ =\frac{\partial\delta\mathbf{z}}{\partial\hat{\mathbf{z}}}\mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}~\frac{\partial\hat{\mathbf{x}}}{\partial\delta x}} \\ =\mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}~\frac{\partial\hat{\mathbf{x}}}{\partial\delta x}}\\ =\mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}} H=δxh xpred=z^δz x^z^ δxx^= x^z^ δxx^= x^z^

δ z = z − z ^ \delta\mathbf{z}=\mathbf{z}-\hat{\mathbf{z}} δz=zz^, δ z \delta\mathbf{z} δz对z求导就是单位阵(观测都是正常加减法,不存在旋转矩阵那种乘法),同理, δ x = x − x ^ \delta\mathbf{x}=\mathbf{x}-\hat{\mathbf{x}} δx=xx^在处理旋转矩阵这种状态量是扰动乘法以外,求导也是单位阵!出于严谨,可以得到(对应状态p、v、R、b_g、b_a、g)

∂ x ∂ δ x = diag ⁡ ( I 3 , I 3 , ∂ Log ⁡ ( R ( Exp ⁡ ( δ θ ) ) ) ∂ δ θ , I 3 , I 3 , I 3 ) . \begin{aligned}\frac{\partial x}{\partial\delta x}=\operatorname{diag}(I_3,I_3,\frac{\partial\operatorname{Log}(\boldsymbol{R}(\operatorname{Exp}(\delta\boldsymbol{\theta})))}{\partial\delta\boldsymbol{\theta}},I_3,I_3,I_3).\end{aligned} δxx=diag(I3,I3,δθLog(R(Exp(δθ))),I3,I3,I3).

  相当于连乘旋转矩阵,需要用BCH近似计算,实际不应该直接作为单位阵,还有一点,这里如果是JPL四元数,那么应该是左扰动,与下面有区别。
∂ L o g ( R ( E x p ( δ θ ) ) ) ∂ δ θ = J r − 1 ( R ) . \frac{\partial\mathrm{Log}(\boldsymbol{R}(\mathrm{Exp}(\delta\boldsymbol{\theta})))}{\partial\delta\boldsymbol{\theta}}=\boldsymbol{J}_r^{-1}(\boldsymbol{R}). δθLog(R(Exp(δθ)))=Jr1(R).
  代码中貌似认为是小量,直接作为单位阵,即 H =   ∂ z ^ ∂ x ^ H = \mathrm{~\frac{\partial\hat{\mathbf{z}}}{\partial\hat{\mathbf{x}}}} H= x^z^

  再计算卡尔曼增益,进而计算误差状态的更新过程
K = P pred H ⊤ ( H P pred H ⊤ + V ) − 1 , δ x = K ( z − h ( x p r e d ) ) , x = x p r e d + δ x , P = ( I − K H ) P p r e d . \begin{aligned} &\boldsymbol{K}&& =P_\text{pred}H^\top(HP_\text{pred}H^\top+V)^{-1}, \\ &\delta x&& =K(z-h(\boldsymbol{x_\mathrm{pred}})), \\ &\boldsymbol{x}&& =x_{\mathrm{pred}}+\delta\boldsymbol{x}, \\ &\text{P}&& =(\boldsymbol{I}-\boldsymbol{K}\boldsymbol{H})\boldsymbol{P}_{\mathrm{pred}}. \end{aligned} KδxxP=PpredH(HPpredH+V)1,=K(zh(xpred)),=xpred+δx,=(IKH)Ppred.

说白了,ESKF就是预测的时候对状态和误差状态都预测了,但实际上只用了状态的预测值,对于误差状态,主要是利用了协方差和更新后的误差Δx。在更新这一块没有使用原始状态对整个方程进行更新!针对不同的观测模型,就有不同的雅可比矩阵H!这个是最重要的!

5.2 视觉观测雅可比矩阵H推导

  前面已经知道,H是计算投影误差相对于误差状态的雅可比矩阵

  滑动窗口内状态——IMU状态、左相机状态(旋转、平移)
x ~ = ( x ~ I ⊤ x ~ C 1 ⊤ … x ~ C N ⊤ ) ⊤ \tilde{\mathbf{x}}=\begin{pmatrix}\tilde{\mathbf{x}}_I^\top&\tilde{\mathbf{x}}_{C_1}^\top&\dots&\tilde{\mathbf{x}}_{C_N}^\top\end{pmatrix}^\top x~=(x~Ix~C1x~CN)
  由于MSCKF更新使用的是不在跟踪上的点,所以这个点必然在IMU状态前⾯,因此关于IMU状态的雅可比就是0,我们只需要计算关于相机状态的雅可比

  单个路标点雅可比,论文公式(5)
r i j = z i j − z ^ i j = H C i j x ~ C i + H f i j G p ~ j + n i j \mathbf{r}_i^j=\mathbf{z}_i^j-\hat{\mathbf{z}}_i^j=\mathbf{H}_{C_i}^j\tilde{\mathbf{x}}_{C_i}+\mathbf{H}_{f_i}^j{}^G\tilde{\mathbf{p}}_j+\mathbf{n}_i^j rij=zijz^ij=HCijx~Ci+HfijGp~j+nij
在这里插入图片描述

下面推导本质就是纯视觉雅可比计算,可参考十四讲

在这里插入图片描述

在这里插入图片描述

当一个路标点看不见时,雅可比矩阵,论文公式(5)

r i j = z i j − z ^ i j = H C i j x ~ C i + H f i j G p ~ j + n i j \mathbf{r}_i^j=\mathbf{z}_i^j-\hat{\mathbf{z}}_i^j=\mathbf{H}_{C_i}^j\tilde{\mathbf{x}}_{C_i}+\mathbf{H}_{f_i}^j{}^G\tilde{\mathbf{p}}_j+\mathbf{n}_i^j rij=zijz^ij=HCijx~Ci+HfijGp~j+nij

在这里插入图片描述

  如果是双目,观测会翻倍,但下面M指观测到路标点的次数
在这里插入图片描述

当最新帧有多个路标点看不见时,论文公式(这里没有了路标下标i)

r j = H x j x ~ + H f j G p ~ j + n j \mathbf{r}^{j}=\mathbf{H}_{\mathrm{x}}^{j}\tilde{\mathbf{x}}+\mathbf{H}_{f}^{jG}\tilde{\mathbf{p}}_{j}+\mathbf{n}^{j} rj=Hxjx~+HfjGp~j+nj

在这里插入图片描述

5.3 视觉观测雅可比的后续处理

5.3.1 左零空间投影

参考论文A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation公式(24)~(26)

  对于 EKF,残差线性化需要满足如下形式,即残差仅与一组状态向量的误差项成线性化关系 r ≅ H δ x + n r\cong H\delta x+n rx+n,且噪声项为与状态向量无关的零均值的高斯分布

  而 MSCKF 的的残差与两个状态向量的误差项相关,不满足上式的线性化形式,因此不能直接应用 EKF 的测量更新流程

  为了解决这个问题,并让这对路标点的雅可比隐式地参与到计算,进行左零空间投影!(具体参考后面的零空间实现,实际也是利用QR分解)

r 0 ( 2 M − 3 M L ) × 1 = A T r 2 M × 1 ≅ A T H X 2 M × ( 15 + 6 N ) ⏟ H 0 X ~ ( 15 + 6 N ) × 1 + A T n 2 M × 1 ⏟ n 0 = H 0 ( 2 M − 3 ) × ( 15 + 6 N ) X ~ ( 15 + 6 N ) × 1 + n 0 ( 2 M − 3 ) × 1 \begin{aligned}r_0^{(2M-3M_L)\times1}&=\mathrm{A}^Tr^{2M\times1}\cong\underbrace{\mathrm{A}^TH_X^{2M\times(15+6N)}}_{H_0}\tilde{X}^{(15+6N)\times1}+\underbrace{\mathrm{A}^Tn^{2M\times1}}_{n_0}\\&={H_0}^{(2M-3)\times(15+6N)}\tilde{X}^{(15+6N)\times1}+{n_0}^{(2M-3)\times1}\end{aligned} r0(2M3ML)×1=ATr2M×1H0 ATHX2M×(15+6N)X~(15+6N)×1+n0 ATn2M×1=H0(2M3)×(15+6N)X~(15+6N)×1+n0(2M3)×1

5.3.2 QR分解降低计算量

参考论文A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation公式(27)~(30)

  投影完之后,我们就可以得到新的残差和相应的雅可比矩阵 H 0 H_{0} H0。但是 H 0 H_{0} H0矩阵通常维度很大,为了降低计算量,对 H 0 H_{0} H0进行QR分解:

  QR分解会得到一个正交矩阵和一个上三角矩阵!正交矩阵的转置和其本身的乘积是单位矩阵,且该矩阵的所有列向量彼此正交(内积为0)
H 0 ( 2 M − 3 ) × ( 15 + 6 N ) = [ Q 1 Q 2 ] [ T H 0 ] {H_0}^{(2M-3)\times(15+6N)}=[Q_1\quad Q_2]\begin{bmatrix}T_H\\0\end{bmatrix} H0(2M3)×(15+6N)=[Q1Q2][TH0]
  对上面新的残差左边乘以 [ Q 1 T Q 2 T ] \left.\left[\begin{array}{cc}\mathbf{Q}_1^T\\\mathbf{Q}_2^T\end{array}\right.\right] [Q1TQ2T],得到
[ Q 1 T r 0 Q 2 T r 0 ] = [ T H 0 ] X ~ + [ Q 1 T n 0 Q 2 T n 0 ] \begin{bmatrix}Q_1^Tr_0\\Q_2^Tr_0\end{bmatrix}=\begin{bmatrix}T_H\\0\end{bmatrix}\tilde{X}+\begin{bmatrix}Q_1^Tn_0\\Q_2^Tn_0\end{bmatrix} [Q1Tr0Q2Tr0]=[TH0]X~+[Q1Tn0Q2Tn0]
  这个过程和左零空间投影很像,这里相当于取第一行对应的矩阵块,左零空间则是取第二行对应的矩阵块。总之,都是利用了QR分解!

5.4 更新

参考论文A Multi-State Constraint Kalman Filterfor Vision-aided Inertial Navigation公式(31)~(33)

在这里插入图片描述

6 左零空间投影

6.1 为什么要进行左零空间投影

要符合EKF的残差线性化形式

​  视觉slam中,得到重投影误差r之后,做更新前需要计算重投影误差相对于位姿与三维点的雅可比,利用雅可比来更新位姿以及三维点。

​  有⼀种模式只优化位姿,那是认为三维点精度很高,没有误差,即使这样,点还是会在后端优化。所以重投影误差中是包含着三维点的误差信息的,msckf的思想就是做不带三维点坐标的状态更新,但是并没有完全不考虑三维点的影响,这个思想是与边缘化⼀样,通过“移动”的手段。
​  在上面描述中出现了两个雅可比矩阵,⼀个是重投影误差相对于状态量的雅可比(位姿,速度,bias等⼀切参与重投影误差的量),它的行数等于误差维度,也就是2n个,n为点数,例如我们的双目msckf就是4n,因为⼀个点在左右目都有观测,列数等于状态量维度。重投影误差相对于三维点的雅可比同理。

​  现在为了将这部分不参与计算,并让这部分隐式地参与到计算,如何做?要注意这里并不能直接向上面⼀样把三维点固定死,因为三维点的误差是不能忽略的。

残差

r i j = z i j − z ^ i j = H C i j x ~ C i + H f i j p ~ j + n i j \mathbf{r}_{i}^{j}=\mathbf{z}_{i}^{j}-\hat{\mathbf{z}}_{i}^{j}=\mathbf{H}_{C_{i}}^{j}\tilde{\mathbf{x}}_{C_{i}}+\mathbf{H}_{f_{i}}^{j}\tilde{\mathbf{p}}_{j}+\mathbf{n}_{i}^{j} rij=zijz^ij=HCijx~Ci+Hfijp~j+nij

  我们找到关于对特征雅可比 H f i j {H}_{f_{i}}^{j} Hfij左零空间 V V Vensure the uncertainty of p ~ j \tilde{\mathbf{p}}_{j} p~jdoes not affect the residual,确保哪些只计算一次保持不变的三维点(误差很大)影响到残差的计算!
r o j = V ⊤ r j = V ⊤ H x j x ~ + V ⊤ n j = H x , o j x ~ + n o j \mathbf{r}_o^j=\mathbf{V}^\top\mathbf{r}^j=\mathbf{V}^\top\mathbf{H}_\mathbf{x}^j\tilde{\mathbf{x}}+\mathbf{V}^\top\mathbf{n}^j=\mathbf{H}_{\mathbf{x},o}^j\tilde{\mathbf{x}}+\mathbf{n}_o^j roj=Vrj=VHxjx~+Vnj=Hx,ojx~+noj
  找到⼀个矩阵V乘在等式左右,将三维点的那项变成0矩阵,那么只需要更新状态即可,同时点也通过V矩阵融入到状态中,数学上讲通过A矩阵将前两项投影到了第三项的零空间上,概率上讲这种操作使得与三维点无关

左零空间与零空间区别

  1. 零空间(Null Space):
    • 零空间,也称为核(kernel),是一个线性变换(或矩阵)中所有映射到零向量的向量组成的空间。
    • 对于矩阵 A,其零空间是 A x = 0 Ax=0 Ax=0所有解的向量组成的空间
  2. 左零空间(Left Null Space):
    • 左零空间是一个矩阵的转置的零空间。
    • 对于矩阵 A,其左零空间是 y T A = 0 y^TA=0 yTA=0所有解的向量组成的空间

零空间维度 + 矩阵A的秩 = 矩阵维度n

6.2 如何计算零空间矩阵V

  对于上面两个雅可比,维度分别如下,4是因为双目,单目观测为2,所以双目是4.n表示了当前观测z被观测的帧数
H C i j = ( J 1 H 1 J 2 R ⊤ H 1 ) 4 n ∗ 6 , H f i j = ( J 1 H 2 J 2 R ⊤ H 2 ) 4 n ∗ 3 \left.\mathbf{H}_{C_i}^j=\left(\begin{array}{c}\mathbf{J}_1\mathbf{H}_1\\\mathbf{J}_2\mathbf{R}^\top\mathbf{H}_1\end{array}\right.\right)_{4n*6},\quad\mathbf{H}_{f_i}^j=\left(\begin{array}{c}\mathbf{J}_1\mathbf{H}_2\\\mathbf{J}_2\mathbf{R}^\top\mathbf{H}_2\end{array}\right)_{4n*3} HCij=(J1H1J2RH1)4n6,Hfij=(J1H2J2RH2)4n3

  把这个雅可比通过QR分解分出两个矩阵,正交矩阵 Q 和一个上三角矩阵 R 的乘积,然后对两个矩阵分块处理,可以得到类似下图矩阵块:

在这里插入图片描述

  因为Q是正交矩阵,所以Q2中任意一列乘以Q1中一列为0!所以Q2的转置实际上就是我们要找的左零空间矩阵(注意到一个正交矩阵Q乘以正交矩阵的转置就是单位阵!)
δ r = J x δ X + J p δ P δ r = J x δ X + [ Q 1 Q 2 ] [ R 1 0 ] δ P [ Q 1 T Q 2 T ] δ r = [ Q 1 T Q 2 T ] J x δ X + [ R 1 0 ] δ P \begin{gathered} \delta\mathbf{r}=\mathbf{J_x}\delta\mathbf{X}+\mathbf{J_p}\delta\mathbf{P} \\ \left.\delta\mathbf{r}=\mathbf{J}_\mathbf{x}\delta\mathbf{X}+\left[\begin{array}{ll}\mathbf{Q}_1&&\mathbf{Q}_2\end{array}\right.\right]\left[\begin{array}{ll}\mathbf{R}_1\\\mathbf{0}\end{array}\right]\delta\mathbf{P} \\ \left.\left[\begin{array}{l}\mathbf{Q_1}^T\\\mathbf{Q_2}^T\end{array}\right.\right]\delta\mathbf{r}=\left[\begin{array}{ll}\mathbf{Q_1}^T\\\mathbf{Q_2}^T\end{array}\right]\mathbf{J_x}\delta\mathbf{X}+\left[\begin{array}{ll}\mathbf{R_1}\\\mathbf{0}\end{array}\right]\delta\mathbf{P} \end{gathered} δr=JxδX+JpδPδr=JxδX+[Q1Q2][R10]δP[Q1TQ2T]δr=[Q1TQ2T]JxδX+[R10]δP
  在说下为什么Q2就是左零空间矩阵呢?看下面矩阵,实际上可以分为两行,如果单独拿出Q2对应的哪一行,关于路标点的那一部分对应是0!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷C++简单题小练习day22—小鱼记忆小程序!一题五解,高效学习

day22--小鱼记忆--2.26 习题概述 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 ai​(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 0 就不要念出来了)。…

【高级数据结构】Trie树

原理 介绍 高效地存储和查询字符串的数据结构。所以其重点在于:存储、查询两个操作。 存储操作 示例和图片来自:https://blog.csdn.net/qq_42024195/article/details/88364485 假设有这么几个字符串:b,abc,abd&…

数字中国:构建智慧社会的未来蓝图

一、引言 随着信息技术的迅猛发展,数字中国已经成为推动社会进步、提升国家竞争力的重要引擎。数字中国不仅代表着信息技术的广泛应用,更代表着一种全新的社会形态和发展模式。在这个背景下,AI与大数据技术的融合与应用成为数字中国建设的核…

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境: Dev c 算法思想: 本实验是模拟进程调度中的优先级算法,在先来先服务算法的基础上,只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU,将其从就绪队列中出队后。若此后队首的进程的…

PCIe(四)—— 物理层

在看完事务层和数据链路层之后,我们来继续我们的协议栈之旅吧!这一篇中,我们会来看看PCIe物理层(Physical Layer)是如何工作的,从而帮助我们更加深入的了解PCIe的数据传输。 1. 物理层(Physical Layer) 当数据链路层将上层数据封装好后,就会将其交给物理层进行传输。…

探讨苹果 Vision Pro 的 AI 数字人形象问题

Personas 的设计模糊性: 部分人认为这种模糊设计可能是出于安全考虑🛡️。安全角度:Personas 代表着你的 AI 数字形象,在创建时,它相当于你的 AVP(生物识别扫描器的存在增加了冒充的难度)。如果…

第19章-IPv6基础

1. IPv4的缺陷 2. IPv6的优势 3. 地址格式 3.1 格式 3.2 长度 4. 地址书写压缩 4.1 段内前导0压缩 4.2 全0段压缩 4.3 例子1 4.4 例子 5. 网段划分 5.1 前缀 5.2 接口标识符 5.3 前缀长度 5.4 地址规模分类 6. 地址分类 6.1 单播地址 6.2 组播地址 6.3 任播地址 6.4 例子 …

ICLR/NeurIPS论文分享:任务通用的时序基础模型

吴海旭 清华大学软件学院博士生 师从龙明盛副教授,研究方向为深度学习及其在复杂时空物理过程建模中的应用,目前在Nature Machine Intelligence、IEEE TPAMI、ICML、NeurIPS上发表多篇论文,研究成果在中国气象局、北京冬奥会落地应用。曾获清…

Linux信号【systemV】

目录 前言 正文: 1消息队列 1.1什么是消息队列? 1.2消息队列的数据结构 1.3消息队列的相关接口 1.3.1创建 1.3.2释放 1.3.3发送 1.3.4接收 1.4消息队列补充 2.信号量 2.1什么是信号量 2.2互斥相关概念 2.3信号量的数据结构 2.4…

【高阶数据结构】LRUCache

文章目录 1. 什么是LRU Cache2. LRU Cache的实现3. LinkedHashMap4. LRU Cache OJ题4.1 题目要求4.2 解题思路4.3 代码实现4.3.1 Java代码一4.3.2 Java代码二 1. 什么是LRU Cache LRUCache,全称为Least Recently Used Cache,即最近最少使用缓存&#xf…

基于springboot+vue的纺织品企业财务管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

mac 安装hbuilderx

下载 HBuilderX下载地址: 下载地址 选额mac版本点击下载 安装 如图,将HBuilderX拖到Applications,才是正确的安装姿势。 MacOSX,软件必须安装到/Applications目录,如未安装到此目录,可能会出现插件安装失败、项目创建…

揭秘Java性能调优的层次 | 综合多方向提升应用程序性能与系统高可用的关键(架构层次规划)

揭秘性能调优的层次 | 综合多方向提升应用程序性能与系统的高可用 前言介绍调优层次调优 — 设计案例说明 - 操作轮询控制事件驱动 调优 — 代码案例说明 - ArrayList和LinkedList性能对比案例说明 - 文件读写实现方式的性能对比 调优 — JVMJVM架构分布JVM调优方向**JVM垃圾回…

Linux搭建SFTP服务器

案例:搭建SFTP服务器 SFTP(SSH文件传输协议) SFTP(SSH文件传输协议)是一种安全的文件传输协议,用于在计算机之间传输文件。它基于SSH(安全外壳协议)的子系统,提供了加密的…

EchoServer回显服务器简单测试

目录 工具介绍 工具使用 测试结果 工具介绍 github的一个开源项目,是一个测压工具 EZLippi/WebBench: Webbench是Radim Kolar在1997年写的一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的…

动态住宅IP vs 静态住宅IP,如何选择适合你的海外住宅IP?

随着数字时代的发展,网络已经成为了我们日常生活中不可或缺的一部分。在海外留学、旅游、工作或者进行电子商务等活动时,一个合适的住宅IP可以帮助我们保护个人隐私、确保网络连接的稳定性、提高在线服务的可靠性等。因此,选择适合自己的住宅…

ChatGPT科研与AI绘图及论文高效写作教程

原文链接:ChatGPT科研与AI绘图及论文高效写作教程 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电…

vos3000外呼系统如何修改话机注册端口

本文以vos3000为例,其他产品替换对应产品名称即可 修改配置文件地址 /home/kunshi/mbx3000/etc/softswitch.conf H323_RAS_PORT1719 H323 注册端口,可以用逗号(,)分隔多个端口 H323_RC4_RAS_PORT3719 H323 加密注册端口&#x…

redis03 八种数据类型

思维草图 String类型 字符串类型,是redis中最简单的存储类型,可以包含任何数据,例如jpg图片或者序列化的对象等,底层都是以字节数组形式存储,最大能存储512MB的数据。 常用命令 KEY命名规范 加前缀,分…

Vue3 循环渲染 v-for

v-for 指令:用于循环渲染列表数据。 v-for 指令:可以循环数组、对象、字符串【不常用】、指定次数【很少用】。 key 属性:用于给标签添加一个唯一的标识。 key 属性:推荐使用 id、手机号、身份证号、学号 等唯一值。 注&#…