VINS-Mono-后端优化 (二:预积分残差雅可比推导)


这里是求预积分对约束的参数块进行求导,有这个雅可比矩阵才能进行优化步长的计算,这个是预积分这个约束因子对各个优化变量的求导,后面还有相机的观测

残差块中的 θ \theta θ 是3维的,但是参数块中的四元数是4维的,因为相减后残差只剩虚部了,但是参数是从4个参数变过来的

预积分的残差具体如下,总共有15维的自由度,即y有15维
在这里插入图片描述
而参数块 x x x , 维护的是 k k k k + 1 k+1 k+1 时刻的 P , Q , V , B a , B g P,Q,V,Ba,Bg P,Q,V,Ba,Bg
P是3维,Q是四元数有4维,因为是过参数化的形式,而 V , B a , B g V,Ba,Bg V,Ba,Bg 总共是9维的参数块
所以整个参数块 x x x 的大小为 7+9

残差对残差参数块的求导
[ ∂ e ∂ P k ∂ e ∂ V k ∂ e ∂ P k + 1 ∂ e ∂ V k + 1 ∂ e 1 ∂ P k ∂ e 1 ∂ V k ∂ e 1 ∂ P k + 1 ∂ e 1 ∂ V k + 1 ⋮ ] \begin{bmatrix} \frac{\partial e}{\partial P_{k}} &\frac{\partial e}{\partial V_{k}}&\frac{\partial e}{\partial P_{k+1}}&\frac{\partial e}{\partial V_{k+1}}\\ \frac{\partial e_{1}}{\partial P_{k}} &\frac{\partial e_{1}}{\partial V_{k}}&\frac{\partial e_{1}}{\partial P_{k+1}}&\frac{\partial e_{1}}{\partial V_{k+1}}\\ \vdots \end{bmatrix} PkePke1VkeVke1Pk+1ePk+1e1Vk+1eVk+1e1
这个矩阵有15行,因为误差矩阵 e e e 是15维的(残差分别是 α , β , θ , B a , B g 构成,各自都是 3 个维度 \alpha,\beta,\theta,B_{a},B_{g}构成,各自都是3个维度 α,β,θ,Ba,Bg构成,各自都是3个维度),参数块 P P P 是7维,参数块 V V V 是9维
所以把这个雅可比矩阵分块成了 15 × 7 15×7 15×7 15 × 9 15×9 15×9 15 × 7 15×7 15×7 15 × 9 15×9 15×9 的形式
误差矩阵的维度和参数是不同的,求导就是对构成这个误差函数的里面的全部变量进行求导

由于我们维护的是 R w c R_{wc} Rwc ,所以我们的扰动是右乘的,十四讲里面维护的是 R c w R_{cw} Rcw 所以才使用左乘

对这个误差矩阵进行求导的时候,也可以按照误差参数块进行分别求导的,15=3*5,前三行雅可比使用位移的函数对 P k , V k , P k + 1 , V k + 1 P_{k},V_{k},P_{k+1},V_{k+1} Pk,Vk,Pk+1,Vk+1 进行求导

对位置 δ α \delta\alpha δα 进行求导

以下示例都是对 k k k 时刻的状态量进行求导, k + 1 k+1 k+1 时刻的同理
使用 δ α b k + 1 b k = … \delta\alpha^{b_{k}}_{b_{k+1}}=\dots δαbk+1bk= 分别对 P , Q , V , B a , B g P,Q,V,Ba,Bg P,Q,V,Ba,Bg 进行求导

位置误差 δ α \delta\alpha δα 对平移 P b k w P^{w}_{b_{k}} Pbkw 的求导

代码中的 Q i Q_{i} Qi R b k w R^{w}_{b_{k}} Rbkw ,所以代码中要取逆

∂ δ α b k + 1 b k ∂ P b k w = − R w b k \frac{\partial\delta\alpha^{b_{k}}_{b_{k+1}}}{\partial P^{w}_{b_{k}}}=-R^{b_{k}}_{w} Pbkwδαbk+1bk=Rwbk

位置 δ α \delta\alpha δα 对旋转 R w b k R^{b_{k}}_{w} Rwbk 进行求导

接下来是对旋转 R w b k R^{b_{k}}_{w} Rwbk 进行求导,由于代码中维护的是 R b k w R^{w}_{b_{k}} Rbkw ,所以这里的公式推导要取逆,方便代码的维护,这样是一个旋转方向的问题,如果直接左乘的话旋转方向就是反过来的了,这样操作的话旋转方向就是按照代码中维护的量的方向来进行操作

