LIO-SAM 论文阅读

论文链接

LIO-SAM


0. Abstract

  • 提出了一种通过平滑和映射进行紧耦合激光雷达惯性里程计的框架 LIO-SAM,它实现了高精度、实时的移动机器人轨迹估计和地图构建
    • LIO-SAM 在因子图上制定激光雷达惯性里程计,允许将多种相对和绝对测量(包括闭环)从不同来源作为因子合并到系统中
    • 惯性测量单元 (IMU) 预积分的估计运动可以消除点云的倾斜,并为激光雷达里程计优化生成初始猜测
    • 对姿势优化进行了边缘化处理,而不是将激光雷达扫描与全局地图匹配
    • 在局部尺度而不是全局尺度上进行扫描匹配显著提高了系统的实时性能,关键帧的选择性引入以及将新的关键帧注册到一组固定大小的先前“子关键帧”的高效滑动窗口方法也有助于提高系统性能

1. Intro

状态估计、定位和地图构建是实现智能移动机器人成功运行的基本先决条件,对于反馈控制、避障和规划等许多功能都是必需的

  • 基于视觉的方法通常使用单目或双目摄像头。虽然基于视觉的方法特别适用于地点识别,但它们对初始化、光照和距离的敏感性使得当它们单独用于支持自主导航系统时不够可靠
  • 基于激光雷达的方法在光照变化方面具有较大的不变性。特别是随着长距离、高分辨率3D激光雷达的最近可用,激光雷达更适用于直接捕捉三维空间环境的精细细节

主要贡献

  • 建立一个紧密耦合的激光雷达惯性测距法框架,建立在因子图之上,适用于多传感器融合和全局优化
  • 提出一种高效的、基于本地滑动窗口的扫描匹配方法,通过将选择性选择的新关键帧注册到一组固定大小的先前子关键帧,实现实时性能
  • 所提出的框架经过广泛验证,通过在不同尺度、车辆和环境上进行测试

2. Related Work

激光雷达里程计通常通过使用 ICP 和 GICP 等扫描匹配方法查找两个连续帧之间的相对变换来执行

  • 基于特征的匹配方法由于其计算效率而成为流行的替代方法,而不是匹配完整的点云
  • 激光雷达通常与其他传感器(例如 IMU 和 GPS)结合使用,用于状态估计和绘图。这种利用传感器融合的设计方案通常可以分为两类:松耦合融合和紧耦合融合
    • 松耦合融合的一种更流行的方法是使用扩展卡尔曼滤波器(EKF)
    • 紧耦合系统通常可以提供更高的准确性,并且是目前正在进行的研究的主要焦点

3. Lidar Internal Odometry Via Smoothing and Mapping

A. 系统概述

将世界坐标系表示为 W \mathbf{W} W,将机器人本体坐标系表示为 B \mathbf{B} B。为了方便起见,z假设IMU坐标系与机器人本体坐标系重合。机器人状态 x \mathbf{x} x 可以写为
x = [ R T , p T , v T , b T ] T , (1) \mathbf{x}=[\mathbf{R}^{\mathbf{T}},\mathbf{p}^{\mathbf{T}},\mathbf{v}^{\mathbf{T}},\mathbf{b}^{\mathbf{T}}]^{\mathbf{T}},\tag{1} x=[RT,pT,vT,bT]T,(1)
其中 R ∈ S O ( 3 ) \mathbf{R}\in SO(3) RSO(3) 是旋转矩阵, p ∈ R 3 \mathbf{p}\in \mathbb{R}^3 pR3 是位置向量, v \mathbf{v} v 是速度, b \mathbf{b} b 是 IMU 偏差。从 B \textbf{B} B W \textbf{W} W 的变换 T ∈ S E ( 3 ) \textbf{T} ∈ SE(3) TSE(3) 表示为 T = [ R ∣ p ] \textbf{T} = [\textbf{R} | \textbf{p}] T=[Rp]

