视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图

news2025/6/22 9:17:50
  • 本节是对上一节BA的进一步简化,旨在提高优化实时性.
  • 难点在于位姿图部分的雅可比矩阵求解(涉及李代数扰动模型求导),书中的相关推导存在跳步(可能数学功底强的人认为过渡的理所当然),笔者参考了知乎Clark的推导,并以顺向思维的方式重新整理推导过程,使得该部分更加通俗易懂.

视觉SLAM学习打卡【10】-后端·滑动窗口法&位姿图

  • 一、本讲缘由
  • 二、滑动窗口法
    • (1)某个时刻窗口的优化处理
    • (2)窗口滑动,结构发生改变
  • 三、位姿图
  • 四、实践g2o_viewer报错解决方案

一、本讲缘由

接上节 视觉SLAM学习打卡【9】-后端·卡尔曼滤波器&光束法平差,BA能同时优化位姿与空间点。然而,大量的路标点/特征点,使得计算量增大,实时性降低。本讲致力于控制BA的规模

  • 滑动窗口法(Sliding Window):将BA控制在一个时间窗口中,离开窗口的关键帧被丢弃.
  • 共视图(Covisibility graph):与当前相机存在共同观测的关键帧构成的图像即为共视图。仅优化与当前帧有20个以上共视路标的关键帧,其余固定不变.请添加图片描述
  • 位姿图(Pose Graph):不管路标,只管轨迹,构建一个只有轨迹的图优化.

二、滑动窗口法

仅保留离当前时刻最近的 N个关键帧(从连续视频中抽出的一部分图像),去掉时间上最早的关键帧。于是BA被固定在一个时间窗口内,离开这个窗口则被丢弃,这种方法称为滑动窗口法

(1)某个时刻窗口的优化处理

假设此时这个窗口内有 N 个关键帧和M个路标点.

  • 关键帧位姿表达为: x 1 , ⋯   , x N x_1,\cdots,x_N x1,,xN
  • 路标点为: y 1 , ⋯   , y M y_1,\cdots,y_M y1,,yM

用上一讲BA方法处理这个滑动窗口,包括建立最小二乘问题,构建整体的Hessian海森矩阵,然后边缘化所有路标点来加速求解。

最后,优化结果为: [ x 1 , ⋯   , x N ] T ∼ N ( [ μ 1 , ⋯   , μ N ] T , Σ ) [x_1,\cdots,x_N]^T\sim N([\mu_1,\cdots,\mu_N]^T,\Sigma) [x1,,xN]TN([μ1,,μN]T,Σ)

其中,均值部分 μ k \mu_{k} μk为为第 k个关键帧的位姿均值,即BA迭代之后的结果;所有关键帧的协方差矩阵 Σ \Sigma Σ是对整个 BA 的 H 矩阵进行舒尔消元边缘化后的系数矩阵.

(2)窗口滑动,结构发生改变

滑动中,状态变量的更新讨论:

  • 新增一个关键帧和对应观测到的路标点
    类似于(1),BA (N+1) 个关键帧和对应的路标点.
  • 删除 / 边缘化一个旧的关键帧
    删除旧关键帧 x1,将 x1 边缘化之后将导致整个问题不再稀疏,将破坏路标部分的对角块结构.

当边缘化路标点时,S= [ B − E C − 1 E T 0 E T C ] \begin{bmatrix}B-EC^{-1}E^\mathrm{T}&0\\E^\mathrm{T}&C\end{bmatrix} [BEC1ETET0C],Fill-in将出现在左上角的位姿块中,右下角的路标块仍为对角阵,保持稀疏,不影响求解

当边缘化关键帧时,Fill-in将出现在右下角的路标块中,BA无法按照之前的稀疏方式迭代求解.

解决方法:边缘化关键帧的同时,边缘化它观测到的路标点,保持了右下角的对角块结构。在OKVIS中,根据要边缘化的关键帧所看到的路标点是否在最新的关键帧中能看到来考虑是否边缘化此路标点。如果不能,就直接边缘化这个路标点;如果能,就丢弃被边缘化关键帧对这个路标点的观测,从而保持BA的稀疏性。

三、位姿图