后面一串相乘后就是一个向量,当作向量 a a a
∂ δ α b k + 1 b k ∂ R w b k = l i m ϕ → 0 ( R b k w e x p ( ϕ ∧ ) ) − 1 ⋅ a − R w b k ⋅ a ϕ \frac{\partial\delta\alpha^{b_{k}}_{b_{k+1}}}{\partial R^{b_{k}}_{w}}=lim_{\phi\rightarrow0}\frac{(R^{w}_{b_{k}}exp(\phi^{\wedge}))^{-1}·a-R^{b_{k}}_{w}·a}{\phi} Rwbkδαbk+1bk=limϕ0ϕ(Rbkwexp(ϕ))1aRwbka

有公式 ( A ⋅ B ) − 1 = B − 1 ⋅ A − 1 (A·B)^{-1}=B^{-1}·A^{-1} (AB)1=B1A1
对旋转向量 ϕ \phi ϕ 取逆,相当于是换了一个旋转方向,所以 ϕ − 1 = − ϕ \phi^{-1}=-\phi ϕ1=ϕ
= ( I − ϕ ∧ ) R w b k ⋅ a − R w b k ⋅ a =(I-\phi^{\wedge})R^{b_{k}}_{w}·a-R^{b_{k}}_{w}·a =(Iϕ)RwbkaRwbka
= − ϕ ∧ ⋅ R w b k ⋅ a =-\phi^{\wedge}·R^{b_{k}}_{w}·a =ϕRwbka

叉乘有一个性质, a ⃗ × b ⃗ = − b ⃗ × a ⃗ \vec{a}×\vec{b}=-\vec{b}×\vec{a} a ×b =b ×a
a ⃗ × b ⃗ = a ∧ ⋅ b \vec{a}×\vec{b}=a^{\wedge}·b a ×b =ab
− b ⃗ × a ⃗ = − b ∧ ⋅ a -\vec{b}×\vec{a}=-b^{\wedge}·a b ×a =ba
a ∧ ⋅ b = − b ∧ ⋅ a a^{\wedge}·b=-b^{\wedge}·a ab=ba

则上面有
= ( R w b k ⋅ a ) ∧ ⋅ ϕ =(R^{b_{k}}_{w}·a)^{\wedge}·\phi =(Rwbka)ϕ

然后约掉分母上的 ϕ \phi ϕ
∂ δ α b k + 1 b k ∂ R w b k = ( R w b k ⋅ a ) ∧ \frac{\partial\delta\alpha^{b_{k}}_{b_{k+1}}}{\partial R^{b_{k}}_{w}}=(R^{b_{k}}_{w}·a)^{\wedge} Rwbkδαbk+1bk=(Rwbka)

对速度 δ β \delta\beta δβ 进行求导

也是使用 δ β b k + 1 b k = … \delta\beta^{b_{k}}_{b_{k+1}}=\dots δβbk+1bk= 分别对 P , Q , V , B a , B w P,Q,V,Ba,Bw P,Q,V,Ba,Bw 进行求导

速度 δ β \delta\beta δβ 对位置 P b k w P^{w}_{b_{k}} Pbkw 求导

由于公式里面不含位置,所以这块导数 = 0

速度 δ β \delta\beta δβ 对旋转 R w b k R^{b_{k}}_{w} Rwbk 求导

整体公式结构和上面的位移对旋转求导一致,所以求导结果也是 ( R w b k ⋅ a ) ∧ (R^{b_{k}}_{w}·a)^{\wedge} (Rwbka)

对旋转 δ θ \delta\theta δθ 进行求导

分别对 P , Q , V , B a , B g P,Q,V,Ba,Bg P,Q,V,Ba,Bg 进行求导

由于公式中不包含平移和速度量,所以对应的雅可比也为0
δ θ = 2 ⋅ ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w \delta\theta=2·(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} δθ=2(γbk+1bk)1(qbkw)1qbk+1w
k对应代码中的 i ,k+1对应代码中的 j

旋转 δ θ \delta\theta δθ q b k w q^{w}_{b_{k}} qbkw 进行求导

