【VIO】第2讲 基于优化的IMU

news/2024/5/20 5:11:27/文章来源:https://blog.csdn.net/ASUNAchan/article/details/127534050

第2讲 基于优化的 IMU 与视觉信息融合

1.最小二乘问题求解

(1)最小二乘基础概念

​ 1 定义:找到一个n维的变量 x∈Rnx \in R^nxRn ,使得损失函数 F(x)F(x)F(x) 取得局部最小值:
F(x)=12∑i=1m(fi(x))2F(x) = \frac{1}{2} \sum_{i=1}^m (f_i(x))^2 F(x)=21i=1m(fi(x))2

2 cost function 泰勒展开

F(x+Δx)=F(x)+JΔx+12ΔxTHΔx+O(∣∣Δx∣∣3)F(x + \Delta x) = F(x) + J \Delta x + \frac{1}{2} \Delta x^TH \Delta x + O(||\Delta x||^3) F(x+Δx)=F(x)+JΔx+21ΔxTHΔx+O(∣∣Δx3)

​ 3 迭代法

​ 找一个下降方向使得损失函数随x的迭代逐渐减小,直到x收敛到 x∗x^*x
F(xk+1)<F(xk)F(x_{k+1}) < F(x_k) F(xk+1)<F(xk)
​ 第一步:找下降方向单位向量 d,第二步:确定下降步长 α\alphaα

​ 假设 α\alphaα 足够小,对 F(x)F(x)F(x) 进行一阶泰勒展开:
F(x+αd)≈F(x)+αJdF(x+ \alpha d) \thickapprox F(x) + \alpha Jd F(x+αd)F(x)+αJd
​ 所以只需要寻找下降方向,满足:
Jd<0Jd < 0 Jd<0

(2)最速下降法和牛顿法

​ 1)最速下降法

​ 下降方向的条件:$Jd = ||J||cos\theta $ ,θ\thetaθ 表示下降方向和梯度方向的夹角。当 θ=π\theta = \piθ=π时:
d=−JT∣∣J∣∣d = \frac{-J^T}{||J||} d=∣∣J∣∣JT
​ 即梯度的负方向为最速下降方向。

​ 2)牛顿法
J+HΔx=0=>HΔx=−JJ+H \Delta x = 0 \\ => H \Delta x = -J J+HΔx=0=>HΔx=J
​ 求解线性方程,便得到了增量。

​ 3)阻尼法

​ 记:
F(x+Δx)≈L(Δx)≡F(x)+JΔx+12ΔxTHΔxF(x + \Delta x) \thickapprox L(\Delta x) \equiv F(x) + J\Delta x + \frac{1}{2}\Delta x^TH\Delta x F(x+Δx)L(Δx)F(x)+JΔx+21ΔxTHΔx
​ 求以下函数的最小化:
Δx≡argmin{L(Δx)+12μΔxTΔx}\Delta x \equiv arg\;min\{L(\Delta x) + \frac{1}{2}\mu \Delta x^T \Delta x \} Δxargmin{L(Δx)+21μΔxTΔx}

求导,并整理:

(H+μI)Δx=−JT(H + \mu I) \Delta x = -J^T (H+μI)Δx=JT

(3)高斯牛顿法

(JTJ)Δx=−JTf=>HΔx=b(J^TJ)\Delta x = -J^T f \\ => H \Delta x = b (JTJ)Δx=JTf=>HΔx=b

(4)LM

​ 对高斯牛顿法进行了改进,求解过程中引入了阻尼因子:
(JTJ+μI)Δx=−JTfμ>0(J^TJ + \mu I)\Delta x = -J^Tf \;\;\;\;\;\; \mu > 0 (JTJ+μI)Δx=JTfμ>0
​ 阻尼因子 μ\muμ 的作用:

​ 1 μ>0\mu > 0μ>0 保证迭代朝着下降方向

​ 2 μ\muμ 非常大,则 Δx=−1μJTf=−1μF′(x)T\Delta x = -\frac{1}{\mu} J^T f = -\frac{1}{\mu}F^ \prime (x)^TΔx=μ1JTf=μ1F(x)T,接近最速下降法

​ 3 μ\muμ 非常小,则 接近高斯牛顿法

​ 简单的 μ0\mu_0μ0 初始值选取策略:
μ0=τmax{(JTJ)ii}\mu_0 = \tau \;max\{(J^TJ)_{ii} \} μ0=τmax{(JTJ)ii}
​ 通常,τ∈[10−8,1]\tau \in [10^{-8}, 1]τ[108,1]

​ 阻尼因子 μ\muμ 的更新策略:

​ 定义比例因子
ρ=F(x)−F(x+Δx)L(0)−L(Δx)L(0)−L(Δx)=12ΔxT(μΔx−JTf)\rho = \frac{F(x) - F(x + \Delta x)}{L(0) - L(\Delta x)} \\ L(0) - L(\Delta x) = \frac{1}{2}\Delta x^T(\mu \Delta x - J^Tf) ρ=L(0)L(Δx)F(x)F(x+Δx)L(0)L(Δx)=21ΔxT(μΔxJTf)
​ Marquardt 策略
ifρ<0.25μ:=u∗2elseifρ>0.75μ:=μ/3if \;\; \rho < 0.25 \\ \mu :=u * 2 \\ else\;\; if\;\;\rho > 0.75\\ \mu :=\mu/3 ifρ<0.25μ:=u2elseifρ>0.75μ:=μ/3
​ Nielsen策略
ifρ>0μ:=u∗max{13,1−(2ρ−1)3};v:=2elseμ:=μ∗3;v:=2∗vif \;\; \rho > 0\\ \mu :=u * max\{\frac{1}{3}, 1-(2\rho-1)^3 \}; \;\; v :=2\\ else\;\;\;\;\;\;\;\;\;\\ \mu :=\mu * 3; v:=2*v ifρ>0μ:=umax{31,1(2ρ1)3};v:=2elseμ:=μ3;v:=2v
​ Nielsen策略实现代码:

/// LM
void Problem::ComputeLambdaInitLM() {ni_ = 2.;currentLambda_ = -1.;currentChi_ = 0.0;// TODO:: robust cost chi2for (auto edge: edges_) {currentChi_ += edge.second->Chi2();}if (err_prior_.rows() > 0)currentChi_ += err_prior_.norm();stopThresholdLM_ = 1e-6 * currentChi_;          // 迭代条件为 误差下降 1e-6 倍double maxDiagonal = 0;ulong size = Hessian_.cols();assert(Hessian_.rows() == Hessian_.cols() && "Hessian is not square");for (ulong i = 0; i < size; ++i) {maxDiagonal = std::max(fabs(Hessian_(i, i)), maxDiagonal);}double tau = 1e-5;currentLambda_ = tau * maxDiagonal;
}void Problem::AddLambdatoHessianLM() {ulong size = Hessian_.cols();assert(Hessian_.rows() == Hessian_.cols() && "Hessian is not square");for (ulong i = 0; i < size; ++i) {Hessian_(i, i) += currentLambda_;}
}void Problem::RemoveLambdaHessianLM() {ulong size = Hessian_.cols();assert(Hessian_.rows() == Hessian_.cols() && "Hessian is not square");// TODO:: 这里不应该减去一个,数值的反复加减容易造成数值精度出问题?而应该保存叠加lambda前的值,在这里直接赋值for (ulong i = 0; i < size; ++i) {Hessian_(i, i) -= currentLambda_;}
}bool Problem::IsGoodStepInLM() {double scale = 0;scale = delta_x_.transpose() * (currentLambda_ * delta_x_ + b_);scale += 1e-3;    // make sure it's non-zero :)// recompute residuals after update state// 统计所有的残差double tempChi = 0.0;for (auto edge: edges_) {edge.second->ComputeResidual();tempChi += edge.second->Chi2();}double rho = (currentChi_ - tempChi) / scale;if (rho > 0 && isfinite(tempChi))   // last step was good, 误差在下降{double alpha = 1. - pow((2 * rho - 1), 3);alpha = std::min(alpha, 2. / 3.);double scaleFactor = (std::max)(1. / 3., alpha);currentLambda_ *= scaleFactor;ni_ = 2;currentChi_ = tempChi;return true;} else {currentLambda_ *= ni_;ni_ *= 2;return false;}
}

(5)鲁棒核函数

2. VIO残差函数的构建

(1)系统需要优化的状态量

χ=[xn,xn+1,⋯,xn+N,λm,λm+1,λm+M]xi=[pwbi,qwbi,viw,babi,bgbi],i∈[n,n+N]\chi = [x_n, x_{n+1}, \cdots, x_{n+N}, \lambda_m, \lambda_{m+1}, \lambda_{m+M}]\\ x_i = [p_{wb_i}, q_{wb_i}, v_i^w, b_a^{b_i}, b_g^{b_i}] , i \in[n, n+N] χ=[xn,xn+1,,xn+N,λm,λm+1,λm+M]xi=[pwbi,qwbi,viw,babi,bgbi]i[n,n+N]

其中: xix_ixi 包含 iii 时刻IMU机体在惯性坐标系中的位置,姿态,速度以及IMU机体坐标系中的加速度和角速度的偏置量估计;

n,mn, mn,m 分别是机体状态量,路标在滑动窗口里的起始时刻;

​ N 滑动窗口中关键帧数量;

​ M 被滑动窗口内所有关键帧观测到的;路标数量。

(2)基于逆深度的重投影误差

​ 特征点逆深度在第 iii 帧中初始化得到,在第 jjj 帧又被观测到,预测其在第 jjj 帧中的坐标:
[xcj,ycj,zcj,1]T=Tbc−1Twbj−1TwbiTbc[1λuci,1λvci,1λ,1]T[x_{c_j}, y_{c_j}, z_{c_j}, 1]^T = T_{bc}^{-1} T_{wb_j}^{-1} T_{wb_i}T_{bc}[\frac{1}{\lambda}u_{c_i}, \frac{1}{\lambda}v_{c_i}, \frac{1}{\lambda}, 1]^T [xcj,ycj,zcj,1]T=Tbc1Twbj1TwbiTbc[λ1uci,λ1vci,λ1,1]T
​ 思考公式的含义:本质上还是相机那一套,只不过IMU的 body 坐标系充当了一个桥梁的作用。(上个时刻的计算得到的像素坐标通过上个时刻的逆深度来估计此时刻的3维世界坐标值)

(3)IMU预积分

