从零开始手写VIO 第5期(Lesson 2)

从零开始手写VIO 第5期(Lesson 2)

本文是VIO课程的第二节课,权当自己的总结,由于github可能比较慢,所以放在了gitee,链接参见之前的博文,欢迎大家参考,更新不易,如需转载,请著名出处,谢谢。

课程内容回顾

   第二节主要讲解了VIO中用到的IMU噪声相关的知识以及标定方法

1 作业1

设置 IMU 仿真代码中的不同的参数,生成 Allen 方差标定曲线:

作业采用kalibr_allan标定工具

1.1 参数1

gyro_bias_sigma = 0.00005 \quad rad/s^2sqrt(HZ)
acc_bias_sigma = 0.0005 \quad m/s^3sqrt(HZ)

gyro_noise_sigma = 0.015\quad rad/s^1sqrt(HZ)
acc_noise_sigma = 0.019\quad m/s^2sqrt(HZ)

加速度角速度

1.2 参数2

gyro_bias_sigma = 0.0001\quad rad/s^2sqrt(HZ)
acc_bias_sigma = 0.005\quad m/s^3sqrt(HZ)

gyro_noise_sigma = 0.025\quad rad/s^1sqrt(HZ)
acc_noise_sigma = 0.03\quad m/s^2sqrt(HZ)

加速度角速度
在这里插入图片描述在这里插入图片描述

可以看到两次标定结果和设置的参数很接近

2 作业2

将 IMU 仿真代码中的欧拉积分替换成中值积分

2.1 中值积分部分代码

//上一时刻数据
MotionData imupose_pre = imudata[i - 1];
//计算均值
Eigen::Vector3d mid_omega = (imupose_pre.imu_gyro + imupose.imu_gyro) * 0.5;

//计算角度变化
Eigen::Vector3d dtheta_half = mid_omega * dt / 2.0;
Eigen::Quaterniond dq(1, dtheta_half.x(), dtheta_half.y(), dtheta_half.z());
dq.normalize();

Eigen::Quaterniond Qwb_newx = Qwb * dq;
//IMU一次积分
Eigen::Vector3d acc_w = 0.5 * (Qwb * (imupose.imu_acc) + gw + Qwb_newx * (imupose_pre.imu_acc) + gw);
Vw = Vw + acc_w * dt;
Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w;
Qwb = Qwb_newx;

2.2 结果展示

​ 将gt轨迹,欧拉积分轨迹以及中值积分轨迹画在一起,其中,蓝色为gt值,绿色为欧拉积分值,红色为中值积分值,可以看到的是,中值积分的结果更接近gt轨迹。
在这里插入图片描述

3 作业3

阅读从已有轨迹生成 imu 数据的论文,撰写总结推导

​ 本文提出了一种通用的视觉-惯性SLAM和标定的连续时间框架,核心在于提供了一个连续轨迹生成的方法,选择了一种形式,能够提供以下几点功能: (1)局部控制,使得系统能够在线或者捆绑批量运行,(2) C 2 C^2 C2连续,从而可以预测IMU的测量,(3)估计最小弯矩的轨迹。三次样条插值在 R 3 \mathbb{R}^3 R3的轨迹上是一种普遍方法,但是对于3D的旋转却不是简单,比如在 S O 3 \mathbb{SO3} SO3上进行插值,不一定能够保持 C 2 C^2 C2连续。所以本文采取了基于李代数的累积基函数方式去参数化一条连续的轨迹。这样的方式不仅能够提供保持 C 2 C^2 C2连续,而且提供了一个很简单的二阶导数公式。

3.1 B-样条累积基函数表示