就是在右边加一个扰动,扰动为 [ 1   θ 2 ] T [1 \ \frac{\theta}{2}]^{T} [1 2θ]T
∂ δ θ ∂ q b k w = ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ⊗ [ 1 θ 2 ] ) − 1 ⊗ q b k + 1 w − ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w θ \frac{\partial \delta\theta}{\partial q^{w}_{b_{k}}}=\frac{(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}}\otimes\begin{bmatrix}1\\\frac{\theta}{2} \end{bmatrix})^{-1}\otimes q^{w}_{b_{k+1}}-(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}}}{\theta} qbkwδθ=θ(γbk+1bk)1(qbkw[12θ])1qbk+1w(γbk+1bk)1(qbkw)1qbk+1w

把逆乘进去,对于扰动那里其实就是把虚部 n ⃗ \vec n n 变一个旋转方向,所以是取个负号
= ( γ b k + 1 b k ) − 1 ⊗ [ 1 − θ 2 ] ⊗ q b k w − 1 ⊗ q b k + 1 w − ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w =(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes\begin{bmatrix}1\\-\frac{\theta}{2} \end{bmatrix}\otimes q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}-(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} =(γbk+1bk)1[12θ]qbkw1qbk+1w(γbk+1bk)1(qbkw)1qbk+1w

这里会用一个四元数的性质
a ⊗ b = [ a ] L ⋅ b = [ b ] R ⋅ a a\otimes b=[a]_{L}·b=[b]_{R}·a ab=[a]Lb=[b]Ra
具体看这篇文章讲解VINS-Mono-IMU预积分 (二:连续时间的PVQ积分+四元数求导)

公式变成
= 2 [ q b k w − 1 ⊗ q b k + 1 w ] R ⋅ [ [ ( γ b k + 1 b k ) − 1 ] L ⋅ [ 1 − θ 2 ] ] − [ q b k w − 1 ⊗ q b k + 1 w ] R ⋅ [ [ ( γ b k + 1 b k ) − 1 ] L ⋅ [ 1 0 ⋮ ] ] =2[q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}]_{R}·\begin{bmatrix}[(\gamma^{b_{k}}_{b_{k+1}})^{-1}]_{L}·\begin{bmatrix}1\\-\frac{\theta}{2} \end{bmatrix}\end{bmatrix}-[q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}]_{R}·\begin{bmatrix}[(\gamma^{b_{k}}_{b_{k+1}})^{-1}]_{L}·\begin{bmatrix}1\\ 0 \\\vdots \end{bmatrix}\end{bmatrix} =2[qbkw1qbk+1w]R[[(γbk+1bk)1]L[12θ]][qbkw1qbk+1w]R [(γbk+1bk)1]L 10
= 2 [ q b k w − 1 ⊗ q b k + 1 w ] R ⋅ [ ( γ b k + 1 b k ) − 1 ] L ⋅ [ [ 1 − θ 2 ] − [ 1 0 ⋮ ] ] =2[q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}]_{R}·[(\gamma^{b_{k}}_{b_{k+1}})^{-1}]_{L}·\begin{bmatrix} \begin{bmatrix}1\\-\frac{\theta}{2} \end{bmatrix} - \begin{bmatrix}1\\ 0 \\\vdots \end{bmatrix}\end{bmatrix} =2[qbkw1qbk+1w]R[(γbk+1bk)1]L [12θ] 10
= [ q b k w − 1 ⊗ q b k + 1 w ] R ⋅ [ ( γ b k + 1 b k ) − 1 ] L ⋅ [ 0 − θ ] x y z θ =\frac{[q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}]_{R}·[(\gamma^{b_{k}}_{b_{k+1}})^{-1}]_{L}· \begin{bmatrix}0\\-\theta \end{bmatrix}_{xyz}}{\theta} =θ[qbkw1qbk+1w]R[(γbk+1bk)1]L[0θ]xyz

θ \theta θ 约掉

= − [ q b k w − 1 ⊗ q b k + 1 w ] R ⋅ [ ( γ b k + 1 b k ) − 1 ] L =-[q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}]_{R}·[(\gamma^{b_{k}}_{b_{k+1}})^{-1}]_{L} =[qbkw1qbk+1w]R[(γbk+1bk)1]L

这里乘完后的结果只有四元数的虚部 x y z xyz xyz
所以把四元数进行矩阵化的公式会有点变动
原本的
[ q ] L = q w ⋅ I + [ 0 − q T q q × ] [q]_{L}=q_{w}·I+\begin{bmatrix}0&-q^{T}\\q&q_{×} \end{bmatrix} [q]L=qwI+[0qqTq×]
[ q ] R = q w ⋅ I + [ 0 − q T q − q × ] [q]_{R}=q_{w}·I+\begin{bmatrix}0&-q^{T}\\q&-q_{×} \end{bmatrix} [q]R=qwI+[0qqTq×]
当只取虚部的时候
[ q ] L = q w ⋅ I + q × [q]_{L}=q_{w}·I+q_{×} [q]L=qwI+q×
[ q ] R = q w ⋅ I − q × [q]_{R}=q_{w}·I-q_{×} [q]R=qwIq×