构建一个只有轨迹的图优化,而位姿节点之间的边,可以由两个关键帧之间通过特征匹配之后得到的运动估计来给定初值(对极几何 / PnP / ICP)。不同的是,一旦初始估计完成,就不再优化那些路标点的位置,而只关心所有的相机位姿之间的联系,省去了大量特征点优化的计算,只保留了关键帧的轨迹,从而构建了所谓的位姿图.请添加图片描述
图优化中,节点表示相机位姿,以 T 1 , ⋯   , T n T_1,\cdots,T_n T1,,Tn表示;是两个位姿节点之间相对运动的估计(特征点法/直接法/GPS / IMU积分)

GPS通过连续测量两个位姿节点在不同时间点的绝对位置,进而通过比较这些位置数据来间接估计它们之间的相对运动。

IMU积分通过测量和跟踪物体的加速度和角速度,并对其进行积分运算,从而估计出两个位姿节点之间的相对运动。

估计 T i T_{i} Ti T j T_{j} Tj之间的运动 Δ T i j \Delta T_{ij} ΔTij,李群写法: Δ T i j = T i − 1 T j ΔT_{ij}=T_i^{-1}T_j ΔTij=Ti1Tj李代数写法: Δ ξ i j = ξ i − 1 ∘ ξ j = ln ⁡ ( T i − 1 T j ) ∨ \Delta\xi_{ij}=\xi_i^{-1}\circ\xi_j=\ln(T_i^{-1}T_j)^\vee Δξij=ξi1ξj=ln(Ti1Tj)构建误差 e i j e_{ij} eij: e i j = ln ⁡ ( T i j − 1 T i − 1 T j ) ∨ = l n ( I ) = 0 e_{ij}=\ln(T_{ij}^{-1}T_i^{-1}T_j)^\vee= ln(I)=0 eij=ln(Tij1Ti1Tj)=ln(I)=0优化变量有两个 ξ i \xi_{i} ξi ξ j \xi_{j} ξj,求 e i j e_{ij} eij关于这两个变量的导数(利用扰动模型,给 ξ i \xi_{i} ξi ξ j \xi_{j} ξj各乘一个左扰动 δ ξ i \delta\xi_{i} δξi δ ξ j \delta\xi_{j} δξj): e ^ i j = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) exp ⁡ ( δ ξ j ∧ ) T j ) ∨ \hat{e}_{ij}=\ln(T_{ij}^{-1}T_i^{-1}\exp((-\delta\xi_i)^{\wedge})\exp(\delta\xi_j^{\wedge})T_j)^{\vee} e^ij=ln(Tij1Ti1exp((δξi))exp(δξj)Tj)

其中, δ ξ i \delta\xi_{i} δξi乘左扰动到了右边,是因为逆的存在 ( exp ⁡ ( δ ξ i ∧ ) T i ) − 1 = T i − 1 ⋅ ( exp ⁡ ( δ ξ i ∧ ) ) − 1 = T i − 1 ⋅ exp ⁡ ( − δ ξ i ∧ ) \begin{aligned}&(\exp(\delta\xi_{i}^{\wedge})T_{i})^{-1}\\&=T_{i}^{-1}\cdot(\exp(\delta\xi_{i}^{\wedge}))^{-1}\\&=T_{i}^{-1}\cdot \exp(-\delta\xi_{i}^{\wedge})\end{aligned} (exp(δξi)Ti)1=Ti1(exp(δξi))1=Ti1exp(δξi)