pwbj=pwbi+viwΔt−12gwΔt2+qwbi∬t∈[i,j](qbibtabt)δt2⏟α\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}+\mathbf{q}_{w b_{i}} \underbrace{\iint_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t^{2}}_{\mathbf{\alpha}} pwbj=pwbi+viwΔt21gwΔt2+qwbiαt[i,j](qbibtabt)δt2

vjw=viw−gwΔt+qwbi∫t∈[i,j](qbibtabt)δt⏟β\mathbf{v}_{j}^{w}=\mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q}_{w b_{i}}\underbrace{\int_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t}_{\mathbf{\beta}} vjw=viwgwΔt+qwbiβt[i,j](qbibtabt)δt

qwbj=qwbi∫t∈[i,j]qbibt⊗[012ωbt]δt⏟γ\mathbf{q}_{w b_{j}}=\mathbf{q}_{w b_{i}}\underbrace{\int_{t \in[i, j]} \mathbf{q}_{b_{i} b_{t}} \otimes\left[\begin{array}{c}0 \\ \frac{1}{2} \boldsymbol{\omega}^{b_{t}}\end{array}\right] \delta t}_{\mathbf{\gamma}} qwbj=qwbiγt[i,j]qbibt[021ωbt]δt

​ 预积分量:
αbibj=∬t∈[i,j](qbibtabt)δt2\boldsymbol{\alpha}_{b_{i} b_{j}}=\iint_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t^{2} αbibj=t[i,j](qbibtabt)δt2

βbibj=∫t∈[i,j](qbibtabt)δt\boldsymbol{\beta}_{b_{i} b_{j}}=\int_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t βbibj=t[i,j](qbibtabt)δt

qbibj=∫t∈[i,j]qbibt⊗[012ωbt]δt\mathbf{q}_{b_{i} b_{j}}=\int_{t \in[i, j]} \mathbf{q}_{b_{i} b_{t}} \otimes \left[ \begin{array}{c} 0 \\ \frac{1}{2} \boldsymbol{\omega}^{b_{t}} \end{array} \right] \delta t qbibj=t[i,j]qbibt[021ωbt]δt

​ 基于预积分量的导航状态更新公式:

[pwbjvjwqwbjbjabjg]=[pwbi+viwΔt−12gwΔt2+qwbiαbibjviw−gwΔt+qwbiβbibjqwbiqbibjbiabig]\left[ \begin{array}{c} \mathbf{p}_{w b_{j}} \\ \mathbf{v}_{j}^{w} \\ \mathbf{q}_{w b_{j}} \\ \mathbf{b}_{j}^{a} \\ \mathbf{b}_{j}^{g} \end{array} \right] =\left[ \begin{array}{c} \mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t-\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}+\mathbf{q}_{w b_{i}} \boldsymbol{\alpha}_{b_{i} b_{j}} \\ \mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q}_{w b_{i}} \boldsymbol{\beta}_{b_{i} b_{j}} \\ \mathbf{q}_{w b_{i}} \mathbf{q}_{b_{i} b_{j}} \\ \mathbf{b}_{i}^{a} \\ \mathbf{b}_{i}^{g} \end{array} \right] pwbjvjwqwbjbjabjg=pwbi+viwΔt21gwΔt2+qwbiαbibjviwgwΔt+qwbiβbibjqwbiqbibjbiabig

(4)预积分误差

(5)预积分的离散形式

​ 采用中值积分法
ω=12[(ωbk−bkg)+(ωbk+1−bkg)]\boldsymbol{\omega}=\frac{1}{2}\left[\left(\boldsymbol{\omega}^{b_{k}}-\mathbf{b}_{k}^{g}\right)+\left(\boldsymbol{\omega}^{b_{k+1}}-\mathbf{b}_{k}^{g}\right)\right] ω=21[(ωbkbkg)+(ωbk+1bkg)]

a=12[qbibk(abk−bka)+qbibk+1(abk+1−bka)]\mathbf{a}=\frac{1}{2}\left[\mathbf{q}_{b_{i} b_{k}}\left(\mathbf{a}^{b_{k}}-\mathbf{b}_{k}^{a}\right)+\mathbf{q}_{b_{i} b_{k+1}}\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right] a=21[qbibk(abkbka)+qbibk+1(abk+1bka)]

αbibk+1=αbibk+βbibkδt+12aδt2\boldsymbol{\alpha}_{b_{i} b_{k+1}}=\boldsymbol{\alpha}_{b_{i} b_{k}}+\boldsymbol{\beta}_{b_{i} b_{k}} \delta t+\frac{1}{2} \mathbf{a} \delta t^{2} αbibk+1=αbibk+βbibkδt+21aδt2

βbibk+1=βbibk+aδt\boldsymbol{\beta}_{b_{i} b_{k+1}}=\boldsymbol{\beta}_{b_{i} b_{k}}+\mathbf{a} \delta t βbibk+1=βbibk+aδt

qbibk+1=qbibk⊗[112ωδt]\mathbf{q}_{b_{i} b_{k+1}}=\mathbf{q}_{b_{i} b_{k}} \otimes \left[ \begin{array}{c} 1 \\ \frac{1}{2} \boldsymbol{\omega} \delta t \end{array} \right] qbibk+1=qbibk[121ωδt]

bk+1a=bka+nbkaδtb_{k+1}^a = b_k^a + n_{b_k^a} \delta t bk+1a=bka+nbkaδt