​ 标准的k-1自由度的B-样条曲线的基函数可以表示为:
p ( t ) = ∑ i = 0 n p i B i , k ( t ) (1) \boldsymbol p(t) = \sum_{i=0}^n \boldsymbol p_iB_{i,k}(t)\tag{1} p(t)=i=0npiBi,k(t)(1)
其中 p i ∈ R N \boldsymbol p_i\in \mathbb{R^N} piRN是在 t i t_i ti时刻的控制点, i ∈ [ 0 , . . . , n ] i \in [0,...,n] i[0,...,n] B i , k ( t ) B_{i,k}(t) Bi,k(t)是基函数,可以通过deboor-Cox递推公式来计算,所以公式 ( 1 ) (1) (1)可以重写成累加的形式:
p ( t ) = p 0 B ~ 0 , k ( t ) + ∑ i = 0 n ( p i − p i − 1 ) B ~ i , k ( t ) (2) \boldsymbol p(t)=\boldsymbol p_0 \widetilde B_{0,k}(t) + \sum_{i=0}^n(\boldsymbol p_i - \boldsymbol p_{i-1}) \widetilde B_{i,k}(t)\tag{2} p(t)=p0B 0,k(t)+i=0n(pipi1)B i,k(t)(2)
其中 B i , k ( t ) = ∑ j = i n B j , k ( t ) B_{i,k}(t)=\sum_{j=i}^nB_{j,k}(t) Bi,k(t)=j=inBj,k(t)是累加基函数。采用对数和指数映射的关系,可以在 S E 3 \mathbb{SE3} SE3的空间下表示 ( 2 ) (2) (2)进而代替控制点的导数,$\Omega_i = log(\boldsymbol T_{w,i-1}^{-1}\boldsymbol T_{w,i})\in \mathfrak{se}3 $,然后多次指数相乘。
T w , s ( t ) = e x p ( B ~ 0 , k ( t ) l o g ( T w , 0 ) ) ∏ i = 1 n e x p ( B ~ i , k ( t ) Ω i ) , (3) \boldsymbol T_{w,s}(t) = exp(\widetilde B_{0,k}(t)log(\boldsymbol T_{w,0}))\prod_{i=1}^{n}exp(\widetilde B_{i,k}(t)\Omega_{i}), \tag{3} Tw,s(t)=exp(B 0,k(t)log(Tw,0))i=1nexp(B i,k(t)Ωi),(3)
其中 T w , s ( t ) ∈ S E 3 \boldsymbol T_{w,s}(t)\in \mathbb{SE}3 Tw,s(t)SE3 t t t时刻的样条插值点, T w , i ( t ) ∈ S E 3 \boldsymbol T_{w,i}(t)\in \mathbb{SE}3 Tw,i(t)SE3是控制点。 w w w表示是在世界坐标系下的。

3.2 累加三次B-样条

