当前位置: 首页 > news >正文

顶刊JFR|ROLO-SLAM:首个针对不平坦路面的车载Lidar SLAM系统

摘要
基于激光雷达(LiDAR)的同步定位与地图构建(SLAM)被认为是在恶劣环境中提供定位指导的一种有效方法。然而,现成的基于激光雷达的SLAM方法在经过不平坦地形时,尤其是在垂直方向相关的部分,会出现显著的姿态估计漂移。这种缺陷通常会导致全局地图明显扭曲。在本文中,提出了一种基于激光雷达的SLAM方法,以提高地面车辆在恶劣地形中的姿态估计精度,该方法被称为旋转优化激光雷达仅(ROLO)SLAM。该方法利用前向位置预测粗略地消除连续扫描之间的位置差异,从而能够在前端分别且准确地确定位置和方向。此外,本文采用了一种并行化的空间体素化方法进行对应匹配。本文开发了一种球面对齐引导的旋转配准方法,在每个体素内估计车辆的旋转。通过结合几何对齐,本文将运动约束引入优化公式中,以增强激光雷达平移的快速有效估计。随后提取几个关键帧来构建子地图,并利用当前扫描与子地图之间的对齐进行精确的姿态估计。同时,建立了一个全局规模的因子图,以帮助减少累积误差。在各种场景中,进行了多种实验来评估本文的方法。结果表明,ROLO-SLAM在地面车辆的姿态估计方面表现出色,并且优于现有的最先进的激光雷达SLAM框架。

©️【深蓝AI】编译

论⽂题目:ROLO-SLAM: Rotation-Optimized LiDAR-Only SLAM in Uneven Terrain with Ground Vehicle

论文作者:Yinchuan Wang, Bin Ren, Xiang Zhang, Pengyu Wang, Chaoqun Wang, Rui Song, Yibin Li, Max Q.-H. Meng

论文地址:https://arxiv.org/abs/2501.02166

官方网站:https://github.com/sdwyc/rolo

介绍

在自动驾驶中,精确定位是安全高效导航的基础,尤其在不平坦地形上,车辆运动受波动影响,增加了定位难度。基于激光雷达的SLAM技术通过点云配准提供环境地图和自我定位,适用于复杂环境。该方法分为前端里程计和后端地图优化,前者提供初始姿态估计,后者细化姿态并重建环境。然而,在不平坦地形中,激光雷达SLAM易出现定位漂移,导致地图扭曲。

为解决此问题,本文提出ROLO-SLAM框架,旨在减少垂直方向的姿态漂移,提高不平坦地形中的姿态估计精度。总的来说,本文的主要贡献在于以下几个方面:

  • 本文利用前向位置预测实现了旋转估计和平移估计之间的软解耦,这允许本文独立估计旋转和平移。

  • 在前端,本文提出了一个双阶段范式,用于使用球面对齐和连续时间优化进行旋转和平移估计。它旨在为后端优化提供精确的初始姿态。

  • 通过整合扫描到子地图对齐和全局因子图优化,建立了一个紧凑的激光雷达SLAM框架,这有助于在不平坦地形中定位地面车辆。

实验结果表明,ROLO-SLAM在不平坦地形中表现出色,优于现有方法。图1展示了示例结果和真实场景快照,源代码和视频演示也已提供。

▲图1|上图显示了一辆真实车辆在越野场景中的移动。下图显示了由ROLO-SLAM输出的点云地图和轨迹。©️【深蓝AI】编译

本文方法

▲图2| 本文的ROLO-SLAM系统的流程管道包含了前端激光雷达里程计模块和后端建图模块。©️【深蓝AI】编译

前向位置预测

在前端,本文将连续扫描的旋转和平移估计解耦。这是通过前向位置预测消除平移差异来实现的。图4显示了车辆在xoz平面上同一扫描间隔期间的快照。给定第k次激光雷达扫描和相应的机器人速度\mathbf{v}_k,前一次扫描对应的机器人速度表示为\mathbf{v}_{k-1}。由于时间间隔足够小,可以预期在两次连续扫描之间,使用现成的速度控制技术,即\mathbf{v}_k \sim \mathbf{v}_{k-1},会有一致的线速度。两次扫描之间的平移距离可以认为是相同的,即\delta \mathbf{d}_{k-1} \sim \delta \mathbf{d}_k。将车辆在经过k次激光雷达扫描后的位置表示为\mathbf{P}_{0:k}。 本文可以通过以下方式估计车辆位置

\mathbf{t}_{k+1} = \mathbf{t}_k + \frac{\tau_{k+1} - \tau_k}{\tau_k - \tau_{k-1}} (\mathbf{t}_k - \mathbf{t}_{k-1}),