bk+1g=bkg+nbkgδtb_{k+1}^g = b_k^g + n_{b_k^g} \delta t bk+1g=bkg+nbkgδt

(6)预积分量的方差

误差的传递由两部分组成:当前时刻的误差传递给下一时刻,当前时刻的测量噪声传递给下一时刻。

假设已知相邻时刻误差的线性传递方程:
ηik=Fk−1ηik−1+Gk−1nk−1\eta_{ik} = F_{k-1}\eta_{ik-1} + G_{k-1}n_{k-1} ηik=Fk1ηik1+Gk1nk1
其中:状态误差为 ηik=[δθik,δvik,δpik]\eta_{ik} = [\delta \theta_{ik}, \delta v_{ik}, \delta p_{ik}]ηik=[δθik,δvik,δpik],测量噪声为 nk=[nKg,nka]n_k = [n_K^g, n_k^a]nk=[nKg,nka]

预积分量的协方差矩阵通过递推得到:
Σi,k=Fk−1Σi,k−1Fk−1⊤+Gk−1ΣnGk−1⊤\boldsymbol{\Sigma}_{i, k}=\mathbf{F}_{k-1} \boldsymbol{\Sigma}_{i, k-1} \mathbf{F}_{k-1}^{\top}+\mathbf{G}_{k-1} \boldsymbol{\Sigma_n} \mathbf{G}_{k-1}^{\top} Σi,k=Fk1Σi,k1Fk1+Gk1ΣnGk1
​ 其中:Σn\Sigma_nΣn 为测量噪声的协方差矩阵,方差从 iii 时刻开始递推,F,G是离散时间下的状态转移矩阵

​ 现在需要求F和G

(7)预积分微分方程

​ 基于误差时间变化的递推方程

​ 已知连续时间下的微分方程形式为:
X˙=FtX+GtN\dot{\boldsymbol{X}}=\boldsymbol{F}_{t} \boldsymbol{X}+\boldsymbol{G}_{t} \boldsymbol{N} X˙=FtX+GtN
其中:
X=[δαtbkδθtbkδβtbkδbatδbwt]\boldsymbol{X}= \left[ \begin{array}{l} \delta \boldsymbol{\alpha}_{t}^{b_{k}} \\ \delta \boldsymbol{\theta}_{t}^{b_{k}} \\ \delta \boldsymbol{\beta}_{t}^{b_{k}} \\ \delta \boldsymbol{b}_{a_{t}} \\ \delta \boldsymbol{b}_{w_{t}} \end{array} \right] X=δαtbkδθtbkδβtbkδbatδbwt

N=[nanwnbanbw]\boldsymbol{N}= \left[ \begin{array}{l} \boldsymbol{n}_{a} \\ \boldsymbol{n}_{w} \\ \boldsymbol{n}_{b_{a}} \\ \boldsymbol{n}_{b_{w}} \end{array} \right] N=nanwnbanbw

​ 不推了,暂时只记结论:
δθ˙=−[ωt−bωt]×δθ+nω−δbωt\delta \dot{\boldsymbol{\theta}}=-\left[\boldsymbol{\omega}_{t}-\boldsymbol{b}_{\omega_{t}}\right]_{\times} \delta \boldsymbol{\theta}+\boldsymbol{n}_{\omega}-\delta \boldsymbol{b}_{\omega_{t}} δθ˙=[ωtbωt]×δθ+nωδbωt

δβ˙=Rt[δθ]×(at−bat)+Rt(na−δbat)=−Rt[at−bat]×δθ+Rt(na−δbat)\begin{aligned}\delta \dot{\boldsymbol{\beta}}=\boldsymbol{R}_{t}[\delta \boldsymbol{\theta}]_{\times}\left(\boldsymbol{a}_{t}-\boldsymbol{b}_{a_{t}}\right)+\boldsymbol{R}_{t}\left(\boldsymbol{n}_{a}-\delta \boldsymbol{b}_{a_{t}}\right) \\ =-\boldsymbol{R}_{t}\left[\boldsymbol{a}_{t}-\boldsymbol{b}_{a_{t}}\right]_{\times} \delta \boldsymbol{\theta}+\boldsymbol{R}_{t}\left(\boldsymbol{n}_{a}-\delta \boldsymbol{b}_{a_{t}}\right) \end{aligned} δβ˙=Rt[δθ]×(atbat)+Rt(naδbat)=Rt[atbat]×δθ+Rt(naδbat)

δα˙=δβ\delta \dot{\boldsymbol{\alpha}}=\delta \boldsymbol{\beta} δα˙=δβ

(8)预积分离散时间递推方程

Xk+1=FkXk+GkNk\boldsymbol{X}_{k+1}=\boldsymbol{F}_{k} \boldsymbol{X}_{k}+\boldsymbol{G}_{k} \boldsymbol{N}_{k} Xk+1=FkXk+GkNk