Fig. 1 LIO-SAM的系统结构。该系统接收来自 3D 激光雷达、IMU 和可选 GPS 的输入。引入四种类型的因子来构建因子图:(a) IMU 预积分因子、(b) 激光雷达里程计因子、© GPS 因子和 (d) 环路闭合因子

引入了四种类型的因子以及一种变量类型来构建因子图。该变量代表机器人在特定时间的状态,归因于图的节点

(a) IMU 预积分因子、(b) 激光雷达里程计因子、© GPS 因子和 (d) 环路闭合因子

B. IMU 预积分因子

IMU 的角速度和加速度测量值使用如下定义
ω ^ t = ω t + b t ω + n t ω (2) \hat\omega_t=\mathbf{\omega}_t+\textbf{b}_t^\omega+\textbf{n}_t^{\omega}\tag{2} ω^t=ωt+btω+ntω(2)

a ^ t = R t BW ( a t − g ) + b t a + n t a (3) \hat{\mathbf{a}}_t=\textbf{R}_t^{\textbf{BW}}(\mathbf{a}_t-\mathbf{g})+\mathbf{b}_t^{\mathrm{a}}+\mathbf{n}_t^{\mathrm{a}} \tag{3} a^t=RtBW(atg)+bta+nta(3)

其中 ω ^ t \hat\omega_t ω^t a ^ t \hat{\mathbf{a}}_t a^t 是时间 t t t B \mathbf{B} B 中的原始 IMU 测量值。 ω ^ t \hat\omega_t ω^t a ^ t \hat{\mathbf{a}}_t a^t 受到缓慢变化的偏差 b t \textbf{b}_t bt 和白噪声 n t \textbf{n}_t nt 的影响。 R t BW \textbf{R}_t^{\textbf{BW}} RtBW 是从 W \textbf{W} W B \textbf{B} B 的旋转矩阵。 g \mathbf{g} g W \mathbf{W} W 中的恒定重力矢量

使用 IMU 的测量值来推断机器人的运动。机器人在时间 t + Δ t t + \Delta t t+Δt 时的速度、位置和旋转可以计算如下
v t + Δ t = v t + g Δ t + R t ( a ^ t − b t a − n t a ) Δ t (4) \mathbf{v}_{t+\Delta t}=\mathbf{v}_t+\mathbf{g}\Delta t+\mathbf{R}_t(\hat{\mathbf{a}}_t-\mathbf{b}^{\mathbf{a}}_t-\mathbf{n}^{\mathbf{a}}_t)\Delta t\tag{4} vt+Δt=vt+gΔt+Rt(a^tbtanta)Δt(4)

p t + Δ t = p t + v t Δ t + 1 2 g Δ t 2 + 1 2 R t ( a ^ t − b t a − n t a ) Δ t 2 (5) \mathbf{p}_{t+\Delta t}=\mathbf{p}_t+\mathbf{v}_t\Delta t+\frac{1}{2}\mathbf{g}\Delta t^2 +\frac{1}{2}\mathbf{R}_t(\hat{\mathbf{a}}_t-\mathbf{b}^{\mathbf{a}}_t-\mathbf{n}^{\mathbf{a}}_t)\Delta t^2\tag{5} pt+Δt=pt+vtΔt+21gΔt2+21Rt(a^tbtanta)Δt2(5)

R t + Δ t = R t exp ⁡ ( ( ω ^ t − b t ω − n t ω ) Δ t ) (6) \mathbf{R}_{t+\Delta t}=\mathbf{R}_t\exp((\hat\omega_t-\textbf{b}_t^\omega-\textbf{n}_t^{\omega})\Delta t)\tag{6} Rt+Δt=Rtexp((ω^tbtωntω)Δt)(6)

其中 R t = R t W B = R t B W ⊤ \mathbf{R}_t = \mathbf{R}_t^{WB} = \mathbf{R}_t^{BW^\top} Rt=RtWB=RtBW。这里假设 B 的角速度和加速度在上述积分过程中保持恒定