​ 在本文中,集中讨论三次B-样条 ( k = 4 ) (k=4) (k=4)的情况。假设控制点是分布在统一的时间间隔 Δ t \Delta t Δt上。在一个三次样条插值中,在t时刻有四个点影响B-样条曲线。定义一个集合为 [ t i − 1 , t i , t i + 1 , t i + 2 ] [t_{i-1},t_{i},t_{i+1},t_{i+2}] [ti1,ti,ti+1,ti+2],对于 t ∈ [ t i , t i + 1 ] {t\in [t_i,t_{i+1}]} t[ti,ti+1]。可以进一步简化,使用统一的时间表示 s ( t ) = ( t − t 0 ) / Δ t s(t)=(t-t_0)/\Delta t s(t)=(tt0)/Δt。这样就将控制点的时间 t i t_i ti转换成 s i ∈ [ 0 , 1 , . . . , n ] s_i \in [0,1,...,n] si[0,1,...,n],给定时间 s i < = s ( t ) < s i + 1 s_i<=s(t)<s_{i+1} si<=s(t)<si+1,有 u ( t ) = s ( t ) − s ( i ) u(t)=s(t)-s(i) u(t)=s(t)s(i);利用这种表达式,结合deboor-Cox递推公式,可以写出累积基函数 B ~ ( u ) \widetilde {\boldsymbol B}(u) B (u)和它的导数 B ~ ˙ ( u ) \dot {\widetilde {\boldsymbol B}}(u) B ˙(u) B ~ ¨ ( u ) \ddot {\widetilde {\boldsymbol B}}(u) B ¨(u)的矩阵表达式:
B ~ ( u ) = C [ 1 u u 2 u 3 ] , B ~ ˙ ( u ) = 1 Δ t C [ 0 1 2 u 3 u 2 ] , B ~ ¨ ( u ) = 1 Δ t 2 C [ 0 0 2 6 u ] , C = 1 6 [ 6 0 0 0 5 3 − 3 1 1 3 3 − 2 0 0 0 1 ] \widetilde {\boldsymbol B}(u)=\boldsymbol C\left[\begin{matrix} 1 \\ u\\ u^2 \\ u^3\end{matrix} \right],\dot {\widetilde {\boldsymbol B}}(u)=\frac{1}{\Delta t}\boldsymbol C\left[\begin{matrix} 0 \\ 1\\ 2u \\ 3u^2\end{matrix} \right],\ddot {\widetilde {\boldsymbol B}}(u)=\frac{1}{\Delta t^2}\boldsymbol C\left[\begin{matrix} 0 \\ 0\\ 2 \\ 6u\end{matrix} \right],\boldsymbol C=\frac{1}{6}\left[\begin{matrix} 6 && 0 && 0 && 0 \\ 5 && 3 && -3 && 1\\ 1&& 3 && 3 && -2 \\0 && 0 && 0 && 1\end{matrix} \right] B (u)=C1uu2u3,B ˙(u)=Δt1C012u3u2,B ¨(u)=Δt21C0026u,C=616510033003300121
在spline轨迹的pose可以表示为:
T w , s ( u ) = T w , i − 1 ∏ j = 1 3 e x p ( B ~ ( u ) j Ω i + j ) (4) \boldsymbol T_{w,s}(u)=T_{w,i-1}\prod_{j=1}^3exp(\widetilde {\boldsymbol B}(u)_j\Omega_{i+j})\tag{4} Tw,s(u)=Tw,i1j=13exp(B (u)jΩi+j)(4)
其中下标 i i i是从 u ( t ) u(t) u(t)中获取, B ~ ( u ) j \widetilde {\boldsymbol B}(u)_j B (u)j表示 B ~ ( u ) \widetilde {\boldsymbol B}(u) B (u)的第 j j j个元素(从0开始), Ω \Omega Ω就是之前定义的。并且,对任意的 u u u都有, B ~ ( u ) 0 = 1 \widetilde {\boldsymbol B}(u)_0 = 1 B (u)0=1。所以位姿的导数可以写成:
T ˙ w , s ( u ) = T w , i − 1 ( A ˙ 0 A 1 A 2 + A 0 A ˙ 1 A 2 + A 0 A 1 A ˙ 2 ) (5) \dot {\boldsymbol T}_{w,s}(u) = {\boldsymbol T}_{w,i-1}(\dot {\boldsymbol A}_{0}{\boldsymbol A}_{1}{\boldsymbol A}_{2} + {\boldsymbol A}_{0}\dot {\boldsymbol A}_{1}{\boldsymbol A}_{2}+{\boldsymbol A}_{0}{\boldsymbol A}_{1}\dot {\boldsymbol A}_{2})\tag{5} T˙w,s(u)=Tw,i1(A˙0A1A2+A0A˙1A2+A0A1A˙2)(5)

