论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

  • 文章概括
  • 摘要
  • I. INTRODACTION
  • II. 相关工作
  • III. APPROACH
    • A. 姿态跟踪工作流程
    • B. VIPose网络

文章概括

引用:

@inproceedings{ge2021vipose,title={Vipose: Real-time visual-inertial 6d object pose tracking},author={Ge, Rundong and Loianno, Giuseppe},booktitle={2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},pages={4597--4603},year={2021},organization={IEEE}
}
Ge, R. and Loianno, G., 2021, September. Vipose: Real-time visual-inertial 6d object pose tracking. In 2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) (pp. 4597-4603). IEEE.

原文:https://ieeexplore.ieee.org/abstract/document/9636283
代码、数据和视频:https


系列文章:
请在 《 《 文章 》 》 专栏中查找


摘要

估计物体的6D姿态对于运输、自动导航、操纵等机器人任务非常有益,同时在虚拟现实和增强现实等超越传统机器人的场景中也同样重要。相对于单张图片的姿态估计,姿态跟踪考虑了跨多个帧的时间信息,以克服可能的检测不一致并提高姿态估计的效率。在这项工作中,我们介绍了一种名为VIPose的新型深度神经网络(DNN),该网络结合惯性和摄像机数据来实时解决物体姿态跟踪问题。主要贡献是设计了一种新型的DNN架构,该架构融合视觉和惯性特征来预测连续图像帧之间物体的相对6D姿态。然后通过连续组合相对姿态来估计总体的6D姿态。我们的方法在处理由现有最先进解决方案难以处理的严重遮挡的物体时显示出了显著的姿态估计结果。所提出方法的有效性在一个新的数据集VIYCB上得到了验证,该数据集包括RGB图像、IMU数据和通过自动化标记技术创建的准确的6D姿态注释。这种方法展示了与最先进技术相当的准确性表现,但额外的好处是实时性。


I. INTRODACTION

从RGB图像序列跟踪物体的6D姿态(即,估计每一帧中物体相对于相机的3D平移和旋转),是各种机器人应用中的重要任务。这可以提高机器人在各种室外和室内环境中的导航性能,以解决复杂任务,如检查、制图和搜索救援。它还可以用于物体操纵任务的规划和抓取、空中电影摄影以跟踪移动目标,以及在虚拟现实(VR)和增强现实(AR)等超出机器人学的场景中使用。从单张RGB图像估计物体的6D姿态已经被广泛研究。传统方法通过图像和3D物体模型匹配物体的关键点[1]-[3]。最近基于深度学习的方法显著提高了姿态估计的准确性和鲁棒性[4]-[11]。一些单图像姿态估计方法是实时的(30 Hz),但准确性有限[5],[11]。此外,这些方法忽略了连续图像帧之间的时空信息,严格专注于单视图姿态估计。这可能导致连续帧之间的姿态估计不一致。