应用IMU预积分方法来获得两个时间步之间的相对身体运动。时间 i i i j j j 之间的预积分测量值 Δ v i j \Delta\mathbf{v}_{ij} Δvij Δ p i j \Delta\mathbf{p}_{ij} Δpij Δ R i j \Delta\mathbf{R}_{ij} ΔRij 可以使用以下公式计算
Δ v i j = R i ⊤ ( v j − v i − g Δ t i j ) Δ p i j = R i ⊤ ( p j − p i − v i Δ t i j − 1 2 g Δ t i j 2 ) Δ R i j = R i ⊤ R j \begin{align} \Delta\mathbf{v}_{ij}&=\mathbf{R}_i^{\top}(\mathbf{v}_j-\mathbf{v}_i-\mathbf{g}\Delta t_{ij}) \tag{7}\\ \Delta\mathbf{p}_{ij}&=\mathbf{R}_i^{\top}(\mathbf{p}_j-\mathbf{p}_i-\mathbf{v}_i\Delta t_{ij}-\frac{1}{2}\mathbf{g}\Delta t^2_{ij})\tag{8}\\ \Delta\mathbf{R}_{ij}&=\mathbf{R}_i^{\top}\mathbf{R}_j\tag{9} \end{align} ΔvijΔpijΔRij=Ri(vjvigΔtij)=Ri(pjpiviΔtij21gΔtij2)=RiRj(7)(8)(9)

C. 激光雷达里程计系数

当新的激光雷达扫描到达时,我们首先执行特征提取。通过评估局部区域上点的粗糙度来提取边缘和平面特征。具有较大粗糙度值的点被归类为边缘特征

  • 将在时间 i i i 的激光雷达扫描中提取的边缘和平面特征分别表示为 F i e \textbf{F}^e_i Fie F i p \textbf{F}^p_i Fip。在第 i 时刻提取的所有特征组成一个激光雷达帧 F i \textbf{F}_i Fi,其中 F i = { F i e , F i p } \mathbb{F}_i = \{\textbf{F}^e_i , \textbf{F}^p_i\} Fi={Fie,Fip} ,激光雷达框架 F \mathbb{F} F B \mathbf{B} B 中表示

  • 采用关键帧选择的概念

    • 当机器人姿态的变化与之前的状态 x i \textbf{x}_i xi 相比超过用户定义的阈值时,我们选择激光雷达帧 F i + 1 \mathbb{F}_{i+1} Fi+1 作为关键帧
    • 新保存的关键帧 F i + 1 \mathbb{F}_{i+1} Fi+1 与因子图中的新机器人状态节点 x i + 1 \textbf{x}_{i+1} xi+1 相关联
    • 两个关键帧之间的激光雷达帧将被丢弃

    通过这种方式添加关键帧不仅可以实现地图密度和内存消耗之间的平衡,而且有助于保持相对稀疏的因子图,适合实时非线性优化。在本文工作中,添加新关键帧的位置和旋转变化阈值选择为 1m 和 10°