根据伴随性质公式 exp ⁡ ( ( A d ( T ) ξ ) ∧ ) = T exp ⁡ ( ξ ∧ ) T − 1 \exp((Ad(T)\xi)^{\wedge})=T\exp(\xi^{\wedge})T^{-1} exp((Ad(T)ξ))=Texp(ξ)T1 (其中, A d ( T ) = [ R t ∧ R 0 R ] Ad(T)=\begin{bmatrix}R&t^\wedge R\\\mathbf{0}&R\end{bmatrix} Ad(T)=[R0tRR])的变形 exp ⁡ ( ξ ∧ ) T = T exp ⁡ ( ( A d ( T − 1 ) ξ ) ∧ ) \exp(\xi^\wedge)T=T\exp((Ad(T^{-1})\xi)^\wedge) exp(ξ)T=Texp((Ad(T1)ξ)) ,把扰动项挪到最右边: e ^ i j = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) exp ⁡ ( δ ξ j ∧ ) T j ⏟ 伴随性质 ) ∨ = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) T j exp ⁡ ( ( A d ( T j − 1 ) δ ξ j ) ∧ ) ⏞ ) ∨ = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) T j ⏟ 伴随性质 exp ⁡ ( ( A d ( T j − 1 ) δ ξ j ) ∧ ) ∨ = ln ⁡ ( T i j − 1 T i − 1 T j exp ⁡ ( ( − A d ( T j − 1 ) δ ξ i ) ∧ ) ⏞ exp ⁡ ( ( A d ( T j − 1 ) δ ξ j ) ∧ ) ) ∨ \begin{aligned} \hat{e}_{ij}& =\ln\left(T_{ij}^{-1}T_{i}^{-1}\exp\left((-\delta\xi_{i})^{\wedge}\right)\underbrace{\exp(\delta\xi_{j}^{\wedge})T_{j}}_{\text{伴随性质}}\right)^{\vee} \\ &=\ln\left(T_{ij}^{-1}T_i^{-1}\exp((-\delta\xi_i)^\wedge)\overbrace{T_j\exp((Ad(T_j^{-1})\delta\xi_j)^\wedge)}\right)^\vee \\ &=\ln\left(T_{ij}^{-1}T_i^{-1}\underbrace{\exp\left((-\delta\xi_i)^\wedge\right)T_j}_\text{伴随性质}\exp\left((Ad(T_j^{-1})\delta\xi_j\right)^\wedge\right)^\vee \\ &=\ln\left(T_{ij}^{-1}T_i^{-1}\overbrace{T_j\exp\left(\left(-Ad(T_j^{-1})\delta\xi_i\right)^{\wedge}\right)}\exp\left(\left(Ad(T_j^{-1})\delta\xi_j\right)^{\wedge}\right)\right)^{\vee} \end{aligned} e^ij=ln Tij1Ti1exp((δξi))伴随性质 exp(δξj)Tj =ln(Tij1Ti1exp((δξi))Tjexp((Ad(Tj1)δξj)) )=ln Tij1Ti1伴随性质 exp((δξi))Tjexp((Ad(Tj1)δξj) =ln(Tij1Ti1Tjexp((Ad(Tj1)δξi)) exp((Ad(Tj1)δξj)))

对上述指数 exp ⁡ ( ( − A d ( T j − 1 ) δ ξ i ) ∧ ) \exp\left(\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge\right) exp((Ad(Tj1)δξi)) exp ⁡ ( ( A d ( T j − 1 ) δ ξ j ) ∧ ) \exp\left(\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge\right) exp((Ad(Tj1)δξj))分别做泰勒一阶展开: exp ⁡ ( ( − A d ( T j − 1 ) δ ξ i ) ∧ ) = I + ( − A d ( T j − 1 ) δ ξ i ) ∧ exp ⁡ ( ( A d ( T j − 1 ) δ ξ j ) ∧ ) = I + ( A d ( T j − 1 ) δ ξ j ) ∧ \exp\left(\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge\right)=I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge\\\exp\left(\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge\right)=I+\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge exp((Ad(Tj1)δξi))=I+(Ad(Tj1)δξi)exp((Ad(Tj1)δξj))=I+(Ad(Tj1)δξj)忽略二次项得: exp ⁡ ( ( − A d ( T j − 1 ) δ ξ i ) ∧ ) exp ⁡ ( ( A d ( T j − 1 ) δ ξ j ) ∧ ) ≈ ( I + ( − A d ( T j − 1 ) δ ξ i ) ∧ ) ( I + ( A d ( T j − 1 ) δ ξ j ) ∧ ) ≈ I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ + ( − A d ( T j − 1 ) δ ξ i ) ∧ ( A d ( T j − 1 ) δ ξ j ) ∧ ⏟ 二次项忽略不计 = I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ \begin{aligned} \exp\left(\left(-Ad(T_{j}^{-1})\delta\xi_{i}\right)^{\wedge}\right)\exp\left(\left(Ad(T_{j}^{-1})\delta\xi_{j}\right)^{\wedge}\right)& \approx\left(I+\left(-Ad(T_{j}^{-1})\delta\xi_{i}\right)^{\wedge}\right)\left(I+\left(Ad(T_{j}^{-1})\delta\xi_{j}\right)^{\wedge}\right) \\ &\approx I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^{\wedge}+\left(Ad(T_j^{-1})\delta\xi_j\right)^{\wedge} \\ &+\underbrace{{\left(-Ad(T_{j}^{-1})\delta\xi_{i}\right)^{\wedge}\left(Ad(T_{j}^{-1})\delta\xi_{j}\right)^{\wedge}}}_{\text{二次项忽略不计}} \\ &=I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^{\wedge}+\left(Ad(T_j^{-1})\delta\xi_j\right)^{\wedge} \end{aligned} exp((Ad(Tj1)δξi))exp((Ad(Tj1)δξj))(I+(Ad(Tj1)δξi))(I+(Ad(Tj1)δξj))I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj)+二次项忽略不计 (Ad(Tj1)δξi)(Ad(Tj1)δξj)=I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj)