其中:
Xk+1=[δαk+1δθk+1δβk+1δbak+1δbωk+1]Xk=[δαkδθkδβkδbakδbωk]Nk=[naknwknak+1nwk+1nbanbw]\boldsymbol{X}_{k+1}=\left[\begin{array}{c} \delta \boldsymbol{\alpha}_{k+1} \\ \delta \boldsymbol{\theta}_{k+1} \\ \delta \boldsymbol{\beta}_{k+1} \\ \delta \boldsymbol{b}_{a_{k+1}} \\ \delta \boldsymbol{b}_{\omega_{k+1}} \end{array}\right] \quad \boldsymbol{X}_{k}=\left[\begin{array}{c} \delta \boldsymbol{\alpha}_{k} \\ \delta \boldsymbol{\theta}_{k} \\ \delta \boldsymbol{\beta}_{k} \\ \delta \boldsymbol{b}_{a_{k}} \\ \delta \boldsymbol{b}_{\omega_{k}} \end{array}\right] \quad \boldsymbol{N}_{k}=\left[\begin{array}{c} \boldsymbol{n}_{a_{k}} \\ \boldsymbol{n}_{w_{k}} \\ \boldsymbol{n}_{a_{k+1}} \\ \boldsymbol{n}_{w_{k+1}} \\ \boldsymbol{n}_{b_{a}} \\ \boldsymbol{n}_{b_{w}} \end{array}\right] Xk+1=δαk+1δθk+1δβk+1δbak+1δbωk+1Xk=δαkδθkδβkδbakδbωkNk=naknwknak+1nwk+1nbanbw
​ 结论:
δθk+1=[I−[ω‾]×δt]δθk+δt2nωk+δt2nωk+1−δtδbωk\delta \boldsymbol{\theta}_{k+1}=\left[\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right] \delta \boldsymbol{\theta}_{k}+\frac{\delta t}{2} \boldsymbol{n}_{\omega_{k}}+\frac{\delta t}{2} \boldsymbol{n}_{\omega_{k+1}}-\delta t \delta \boldsymbol{b}_{\omega_{k}} δθk+1=[I[ω]×δt]δθk+2δtnωk+2δtnωk+1δtδbωk

δαk+1=δαk+δα˙kδt=δαk+δtδβk−δt24[Rk[ak−bak]×+Rk+1[ak+1−bak]×(I−[ω‾]×δt)]δθk−δt38Rk+1[ak+1−bak]×nωk−δt38Rk+1[ak+1−bak]×nωk+1+δt34Rk+1[ak+1−bak]×δbωk+δt24Rknak+δt24Rk+1nak+1−δt24(Rk+Rk+1)δbak\begin{aligned} \delta \boldsymbol{\alpha}_{k+1}= & \enspace \delta \boldsymbol{\alpha}_{k} + \delta \dot{\boldsymbol{\alpha}}_{k} \delta t \\ =& \enspace \delta \boldsymbol{\alpha}_{k} +\delta t \delta \boldsymbol{\beta}_{k} \\ &-\frac{\delta t^{2}}{4}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \delta \boldsymbol{\theta}_{k} \\ &-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k}} \\ &-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k+1}} \\ &+\frac{\delta t^{3}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \delta \boldsymbol{b}_{\omega_{k}} \\ &+\frac{\delta t^{2}}{4} \boldsymbol{R}_{k} \boldsymbol{n}_{a_{k}} \\ &+\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1} \boldsymbol{n}_{a_{k+1}} \\ &-\frac{\delta t^{2}}{4}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta \boldsymbol{b}_{a_{k}} \end{aligned} δαk+1==δαk+δα˙kδtδαk+δtδβk4δt2[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]δθk8δt3Rk+1[ak+1bak]×nωk8δt3Rk+1[ak+1bak]×nωk+1+4δt3Rk+1[ak+1bak]×δbωk+4δt2Rknak+4δt2Rk+1nak+14δt2(Rk+Rk+1)δbak

δβk+1=δβk+δβ˙kδt=δβk−δt2[Rk[ak−bak]×+Rk+1[ak+1−bak]×(I−[ω‾]×δt)]δθk−δt24Rk+1[ak+1−bak]×nωk−δt24Rk+1[ak+1−bak]×nωk+1+δt22Rk+1[ak+1−bak]×δbωk+δt2Rknak+δt2Rk+1nak+1−δt2(Rk+Rk+1)δbak\begin{aligned} \delta \boldsymbol{\beta}_{k+1} = & \enspace \delta \boldsymbol{\beta}_{k} + \delta \dot{\boldsymbol{\beta}}_{k} \delta t \\ =& \enspace \delta \boldsymbol{\beta}_{k} \\ &-\frac{\delta t}{2}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \delta \boldsymbol{\theta}_{k} \\ &-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k}} \\ &-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \boldsymbol{n}_{\omega_{k+1}} \\ &+\frac{\delta t^{2}}{2} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \delta \boldsymbol{b}_{\omega_{k}} \\ &+\frac{\delta t}{2} \boldsymbol{R}_{k} \boldsymbol{n}_{a_{k}} \\ &+\frac{\delta t}{2} \boldsymbol{R}_{k+1} \boldsymbol{n}_{a_{k+1}} \\ &-\frac{\delta t}{2}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta \boldsymbol{b}_{a_{k}} \end{aligned} δβk+1==δβk+δβ˙kδtδβk2δt[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]δθk4δt2Rk+1[ak+1bak]×nωk4δt2Rk+1[ak+1bak]×nωk+1+2δt2Rk+1[ak+1bak]×δbωk+2δtRknak+2δtRk+1nak+12δt(Rk+Rk+1)δbak

(9)F,G

