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

  • 本节是对上一节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.mzph.cn/web/99.shtml

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

相关文章

【Gradle】Gradle的构建过程

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。 面向Java应用为主。当前其支持的语言C、J…

免费网址导航网站源码v1.7.0最新版内置多个模板

效果图 PC端&移动端(共有7款主题) 1.5IUX搜索 2.Onenav主题 六零二开 3.基于彩虹工具网修改 4.默认主题 5.基于default主题开发 6.极简个人主页主题 7.孤客主题 后台管理效果图 项目说明 孤客导航页(LoSFeR)是一个…

Zephyr Windows开发环境搭建

Zephyr 如果有错误或未及时更新,请以官网文档为主 官网:https://docs.zephyrproject.org/latest/develop/getting_started/index.htm 下载安装 Chocolatey 这是一个类似于在Linux系统下 yum 和 apt 那样的包管理器 官网:https://chocolat…

安宝特方案 | AR工业解决方案系列-工厂督查

在工业4.0时代,增强现实(AR)技术正全面重塑传统工业生产,在工厂监督领域,其应用不仅大幅提升了生产效率、监测准确性和规范执行程度,而且为整体生产力带来了质的飞跃。 01 传统挑战与痛点 在制造业生产流程…

未来趋势:探索Facebook在数字化时代的发展方向

在当今日益数字化的时代,社交媒体已经成为人们日常生活中不可或缺的一部分。Facebook,作为全球最大的社交媒体平台,一直处于行业的前沿,不断地探索和引领社交媒体的发展趋势。本文将深入探讨Facebook在数字化时代的发展方向&#…

如何解决Charles抓包乱码?

一、问题:抓包乱码 二、 1、打开Charles安装的目录下,Charles.ini文件, 2、添加内容、保存 vmarg.5-Dfile.encodingUTF-8 三、重启,再次抓包

Object.assign()用法及详细分析到底是浅拷贝还是深拷贝?

Object.assign方法用于对象的合并,将源对象(source )的所有可枚举属性,复制到目标对象(target)。 Object.assign(target,source1,source2) Object.assign方法的第一个参数是目标对象,后面的参数…

Next.js动态路由如何使用

官方解释 Next.js 允许你创建具有 动态路由 的页面。例如,你可以创建一个名为 pages/posts/[id].js 的文件用以展示以 id 标识的单篇博客文章。当你访问 posts/1 路径时将展示 id: 1 的博客文章。 代码 这里先用一个写好的实例代码来展示 import React from react…

Python-Qt上位机设计

1.下载designer软件 2.自己设计一个界面 3.在指定部件加入点击响应命令函数名 鼠标点击目标部件拖出信号线 4.保存生成.ui文件,用pycharm打开 5.生成.py文件 6.新建一个功能文件 上图中class MainWindow的具体代码不予展示。 7.生成exe文件 将写好的py文件保存&a…

java的JDK动态代理

JDK动态代理是指:代理类实例在程序运行时,由JVM根据反射机制动态的生成。也就是说代理类不是用户自己定义的,而是由JVM生成的。 由于其原理是通过Java反射机制实现的,所以在学习前,要对反射机制有一定的了解。传送门&…

【简单介绍下PostCSS】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

python爬虫 - 爬取图片

文章目录 1、爬取图片示例1:使用 .urlretrieve() 函数2、爬取图片示例2 - 使用 open/write 函数3、爬取图片示例33.1 使用 open/write 下载3.2 使用 urlretrieve下载 爬虫的本质:模拟对应的App,浏览器访问对应的地址获取到数据 1、爬取图片示…

57、通过EEG数据的SHAPE变化,揭开EEG-TCNet的黑匣子[看好了小子,我只教这一次]

之前在第18篇博客中对于EEG-TCNet这个处理EEG信号的sota模型进行了介绍,也给出了模型,目前也是全网对于EEG-TCNet浏览度最高的文章了,我觉得讲的已经很细致了,没想到还是有不少同学疑问,这也是全网缺少该模型pytorch代…

3D Gaussian Splatting技术原理

3D Gaussian Splatting 是一种用于体积渲染的技术,特别适用于科学和医学可视化。这种技术使得用户能够以一种直观的方式查看和分析三维数据集,如医学成像数据(MRI、CT扫描)或科学模拟数据。 技术原理 3D Gaussian Splatting基本上是一种将3D空间中的点数据转换成一个连续…

Redis中的Sentinel(五)

Sentinel 检测主观下线状态 在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内) 发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。如图所示,带箭头的连线显…

Word学习笔记之奇偶页的页眉与页码设置

1. 常用格式 在毕业论文中,往往有一下要求: 奇数页右下角显示、偶数页左下角显示奇数页眉为每章标题、偶数页眉为论文标题 2. 问题解决 2.1 前期准备 首先,不论时要求 1、还是要求 2,这里我们都要做一下设置: 鼠…

如何封装Vue组件并上传到npm

前言 环境准备 1.注册npm账号:npm | Home (npmjs.com) 2.保证当前环境安装了vue、webpack、node,以下工作将在该环境下进行(没有的小伙伴自行百度安装哈~) 3.一下用到的环境版本 webpack:v5.1.4node:v…

SAM5716B 法国追梦DREAM 音频DSP芯片

法国追梦/DERAM SAM5504/5704/5716/5808音频DSP芯片,开发板,方案 可用于电子鼓、电子琴、电吉他、效果器、均衡器、啸叫抑制器等电声产品领域 全系列芯片: SAM2634 SAM2695 SAM5504B SAM5704B SAM5708B SAM5808B SAM5716B SAM5916B... 原厂开发…

根据状态转移图实现时序电路

描述 某同步时序电路的状态转换图如下,→上表示“C/Y”,圆圈内为现态,→指向次态。 请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。 如图所示: 电路的接口如下图所示,C是单bit数据…

密码学 | 承诺:常见的承诺方案

🥑原文:密码学原语如何应用?解析密码学承诺的妙用 - 知乎 1 简介 密码学承诺 涉及 承诺方、验证方 两个参与方,以及以下两个阶段: 承诺阶段:承诺方选择一个敏感数据 v v v,为它计算出相应…