假设向因子图中添加一个新的状态节点 x i + 1 \textbf{x}_{i+1} xi+1。与此状态关联的激光雷达关键帧是 F i + 1 \mathbb{F}_{i+1} Fi+1。激光雷达里程计因子的生成描述如下步骤

  • 体素地图的子关键帧:取 n n n 个最近的关键帧,我们称之为子关键帧,用于估计。子关键帧集合 { F i − n , . . . , F i } \{\mathbb{F}_{i−n}, ..., \mathbb{F}_i\} {Fin,...,Fi} 然后使用与它们相关联的变换 { T i − n , . . . , T i } \{\mathbf{T}_{i−n}, ..., \mathbf{T}_i\} {Tin,...,Ti} 转换为帧 W \mathbf{W} W。转换后的子关键帧被合并成一个体素地图 M i \mathbf{M}_i Mi。由于在先前的特征提取步骤中提取了两种类型的特征, M i \mathbf{M}_i Mi由两个子体素地图组成,分别表示为 M i e \mathbf{M}^e_i Mie,边缘特征体素地图,和 M i p \mathbf{M}^p_i Mip,平面特征体素地图。激光雷达帧和体素图彼此相关,如下所示
    M i = { M i e , M i p } w h e r e :   M i e =   ′ F i e ∪   ′ F i − 1 e ∪ . . . ∪   ′ F i − n e M i p =   ′ F i p ∪   ′ F i − 1 p ∪ . . . ∪   ′ F i − n p \mathbf{M_i}=\{\mathbf{M}^e_i,\mathbf{M}^p_i\}\\ where:\ \mathbf{M}^e_i=\ '\mathbf{F}^e_i∪\ '\mathbf{F}^e_{i−1} ∪ ... ∪\ '\mathbf{F}^e_{i−n}\\ \mathbf{M}^p_i=\ '\mathbf{F}^p_i∪\ '\mathbf{F}^p_{i−1} ∪ ... ∪\ '\mathbf{F}^p_{i−n} Mi={Mie,Mip}where: Mie= Fie Fi1e... FineMip= Fip Fi1p... Finp

    ′ F i e '\mathbf{F}^e_i Fie ′ F i p '\mathbf{F}^p_i Fip 是W 中变换后的边缘和平面特征。然后对 M i e \mathbf{M}^e_i Mie M i p \mathbf{M}^p_i Mip 进行下采样以消除落在同一体素单元中的重复特征

  • 扫描匹配:通过扫描匹配将新获得的激光雷达帧 F i + 1 \mathbb{F}_{i+1} Fi+1(也是 { F i + 1 e , F i + 1 p } \{\mathbf{F}^e_{i+1},\mathbf{F}^p_{i+1}\} {Fi+1eFi+1p})与 M i \mathbf{M}_i Mi 进行匹配

    • 首先将 { F i + 1 e , F i + 1 p } \{\mathbf{F}^e_{i+1},\mathbf{F}^p_{i+1}\} {Fi+1eFi+1p} B \mathbf{B} B 变换到 W \mathbf{W} W 并得到 { ′ F i + 1 e , ′ F i + 1 p } \{'\mathbf{F}^e_{i+1},'\mathbf{F}^p_{i+1}\} {Fi+1eFi+1p} 。该初始变换是通过使用 IMU 预测的机器人运动 T ~ i + 1 \tilde{\mathbf{T}}_{i+1} T~i+1 获得的
    • 对于 ′ F i + 1 e '\mathbf{F}^e_{i+1} Fi+1e ′ F i + 1 p '\mathbf{F}^p_{i+1} Fi+1p 中的每个特征,我们然后在 M i e \mathbf{M}^e_i Mie M i p \mathbf{M}^p_i Mip 中找到其边缘或平面对应关系
  • 相对变换:特征与其边缘或平面块对应关系之间的距离可以使用以下方程计算
    d e k = ∣ ( p i + 1 , k e − p i , u e ) × ( p i + 1 , k e − p i , v e ) ∣ ∣ p i , u e − p i , v e ∣ (10) \mathbf{d}_{e_k}=\frac{\left| (\mathbf{p}^e_{i+1,k}-\mathbf{p}^e_{i,u})\times(\mathbf{p}^e_{i+1,k}-\mathbf{p}^e_{i,v}) \right|}{\left|\mathbf{p}^e_{i,u}-\mathbf{p}^e_{i,v}\right|}\tag{10} dek= pi,uepi,ve (pi+1,kepi,ue)×(pi+1,kepi,ve) (10)

    d p k = ∣ ( p i + 1 , k p − p i , u p ) ( p i , u p − p i , v p ) × ( p i , u p − p i , w p ) ∣ ∣ ( p i , u p − p i , v p ) × ( p i , u p − p i , w p ) ∣ (11) \mathbf{d}_{p_k}=\frac{\begin{vmatrix} (\mathbf{p}^p_{i+1,k}-\mathbf{p}^p_{i,u})\\ (\mathbf{p}^p_{i,u}-\mathbf{p}^p_{i,v})\times(\mathbf{p}^p_{i,u}-\mathbf{p}^p_{i,w}) \end{vmatrix} } {\left| (\mathbf{p}^p_{i,u}-\mathbf{p}^p_{i,v})\times(\mathbf{p}^p_{i,u}-\mathbf{p}^p_{i,w}) \right|}\tag{11} dpk= (pi,uppi,vp)×(pi,uppi,wp) (pi+1,kppi,up)(pi,uppi,vp)×(pi,uppi,wp) (11)

    其中 k k k u u u v v v w w w 是其对应集合中的特征索引。对于 ′ F i + 1 e '\mathbf{F}^e_{i+1} Fi+1e 中的边缘特征 p i + 1 , k e \mathbf{p}^e_{i+1,k} pi+1,ke p i , u e \mathbf{p}^e_{i,u} pi,ue p i , v e \mathbf{p}^e_{i,v} pi,ve 是形成 M i e \mathbf{M}^e_i Mie 中相应边缘线的点。对于 ′ F i + 1 p '\mathbf{F}^p_{i+1} Fi+1p 中的平面特征 p i + 1 , k p \mathbf{p}^p_{i+1,k} pi+1,kp p i , u p \mathbf{p}^p_{i,u} pi,up p i , v p \mathbf{p}^p_{i,v} pi,vp p i , w p \mathbf{p}^p_{i,w} pi,wp 形成 M i p \mathbf{M}^p_i Mip 中相应的平面块

    然后使用高斯牛顿方法通过最小化来求解最优变换
    m i n T i + 1 = { ∑ p i + 1 , k e ∈ ′ F i + 1 e d e k + ∑ p i + 1 , k p ∈ ′ F i + 1 p d p k } \mathop{\mathrm{min}}\limits_{\mathbf{T}_{i+1}}= \left\{ \sum\limits_{\mathbf{p}^e_{i+1,k}\in'\mathbf{F}^e_{i+1}} \mathbf{d}_{e_k}+\sum\limits_{\mathbf{p}^p_{i+1,k}\in'\mathbf{F}^p_{i+1}}\mathbf{d}_{p_k} \right\} Ti+1min= pi+1,keFi+1edek+pi+1,kpFi+1pdpk
    最后,可以得到 x i \textbf{x}_i xi x i + 1 \textbf{x}_{i+1} xi+1 之间的相对变换 Δ T i , i + 1 \Delta \mathbf{T}_{i,i+1} ΔTi,i+1,这是连接这两个位姿的激光雷达里程计因子
    Δ T i , i + 1 = T i ⊤ T i + 1 (12) \Delta\mathbf{T}_{i,i+1}=\mathbf{T}_i^{\mathbf{\top}}\mathbf{T}_{i+1}\tag{12} ΔTi,i+1=TiTi+1(12)