Fk=[If12Iδt−14(Rk+Rk+1)δt2f150I−[ω‾]×δt00−Iδt0f32I−12(Rk+Rk+1)δtf35000I00000I]\mathbf{F}_{k}=\left[\begin{array}{ccccc} \mathbf{I} & \mathbf{f}_{12} & \mathbf{I} \delta t & -\frac{1}{4}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta t^{2} & \mathbf{f}_{15} \\ \mathbf{0} & \mathbf{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t & \mathbf{0} & \mathbf{0} & -\mathbf{I} \delta t \\ \mathbf{0} & \mathbf{f}_{32} & \mathbf{I} & -\frac{1}{2}\left(\boldsymbol{R}_{k}+\boldsymbol{R}_{k+1}\right) \delta t & \mathbf{f}_{35} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \end{array}\right] Fk=I0000f12I[ω]×δtf3200Iδt0I0041(Rk+Rk+1)δt2021(Rk+Rk+1)δtI0f15Iδtf350I

f12=−δt24[Rk[ak−bak]×+Rk+1[ak+1−bak]×(I−[ω‾]×δt)]f15=δt34Rk+1[ak+1−bak]×δbωkf32=−δt2[Rk[ak−bak]×+Rk+1[ak+1−bak]×(I−[ω‾]×δt)]f35=δt22Rk+1[ak+1−bak]×\begin{aligned} &\boldsymbol{f}_{12}=-\frac{\delta t^{2}}{4}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \\ &\boldsymbol{f}_{15}=\frac{\delta t^{3}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \delta \boldsymbol{b}_{\omega_{k}} \\ &\boldsymbol{f}_{32}=-\frac{\delta t}{2}\left[\boldsymbol{R}_{k}\left[\boldsymbol{a}_{k}-\boldsymbol{b}_{a_{k}}\right]_{\times}+\boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times}\left(\boldsymbol{I}-[\overline{\boldsymbol{\omega}}]_{\times} \delta t\right)\right] \\ &\boldsymbol{f}_{35}=\frac{\delta t^{2}}{2} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \end{aligned} f12=4δt2[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]f15=4δt3Rk+1[ak+1bak]×δbωkf32=2δt[Rk[akbak]×+Rk+1[ak+1bak]×(I[ω]×δt)]f35=2δt2Rk+1[ak+1bak]×

Gk=[14Rkδt2g1214Rk+1δt2g140amp;0012Iδt012Iδt0012Rkδtg3212Rk+1δtg34000000Iδt000000Iδt]\mathbf{G}_{k}=\left[\begin{array}{cccccc} \frac{1}{4} \boldsymbol{R}_{k} \delta t^{2} & \mathbf{g}_{12} & \frac{1}{4} \boldsymbol{R}_{k+1} \delta t^{2} & \mathbf{g}_{14} & \mathbf{0} &amp; \mathbf{0} \\ \mathbf{0} & \frac{1}{2} \mathbf{I} \delta t & \mathbf{0} & \frac{1}{2} \mathbf{I} \delta t & \mathbf{0} & \mathbf{0} \\ \frac{1}{2} \boldsymbol{R}_{k} \delta t & \mathbf{g}_{32} & \frac{1}{2} \boldsymbol{R}_{k+1} \delta t & \mathbf{g}_{34} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \delta t & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \delta t \end{array}\right] Gk=41Rkδt2021Rkδt00g1221Iδtg320041Rk+1δt2021Rk+1δt00g1421Iδtg3400000Iδt0amp;0000Iδt

g12=−δt38Rk+1[ak+1−bak]×g14=−δt38Rk+1[ak+1−bak]×g32=−δt24Rk+1[ak+1−bak]×g34=−δt24Rk+1[ak+1−bak]×\begin{aligned} &\boldsymbol{g}_{12}=-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \\ &\boldsymbol{g}_{14}=-\frac{\delta t^{3}}{8} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \\ &\boldsymbol{g}_{32}=-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \\ &\boldsymbol{g}_{34}=-\frac{\delta t^{2}}{4} \boldsymbol{R}_{k+1}\left[\boldsymbol{a}_{k+1}-\boldsymbol{b}_{a_{k}}\right]_{\times} \end{aligned} g12=8δt3Rk+1[ak+1bak]×g14=8δt3Rk+1[ak+1bak]×g32=4δt2Rk+1[ak+1bak]×g34=4δt2Rk+1[ak+1bak]×

计算得到矩阵FkF_kFkGkG_kGk后,即可按照上述公式来计算方差。

3.预积分残差关于待求状态量的雅可比

在优化时,需要求出残差对于求解的状态量的雅可比。

已知基于预积分量的状态更新如下:
[pwbjqwbjvjwbjabjg]=[pwbi+viwΔt−12gwΔt2+qwbiαbibjqwbiqbibjviw−gwΔt+qwbiβbibjbiabig]\left[\begin{array}{c} \mathbf{p}_{w b_{j}} \\ \mathbf{q}_{w b_{j}} \\ \mathbf{v}_{j}^{w} \\ \mathbf{b}_{j}^{a} \\ \mathbf{b}_{j}^{g} \end{array}\right]=\left[\begin{array}{c} \mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t-\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}+\mathbf{q}_{w b_{i}} \boldsymbol{\alpha}_{b_{i} b_{j}} \\ \mathbf{q}_{w b_{i}} \mathbf{q}_{b_{i} b_{j}} \\ \mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q}_{w b_{i}} \boldsymbol{\beta}_{b_{i} b_{j}} \\ \mathbf{b}_{i}^{a} \\ \mathbf{b}_{i}^{g} \end{array}\right] pwbjqwbjvjwbjabjg=pwbi+viwΔt21gwΔt2+qwbiαbibjqwbiqbibjviwgwΔt+qwbiβbibjbiabig
把上式左侧状态移到右侧,在理想的情况下左侧应该只剩下0,但是由于误差的存在,可以使用残差小量r代替,因此有:
[rprqrvrbarbg]=[pwbj−pwbi−viwΔt+12gwΔt2−qwbiαbibj2[qbibj∗⊗(qwbi∗⊗qwbj)]xyzvjw−viw+gwΔt−qwbiβbibjbja−biabjg−big]\left[\begin{array}{c} \mathbf{r}_{p} \\ \mathbf{r}_{q} \\ \mathbf{r}_{v} \\ \mathbf{r}_{b a} \\ \mathbf{r}_{b g} \end{array}\right]=\left[\begin{array}{c} \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}-\mathbf{q}_{w b_{i}} \boldsymbol{\alpha}_{b_{i} b_{j}} \\ 2\left[\mathbf{q}_{b_{i} b_{j}}^{*} \otimes\left(\mathbf{q}_{w b_{i}}^{*} \otimes \mathbf{q}_{w b_{j}}\right)\right]_{x y z} \\ \mathbf{v}_{j}^{w}-\mathbf{v}_{i}^{w}+\mathbf{g}^{w} \Delta t-\mathbf{q}_{w b_{i}} \boldsymbol{\beta}_{b_{i} b_{j}} \\ \mathbf{b}_{j}^{a}-\mathbf{b}_{i}^{a} \\ \mathbf{b}_{j}^{g}-\mathbf{b}_{i}^{g} \end{array}\right] rprqrvrbarbg=pwbjpwbiviwΔt+21gwΔt2qwbiαbibj2[qbibj(qwbiqwbj)]xyzvjwviw+gwΔtqwbiβbibjbjabiabjgbig
更加复杂。。。。