对于一个四元数取逆的时候
q = [ c o s θ 2 n ⃗ ⋅ s i n θ 2 ] q=\begin{bmatrix}cos\frac{\theta}{2}\\\vec n·sin\frac{\theta}{2}\end{bmatrix} q=[cos2θn sin2θ]
其实就是把旋转轴的方向换成反方向,实部是不变的,只有虚部会反方向
q − 1 = [ c o s θ 2 − n ⃗ ⋅ s i n θ 2 ] q^{-1}=\begin{bmatrix}cos\frac{\theta}{2}\\-\vec n·sin\frac{\theta}{2}\end{bmatrix} q1=[cos2θn sin2θ]

[ q − 1 ] L = q w ⋅ I − q × = [ q ] R [q^{-1}]_{L}=q_{w}·I-q_{×}=[q]_{R} [q1]L=qwIq×=[q]R
[ q − 1 ] R = q w ⋅ I + q × = [ q ] L [q^{-1}]_{R}=q_{w}·I+q_{×}=[q]_{L} [q1]R=qwI+q×=[q]L

我们推导的公式是这样的
= − [ q b k w − 1 ⊗ q b k + 1 w ] R ⋅ [ ( γ b k + 1 b k ) − 1 ] L =-[q^{w-1}_{b_{k}}\otimes q^{w}_{b_{k+1}}]_{R}·[(\gamma^{b_{k}}_{b_{k+1}})^{-1}]_{L} =[qbkw1qbk+1w]R[(γbk+1bk)1]L

代码中用了上面的变换关系,代码中的公式是这样的
其实就是对四元数取个逆就可以进行左右乘矩阵的变换

= − [ q b k + 1 w − 1 ⊗ q b k w ] L ⋅ [ ( γ b k + 1 b k ) ] R =-[q^{w-1}_{b_{k+1}}\otimes q^{w}_{b_{k}}]_{L}·[(\gamma^{b_{k}}_{b_{k+1}})]_{R} =[qbk+1w1qbkw]L[(γbk+1bk)]R

γ \gamma γ 是预积分量来的
在计算这个雅可比前也还是会用实时修正的零偏对预积分量进行调整,调整后才进入雅可比的计算

对零偏进行求导

上面的公式中没有包含零偏的项,这里要用到预积分一阶近似更新公式
在这里插入图片描述
用这个近似公式代替前面的预积分,再对零偏进行求导

平移 δ α \delta\alpha δα 对 k/i 时刻的 b a 、 b w b_{a}、b_{w} babw的扰动

其实就是对预积分量进行一个扰动,此时预积分量前面的参数都等于是常数直接为0
公式为
− [ ( α ^ b k + 1 b k + J b a α Δ b a ) − α b k + 1 b k ] Δ b a = − J b a α \frac{-[(\hat \alpha^{b_{k}}_{b_{k+1}}+J^{\alpha}_{b_{a}}\Delta b_{a})-\alpha^{b_{k}}_{b_{k+1}}]}{\Delta b_{a}}=-J^{\alpha}_{b_{a}} Δba[(α^bk+1bk+JbaαΔba)αbk+1bk]=Jbaα

b g b_{g} bg 求导也是同理的, α 和 β 都是一样的建模方式 \alpha 和 \beta 都是一样的建模方式 αβ都是一样的建模方式,结果也是一样的
上面是对 i / k 时刻的零偏的求导,这里的零偏也是第 i 时刻的

δ b a \delta b_{a} δba 对 i时刻ba的求导就是 − I -I I b g b_{g} bg 同理

由于预积分量中零偏的建模中都是假设零偏与 k k k 时刻有关,与 k + 1 k+1 k+1 时刻无关的,因为假设预积分过程中零偏是不会变的,虽然有联合优化零偏,但是零偏是通过一阶近似的方式加入到第 k k k 时刻的零偏中,所以 α , β , θ \alpha,\beta,\theta α,β,θ 对于 k + 1 k+1 k+1 时刻的零偏求导都是 0