e ^ i j ≈ ln ⁡ ( T i j − 1 T i − 1 T j [ I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ ] ) ∨ \hat{e}_{ij}\approx\ln\left(T_{ij}^{-1}T_i^{-1}T_j\left[I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge+\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge\right]\right)^\vee e^ijln(Tij1Ti1Tj[I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj)])

  • 令变换矩阵 T i j − 1 T i − 1 T j T_{ij}^{-1}T_i^{-1}T_j Tij1Ti1Tj对应的李代数为 e i j e_{ij} eij,根据李群李代数的对应关系得: T i j − 1 T i − 1 T j = exp ⁡ ( e i j ∧ ) T_{ij}^{-1}T_i^{-1}T_j=\exp(e_{ij}^{\wedge}) Tij1Ti1Tj=exp(eij)
  • 再令 exp ⁡ ( x ∧ ) = I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ \exp(x^\wedge)=I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge+\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge exp(x)=I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj)根据对数函数的泰勒展开式: ln ⁡ ( A ) = ( A − I ) − ( A − I ) 2 2 + ( A − I ) 3 3 − … \ln(A)=(A-I)-\frac{(A-I)^2}2+\frac{(A-I)^3}3-\ldots ln(A)=(AI)2(AI)2+3(AI)3取其中的一阶项,可得: x ∧ = ln ⁡ ( I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ ) ≈ I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ − I = − ( A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ \begin{aligned} x^{\wedge}& =\ln\left(I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge+\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge\right) \\ &\approx I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge+\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge-I \\ &=-\left(Ad(T_j^{-1})\delta\xi_i\right)^{\wedge}+\left(Ad(T_j^{-1})\delta\xi_j\right)^{\wedge} \end{aligned} x=ln(I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj))I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj)I=(Ad(Tj1)δξi)+(Ad(Tj1)δξj)