T ¨ w , s ( u ) = T w , i − 1 ( A ¨ 0 A 1 A 2 + A 0 A ¨ 1 A 2 + A 0 A 1 A ¨ 2 + 2 ( A ˙ 0 A ˙ 1 A 2 + A ˙ 0 A 1 A ˙ 2 + A 0 A ˙ 1 A ˙ 2 ) (6) \ddot {\boldsymbol T}_{w,s}(u) = {\boldsymbol T}_{w,i-1}(\ddot {\boldsymbol A}_{0}{\boldsymbol A}_{1}{\boldsymbol A}_{2} + {\boldsymbol A}_{0}\ddot {\boldsymbol A}_{1}{\boldsymbol A}_{2}+{\boldsymbol A}_{0}{\boldsymbol A}_{1}\ddot {\boldsymbol A}_{2} + 2(\dot {\boldsymbol A}_{0}\dot {\boldsymbol A}_{1}{\boldsymbol A}_{2}+\dot {\boldsymbol A}_{0}{\boldsymbol A}_{1}\dot {\boldsymbol A}_{2}+{\boldsymbol A}_{0}\dot {\boldsymbol A}_{1}\dot {\boldsymbol A}_{2}) \tag{6} T¨w,s(u)=Tw,i1(A¨0A1A2+A0A¨1A2+A0A1A¨2+2(A˙0A˙1A2+A˙0A1A˙2+A0A˙1A˙2)(6)

A j = e x p ( Ω i + j B ~ ( u ) j ) , A ˙ j = A j Ω i + j B ~ ˙ ( u ) j , A ¨ j = A ˙ j Ω i + j B ~ ˙ ( u ) j + A j Ω i + j B ~ ¨ ( u ) j {\boldsymbol A}_{j}=exp(\Omega_{i+j}\widetilde {\boldsymbol B}(u)_j),\dot {\boldsymbol A}_{j}={\boldsymbol A}_{j}\Omega_{i+j}\dot {\widetilde {\boldsymbol B}}(u)_j, \\\ddot {\boldsymbol A}_{j}=\dot {\boldsymbol A}_{j}\Omega_{i+j}\dot {\widetilde {\boldsymbol B}}(u)_j + {\boldsymbol A}_{j}\Omega_{i+j}\ddot {\widetilde {\boldsymbol B}}(u)_j Aj=exp(Ωi+jB (u)j),A˙j=AjΩi+jB ˙(u)j,A¨j=A˙jΩi+jB ˙(u)j+AjΩi+jB ¨(u)j

​ 累加 B 样条参数化轨迹可以利用上式计算对时间的导数,因此可以用来计算加速度和角速度的测量:
G y r o ( u ) = R w , s T ( u ) ∗ R ˙ w , s ( u ) + b i a s , (8) Gyro(u)=\boldsymbol R_{w,s}^T(u)*\dot {\boldsymbol R}_{w,s}(u) + bias,\tag{8} Gyro(u)=Rw,sT(u)R˙w,s(u)+bias,(8)

A c c e l ( u ) = R w , s T ( u ) ∗ ( s w ¨ ( u ) + g w ) + b i a s , (9) Accel(u)=\boldsymbol R_{w,s}^T(u)*(\ddot {\boldsymbol s_w}(u)+g_w) + bias,\tag{9} Accel(u)=Rw,sT(u)(sw¨(u)+gw)+bias,(9)

​ 其中 R ˙ w , s ( u ) \dot {\boldsymbol R}_{w,s}(u) R˙w,s(u) s w ¨ ( u ) \ddot {\boldsymbol s_w}(u) sw¨(u)分别表示$\dot {\boldsymbol T}{w,s}(u) 和 和 \ddot {\boldsymbol T}{w,s}(u) 的 旋 转 、 平 移 子 矩 阵 , 的旋转、平移子矩阵, g_w$表示世界坐标系的重力加速度。

4 Allan Variance总结

4.1 前言

陀螺仪的随即误差包括: 量化噪声,角度随机游走,零偏不稳定性,角速率随机游走,速率斜坡等。

a. 量化噪声(Q): 由AD转换过程中产生,是随机的,互不相关,是白噪声序列。

b. 角度随机游走(N): 陀螺仪输出的角速率(加速度计的线加速度)白噪声,时间积分后为角度(线速度)随机游走。

c. 零偏不稳定性(B): 零偏稳定性是指低频零偏抖动,由于内部电路随机波动引起,代表零偏随时间变化的情况。

d. 角速率随机游走(K): 相关时间较长的一种噪声,是一种起源不确定的随机过程,

e. 速率斜坡®: 漂移角速率斜坡是一种确定性系统误差,而不是随机项。

4.2 计算过程

4.2.1 采集数据

​ 首先将陀螺仪静置,采集陀螺仪的角速度序列为 Ω \Omega Ω(t),设采集到了N个数据,采样频率为。

4.2.2 选择因子m

​ 选择一个平均的时间长度为 τ = m τ 0 \tau = m\tau_0 τ=mτ0,其中m是平均时间因子,m的值可以随便选取,只要满足 m < ( N − 1 ) / 2 m < (N-1)/2 m<(N1)/2

4.2.3 分堆

​ 根据采集的数据及m的值,将数据分堆,每一堆的时间长度都为 τ = m τ 0 \tau = m\tau_0 τ=mτ0。这里是有重叠区域的划分,得到的结果如图所示:
在这里插入图片描述这张图是参考一个文献的,具体忘记了,后续找到之后更新上来

4.2.4 计算阿伦方差
4.2.4.1 累加计算每个时刻的 θ \theta θ

​ 根据公式 θ ( t ) = ∫ t Ω ( t ′ ) d ( t ′ ) \theta(t) = \int^t \Omega (t') d(t') θ(t)=tΩ(t)d(t)来计算每个时刻对应的角,其中$ t = k \tau_0(\tau_0,2\tau_0,3\tau_0…) , k 从 1 到 N , 对 于 离 散 的 数 据 来 说 , 累 加 和 也 可 以 用 来 计 算 出 N 个 角 度 值 , 比 如 有 三 个 角 速 度 为 : 10 , 12 , 15 , 那 么 有 : ,k从1到N,对于离散的数据来说,累加和也可以用来计算出N个角度值,比如有三个角速度为: 10,12,15,那么有: k1NN:10,12,15,:\theta_1 = 10 \tau_0,\theta_2 = 22 \tau_0,\theta_3 = 37 \tau_0$。

4.2.4.2 利用下式计算Allan方差

σ 2 ( θ ) = 1 2 τ 2 ( N − 2 m ) Σ k = 1 N − 2 m ( θ k + 2 m − 2 θ k + m + θ k ) 2 \sigma^2(\theta) = \frac{1}{2\tau^2(N-2m)}\Sigma_{k=1}^{N-2m}(\theta_{k+2m}-2\theta_{k+m}+\theta_{k})^2 σ2(θ)=2τ2(N2m)1Σk=1N2m(θk+2m2θk+m+θk)2

4.2.5 重复4.2.2-4.2.4

4.3 计算各个项方差

​ 忽略其它噪声的影响,Allan方差可近似为以上五种噪声的和,化间可得:
σ t o t a l 2 ( τ ) = 3 Q 2 τ 2 + N 2 τ + B 2 [ 2 π ] l n 2 + K 2 τ 3 + R 2 τ 2 2 = Σ n = − 2 2 A n 2 τ n \sigma_{total}^2(\tau) = \frac{3Q^2}{\tau^2}+ \frac{N^2}{\tau}+B^2[\frac{2}{\pi}]ln2 + \frac{K^2\tau}{3}+\frac{R^2\tau^2}{2}=\Sigma_{n=-2}^{2}A_n^2\tau^n σtotal2(τ)=τ23Q2+τN2+B2[π2]ln2+3K2τ+2R2τ2=Σn=22An2τn
为了求解以上5个方差,可以拟合出相应的曲线:
σ t o t a l ( τ ) = 3 Q 2 τ 2 + N 2 τ + B 2 [ 2 π ] l n 2 + K 2 τ 3 + R 2 τ 2 2 = Σ n = − 2 2 A n τ n / 2 \sigma_{total}(\tau) =\sqrt{\frac{3Q^2}{\tau^2}}+ \sqrt{\frac{N^2}{\tau}}+\sqrt{B^2[\frac{2}{\pi}]ln2} + \sqrt{\frac{K^2\tau}{3}}+\sqrt{\frac{R^2\tau^2}{2}}=\Sigma_{n=-2}^{2}A_n\tau^{n/2} σtotal(τ)=τ23Q2 +τN2 +B2[π2]ln2 +3K2τ +2R2τ2 =Σn=22Anτn/2
根据系数来计算对应的结果,这里有两种方式来计算。假如有m个因子,每个因子对应着一个 τ ′ = τ \tau'=\sqrt{\tau} τ=τ ,对应的系数为C,则有:
[ τ 1 ′ − 2 τ 1 ′ − 1 τ 1 ′ 0 τ 1 ′ 1 τ 1 ′ 2 . . . . . . . . . . . . . . . τ m ′ − 2 τ m ′ − 1 τ m ′ 0 τ m ′ 1 τ m ′ 2 ] ∗ [ C 1 C 2 C 3 C 4 C 5 ] = [ σ 1 . . . σ m ] \left[\begin{matrix} \tau_1'^{-2} & \tau_1'^{-1} & \tau_1'^{0} & \tau_1'^{1} & \tau_1'^{2}\\ ... & ... & ... & ... & ...\\ \tau_m'^{-2} & \tau_m'^{-1} & \tau_m'^{0} & \tau_m'^{1} & \tau_m'^{2} \end{matrix}\right]* \left[\begin{matrix} C_1\\ C_2\\ C_3\\ C_4\\ C_5\\ \end{matrix}\right]= \left[\begin{matrix} \sigma_1\\ ...\\ \sigma_m\\ \end{matrix}\right] τ12...τm2τ11...τm1τ10...τm0τ11...τm1τ12...τm2C1C2C3C4C5=σ1...σm

A X = b X = ( A T A ) − 1 A T b AX = b\\ X = (A^TA)^{-1}A^Tb AX=bX=(ATA)1ATb

这是一个超定方程,这样就可以求出对应的系数,利用对应的系数就可以计算出上述5个方差的值了,也可采用优化的方法来求解出对应的系数,从而计算出对应的方差项。

​ 像imu_utils就用的ceres来进行优化。

4.4 单位分析

​ 根据量纲的依据,可以知道C的各项系数的单位:

​ 由于 A A A的单位为 [ s − 1 s − 1 2 s 0 s 1 2 s 1 ] \left[\begin{matrix}s^{-1} & s^{-\frac{1}{2}}&s^0 & s^{\frac{1}{2}} & s^1\end{matrix}\right] [s1s21s0s21s1],而 b b b的单位是 d e g / h deg/h deg/h,所以 C C C对应的单位是 [ d e g / h ∗ s d e g / h ∗ s d e g / h d e g / h / s d e g / h / s ] \left[\begin{matrix}deg/h*s & deg/h*\sqrt{s} & deg/h & deg/h/\sqrt{s} & deg/h/s\end{matrix}\right] [deg/hsdeg/hs deg/hdeg/h/s deg/h/s]。根据时间的关系可以换算成相对应的 h h h s s s的单位。

噪声类型参数单位
量化噪声Q d e g / h ∗ s deg/h*s deg/hs
角度随机游走N d e g / h deg/\sqrt{h} deg/h
零偏不稳定性B d e g / h deg/h deg/h
角速率随机游走K d e g / h / h deg/h/\sqrt{h} deg/h/h
速率斜坡R d e g / h / h deg/h/h deg/h/h

同理可以计算出加速度计的各项误差及单位

噪声类型参数单位
量化噪声Q m / s m/s m/s
速度随机游走N m / s / s m/s/\sqrt{s} m/s/s
零偏不稳定性B m / s 2 m/s^2 m/s2
加速度随机游走K m / s 2 / s m/s^2/\sqrt{s} m/s2/s
速率斜坡R m / s 2 / s m/s^2/s m/s2/s

总结

参考链接

[1] 深蓝学院SLAM/VIO课程
[2] Allan variance文献(待确认)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值