最近基于RGB的6D物体姿态跟踪方法取得了良好的跟踪性能[9],[12]。然而,这些方法对于严重遮挡不够鲁棒,这种情况需要每次重新初始化姿态跟踪过程。重新初始化通常由一个精确的6D姿态估计方法执行,这在计算上是昂贵的。因此,这些方法的速度相当有限,阻碍了它们在实时场景中的应用。为了克服上述缺点,我们提出了一种新的DNN架构,它结合了惯性测量单元(IMU)数据和相机图像。IMU在机器人领域已广泛用于定位和导航。最近的研究[13],[14]表明,可以通过训练有素的DNN处理IMU数据来预测速度,这可以用来解决相机定位问题。因此,IMU传感器可以提供关于相机运动的有用信息。在我们的案例中,我们利用这些信息实现在严重遮挡下也能准确的物体姿态跟踪。此外,对图像和IMU数据的联合学习过程导致了一种高效的表征,使得鲁棒的实时姿态跟踪成为可能。这项工作呈现了多个贡献。首先,我们提出了第一个融合相机和IMU数据的物体姿态跟踪方法,以应对复杂场景中包括物体遮挡的姿态跟踪挑战。其次,我们的方法通过利用IMU数据并通过传播和结合连续帧的相对姿态估计来加速姿态跟踪问题。最后,我们在收集的包括RGB图像和IMU数据的数据集上实验验证了我们的方法,这些数据通常在现有数据集中不可用。为了克服生成6D姿态注释的众所周知的困难任务,还引入了一种自动化标记技术来收集足够的训练和测试数据,从而显著减少了手工标记的努力。实验结果表明,提出的方法与现有最先进的解决方案相比取得了可比的结果,同时运行速度显著更快,达到了实时性能(即50.2 Hz)。论文的结构如下。第II部分,我们回顾了6D姿态估计和跟踪的相关工作,以及基于IMU数据的定位学习技术。第III部分介绍了提出的跟踪管道和VIPose网络。第IV部分展示了在我们的VIYCB数据集上的广泛实验结果。第V部分总结了工作并提出了未来的方向。


在这里插入图片描述图1:视觉-惯性6D物体姿态跟踪(顶部)。在我们的VIYCB数据集上进行速度-准确性基准测试,与现有最先进解决方案进行比较(底部)。



II. 相关工作

6D姿态估计: 传统上,单张图像中物体的6D姿态是通过模板匹配方法估计的,该方法将图像中的特征点与相应的3D模型特征点匹配。然后,可以通过使用PnP算法[1]解决这些局部特征的2D-3D对应关系来估计6D物体姿态。最近,基于深度学习的方法日益流行。SSD-6D[4]扩展了SSD物体检测器到6D姿态估计,增加了一个视点分类分支。[5]采用YOLO网络来检测图像中物体的3D包围框角点,并通过再次解决PnP问题来恢复6D姿态。PoseCNN[8]提出了一个端到端的框架,用于执行语义分割并预测3D旋转和平移。相反,DeepIM[9]采用FlowNetSimple网络[15]来通过迭代预测从渲染的前一姿态到当前图像观察的相对姿态,直到迭代姿态增量足够小。一般来说,将6D姿态估计方法应用于视频的每一帧来估计6D姿态,忽略了可能有用的时间信息,这些信息可以提高姿态估计过程的速度和准确性,而无需在每一帧都进行估计。

6D姿态跟踪: 我们的工作与最近在基于RGB的6D物体姿态跟踪方面的进展密切相关。PWP3D[16]提出通过优化物体3D模型的投影轮廓来跟踪物体姿态。[17]进一步改进了[16],采用一种新颖的优化方案和GPU并行化。然后[18]提出使用时间局部颜色直方图来改进姿态跟踪。最近,[19]采用深度神经网络预测连续帧之间的姿态差异。PoseRBPF[12]提出了一个Rao-Blackwellized粒子滤波方法来跟踪6D姿态,该方法将3D旋转和3D平移解耦,并考虑不确定性和物体对称性,达到了YCB视频数据集上的最佳性能。DeepIM[9]也可以扩展到通过预测连续两帧之间的相对变换来执行姿态跟踪。然而,这些方法对严重遮挡仍然不够鲁棒,丢失跟踪时需要重新初始化。[20]提出了一种新的网络,用于RGB-D数据上的6D姿态跟踪。它解耦了特征编码,以减少仿真和现实之间的领域差距,并且仅使用合成数据进行训练。这种方法在RGB-D数据上表现良好,而在我们的工作中,我们专注于更具挑战性的情况,即只有RGB图像可用,没有深度信息。