e ^ i j = ln ⁡ ( T i j − 1 T i − 1 T j [ I + ( − A d ( T j − 1 ) δ ξ i ) ∧ + ( A d ( T j − 1 ) δ ξ j ) ∧ ] ) ∨ = ln ⁡ ( exp ⁡ ( e i j ∧ ) exp ⁡ ( x ∧ ) ) ∨ \begin{aligned} \hat{e}_{ij}& =\ln\left(T_{ij}^{-1}T_i^{-1}T_j\left[I+\left(-Ad(T_j^{-1})\delta\xi_i\right)^\wedge+\left(Ad(T_j^{-1})\delta\xi_j\right)^\wedge\right]\right)^\vee \\ &=\ln\left(\exp(e_{ij}^{\wedge})\exp(x^{\wedge})\right)^{\vee} \end{aligned} e^ij=ln(Tij1Ti1Tj[I+(Ad(Tj1)δξi)+(Ad(Tj1)δξj)])=ln(exp(eij)exp(x))因此根据BCH的右乘近似公式可得(x为小量): e ^ i j = ln ⁡ ( exp ⁡ ( e i j ∧ ) exp ⁡ ( x ∧ ) ) ∨ = J r − 1 ( e i j ) x + e i j \hat{e}_{ij}=\ln\left(\exp(e_{ij}^{\wedge})\exp(x^{\wedge})\right)^{\vee}=\mathcal{J}_r^{-1}(e_{ij})x+e_{ij} e^ij=ln(exp(eij)exp(x))=Jr1(eij)x+eij ≈ J r − 1 ( e i j ) ( − A d ( T j − 1 ) δ ξ i + A d ( T j − 1 ) δ ξ j ) + e i j = e i j + ( − J r − 1 ( e i j ) A d ( T j − 1 ) ) ⏟ ∂ e i j ∂ δ ξ i δ ξ i + J r − 1 ( e i j ) A d ( T j − 1 ) ⏟ ∂ e i j ∂ δ ξ j δ ξ j \begin{aligned} &\approx\mathcal{J}_r^{-1}(e_{ij})\left(-Ad(T_j^{-1})\delta\xi_i+Ad(T_j^{-1})\delta\xi_j\right)+e_{ij} \\ &=e_{ij}+\underbrace{\left(-\mathcal{J}_r^{-1}(e_{ij})Ad(T_j^{-1})\right)}_{\frac{\partial e_{ij}}{\partial\delta\xi_i}}\delta\xi_i+\underbrace{\mathcal{J}_r^{-1}(e_{ij})Ad(T_j^{-1})}_{\frac{\partial e_{ij}}{\partial\delta\xi_j}}\delta\xi_j \end{aligned} Jr1(eij)(Ad(Tj1)δξi+Ad(Tj1)δξj)+eij=eij+δξieij (Jr1(eij)Ad(Tj1))δξi+δξjeij Jr1(eij)Ad(Tj1)δξj其中,为方便计算, J r − 1 ( e i j ) ≈ I + 1 2 [ ϕ e ∧ ρ e ∧ 0 ϕ e ∧ ] \left.\mathcal{J}_r^{-1}(e_{ij})\approx I+\frac{1}{2}\left[\begin{array}{cc}\phi_e^\wedge&\rho_e^\wedge\\\mathbf{0}&\phi_e^\wedge\end{array}\right.\right] Jr1(eij)I+21[ϕe0ρeϕe]或者 ≈ I \approx I I
通过 ∂ e i j ∂ δ ξ i = 0 \frac{\partial e_{ij}}{\partial\delta\xi_i}=0 δξieij=0 ∂ e i j ∂ δ ξ j = 0 \frac{\partial e_{ij}}{\partial\delta\xi_j}=0 δξjeij=0 求得 δ ξ i \delta\xi_{i} δξi δ ξ j \delta\xi_{j} δξj不断迭代 ξ i \xi_{i} ξi ξ j \xi_{j} ξj。求得目标函数 min ⁡ 1 2 ∑ i , j ∈ E e i j T Σ i j − 1 e i j \min\frac12\sum_{i,j\in\mathcal{E}}e_{ij}^T\Sigma_{ij}^{-1}e_{ij} min21i,jEeijTΣij1eij的最小值。

四、实践g2o_viewer报错解决方案

问题1

g2o_viewer: command not found

原因

之前编译g2o库的时候因为少装了部分依赖所以没有编译出 g2o_viewer的可执行文件

解决方案

补充下述依赖

sudo apt-get install libsuitesparse-dev qtdeclarative5-dev qt5-qmake
sudo apt-get install libqglviewer-dev-qt5

进入g2o的build文件夹下

cmake ..
make
sudo make install

问题2

g2o_viewer: error while loading shared libraries: libg2o_viewer.so: cannot o

解决方案

sudo ldconfig

sudo ldconfig命令的作用是确保新安装的动态链接库能够被系统正确识别和共享

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

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

相关文章

B站广告推广操作教程及费用?

哔哩哔哩(B站)作为国内极具影响力的年轻人文化社区,已成为众多品牌与企业触达目标受众、提升品牌影响力的重要阵地。然而,面对B站复杂的广告系统与精细化运营需求,许多广告主可能对如何高效开展B站广告推广感到困惑。云…

2024年同城网总流量全新生态,个人工作室落地式游戏玩法,单账户月入3万

我要为大家解读的是本地生活新项目,这个业务模式中,即使是低收入的玩法,一个月赚取万儿八千也是完全可行的。而高收入的玩法,一单的收入甚至能超过一万。目前,你的圈子里已经有一些同行业的人开始以个人工作室的形式去…

stm32开发之threadx+netxduo(结合 modbus 编写tcp接口程序)

前言 本篇结合freemodbus源码程序进行移植,驱动实现的接口为modbus tcp需要知道threadx的 事件标志组、信号量、线程相关的知识需要知道netxduo tcp方面的api和创建流程方面的知识 freemodbus程序源码 本次使用的源码来自于rt-thread软件包里面的,可以参考之前的…