D. GPS 因子

尽管可以仅利用 IMU 预积分和激光雷达里程计因子来获得可靠的状态估计和映射,但系统在长时间导航任务中仍然会出现漂移。为了解决这个问题,可以引入提供绝对测量的传感器以消除漂移,如 GPS

  • 当收到 GPS 测量结果时,首先将它们转换为本地笛卡尔坐标系
  • 当 GPS 接收可用时,没有必要不断添加 GPS 因子,因为激光雷达惯性里程计的漂移增长非常缓慢
  • 只有当估计的位置协方差大于接收到的 GPS 位置协方差时,我们才添加 GPS 因子

E. 环路闭合因子

实现了一种朴素但有效的基于欧几里德距离的闭环检测方法

  • 当一个新的状态 x i + 1 \mathrm{x}_{i+1} xi+1 添加到因子图中时,首先搜索图并找到欧几里德空间中接近 x i + 1 \mathrm{x}_{i+1} xi+1 的先验状态
  • 尝试使用扫描匹配将 F i + 1 \mathbb{F}_{i+1} Fi+1 与子关键帧 { F 3 − m , . . . , F 3 , . . . , F 3 + m } \{\mathbb{F}_{3−m}, ..., \mathbb{F}_3, ..., \mathbb{F}_{3+m}\} {F3m,...,F3,...,F3+m} 匹配
  • F i + 1 \mathbb{F}_{i+1} Fi+1 和过去的子关键帧在扫描匹配之前首先转换为 W \mathbf W W
  • 获得相对变换 Δ T 3 , i + 1 \Delta \mathrm T_{3,i+1} ΔT3,i+1 并将其作为闭环因子添加到图中