数据驱动的IMU定位: 传统上,IMU数据可以通过一些基于滤波的方法来进行定位。近年来,深度学习方法已经被应用于直接从IMU数据回归定位信息。VINet[21]提出了第一个端到端的视觉-惯性测距系统,它采用一个LSTM[22]网络来处理跨图像帧的IMU输入,以及一个FlowNet网络来处理图像对。视觉-惯性融合是通过连接IMU和视觉特征向量实现的。IONet[23]提出了一个LSTM网络来预测2D中的相对位移,并将预测结果连接起来,仅依赖于IMU输入来推断位置。RoNIN[13]将IMU数据旋转到与重力对齐的框架中,并使用1D ResNet网络预测一系列IMU数据的平均2D速度。TLIO[14]同样采用1D ResNet网络,但用于回归3D位移及其对应的不确定性,并采用紧耦合的扩展卡尔曼滤波框架进行状态估计。我们的工作与上述关于使用1D ResNet处理IMU数据的工作密切相关,但我们专注于物体姿态和跟踪问题,而不是相机定位。



III. APPROACH

姿态跟踪问题的目标是估计给定时刻 t t t t ∈ { 1 , 2 , … , N } t \in \{1, 2, \dots, N\} t{1,2,,N}相对于相机框架的物体的6D姿态 ξ t ∈ SE ( 3 ) \xi_t \in \text{SE}(3) ξtSE(3),给定:

  • 物体的3D CAD模型
  • 物体的初始姿态 ξ 0 ∈ SE ( 3 ) \xi_0 \in \text{SE}(3) ξ0SE(3),可以通过任何6D姿态估计方法获得
  • 一系列RGB图像 I j I_j Ij j ∈ { 0 , 1 , … , N } j \in \{0, 1, \dots, N\} j{0,1,,N}
  • 一系列IMU数据 G k G_k Gk k ∈ { 0 , 1 , … , M } k \in \{0, 1, \dots, M\} k{0,1,,M},其中 G k G_k Gk是一个包含在IMU框架的三个笛卡尔轴上的加速度和角速度测量的6维向量

在本节中,我们首先提供姿态跟踪工作流的概述,包括在使用VIPose DNN之前对原始图像和IMU输入进行预处理的阶段。随后我们描述我们的新型VIPose DNN,它通过结合两个连续的图像和一系列IMU数据来推断连续帧之间的相对姿态。然后通过组合连续帧之间的相对变换来获得最终的物体姿态。

A. 姿态跟踪工作流程

我们流水线在时间 t t t的姿态工作流程如图2所示。相机提供图像观察 I t I_t It,IMU提供加速度和角速度。图像预处理包括三个主要步骤:渲染、裁剪和调整大小,随后是IMU的预处理步骤。


在这里插入图片描述图2:姿态跟踪工作流程。在时间 t t t,相机提供图像观察 I t I_t It。使用物体的3D模型和上一次的姿态估计 ξ t − 1 \xi_{t-1} ξt1来渲染 I t − 1 R I^R_{t-1} It1R I t I_t It I t − 1 R I^R_{t-1} It1R都通过一个放大的边界框(如图3所示)进行裁剪,并调整为原始分辨率的一半大小。IMU缓冲区提供最近的 K K K个IMU测量数据。预处理后的图像对和IMU序列被送入VIPose网络,以预测相对姿态 Δ ξ t \Delta\xi_t Δξt,该相对姿态与 ξ t − 1 \xi_{t-1} ξt1结合,得到该帧的物体姿态估计 ξ t \xi_t ξt


1)渲染:首先,我们使用物体的3D模型和上一帧的估计6D姿态 ξ t − 1 \xi_{t-1} ξt1来渲染RGB图像 I t − 1 R I^R_{t-1} It1R作为最后一帧的参考图像,以提供要跟踪的目标物体。渲染过程从杂乱的场景中提取物体信息。这是通过将物体的3D模型放置在带有黑色背景的场景中心,并在由姿态 ξ t − 1 \xi_{t-1} ξt1定义的视点处投射RGB图像来执行的,如图3所示。