练习2

样例代码给出使用LM算法估计曲线 y=e(ax2+bx+c)y = e^{(ax^2 + bx +c)}y=e(ax2+bx+c) 参数a,b,c 的完整过程。

(1)绘制样例代码中LM阻尼因子 μ\muμ 随迭代变化的曲线图。

​ 运行代码,即可看到输出,将结果导入matlab即可绘制图象

(2)将曲线函数改成 y=(ax2+bx+c)y = (ax^2 + bx +c)y=(ax2+bx+c) 修改代码

(3)其他阻尼因子更新策略

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word控件Spire.Doc 【文本】教程(5) ;从 Word 文档中的文本框中提取文本

文本框的目的是允许用户输入程序要使用的文本信息。也可以从文本框中提取现有的文本信息。以下指南重点介绍如何通过Spire.Doc for .NET从 C# 中 Word 文档的文本框中提取文本。 Spire.Doc for.NET 最新下载&#xff08;qun:767755948&#xff09;https://www.evget.com/produ…

3、Java对象相关

目录JVM内存分配机制对象的创建对象大小与指针压缩java对象的指针压缩指针压缩的原因分代回收机制分代GC分类对象内存分配栈上分配逃逸分析标量替换标量与聚合量Eden区分配大对象分配老年代分配对象动态年龄判断老年代空间分配担保机制对象的内存布局对象的访问定位对象内存回收…

WebDAV之葫芦儿·派盘+一刻日记

一刻日记 支持webdav方式连接葫芦儿派盘。 是一款强大的记录软件,通过平台可以随意的记录重要的事情,让用户在平台里能获得更多的帮助,实时的解决你的记录需求,让你可以更好的进行使用;在使用的过程中,用户可以记录当天重要的事情,把你的感想更好的记录在平台里,让用…

js-键盘事件

onkeydown:按键被按下 onkeyup:按键被松开 事件绑定的对象&#xff1a;键盘事件一般绑定给可以获取焦点的对象或者document对象 焦点&#xff1a;光标在闪的&#xff1a;比如input标签 如果一直按按键不松手&#xff0c;按键会一直被触发 当&#xff1a;onkeydown连续触发时…

后端php项目和数据库启动

有两种方法可以启动 1.使用小皮面板 ①启动php项目开启后端网站 可去官网下载 下载后就能使用了 官网地址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 下载完成后打开 php项目需要启动apache 创建一个php项目的网站 注意这里要写public 点击…

亚马逊云 RDB数据库故障转移(多可用区)

RDB关系数据库(Relational Database,RDB) 创建名为VPC for RDS的vpc 两个可用区,两组公内网创建安全组创建RDS数据库实例用的数据库子网组创建RDS数据库实例创建数据库连接RDS数据库实例并给数据库test添加数据 1.创建安全组2.创建用来连接数据库实例的EC2选择vpc for rds那…

MyBatis 环境搭建配置全过程【IDEA】

文章目录一、MyBatis 介绍二、MyBatis 环境搭建1.MyBatis 下载2.配置 jdk 版本3.创建 Maven 工程4.IDEA 连接数据库5.项目文件构架6.引入相关依赖7.命令行创建数据库8.数据库配置文件9.核心配置文件三、入门测试程序1.创建表准备数据2.创建 POJO 实体3.创建映射文件4.修改核心配…