在实践中发现当 GPS 是唯一可用的绝对传感器时,添加闭环因子对于纠正机器人高度的漂移特别有用


4. Experiments

  • 使用的传感器套件包括 Velodyne VLP16 激光雷达、MicroStrain 3DM-GX5-25 IMU 和 Reach M GPS

    Fig. 2 数据集在 3 个平台上收集:(a) 定制手持设备,(b) 无人驾驶地面车辆 - Clearpath Jackal,© 电动船 - Duffy 21

    数据集的详细信息如表 I 所示

A. 旋转数据集

在此测试中,重点评估仅将 IMU 预积分和激光雷达里程计因子添加到因子图中时框架的稳健性。旋转数据集是由用户手持传感器套件并在静止状态下执行一系列激进的旋转操作来收集的

Fig. 3 旋转测试中 LOAM 和 LIO-SAM 的绘图结果。 LIOM 未能产生有意义的结果

B. 步行数据集

该测试旨在评估当系统在 SE(3) 中经历剧烈平移和旋转时方法的性能。该数据集遇到的最大平移速度和旋转速度分别为 1.8 m/s 和 213.9 °/s

Fig. 4 使用 Walking 数据集的 LOAM、LIOM 和 LIO-SAM 的绘图结果。当遇到剧烈旋转时,(b) 中的 LOAM 地图会多次发散。 LIOM 优于 LOAM。然而,由于点云配准不准确,其地图显示出许多模糊的结构。 LIO-SAM 无需使用 GPS 即可生成与 Google Earth 图像一致的地图

C. 校园数据集

该测试旨在展示引入 GPS 和环路闭合因素的好处。为了做到这一点,特意禁止在图中插入 GPS 和闭环因子。当 GPS 和环路闭合因子均被禁用时,方法称为 LIO-odom,它仅利用 IMU 预积分和激光雷达里程计因子。当使用 GPS 因子时,方法被称为 LIO-GPS,它使用 IMU 预积分、激光雷达里程计和 GPS 因子来构建图形

Fig. 5 使用在麻省理工学院校园收集的校园数据集的各种方法的结果。红点表示开始和结束位置。轨迹方向为顺时针方向。 LIOM 未显示,因为它无法产生有意义的结果

Tab. 2 机器人返回起点时所有方法的相对平移误差

D. 公园数据集

在本次测试中,将传感器安装在 UGV 上,并沿着森林远足小径驾驶车辆。行驶40分钟后,机器人返回初始位置

Fig. 6 使用在新泽西州 Pleasant Valley Park 收集的 Park 数据集的各种方法的结果。红点表示开始和结束位置。轨迹方向为顺时针方向。

由于没有可靠的绝对高度测量,LIO-GPS 会出现高度漂移,并且在返回机器人初始位置时无法关闭环路。 LIO-SAM不存在这样的问题,因为它利用闭环因子来消除漂移

E. 阿姆斯特丹数据集

将传感器套件安装在船上,并沿着阿姆斯特丹运河航行了 3 个小时。尽管在本次测试中传感器的移动相对平稳,但由于多种原因,绘制运河图仍然具有挑战性

  • 当直射阳光位于传感器视场中时,激光雷达出现许多错误检测,这种情况在数据收集期间大约 20% 的时间发生
  • LOAM、LIOM 和 LIO-odom 都未能在此测试中产生有意义的结果

F. 基准测试结果

由于完整的 GPS 覆盖范围仅在 Park 数据集中可用,因此我们显示了与 GPS 测量历史记录相关的均方根误差 (RMSE) 结果,该结果被视为地面实况

Tab. 3 LIO-GPS 和 LIO-SAM 相对于 GPS 地面实况实现了类似的 RMSE 误差