其中τi表示第i次扫描的时间戳。当扫描\mathcal{P}_{k+1}到达时,使用方程预先估计车辆在时间\tau_{k+1}的位置,以形成粗略约束。对于车辆的旋转,车辆的俯仰角\theta_i受到地面的约束,这比平移更容易受到地面起伏的影响。在实际应用中,地面的起伏通常是未知和非线性的;因此,在车辆移动过程中面对不平坦地形时,俯仰角变化很难保持相同的值。同样的事情也适用于横滚角的分析。因此,本文不以平移估计的方式来估计旋转。

传统配准方法常常将旋转和平移估计交织在一起,从而模糊了各自相关的独特挑战,可能导致车辆姿态和位置的潜在不准确性。通过引入前向位置预测,本文建立了连续激光雷达扫描之间的粗略平移估计。这在前端解耦了平移和旋转估计,建立了扫描位置的一致基线,并有望提高车辆旋转估计的准确性。

体素化匹配和旋转配准

准确识别扫描间的点对点对应关系是具有挑战性的。为了解决这个问题,本文首先提出使用高斯体素图。高斯体素图是在P_t的坐标系中按照算法1中描述的方式构建的。

基于体素化,本文避免了直接考虑点对点对应关系。相反,本文寻找由源点p_s^i \in P_s和目标体素m_k \in \mathcal{V}组成的对\langle p_s^i, m_k \rangle。基于前向位置预测,本文获得了平移信息。

然后,本文将两个连续扫描的传感器中心对齐到同一原点并开始匹配,这在算法2中描述。本文首先按照算法1为P_t建立体素图V。然后,按照算法2的第4行计算每个源点p_s^i \in P_s对应于V的索引。如算法2的第5-7行所示。请注意,V中包含的点不足的体素不符合与任何源点匹配的条件。N^+是预设的最少点数阈值。这确保了只有能够充分表示局部几何的体素才被考虑用于建立对应关系。

▲图3| 旋转对齐模型。绿色点是点集Ps中的源点,而蓝色椭球表示mk中的高斯分布。紫色箭头代表可能的旋转方向。©️【深蓝AI】编译

现在获得了源点C和目标体素之间的对应关系。然后,通过尝试将P_s中的点与存储在体素中的相关高斯分布的均值位置\bar{p}_k对齐,获得P_sP_t之间的旋转。旋转对齐模型由图5演示。通过前向位置预测,两个连续扫描的传感器中心被定位在同一个原点。旋转点云可以被概念化为每个点沿着球形表面滑动,激光雷达位于中心,点到点的距离作为半径。各种源点p_s^i \in P_s沿着球面滑动以对齐存储在体素m_k中的高斯分布的均值位置\bar{p}_k这个对齐过程估计了旋转。为此,整个旋转对齐表示为

\mathbf{R} = \arg\min_{\mathbf{R}} \sum \angle(\bar{\mathbf{p}}_k, \mathbf{R} \mathbf{p}_s^i),

▲图4| 旋转对齐的示例。蓝色平面表示均值位置的高斯分布的投影。©️【深蓝AI】编译

为了概念性地说明这种转换,图4展示了将源点p_s^i与相关高斯分布的均值p_k对齐的一个示例。这里,\mathbf{Rp}_s^i表示\mathbf{R}通过旋转的源点,而\bar{\mathbf{p}}_k'表示\bar{\mathbf{p}}_k在与\mathbf{Rp}_s^i相交的球面切平面上的投影:

\sphericalangle(\bar{\mathbf{p}}_k, \mathbf{Rp}_s^i) = \arcsin \frac{\|d_i\|}{\|\bar{\mathbf{p}}_k'\|},

\sphericalangle(\bar{\mathbf{p}}_k, \mathbf{Rp}_s^i) \propto \|d_i\|, \quad \text{s.t.,} \quad \sphericalangle(\bar{\mathbf{p}}_k', \mathbf{Rp}_s^i) \leq \frac{\pi}{2},

本文构建这个高斯噪声的协方差矩阵为

\mathbf{\Omega}_R' = \mathbf{\Omega}_k + \mathbf{R}^\top \mathbf{\Omega}_s^i \mathbf{R},

其中\mathbf{\Omega}_k\mathbf{\Omega}_s^i分别是\bar{\mathbf{p}}_kp_s^i的噪声协方差矩阵。然后本文对\mathbf{\Omega}_R'执行奇异值分解(SVD),协方差被重构为

\mathbf{\Omega}_R = \mathbf{U} \begin{bmatrix} \lambda_{\max} & \\ & \lambda_{\max} \\ & & \ddots \end{bmatrix} \mathbf{V}^\top.

\lambda_{\max}是特征值的最大值,鉴\|d_i\|量化了\mathbf{Rp}_s^i\bar{\mathbf{p}}_k'在球面上的径向距离,本文的主要关注点是径向距离的差异。相反\bar{\mathbf{p}}_k'\bar{\mathbf{p}}_k之间的轴向距离对于旋转配准不太相关。因此,SVD被用来正则化协方差,消除轴向距离的影响。这种正则化可以被解释为高斯过程的降维,其中数据从一个3D椭球流形映射到一个2D椭圆流形,如图5所示。

▲图5| 旋转对齐的示例。蓝色平面表示均值位置的高斯分布的投影。©️【深蓝AI】编译

因此,旋转\mathbf{R}可以通过以下方式计算:

\mathbf{R} = \arg\min_{\mathbf{R}} \sum \|d_i\|_{\mathbf{\Omega}_R^{-1}},

该方程可以通过包括高斯-牛顿(GN)和Levenberg-Marquardt(LM)在内的优化算法迭代求解。

基于连续时间的平移优化

到目前为止,本文已经获得了旋转矩阵\mathbf{R}和一个粗略的平移估计\mathbf{t}。为了进一步优化平移,本文设计了一个目标函数,该函数结合了基于连续时间的平移约束。这个约束是从车辆在两个连续激光雷达扫描之间连续均匀运动模型中得出的:

\bar{\mathbf{T}}_{\text{opt}} = \underset{\bar{\mathbf{T}}}{\arg\min} \sum \left( F_{\text{ICP}}[\bar{\mathbf{T}}] + \lambda F_{\text{CT}}[\bar{\mathbf{T}}] \right),

其中目标函数包含两个部分:F_{\text{ICP}}[\cdot],它基于点到分布的距离解决几何对齐问题。F_{\text{CT}}[\cdot]表示基于连续时间的平移约束。给定一个对应关系\langle \mathbf{p}_s, \mathbf{m}_k \rangle \in \mathcal{C}

F_{\text{ICP}}[\bar{\mathbf{T}}] = \left\| N_j \cdot (\bar{\mathbf{p}}_k - \bar{\mathbf{T}} \mathbf{p}_s) \right\|_{\mathbf{\Omega}_{\text{ICP}}^{-1}},

\mathbf{\Omega}_{\text{ICP}} = \bar{\mathbf{\Omega}}_k + \bar{\mathbf{T}}^\top \mathbf{\Omega}_s \bar{\mathbf{T}},

F_{\text{CT}}[\bar{\mathbf{T}}] = \left\| \mathbf{t}^n - \mathbf{t}^{n-1} \right\|_{\mathbf{\Omega}_{\text{CT}}^{-1}},

\mathbf{t}^n = (\bar{\mathbf{T}} \mathbf{p}_i - \check{\mathbf{T}} [\bar{\mathbf{T}}_{\text{flp}}]^{-1} \mathbf{p}_i),

\mathbf{\Omega}_{\text{CT}} = \mathbf{t}^n \otimes \mathbf{t}^n.

F_{\text{ICP}}(\cdot)用于实现传感器数据的几何对齐,而F_{\text{CT}}(\cdot)确保车辆尽可能保持连续和均匀的运动。最终的平移变换\bar{\mathbf{T}}\bar{\mathbf{T}}_{\text{flp}}\bar{\mathbf{T}}_{\text{opt}}的组合,计算如下:

\bar{\mathbf{T}} = \bar{\mathbf{T}}_{\text{opt}} \cdot \bar{\mathbf{T}}_{\text{flp}}.

后端建图与回环闭合

后端优化前端的变换输出,促进生成高质量的全局位姿和环境地图。后端包括两个主要模块:局部扫描到子地图对齐和全局位姿优化。在局部层面,扫描到子地图对齐采用精确配准方法将最新扫描与累积的局部子地图对齐,从而实现更精确的激光雷达里程计。在全球层面,因子图从累积的关键帧中递增构建,调整每个历史关键帧的位姿以最小化整体历史误差。

扫描到子地图的优化。首先,扫描到子地图对齐用于进一步优化地面车辆的位姿估计。全局点云地图由历史关键帧构建,每个关键帧由边缘特征F_e和平面特征F_e组成,表示为为了减少内存开销,关键帧以预定义的时间间隔定期选择。在滑动时间窗口内选择预定义数量的关键帧来构建子地图表示为:

\mathcal{M} = \{\mathcal{M}_e, \mathcal{M}_p\},

\mathcal{M}_e = \{F_e^i, F_e^{i-1}, F_e^{i-2}, \ldots, F_e^{i-k+1}\},

\mathcal{M}_p = \{F_p^i, F_p^{i-1}, F_p^{i-2}, \ldots, F_p^{i-k+1}\},

扫描到子地图对齐被转化为一个优化问题,可以表示为

\mathbf{T}_b = \arg\min_{\mathbf{T}_b} \sum_j \left( F_e[\mathbf{T}_b \mathbf{p}_e] + F_p[\mathbf{T}_b \mathbf{p}_p] \right).

全局优化和回环闭合。ROLO-SLAM利用因子图(FG)模型来解决MAP问题。整个FG由具有不同因子的节点和边组成。每个节点存储那一刻的状态,本文将状态定义为世界坐标系中车辆的姿态,即\mathbf{X}_i = [\mathbf{R}_i \mid \mathbf{t}_i]此外,本文定义了两个因子:里程计因子和回环闭合因子。因子图的整体结构如图8所示。里程计因子约束相邻状态之间的变换,类似于马尔可夫链。相邻节点的变换由扫描到子地图对齐给出。这个因子通过扫描到子地图对齐估计的状态拒绝异常值,并平滑运动轨迹。回环闭合因子用于解决长期和大规模场景中累积的误差。为了构建这个因子,本文建立了一个以当前状态\mathbf{X}_c为中心的稳定搜索窗口。在窗口中有状态和关键帧,表示为\mathcal{B} = \{\mathbf{F}_0, \mathbf{F}_1, \ldots, \mathbf{F}_i, \ldots\}。在车辆移动过程中,一个检查线程不断执行以评估每个\mathbf{F}_i \in \mathcal{B}和当前关键帧之间的相似性。在识别出显著的相似性后,采用特征配准来确定变换\widehat{\mathbf{T}}_{\mathbf{F}_c, \mathbf{F}_i}然后,建立回环闭合元组\mathcal{L}_{c,i}

\mathcal{L}_{c,i} = \langle \mathbf{X}_c, \mathbf{X}_i, \widehat{\mathbf{T}}_{\mathbf{F}_c, \mathbf{F}_i} \rangle.

这些回环闭合元组被转化为FG中的回环闭合因子,在不同时间实例引入的节点之间建立约束。通过使用FG进行全局姿态优化,细化车辆的姿态,使所有节点能够自适应调整以最小化全局差异,有效消除累积误差。

实验评估

平台和实验设置

为了评估ROLO-SLAM,本文进行了实验,关注姿态估计精度、鲁棒性、计算效率和建图。使用了公共和自建数据集。

KITTI里程计数据集用于评估水平定位精度,包含城市、乡村和高速公路场景的多模态数据。

真实越野场景数据集收集于校园周围山地,包含多种地形,适合评估6D姿态估计。

山东大学校园场景数据集涵盖变化地形,用于评估整体性能。这个数据集被用来评估所开发方法的整体性能。为了在户外环境中收集信息,这些车辆配备了相同的感知平台。感知平台有多个传感器,包括一个VLP-32C Puck 3D激光雷达、一个ZED2i立体相机、一个GW-GNS100 GNSS系统和一个Mti-300 9轴IMU。

ROLO-SLAM与LOAM、LeGO-LOAM、CT-ICP和HDL-SLAM等方法比较,展示其性能。实验在ROS Noetic和Ubuntu 20.04上进行,所有算法在联想Y9000P笔记本上执行。

定位精度评估

本文通过与不同方法的比较来评估ROLO-SLAM的定位精度。在KITTI里程计数据集(序列00、05和08)中,ROLO的轨迹紧密贴合地面实况(GT),尤其在图6(c)中几乎完全重叠。LOAM和CT-ICP也表现出高相似度,但在特征稀疏或表面几何急剧变化的情况下,其他方法如LeGO-LOAM和HDL-SLAM则显示出明显的轨迹误差。相比之下,ROLO与GT的对齐度最高,尤其是在水平方向上表现出色。

▲图6| ROLO和其他里程计框架对KITTI里程计数据集序列00、05和08的轨迹估计。©️【深蓝AI】编译

▲图7| 旋转对齐的示例。蓝色平面表示均值位置的高斯分布的投影。©️【深蓝AI】编译

为了评估垂直方向上的定位效果,本文在Offroad1、Offroad2和Offroad3数据集上进行了测试。结果显示,ROLO的3D轨迹与GT高度相似,特别是在图7(b)中。此外,ROLO的高程曲线与GT紧密吻合。这些结果表明,ROLO在越野场景中保持了高稳定性和瞬时精度,得益于前端独立估计旋转和平移的能力。

▲图8| 本文的方法和替代方法对山东大学校园数据集(千佛山校区、兴隆山校区)的轨迹估计。©️【深蓝AI】编译

进一步使用SDU校园数据集验证姿态估计性能,结果如图8所示。ROLO的轨迹和高程曲线基本与GT重叠,证明了其在6自由度姿态估计中的优势。表1显示,ROLO在SDU和越野数据集中具有最低的RMSE,而在KITTI数据集中,LOAM和LeGO-LOAM由于丰富的环境特征也表现良好。

▲表1| 各种方法与真值的RMSE。©️【深蓝AI】编译

为了展示前端配准方法的优势,本文将ROLO与传统点云配准方法(如ICP、NDT和PTP ICP)进行了比较。定量结果表明,ROLO在SDU和越野数据集中具有极小的RMSE,尽管在某些数据集中未能取得最佳表现。

鲁棒性评估

定位鲁棒性反映了复杂场景中维持自定位稳定性的能力。本文利用两个帧间变换的绝对误差E_RE_T来测量定位鲁棒性。为了与其它方法比较鲁棒性,本文在SDU校园数据集中收集E_RE_T的值。表2显示,ROLO的标准差最小,保证了连续扫描的估计稳定性,且均值最小,证明了其在执行过程中的精确性。相比之下,LOAM和HDL-SLAM的均值和标准差较高,在鲁棒性方面表现不佳。

▲表2| 针对山东大学校园数据集的帧间绝对误差(平均值/标准差)。©️【深蓝AI】编译

计算效率评估

图9显示了所有数据集中每次扫描的平均处理时间,每列分别堆叠了前端和后端的处理时间。误差条代表总处理时间的变化范围。结果表明,尽管ROLO的前端被划分为三个连续模块,但它仍保持快速处理速度。总处理时间约为每次扫描100毫秒,满足机器人应用的实时要求。LeGO-LOAM的前端处理时间最短,但在定位精度方面表现不佳。此外,CT-ICP和HDL-SLAM的误差条较长,这意味着它们的处理效率不可靠。ROLO比CT-ICP和HDL-SLAM快至少10%,这证明了所开发方法的效率。

▲图9|各方法每次扫描的总处理时间。请注意,CT-ICP只有前端的处理时间。©️【深蓝AI】编译

建图结果

为了展示在不平坦地形场景中建图的性能,本文使用千佛山数据集比较了HDL-SLAM、LeGO-LOAM和ROLO的建图性能。结果如图10(b)-(d)所示。在全球尺度上,本文方法生成的点云地图与卫星地图中的场景轮廓高度一致。相比之下,图10(b)-(c)顶部的HDL-SLAM和LeGO-LOAM的结果出现了明显的形态失真,尤其是在建筑物的轮廓上。在图10(d)的侧视图中,ROLO展示了一个相对平坦的建图平面,考虑到本文校园的平坦地面。然而,其他方法的侧视图显示了显著的倾斜,HDL-LOAM甚至在图10(b)中显示了重叠。这些现象反映了SLAM任务中显著的垂直漂移。相比之下,ROLO在减轻垂直漂移问题方面表现更好。

▲图10|HDL-LOAM、LeGO-LOAM和ROLO在千佛山数据集中的建图结果。在(b)-(d)中,上方的图显示了整体地图,而下方的图是从侧视角度捕捉的。©️【深蓝AI】编译

结论和未来工作

本文提出了ROLO-SLAM,以在不平坦地形中获得精确的姿态估计和环境地图。为了减轻地面车辆行驶过程中的垂直漂移,本文基于前向位置预测的粗略平移,独立估计旋转和平移。在后端,本文利用扫描到子地图和因子图来提高最终姿态估计的准确性。实验结果表明,本文的方法与最先进的方法相比表现更为出色。此外,还在不同场景中进行了建图评估,以验证ROLO-SLAM的建图质量。建图结果显示,本文的方法能够在城市和越野场景中生成高度精确的点云地图。与最先进的方法相比,本文方法输出的点云地图与真实场景的相似度最高。这也反映了本文的方法能够输出精确的姿态估计。

在未来的工作中,本文将研究在没有中心对齐条件的情况下旋转和平移的解耦,这减少了对前向位置预测的依赖。此外,本文将专注于由动态和瞬时地面波动引起的姿势变化。可能会将有限观测中提取的未来姿态预测等先验信息融合到框架中,以提高姿态估计的准确性。

相关文章:

顶刊JFR|ROLO-SLAM:首个针对不平坦路面的车载Lidar SLAM系统

摘要 基于激光雷达(LiDAR)的同步定位与地图构建(SLAM)被认为是在恶劣环境中提供定位指导的一种有效方法。然而,现成的基于激光雷达的SLAM方法在经过不平坦地形时,尤其是在垂直方向相关的部分,会…...

第05章 09 使用Lookup绘制地形数据高程着色图

在VTK(Visualization Toolkit)中,可以使用颜色查找表(Lookup Table,简称LUT)来根据高程数据对地形进行着色。以下是一个示例代码,展示了如何使用VTK和C来读取地形数据,并使用颜色查找…...

【深度学习入门_机器学习理论】K近邻法(KNN)

本部分主要为机器学习理论入门_K近邻法(KNN),书籍参考 “ 统计学习方法(第二版)”。 学习目标: 了解k近邻算法的基本概念、原理、应用;熟悉k近邻算法重要影响要素;熟悉kd树原理与优化应用。 开始本算法之…...

基于Django的Boss直聘IT岗位可视化分析系统的设计与实现

【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言,利用Django这一高效、安全的W…...

编程语言中的常见Bug及解决方案

在编程过程中,不同语言有其独特的特性和挑战,这也导致了各种常见Bug的出现。本文将总结几种主流编程语言中的常见Bug,包括JavaScript、Python、C/C、Java和Go,并提供相应的解决方案和案例。 一、JavaScript中小数相加精度不准确的…...

DeepSeek API 的获取与对话示例

代码文件下载:Code 在线链接:Kaggle | Colab 文章目录 注册并获取API环境依赖设置 API单轮对话多轮对话流式输出更换模型 注册并获取API 访问 https://platform.deepseek.com/sign_in 进行注册并登录: 新用户注册后将赠送 10 块钱余额&#…...

数据库SQLite和SCADA DIAView应用教程

课程简介 此系列课程大纲主要包含七个课时。主要使用到的开发工具有:SQLite studio 和 SCADA DIAView。详细的可成内容大概如下: 1、SQLite 可视化管理工具SQLite Studio :打开数据库和查询数据;查看视频 2、创建6个变量&#x…...

Elasticsearch+kibana安装(简单易上手)

下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口(可以不修改) 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…...

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑:**在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问; **什么叫灰度:**发布后让部分用户使用新版本,其它用户使用旧版本&am…...

Android源码阅读笔记(二)—— 启动模式

Android源码阅读笔记(二)—— 启动模式初章 1、为什么学习启动模式 Activity的启动模式其实是一个在面试中经常会被关注的问题,那么它的重要性体现在哪里? A:在多数的开发场景中,我们似乎也没有怎么关注过…...

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…...

PCL ——LevenbergMarquardt非线性最小二乘法拟合圆柱(C++详细过程版)

目录 一、算法概述1、圆柱方程2、LM算法流程二、代码实现三、结果展示一、算法概述 目前求解非线性最小二乘问题常用算法有高斯-牛顿方法(Gauss-Newton algorithm,GN 算法)、列文伯格-马夸尔特方法(Levenberg-Marquardt algorithm,LM 算法)。本文采用 LM 算法进行圆柱拟合。 …...

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器,因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数,不管是STM32的芯片还是GD32,AT32的芯片,delay函数都可以这么写,只要它是cortex-M…...

DeepSeek R1:推理模型新纪元与价格战

标题:DeepSeek R1:推理模型新纪元与价格战 文章信息摘要: DeepSeek R1的发布标志着推理模型研究的重要转折点,其采用四阶段强化学习训练方法,结合监督微调和拒绝采样,显著提升了模型的推理能力。这一进展不…...

一文简单回顾Java中的String、StringBuilder、StringBuffer

简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的,它们之间的区别是String是不可变的,平常开发用的最多,当遇到大量字符串连接的时候,就用StringBuilder&am…...

机器学习:支持向量机

支持向量机(Support Vector Machine)是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的广义线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…...

简单的停车场管理系统的C语言实现示例

以下是一个简单的停车场管理系统的C语言实现示例。该示例使用结构体来管理停车场的车位信息&#xff0c;并提供基本车辆进入、离开以及显示停车场状态功能。 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_SLOTS 10 // 最大车位数…...

网络工程师 (3)指令系统基础

一、寻址方式 &#xff08;一&#xff09;指令寻址 顺序寻址&#xff1a;通过程序计数器&#xff08;PC&#xff09;加1&#xff0c;自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址&#xff1a;通过转移类指令直接或间接给出下一条指令的地址。跳…...

基于Python的智慧物业管理系统

【Python】基于Python的智慧物业管理系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目背景二、研究目的三、项目意义四、项目功能五、项目创新点六、开发技术介绍七、项目界面展示&#xff08;部分展示&#xff0c;详细看视频&#xff09;八、项…...

使用 Vue 3 的 watchEffect 和 watch 进行响应式监视

Vue 3 的 Composition API 引入了 <script setup> 语法&#xff0c;这是一种更简洁、更直观的方式来编写组件逻辑。结合 watchEffect 和 watch&#xff0c;我们可以轻松地监视响应式数据的变化。本文将介绍如何使用 <script setup> 语法结合 watchEffect 和 watch&…...

环境变量

目录 一.概念介绍 1.1命令行参数 二.一个例子&#xff0c;一个环境变量 2.1查看环境变量 2.2如何理解环境变量呢&#xff1f;存储的角度 2.3环境变量最开始从哪里来的呢&#xff1f; 概括&#xff1a; 1. 环境变量的存储 2. 命令查找过程 3. 环境变量表和命令行参数…...

Scale AI 创始人兼 CEO采访

Scale AI 创始人兼 CEO 亚历山大王&#xff08;Alexander Wang&#xff09;首次亮相节目接受采访。他的公司专注于为人工智能工具提供准确标注的数据。早在 2022 年&#xff0c;王成为世界上最年轻的白手起家亿万富翁。 美国在全球人工智能竞赛中的地位&#xff0c;以及它与中…...

MongoDB中常用的几种高可用技术方案及优缺点

MongoDB 的高可用性方案主要依赖于其内置的 副本集 (Replica Set) 和 Sharding 机制。下面是一些常见的高可用性技术方案&#xff1a; 1. 副本集 (Replica Set) 副本集是 MongoDB 提供的主要高可用性解决方案&#xff0c;确保数据在多个节点之间的冗余存储和自动故障恢复。副…...

【Erdas实验教程】001:Erdas2022下载及安装教程

文章目录 一、Erdas2022安装教程1. 安装主程序2. 拷贝补丁3. 安装LicenseServer4. 运行软件 二、Erdas2022下载地址 一、Erdas2022安装教程 Erdas2022全新界面如下&#xff1a; 1. 安装主程序 下载安装包并解压&#xff0c;以管理员身份运行 “setup.exe” 或 “setup.vbs”&…...

Python3 【函数】水平考试:精选试题和答案

Python3 【函数】水平考试&#xff1a;精选试题和答案 Python 函数考试试卷及答案。共计30题&#xff0c;其中选择题15题、填空题10题、编程题5题&#xff0c;试卷满分为100分。 一、选择题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 以下哪个关键字用于定义函数…...

stm8s单片机(三)时钟系统与时钟切换

一个单片机系统要正常运行应包括四个部分: 电源&#xff0c;晶振&#xff0c;复位电路&#xff0c;下载电路。 晶振就是时钟。 stm8有四种时钟源 HSE (High Speed External clock signal)HSE user-ext (High Speed External clock signal user external)HSI (High Speed Inter…...

ChatGPT高效处理图片技巧使用详解

ChatGPT&#xff0c;作为OpenAI开发的预训练语言模型&#xff0c;主要用于生成自然语言文本的任务。然而&#xff0c;通过一些技巧和策略&#xff0c;我们可以将ChatGPT与图像处理模型结合&#xff0c;实现一定程度上的图像优化和处理。本文将详细介绍如何使用ChatGPT高效处理图…...

图漾Halcon版本SDK使用教程【V1.1.0新版本】

文章目录 1.下载并安装 Halcon1.1 下载Halcon软件1.2 安装Halcon 2.下载Camport_Halcon_gentl SDK2.1 下载Camport_Halcon_gentl SDK2.2 Camport Halcon SDK介绍2.3 Halcon SDK环境配置与运行2.3.1 SDK环境配置2.3.2 获取相机支持的参数2.3.3 配置相机参数并运行相机 2.4 遍历H…...

C语言二级

//请编写函数fun()&#xff0c;该函数的功能是&#xff1a;计算并输出给定整数n的所有因 //子&#xff08;不包括1和自身&#xff09;之和。规定n的值不大于1000。例如&#xff0c;在主函数 //中从键盘给n输入的值为856&#xff0c;则输出为&#xff1a;sum 763。 //注意&…...

软工_软件工程

2025.01.24&#xff1a;软件工程导论学习笔记 第2节 软件工程 2.1 软件发展 - 四个阶段2.1.1 程序设计2.1.2 程序系统2.1.3 软件工程2.1.4 第四阶段 2.2 软件危机2.2.1 软件危机 - 定义2.2.2 软件危机 - 主要表现 2.1 软件发展 - 四个阶段 2.1.1 程序设计 软件生产个体化&…...

【creo】CREO配置快捷键方式和默认单位

了解CREO工作目录设置 设置快捷方式启动目录&#xff0c;就能自动加载其中的配置。 一、通过键盘快捷方式 保存配置 creo_parametric_customization.ui 文件&#xff1a; 二、通过映射键录制 通过这种方式可以监听鼠标的点击事件。使用键盘快捷方式无法找到需要的动作时候可…...

go理论知识——Go Channel 笔记 [特殊字符]

go理论知识——Go Channel 笔记 &#x1f4dd; 1. 基本概念 &#x1f9e0; 1.1 Channel 是什么&#xff1f; Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。Channel 是类型安全的&#xff0c;意味着你只能发送和接收特定类型的数据。 1.2 Channel 的创建 …...

微信小程序压缩图片

由于wx.compressImage(Object object) iOS 仅支持压缩 JPG 格式图片。所以我们需要做一下特殊的处理&#xff1a; 1.获取文件&#xff0c;判断文件是否大于设定的大小 2.如果大于则使用canvas进行绘制&#xff0c;并生成新的图片路径 3.上传图片 async chooseImage() {let …...

第05章 11 动量剖面可视化代码一则

在计算流体力学&#xff08;CFD&#xff09;中&#xff0c;动量剖面&#xff08;Momentum Profiles&#xff09;通常用于描述流体在流动方向上的动量分布。在 VTK 中&#xff0c;可以通过读取速度场数据&#xff0c;并计算和展示动量剖面来可视化呈现速度场信息。 示例代码 以…...

Android Studio 新版本24.2.2 运行后自动切到 LogCat

最近更新了 Android studio 版本&#xff0c;发现有个问题&#xff1a; 每次 Run app 之后。都会自动切换到 run 标签。这让我非常不习惯。我个人习惯在app 运行后查看Logcat 最后靠 deepSeek 找到一种解决方案&#xff1a; Android Studio 中截图如下&#xff1a;...

使用EVE-NG-锐捷实现OSPF

一、OSPF基础知识 Open shortest Path First(OSPF)开放式最短路径优先协议 1.OSPF的关系状态 (1)邻居关系(TWO-WAY) 只发送hello包不发送LSA包(链路状态通告包) (2)邻接关系(FULL) OSPF设备与设备之间相互建立OSPF关系&#xff0c;初始为邻居关系(TWO-WAY)状态&#xff0…...

解决使用Selenium时ChromeDriver版本不匹配问题

在学习Python爬虫过程中如果使用Selenium的时候遇到报错如下session not created: This version of ChromeDriver only supports Chrome version 99… 这说明当前你的chrome驱动版本和浏览器版本不匹配。 例如 SessionNotCreatedException: Message: session not created: This…...

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…...

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…...

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>解数独

题目&#xff1a; 解析&#xff1a; 部分决策树&#xff1a; 代码设计&剪枝&回溯&#xff1a; 代码&#xff1a; class Solution {private boolean[][] row, col;private boolean[][][] gird; public void solveSudoku(char[][] board) {//下标->数字&#xff…...

C#@符号在string.Format方法中作用

本文详解@符号在string.Format方法中作用。...

mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。

在第一章中安装 &#xff0c;启动mysql80 服务后&#xff0c;连接上了mysql&#xff0c;那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前&#xff0c;要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…...

JVM栈溢出线上环境排查

#查看当前Linux系统进程ID、线程ID、CPU占用率&#xff08;-eo后面跟想要展示的列&#xff09; ps H -eo pid,tid,%cpups H -eo pid,tid,%cpu |grep tid #使用java jstack 查看进程id下所有线程id的情况 jstack pid 案例2 通过jstack 排查死锁问题 #启动java代码 jstack 进…...

【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件

一、概述 本示例实现了一个基于 Vue3 和 TypeScript 的断点上传功能。该功能支持文件分块上传&#xff0c;能够在上传过程中暂停、继续上传&#xff0c;并且支持检测已经上传的分块&#xff0c;避免重复上传&#xff0c;提升上传效率。以下是关键的技术点与实现流程&#xff1…...

Kafka运维宝典 (三)- Kafka 最大连接数超出限制问题、连接超时问题、消费者消费时间超过限制问题详细介绍

Kafka运维宝典 &#xff08;三&#xff09; 文章目录 Kafka运维宝典 &#xff08;三&#xff09;一、Kafka Broker 配置中的最大连接数超出限制问题1. 错误原因2. 相关 Kafka 配置参数2.1 connections.max2.2 max.connections.per.ip2.3 num.network.threads2.4 connections.ma…...

【135. 分发糖果 困难】

题目&#xff1a; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计…...

AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs

论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…...

算法题(49):反转链表II

审题&#xff1a; 需要我们对指定范围的链表进行反转&#xff0c;并返回反转后链表的头结点 思路&#xff1a; 方法一&#xff1a;vector法 我们先遍历一次链表&#xff0c;并把数据对应的存在数组中&#xff0c;然后利用数组的reverse方法进行反转数据&#xff0c;最后再遍历一…...

代码随想录day20

235. 利用二叉搜索树的特性即可 /** lc appleetcode.cn id235 langcpp** [235] 二叉搜索树的最近公共祖先*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) :…...

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及&#xff0c;用户迫切需要将纸质文档快速、准确地转换成电子格式&#xff0c;以提高工作效率和信息管理的便捷性。同时&#xff0c;用户将文档扫描成电子版后&#xff0c;可以自行通过加密和访问控制提高电子文档的安全性&#xff0c;以满…...