2)裁剪:由于原始图像中物体大小较小,提取用于跨帧匹配的有用特征可能很困难。受[9]启发,我们通过使用一个放大的边界框(白框),如图3所示,来裁剪渲染图像 I t − 1 R I^R_{t-1} It1R和图像观察 I t I_t It来解决这个问题。为了获得这样的边界框,我们首先使用相应3D物体模型的8个角点的2D投影 p i p_i pi i ∈ { 1 , 2 , … , 8 } i \in \{1, 2, \dots, 8\} i{1,2,,8}(如图3中的黄色点所示)来估计渲染图像中物体的大小,
x size = max ⁡ i ( p i x ) − min ⁡ i ( p i x ) {x}_\text{size} = \max_i(p_{i_x}) - \min_i(p_{i_x}) xsize=imax(pix)imin(pix)
y size = max ⁡ i ( p i y ) − min ⁡ i ( p i y ) {y}_\text{size} = \max_i(p_{i_y}) - \min_i(p_{i_y}) ysize=imax(piy)imin(piy)

放大的边界框以3D模型中心的2D投影为中心(在图3中用绿点表示),并保持输入图像的相同宽高比。放大边界框的高度 h h h和宽度 w w w按照以下公式获得:
h = λ ⋅ max ⁡ ( x size r y size ) , h = \lambda \cdot \max\left(\frac{{x}_\text{size}}{r}{y}_\text{size}\right), h=λmax(rxsizeysize),
w = λ ⋅ max ⁡ ( x size , y size ⋅ r ) w = \lambda \cdot \max({x}_\text{size}, {y}_\text{size}\cdot r) w=λmax(xsize,ysizer)
其中 r r r是原始图像的宽高比, λ \lambda λ表示扩展比例,以确保边界框在渲染图像和新图像中都包含物体。


在这里插入图片描述图3:渲染和裁剪的可视化。物体使用3D模型和估计的6D姿态进行渲染。3D模型中心和8个角点的2D投影分别用绿点和黄点表示。红框定义了渲染物体的尺寸 x size {x}_\text{size} xsize y size {y}_\text{size} ysize。白框代表放大的边界框,以绿点为中心,宽度为 w w w,高度为 h h h


3)调整大小:随后,我们调整裁剪后的图像对的大小以获取更多细节。裁剪后的图像对被调整为固定分辨率,这是原始图像大小的一半,以减少网络中的计算量。在训练阶段,这允许使用更大的批次大小以加快训练过程的收敛。在测试阶段,这显著减少了系统的运行时间,而不影响准确性。调整大小后的图像对被用作网络的视觉输入。

4)IMU预处理:在图像对预处理之后,我们还预处理IMU数据作为网络的惯性输入。设计了一个IMU缓冲区,作为一个队列,存储最近的 K K K个IMU测量数据。 K K K的选择可以根据IMU输入的频率和不同应用中相机的速度而变化。当新的图像观察到达时,IMU缓冲区中的全部数据被用作网络的输入,并以 K × 6 K \times 6 K×6的张量表示。根据类似[13]的方法,IMU序列从IMU框架旋转到一个朝向不明的坐标框架,使用来自设备的真实方向。朝向不明的坐标框架被定义为一个其Z轴与重力对齐并在整个序列中保持一致的坐标框架。

预处理后的图像对和IMU序列被输入VIPose网络,以预测图像 I t − 1 R I^R_{t-1} It1R I t I_t It之间的相对物体姿态 Δ ξ t ∈ SE ( 3 ) \Delta \xi_t \in \text{SE}(3) ΔξtSE(3)。然后,当前图像中的物体的6D姿态 ξ t \xi_t ξt可以通过 ξ t = Δ ξ t ⊗ ξ t − 1 \xi_t = \Delta \xi_t \otimes \xi_{t-1} ξt=Δξtξt1得到,其中 ⊗ \otimes 表示矩阵乘法操作。跟踪过程持续进行,直到获得最后一张图像的6D姿态。