將一個react+nodejs聊天軟件前後端項目進行docker打包並運行

文章目录1概述2将react前端打包入docker2.1打包react项目2.2nginx配置2.3创建Docker镜像2.4打包和运行2.5上传dockerhub3将nodejs打包入dockerDockerfile文件.dockerignore 文件打包和运行上传dockerhub1概述 https://gitee.com/chuge325/practise–chat-app-react-nodejs.git…

爱上源码,重学Spring IoC深入

回答&#xff1a; 我们为什么要学习源码&#xff1f; 1、知其然知其所以然 2、站在巨人的肩膀上&#xff0c;提高自己的编码水平 3、应付面试1.1 Spring源码阅读小技巧 1、类层次藏得太深&#xff0c;不要一个类一个类的去看&#xff0c;遇到方法该进就大胆的进 2、更不要一行…

左程云老师算法课笔记( 四)

前言 仅记录学习笔记&#xff0c;如有错误欢迎指正。 啊啊&#xff0c;才发现二被我挤掉了&#xff0c;有空补下&#xff01; 一、图&#xff1a; 图的深度优先遍历&#xff1a;&#xff08;和二叉树的区别就是有环&#xff0c;不能重复打印&#xff09;&#xff08;Queue队…

网课搜题接口-查题校园题库系统

网课搜题接口-查题校园题库系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&…

全球名校AI课程库(28)| MIT麻省理工 · 基因组学机器学习课程『Machine Learning for Genomics』

&#x1f3c6; 课程学习中心 | &#x1f6a7; AI生物医疗课程合辑 | &#x1f30d; 课程主页 | &#x1f4fa; 中英字幕视频 | &#x1f680; 项目代码解析 课程介绍 MIT 6.047/6.878是全球顶校麻省理工开设的基因组学与机器学习的交叉专业课程。课程以基因组学为主要应用领域…

智慧城市万亿级蓝海赛道机遇何在?

工商业的发展&#xff0c;为人类居住历史增添了“城市”这一全新的选项。从春秋战国时期的“货市”&#xff0c;到13世纪地中海沿岸星罗棋布的都市&#xff0c;风格迥异的城市为身处不同时代的居民提供了栖居之地。仅在中国&#xff0c;城市就以不到6%的土地面积&#xff0c;维…

个人征信预测

个人征信预测 --数据分析项目报一、项目概述 通过脱敏的现有数据&#xff0c;如&#xff1a;用户基本身份信息&#xff0c;消费行为&#xff0c;银行还款等&#xff0c;进行数据处理特征&#xff0c;选取并建立逾期预测模型&#xff0c;预测用户是否会逾期还款。二、项目概述数…

SSD目标检测网络ONNX推理,为tensorrt推理做准备【附代码】

本篇文章是实现SSD的onnx推理&#xff0c;主要是为后期tensorrt推理打下基础&#xff0c;YOLOv4以及YOLOv5的tensorrt推理可以看我之前的文章。 SSD的代码我这里下载的是b站up主Bubbliiiing的pytorch版SSD&#xff0c;大家可自行下载【我这里就不传代码了&#xff0c;等最近把…

期货开户用心服务每个客户

用心服务每一个客户&#xff01;以信为本&#xff0c;点石成金&#xff01; 蓄之既久&#xff0c;其发必速 如果价格连续多天在—个狭窄的幅度内升降&#xff0c;在图表上形成一幅有如建筑地盘布满地基桩的图景&#xff0c;习惯上称之为密集区&#xff0c;亦即专家所说的技术…

【GraphQL】Node + Postgres + adminer实现demo应用

1、程序目录 在第一级目录下存在三个文件&#xff0c; db.sql用于创建tables和demo数据&#xff0c;可以直接在adminer里登录执行sql语句进行创建&#xff0c;可以看到如下图绿色部分的执行结果 docker-compose.yaml用于为node、postgres和adminer分别创建一个容器&#xff0…

数明SLM27517能驱动MOSFET和IGBT功率开关 低侧栅极驱动器兼容UCC27517

SLM27517 单通道&#xff0c;高速&#xff0c;低侧栅极驱动器器件可以有效地驱动MOSFET和IGBT功率开关。使用设计其固有地最小化击穿电流&#xff0c;可以源汇高峰值电流脉冲转换为电容性负载轨对轨驱动能力非常小传播延迟通常为15ns。可提供4 A电源&#xff0c;5 A接收器12 V …

语音识别 CTC Loss

(以下内容搬运自 PaddleSpeech) Derivative of CTC Loss 关于CTC的介绍已经有很多不错的教程了&#xff0c;但是完整的描述CTCLoss的前向和反向过程的很少&#xff0c;而且有些公式推导省略和错误。本文主要关注CTC Loss的梯度是如何计算的&#xff0c;关于CTC的介绍这里不做…

泛海微告诉你电压检测IC主要用途会是什么呢

泛海微告诉你电压检测IC主要用途会是什么呢&#xff1a; FS61CN3302MR电压检测IC(芯片)是一款高精度,低功耗的电压检测器芯片,并采用了CMOS生产工艺和激光微调技术。XC61C温度漂移特性的影响很小,电压检测精度很高。 ​ ①充电电池配电设备的开关电源一部分。 ②鼠标&#x…