Tab. 4 三种竞争方法在所有五个数据集中注册一个激光雷达帧的平均运行时间

LIO-SAM 的运行时间受特征图密度的影响更显着,而受因子图中节点和因子数量的影响较小


5. Conclusions And Discussion

  • 提出了 LIO-SAM,这是一种通过平滑和映射实现紧耦合激光雷达惯性里程计的框架,用于在复杂环境中执行实时状态估计和映射
  • 通过在因子图上制定激光雷达惯性里程计,LIO-SAM 特别适合多传感器融合。额外的传感器测量可以作为新因素轻松纳入框架中
  • 提供绝对测量的传感器(例如 GPS、指南针或高度计)可用于消除激光雷达惯性里程计在长时间内或在功能匮乏的环境中累积的漂移
  • 提出了一种滑动窗口方法,可以边缘化旧的激光雷达帧以进行扫描匹配
  • 关键帧有选择地添加到因子图中,并且当生成激光雷达里程计和回环因子时,新关键帧仅注册到固定大小的子关键帧集

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

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

相关文章

k8s-基础知识(Pod,Deployment,ReplicaSet)

k8s职责 自动化容器部署和复制随时扩展或收缩容器容器分组group,并且提供容器间的负载均衡实时监控,即时故障发现,自动替换 k8s概念及架构 pod pod是容器的容器,可以包含多个container pod是k8s最小可部署单元,容器…

理解分布式存储的真实成本 - 10PB的硬件和软件

我们最近与一家大型银行的首席信息官进行了一次对话。他们是全球系统性重要银行之一——规模极其庞大。这位CIO决定将MinIO引入为数据分析计划的对象存储。这个部署从抵押贷款、交易和新闻平台收集数据,以运行Spark和其他分析工具,为银行提供洞察力。Min…

【C语言】【插入排序】

void InsertSort(int* a, int n) {int end 0, tmp 0;for (int i 0;i < n - 1;i){end i;tmp a[end 1];while (end > 0){if (a[end] > tmp){a[end 1] a[end];--end;}elsebreak;}a[end 1] tmp;} }逻辑解释&#xff1a; 变量end代表某次循环&#xff0c;要比较…

学习笔记-李沐动手学深度学习(三)(10-11,隐藏层、多层感知机、激活函数、模型超参数选择、欠过拟合)

总结 多体会&#xff08;宏观、哲学&#xff09; 【深度学习的核心】首先是要模型足够大&#xff0c;在此基础上通过各种手段 来控制模型容量&#xff0c;使得最终得到较小的泛化误差 【一般深度学习特指神经网络 这一块】 【学习的核心是要学习 本质上不变的那些核心思想&a…

MySql必知必会

41.undo log、redo log、 bin log的作用是什么&#xff1f; undo log 基本概念 undo log是一种用于撤销回退的日志&#xff0c;在数据库事务开始之前&#xff0c;MySQL会先记录更新前的数据到 undo log日志文件里面&#xff0c;当事务回滚时或者数据库崩溃时&#xff0c;可以…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和短曝光功能的技术背景Baumer工业相机通过CameraExplorer软件使用Binning功能Baumer工业相机通过NEOAPI SDK使用Binning功能1.引用合…

基于禁忌搜索算法的TSP路径规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 TSP问题描述 4.2 禁忌搜索算法原理 4.3 算法步骤 5.完整程序 1.程序功能描述 基于禁忌搜索算法的TSP路径规划,输出优化收敛曲线以及路线规划图。 2.测试软件版本以及运行结果展示 …

芯课堂 | 通过ISP升级芯片固件方法及框架

一、升级原理 芯片在应用前&#xff0c;是一颗裸片&#xff0c;内部没有任何驱动或应用程序。芯片在贴上PCB板子后&#xff0c;会实现各种功能&#xff0c;这是时候会开发对应的驱动或者应用程序&#xff0c;在芯片上面运行的程序&#xff0c;一般称之为固件&#xff08;Firmw…