linux查看网络连接数

目录 netstat top netstat 1.netstat查看当前主机上网络连接信息,端口号,pid,程序名等等 #直接查看 netstat -anp #一般使用的时候,可能要筛选 #比如8080端口是否被占用 netstat -anp | grep 8080 #minio服务占用了那些端口 netstat -anp …

掌握判断IPv4地址是否正确的方法

在数字通信和互联网领域中,IPv4地址作为标识网络设备的核心元素,其正确性至关重要。一个有效的IPv4地址能够确保设备在网络中的正常通信和交互,而错误的IPv4地址则可能导致连接失败、通信中断甚至网络安全问题。因此,掌握判断IPv4…

【docker】之linux写shell脚本备份线上数据库(备份为dump文件)

目录 1. SH文件1.1 SH文件示例1.2 文件解释1.3 .sh文件执行 2. 备份线上数据库的.sh文件2.1 文件命令解析 3. 命令执行4. 线下dump文件的恢复与备份 环境:linux容器:docker 1. SH文件 SH文件通常指的是 Shell 脚本文件,文件后缀名为.sh&…

Spring Boot统一功能处理(一)

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求(doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口,通常会安排几个…

【C++学习】C++11新特性(第一节)

文章目录 ♫一.文章前言♫二.C11新特性♫一.统一的列表初始化♫二.std::initializer_list♫三.声明♫四.decltype关键字♫五.nullptr♫六.新增加容器---静态数组array、forward_list以及unordered系列♫6.1unordered_map与unoredered_set♫6.2array♫6.3 forward_list&#xff…

Leetcode算法训练日记 | day18

一、找树左下角的值 1.题目 Leetcode:第 513 题 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出:…

nandgame中的Memory(内存操作):栈、堆、静态区

Push Memory Push Memory 将内存中的值push到栈内堆栈顶部的值是一个内存地址。从堆栈中弹出地址。获取内存地址的当前内容,并将其推送到堆栈上。POP_A //堆栈顶部的值是一个内存地址。从堆栈中弹出地址。 D *A //获取内存地址的当前内容 PUSH_D //将其推送到…

JVM性能调优——运行时参数

文章目录 1、JVM参数选项类型1.1、标准参数选项1.2、非标准参数选项1.3、非稳定参数选项 2、添加JVM参数的方式3、常用JVM参数选项4、通过Java代码获取JVM参数5、小结 熟悉JVM参数对于系统调优是非常重要的。比如一个高流量的延迟的电子交易平台,它要求的响应时间都…

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(五)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_clie…

MySQL:关于数据库的一些练习题

文章目录 前面的内容已经把数据库的一些必要知识已经储备好了,因此下面就对于这些语句进行一些练习: 批量插入数据 insert into actor values (1, PENELOPE, GUINESS, 2006-02-15 12:34:33), (2, NICK, WAHLBERG, 2006-02-15 12:34:33);SQL202 找出所有…

C/S医学检验LIS实验室信息管理系统源码 医院LIS源码

LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地…

一起学习python——基础篇(14)

今天讲一下python的json解析方式。 上一篇文章讲述了将传参数据转换为json格式的数据传给后台,如果后端返回的json格式数据,我们该如何解析呢? 例子一:简单的json数据格式 如果后端返回的json数据如下, { "na…

【leetcode面试经典150题】34.有效的数独(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

Docker Compose 一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

【C++学习】C++11新特性(第二节)—— 右值引用与移动语义超详解

文章目录 文章简介二.右值引用1.什么是左值,什么是右值?什么是左值引用,什么是右值引用?2.左值引用与右值引用比较 三.右值引用使用场景和意义1.左值引用的使用场景:2.左值引用的短板:3.右值引用与移动构造…

2024大模型落地应用案例集(免费下载)

【1】扫码关注本公众号 【2】私信发送 2024大模型落地应用案例集 【3】获取本方案PDF下载链接,直接下载即可。

【Linux】环境下OpenSSH升级到 OpenSSH_9.6P1(图文教程)

漏洞描述 OpenSSH(OpenBSD Secure Shell)是加拿大OpenBSD计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。OpenSSH 9.6之前…