一般来说,在时间 t t t,使用渲染图像 I t − 1 R I^R_{t-1} It1R而不是图像观察 I t − 1 I_{t-1} It1作为上一帧的参考图像进行姿态跟踪是有帮助的。为了进一步阐明这一点,如果估计的物体姿态 ξ t − 1 \xi_{t-1} ξt1不准确,那么物体姿态 ξ t − 1 \xi_{t-1} ξt1与图像 I t − 1 I_{t-1} It1中的相应物体观察之间会有不匹配,因为姿态 ξ t − 1 \xi_{t-1} ξt1受到估计漂移的影响。相反,渲染图像 I t − 1 R I^R_{t-1} It1R是使用估计的物体姿态 ξ t − 1 \xi_{t-1} ξt1生成的全新图像,它不受上述观察问题的影响。因此,估计 I t − 1 R I^R_{t-1} It1R I t I_t It之间的相对姿态对姿态漂移不敏感,有助于减少全局物体姿态估计的漂移。

B. VIPose网络

所提出的网络架构如图4所示。该网络由一个视觉分支组成,输入处理后的图像对 I t − 1 R I^R_{t-1} It1R I t I_t It,一个惯性分支从IMU序列中提取特征,以及一个输出分支预测相对姿态 Δ ξ t \Delta \xi_t Δξt


在这里插入图片描述图4:VIPose网络架构。蓝色块代表基于FlowNetC的视觉分支,用于产生视觉特征。绿色块代表基于1D ResNet的惯性分支,用于产生惯性特征。视觉和惯性特征通过连接两个特征向量融合,为相对姿态估计提供多模态特征。橙色块代表输出分支,直接回归两个连续帧之间的相对姿态。


视觉分支(图4中的蓝色块),基于FlowNet-C网络[15]从输入图像对中提取视觉特征,并且我们只采用原始FlowNet-C网络的卷积层。该网络预训练以预测一对图像之间的光流。光流的表示被认为对相对姿态估计有用,这在[9]中得到了证明。前三个卷积层分别从两个输入图像中提取低级特征,并为负责计算块间相似性的相关层生成两个特征图,因此找到图像对之间的对应关系。然后,最后六个卷积层提取高级特征并减小特征图的大小。最后一个卷积层的特征图输出被平展为视觉特征向量,以便后续特征融合。

惯性分支(图4中的绿色块)采用标准ResNet-18网络[24]的1D版本,并以IMU序列为输入,即先前指定的来自IMU缓冲区的 K × 6 K \times 6 K×6张量。受[13]的启发,我们采用了一个预训练的1D ResNet,用于预测给定IMU输入序列的平均2D速度。与其他网络架构(包括LSTM [22]和时间卷积网络[25])相比,这种方法表现出更好的性能。惯性分支使用[13]中的预训练权重初始化。同样,最后一个1D卷积层的输出被平展为惯性特征向量。

视觉特征和惯性特征通过连接两个特征向量融合,提供了一个多模态特征用于回归相对变换。当目标物体的视觉信息有限,如在严重遮挡情况下,惯性特征提供了有关相机运动的有用信息,用于推断相对姿态。

输出分支(图4中的橙色块)是一个多层感知机,它以融合的特征向量为输入,并输出两帧之间的相对姿态。它包含两个具有256维的全连接层,后面跟着两个分别用于预测旋转和平移的单独全连接层。相对姿态的表示对网络的性能至关重要。我们采用[20]中的 s e ( 3 ) se(3) se(3)表示,其中 v = [ t , w ] T ∈ s e ( 3 ) \text{v} = [\text{t}, \text{w}]^\text{T} \in se(3) v=[t,w]Tse(3),使得其伪指数映射位于 S E ( 3 ) SE(3) SE(3)中,