线程池高手进阶:揭秘ThreadPoolExecutor的小妙招!

RejectedExecutionHandler总结 ThreadPoolExecutor 是 Java 中用于创建和管理线程池的接口&#xff0c;当线程池中的任务队列已满&#xff0c;并且线程池中的线程数量已经达到最大时&#xff0c;如果再有新的任务提交&#xff0c;就需要一个策略来处理这些无法执行的任务。它 …

antd 日期选择框增加季度预设范围

测试同学说想要有个季度的预设选择框&#xff0c;方便快速选择季度的开始和结束日期。 antd 的rangepicker是支持预设的 日期选择框 DatePicker - Ant Design 实现方法很简单&#xff0c;按照官网示例用moment初始化一下即可 获取当前一季度的开始日期时间&#xff1a; mom…

系统移植 day2 bootloader->u-boot 移植

一、栈的复习 1、满栈&#xff1a;当堆栈指针SP总是指向最后压入堆栈的数据&#xff0c;称为满栈&#xff1b; 2、空栈&#xff1a;当堆栈指针SP总是指向下一个将要放入数据的空位置&#xff0c;称为空栈&#xff1b; 满栈状态下&#xff0c;先移动指针&#xff0c;后赋值. 空…

量化交易学习1

一、股票数据基本分类 可分为&#xff08;1&#xff09;技术面数据和&#xff08;2&#xff09;基本面数据 &#xff08;1&#xff09;技术面数据 技术面数据是通过股票的历史价格和交易量等市场数据进行计算和分析得出的指标。常用的技术指标包括移动平均线、相对强弱指标、…

服务器数据恢复—EVA存储raid5硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EVA某型号存储&#xff0c;底层是RAID5阵列&#xff0c;划分了若干lun。 服务器故障&分析&#xff1a; 该存储设备中raid5阵列有两块硬盘掉线&#xff0c;存储中的lun丢失。 将故障服务器存储中的所有磁盘编号后取出&#xff0c;硬件…

磁盘d盘满了怎么清理?几个步骤轻松搞定!

当您的电脑D盘快满了的时候&#xff0c;需要对电脑D盘进行清理&#xff0c;以节省空间并使电脑运转更加流畅。下面是一些电脑清理的方法和工具介绍。 一、清理磁盘 1、首先我们打开此电脑 2、然后找到我们要清理的磁盘 3、接着我们右键单击属性选项 4、然后我们点击磁盘清理 …

locust快速入门--自定义用户增长形状

背景&#xff1a; locust 默认的用户增长模式&#xff0c;不方便分析不同用户量大对服务器的压力影响。因此&#xff0c;需要对用户增加的图形进行自定义。 locust官网说明&#xff1a;https://docs.locust.io/en/stable/custom-load-shape.html 自定义不同时间段用户的数量…

Linux 驱动开发基础知识——Hello驱动程序(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

CentOS安装Flume

CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…

防火墙接口配置实验

1、搭建拓扑 2、给云端添加网络&#xff0c;来实现真机与虚拟机的连接 3、 给防火墙g0/0/0口配置IP&#xff0c;由于我云端绑定的是192.168.100.10&#xff0c;所以这里IP配置为192.168.100.1/24,使用命令开启防火墙远程连接的服务&#xff0c;之后便可通过web远程登陆防火墙 …

JavaScript——forEach()方法

代码示例&#xff1a;数组变量.forEach(值变量名 > {代码块}) //每遍历一个值&#xff0c;就作为形参传入给代码块&#xff0c;执行一次该函数头&#xff0c;继续遍历 举例说明&#xff1a; <script>let arr [1, 2, 3, 4];//arr.forEach(val > {});arr.forEach(v…

OceanBase创建租户

租户是集群之上的递进概念&#xff0c;OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念&#xff0c;是 Zone 和节点的集合&#xff0c;租户则偏向于资源层面的逻辑概念&#xff0c;是在物理节点上划分的资源单元&#xff0c;可以指定其资源规格&#xff0c;包括…