θ \theta θ 对陀螺仪零偏求导

2 ( γ b k + 1 b k [ 1 1 2 J b w γ δ b w k ] ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w − 2 ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w 2(\gamma^{b_{k}}_{b_{k+1}}\begin{bmatrix}1\\\frac{1}{2}J^{\gamma}_{b_{w}}\delta b_{w_{k}} \end{bmatrix})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}}-2(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} 2(γbk+1bk[121Jbwγδbwk])1(qbkw)1qbk+1w2(γbk+1bk)1(qbkw)1qbk+1w

解开逆
= 2 [ 1 − 1 2 J b w γ δ b w k ] ⊗ ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w − 2 ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w =2\begin{bmatrix}1\\-\frac{1}{2}J^{\gamma}_{b_{w}}\delta b_{w_{k}} \end{bmatrix}\otimes(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}}-2(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} =2[121Jbwγδbwk](γbk+1bk)1(qbkw)1qbk+1w2(γbk+1bk)1(qbkw)1qbk+1w

= [ 0 − J b w γ δ b w k ] ⊗ ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w =\begin{bmatrix}0\\-J^{\gamma}_{b_{w}}\delta b_{w_{k}} \end{bmatrix}\otimes(\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} =[0Jbwγδbwk](γbk+1bk)1(qbkw)1qbk+1w

= [ ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w ] R ⋅ [ 0 − J b w γ δ b w k ] ∂ b w k =\frac{\begin{bmatrix} (\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} \end{bmatrix}_{R}·\begin{bmatrix}0\\-J^{\gamma}_{b_{w}}\delta b_{w_{k}} \end{bmatrix}}{\partial b_{w_{k}}} =bwk[(γbk+1bk)1(qbkw)1qbk+1w]R[0Jbwγδbwk]

约掉 b w k b_{w_{k}} bwk
= [ ( γ b k + 1 b k ) − 1 ⊗ ( q b k w ) − 1 ⊗ q b k + 1 w ] R ⋅ − J b w γ =\begin{bmatrix} (\gamma^{b_{k}}_{b_{k+1}})^{-1}\otimes(q^{w}_{b_{k}})^{-1}\otimes q^{w}_{b_{k+1}} \end{bmatrix}_{R}·-J^{\gamma}_{b_{w}} =[(γbk+1bk)1(qbkw)1qbk+1w]RJbwγ

= − [ ( ⊗ q b k + 1 w ) − 1 ⊗ q b k w ⊗ γ b k + 1 b k ] L ⋅ J b w γ =-\begin{bmatrix} (\otimes q^{w}_{b_{k+1}})^{-1}\otimes q^{w}_{b_{k}}\otimes \gamma^{b_{k}}_{b_{k+1}} \end{bmatrix}_{L}·J^{\gamma}_{b_{w}} =[(qbk+1w)1qbkwγbk+1bk]LJbwγ

最后这样的形式就和代码中的公式一致了

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

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

相关文章

Vuex介绍

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如:购…

创建多层级行索引,创建多层级行索引的DataFrameMultiIndex.from_product()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 创建多层级行索引, 创建多层级行索引的DataFrame MultiIndex.from_product() [太阳]选择题 使用pd.MultiIndex.from_product(),下列输出正确的是: import pandas as pd…

【操作系统】考研真题攻克与重点知识点剖析 - 第 2 篇:进程与线程

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

在Word中优雅的给公式编号,且自动更新

本文适用情景: 使用Word插入公式;需要给公式增加编号;且在正文中引用,支持自动更新序号。 Word自带公式编号 1 Word自带公式编辑器1.1 问题1.2 原因完美解决 2 MathType公式编辑器end: 后记: 1 Word自带公式编辑器 或…

卡尔曼滤波EKF

目录 一、概述 二、卡尔曼滤波的5个公式 三、应用案例:汽车运动 四、应用案例:温度估计 五、总结 一、概述 初学者对于卡尔曼滤波5个公式有点懵,本文先接地气地介绍5个公式,然后举两个常用例子加强理解,同时附有M…

【媒体邀约】媒体宣传——企业成长的催化剂

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传是企业成长的催化剂,它在各种方面对企业的成功和发展起到了关键作用。 1. 曝光和知名度: 媒体宣传可以将企业和其产品或服务推向广泛的受众,…

Vue脚手架学习笔记