Δ ξ = pseudo-exp ( v ) = [ R t 0 T 1 ] ∈ S E ( 3 ) , (1) \Delta \xi = \text{pseudo-exp}(v) = \begin{bmatrix} \text{R} & \text{t} \\ 0^\text{T} & 1 \end{bmatrix} \in SE(3), \tag{1} Δξ=pseudo-exp(v)=[R0Tt1]SE(3),(1)
其中
R = I 3 × 3 + [ w ] × ∣ w ∣ sin ⁡ ( ∣ w ∣ ) + [ w ] × 2 ∣ w ∣ 2 ( 1 − cos ⁡ ( ∣ w ∣ ) ) , \text{R} = \text{I}_{3 \times 3} + \frac{[\text{w}]_\times}{|\text{w}|} \sin(|\text{w}|) + \frac{[\text{w}]_\times^2}{|\text{w}|^2} (1 - \cos(|\text{w}|)), R=I3×3+w[w]×sin(w)+w2[w]×2(1cos(w)),

并且 [ w ] × [\text{w}]_\times [w]×是斜对称矩阵。最后两个输出层用于直接回归 w \text{w} w t \text{t} t,然后使用该预测来计算相对姿态 Δ ξ \Delta \xi Δξ。网络采用端到端训练,考虑以下 L 2 L_2 L2损失

L = λ 1 ⋅ ∣ ∣ w − w g t ∣ ∣ 2 + λ 2 ⋅ ∣ ∣ t − t g t ∣ ∣ 2 , (2) \mathcal{L} = \lambda_1 \cdot ||\text{w} - \text{w}_{gt}||_2 + \lambda_2 \cdot ||\text{t} - \text{t}_{gt}||_2, \tag{2} L=λ1∣∣wwgt2+λ2∣∣ttgt2,(2)

其中 λ 1 , λ 2 \lambda_1, \lambda_2 λ1,λ2是旋转和平移的损失权重, w g t , t g t w_{gt}, t_{gt} wgt,tgt表示真实的相对姿态。

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

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

相关文章

web——upload-labs——第三关——后缀黑名单绕过

上传一个正常的一句话木马,判断一下验证类型 响应后返回提示不允许上传.asp,.aspx,.php,.jsp后缀文件! 且查看网页源代码中并没有前端验证机制,所以可以判断这道题是后端验证 使用burp 提示无法上传.php结尾的文件,但我们的一句…

LeetCode题解:18.四数之和【Python题解超详细】,三数之和 vs. 四数之和

题目描述 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): …

如何利用SAP低代码平台快速构建企业级应用?

SAP作为全球领先的企业管理软件解决方案提供商,一直致力于为企业提供全面且高效的业务管理工具。随着技术的快速发展,传统的开发方式已经无法满足企业在快速变化的市场环境下的需求。低代码开发平台应运而生,它通过简化应用程序的创建过程&am…

Redis基础篇

文章目录 1.Redis的引入2.单机和分布式3.读写分离4.缓存服务器5.微服务 1.Redis的引入 我们的这个redis就是对于这个内存数据进行存储的,和我们的这个变量的这个性质是一样的,但是我们的这个redis主要是应用于这个分布式的这个系统上面的,如…

C++11(四)---可变参数模板