视频 Vue脚手架学习笔记 1. 脚手架设置相关内容1.1 各文件的作用1.2 关闭语法检查 2. 组件的使用2.1 单文件组件的使用(组件使用的三个步骤)2.2 prop配置项:父向子传数据2.2.1 数组方式2.2.2 类型限制2.2.3 默认值、必要性 2.3 ref &#xf…

Hello Qt!

目录 1. 什么是Qt 2. Qt中的模块 3. 下载安装 4. QtCreator 4. Hello Qt 解释 .pro 解释 main.cpp 解释 mainwindow.ui 解释 mainwindow.h 解释 mainwindow.cpp 5. Qt 中的窗口类 5.1 基础窗口类 5.2 窗口的显示 6. Qt 的坐标体系 7. 内存回收 1. 什么是Qt 是一…

评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?

作为一名应用程序开发评估师,可能涉及到的主要任务是为特定的应用程序提供估算开发成本和所需时间预测。为了为一个应用程序更准确地评估价格,须遵循以下几个步骤: 问: 如何让一个App更好、更精确地评估出价格? 答: 以下是一个可…

一款功能强大的web目录扫描器专业版

dirpro 简介 dirpro 是一款由 python 编写的目录扫描器,操作简单,功能强大,高度自动化。 自动根据返回状态码和返回长度,对扫描结果进行二次整理和判断,准确性非常高。 已实现功能 可自定义扫描线程 导入url文件进…

1. Collection,List, Map, Queue

1. java集合框架体系结构图 2. Collection派生的子接口 其中最重要的子接口是: 1)List 表示有序可重复列表,重要的实现类有:ArrayList, LinkedList ArrayList特点:底层数组实现,随机查找快,增删…

centos 上redis以及远程连接工具rdm安装与使用

目录 一 安装包准备 二 安装 三 启动 redis 四 rdm 连接 redis 一 安装包准备 redis 6.2.4 网盘资源: 链接: https://pan.baidu.com/s/1R120Va9FEyraLdiPe9fBHg?pwdgq9i 提取码: gq9i rdm 网盘资源: 链接: https://pan.baidu.com/s/1GiYnfIuQdSUmM…

服装展示服务预约小程序的内容如何

互联网电商深入,很多服装商家开始线上卖货经营、会员管理及私域营销等,这也是当今商家们的一个优选项,当然除了直接卖货以外,展示和预约、客户交互也同样是不少商家需要的。 那么商家通过服装展示预约小程序能够实现什么效果呢&a…

19 数据中心详解

1、数据中心的概念 其实平时我们不管是看新闻,视频,下载文件等,最终访问的目的地都是在数据中心里面。数据中心存放的是服务器,区别于我们平时使用的笔记本或者台式机。 机架:数据中心的服务器被放在一个个叫作机架&…

【发布】DDD 工程脚手架 + 一键安装分布式技术栈环境!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 大家好,我是技术UP主小傅哥。 写了那么多案例工程,开发了那么多技术项目。那小傅哥做的这些案例和项目是…

第十八章总结

一.Swing概述 二.Swing常用窗体 1.JFrame窗体 创建一个不可见、具有标题的窗体,关键代码: JFrame jfnew JFrame("登陆系统"); Container containerjf.getContentPane(); 在创建窗体后,先调用getContentPane()方法将窗体转…

2023年Q3乳品行业数据分析(乳品市场未来发展趋势)

随着人们生活水平的不断提高以及对健康生活的追求不断增强,牛奶作为优质蛋白和钙的补充品,市场需求逐年增加。 今年Q3,牛奶乳品市场仍呈增长趋势。根据鲸参谋电商数据分析平台的相关数据显示,2023年7月-9月,牛奶乳品市…

C# OpenCvSharp 通过特征点匹配图片

SIFT匹配 SURF匹配 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; using static System.Net…

(C++17) variant的使用与union对比

文章目录 前言与需求union内存映射图C11的union 使用ref示例构造普通构造置空emplacemonostate 访问std::get<>std::holds_alternative<>获取指针std::get_if<>获取可选数量个数std::variant_size END 前言与需求 联合体&#xff0c;是在C语言时代就存在的概…

Global_Mapper_Pro_25.0安装教程大全

一. 下载&#xff1a; http://dt1.8tupian.net/2/29913a55b1000.pg3二. 介绍&#xff1a; Global Mapper Pro 25是领先的GIS数据处理解决方案&#xff01;提供了一整套符合标准的功能来提升您的操作和技能&#xff0c;您可以最合理的利用您的工具集来完成以前复杂的工作任务&a…