文章目录 可变参数模板 可变参数模板 参数包代表多个类型和参数 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Args> void ShowList(Args... arg…

基于Springboot+Vue的中国蛇类识别系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

大数据新视界 -- 大数据大厂之 Impala 性能飞跃:分区修剪优化的应用案例(下)(22 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

ES6标准-Promise对象

目录 Promise对象的含义 Promise对象的特点 Promise对象的缺点 Promise对象的基本用法 Promise对象的简单例子 Promise新建后就会立即执行 Promise对象回调函数的参数 Promise参数不会中断运行 Promise对象的then方法 Promise对象的catch()方法 Promise状态为resolv…

【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测

【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测 文章目录 【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测前言YOLOV5模型运行环境搭建YOLOV5模型运行数据集准备YOLOV5运行模型训练模型验证模型推理 总结 前言 Ultralytics YOLO 是一…

使用Axios函数库进行网络请求的使用指南

目录 前言1. 什么是Axios2. Axios的引入方式2.1 通过CDN直接引入2.2 在模块化项目中引入 3. 使用Axios发送请求3.1 GET请求3.2 POST请求 4. Axios请求方式别名5. 使用Axios创建实例5.1 创建Axios实例5.2 使用实例发送请求 6. 使用async/await简化异步请求6.1 获取所有文章数据6…

windows工具 -- 使用rustdesk和云服务器自建远程桌面服务, 手机, PC, Mac, Linux远程桌面 (简洁明了)

目的 向日葵最先放弃了, todesk某些功能需要收费, 不想用了想要 自己搭建远程桌面 自己使用希望可以电脑 控制手机分辨率高一些 原理理解 ubuntu云服务器配置 够买好自己的云服务器, 安装 Ubuntu操作系统 点击下载 hbbr 和 hbbs 两个 deb文件: https://github.com/rustdesk/…

MySQL-关联查询和子查询

目录 一、笛卡尔积 二、表连接 1、内部连接 1.1 等值连接 1.2 非等值连接 2、外部链接 2.1 左外连接-LEFT JOIN 2.2 右外连接-RIGHT JOIN 2.3 全关联-FULL JOIN/UNION 三、子查询 1、嵌套子查询 2、相关子查询 3、insert和select语句添加数据 4、update和select语…

AWTK-WIDGET-WEB-VIEW 实现笔记 (1) - 难点

webview 提供了一个跨平台的 webview 库&#xff0c;其接口简单&#xff0c;提供的例子也直观易懂。但是把它集成到 AWTK 里&#xff0c;还是遇到一些难题&#xff0c;这里记录一下&#xff0c;供有需要的朋友参考。 1. 作为 AWTK 控件 webview 提供的例子都是独立的程序&…

类与对象;

目录 一、认识类&#xff1b; 1、类的引入&#xff1b; 2、类的定义&#xff1b; 类的两种定义方式&#xff1a; 3、类的访问限定符及封装&#xff1b; 4、类的作用域&#xff1b; 5、类的实例化&#xff1b; 6、类对象模型&#xff1b; 计算类对象的大小&#xff1b; …

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan 背景 在使用Ant Design Vue 开发数据表格时&#xff0c;我们常常会遇到需要合并单元格的需求。 比如&#xff0c;某些字段的值可能会在多行中重复出现&#xff0c;而我们希望将这些重复的单元格合并为…

27.<Spring博客系统③(实现用户退出登录接口+发布博客+删除/编辑博客)>

PS&#xff1a;关于打印日志 1.建议在关键节点打印日志。 ①请求入口。 ②结果响应 2.在可能发生错误的节点打印日志 3.日志不是越多越好。因为打日志也会消耗性能。 日志也可以配置去除重复日志。 一、用户退出功能 判断用户退出。我们只需要在前端将token删掉就可以了。 由于…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值&#xff0c;常用来表示对象属性的唯一标识 复杂数据类型 object&#xff0c;数组&#xff0c;函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…

uniapp自动注册机制:easycom

传统 Vue 项目中&#xff0c;我们需要注册、导入组件之后才能使用组件。 uniapp 框架提供了一种组件自动注册机制&#xff0c;只要你在 components 文件夹下新建的组件满足 /components/组件名/组件名.vue 的命名规范&#xff0c;就能直接使用。 注意&#xff1a;组件的文件夹…

人工智能与SEO优化中的关键词策略解析

内容概要 在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;与搜索引擎优化&#xff08;SEO&#xff09;的结合正变得愈发重要。关键词策略是SEO优化的一项基础工作&#xff0c;它直接影响到网站的可见性和流量。通过运用智能算法&#xff0c;企业能…