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

RLOAM/RO-LOAM

LOAM框架

LOAM框架包含三个步骤:

  • Scan registration:从原始激光扫描点数据中提取点特征。点特征是角点或者面点。

  • odometry estimation:在特征提取之后,特征点传递到里程计模块,通过特征匹配和优化步骤计算相对坐标变换即当前帧激光扫描数据相对前一帧激光扫描数据的位姿。里程计模块输出一个6-DoF位姿估计,作为建图模块的初始位姿估计。

  • mapping:
    建图模块的第一步是地图准备,将地图的特征点排序并存储在一个立方体结构中,用于查找当前扫描点的特征与地图特征的对应关系。
    J(q,t)=∑cS∈CSρ(∥fS(cS,q,t)∥2)+∑cC∈CCρ(∥fC(cC,q,t)∥2)J(q,t)=\sum_{c^{\mathcal{S}}\in C^{\mathcal{S}}}\rho(\Vert f^{\mathcal{S}}(c^{\mathcal{S}},q,t) \Vert^2)+\sum_{c^{\mathcal{C}}\in C^{\mathcal{C}}}\rho(\Vert f^{\mathcal{C}}(c^{\mathcal{C}},q,t) \Vert^2) J(q,t)=cSCSρ(fS(cS,q,t)2)+cCCCρ(fC(cC,q,t)2)

    CC={c1C,c2C,⋯,cnC}C^{\mathcal{C}}=\{c_1^{\mathcal{C}},c_2^{\mathcal{C}},\cdots,c_n^{\mathcal{C}}\}CC={c1C,c2C,,cnC}是角点特征的特征点对应关系,CS={c1S,c2S,⋯,cmS}C^{\mathcal{S}}=\{c_1^{\mathcal{S}},c_2^{\mathcal{S}},\cdots,c_m^{\mathcal{S}}\}CS={c1S,c2S,,cmS}是面特征的特征点对应关系,特征点对应关系的格式为c={p1,p2}c=\{p_1,p_2\}c={p1,p2},其中p1p_1p1是当前帧雷达扫描的点,p2p_2p2是地图的点。q,tq,tq,t是雷达坐标系转换到地图坐标系的四元数和平移向量。通过优化得到最优坐标变换,再次迭代执行特征点匹配和位姿优化。在两次迭代之后,使用最终的最优坐标变换将当前帧雷达扫描点的特征点插入到地图中。随后,更新后的地图可用于估计下一帧激光扫描的6-DoF位姿。

R-LOAM

Motivation动机

利用环境中的参考物体等先验知识来改善定位精度,减少漂移,提升地图构建质量,但之前的大多数工作都是利用二维CAD平面图等二维先验信息,即使使用三维模型,对3D先验信息的处理也很粗糙,例如对3D CAD建筑图采样得到初始点云地图进行定位,没有用3D先验信息优化建图的算法。该算法率先提出利用3D参考对象进行轨迹和地图优化,并提出了一种使用具体使用3D三角网格模型的方法。

Challenge挑战

  1. 该算法假设已知参考对象的3D模型及其在全局坐标系的位置,而且该算法对于参考模型的模型精度和位置精度要求很高,建模误差和模型位置误差都会导致算法性能的下降,甚至造成反向提升的效果。

  2. 该算法只针对激光雷达,应用范围受限,也不可避免的继承了激光SLAM的固有缺陷。

能否扩展到视觉传感器?

能否不知道参考对象的全局位姿,只知道参考对象的几何信息?

能否利用除几何信息外的先验信息?例如,桌子的四个腿成矩形排列,桌子上面有个碗。

先验信息能否来自AI检测或分割算法?

能否利用更高级、更抽象的先验信息帮助定位建图?

主要贡献

拓展了主流激光定位LOAM算法框架,在后端优化中不只利用激光特征点信息,还利用从参考物体的3D mesh模型中提取的网格特征,网格特征是在参考对象mesh模型表面上采样的虚拟点(mesh模型表面距离当前激光扫描点最近的点)。point-to-mesh匹配特征的欧式距离平方和作为新的代价函数加入LOAM的常规地图优化步骤。

使用了Axis-Aligned-Bounding-Box-Tree(AABB Tree)数据结构来加速网格特征匹配,能够处理由数十万三角网格组成的3D mesh模型。不止利用已经提前构建好的地图来做全局定位,还考虑与参考物体的相对位置减少长期漂移。

技术方案

在这里插入图片描述

首先假设参考对象的模型及其在全局坐标系下的位姿是已知的,模型以3D三角网格的形式给出。

AABB-Tree 每个叶节点都包含网格的一个面。

1) 点云分离 Scan-Isolation

  1. 使用odometry模块的输出作为initial pose将原始点云数据从雷达坐标系转换到地图坐标系。

  2. 分离点云

    从原始点云数据中分离出属于参考对象的雷达扫描点。具体方法为只保留一个比参考对象3D模型大一点的3D bounding box之内的点云。理想情况下,只有属于参考对象的雷达扫描点会被保留下来。
    需要权衡裁剪点云的方法,如果裁剪条件太严格,则必须要很准确的雷达初始位姿估计,否则可能剔除很多参考对象的扫描点,导致优化结果效果不好。而如果裁剪条件太宽松,则可能保留很多不属于参考对象的扫描点,导致反向优化使结果更差。

2) 网格特征提取 Mesh Feature Extraction(包含scan-to-model Alignment)

在这里插入图片描述

3D triangular mesh 模型是由一个个三角形面组成,每一个三角面由其顶点隐式定义。

  1. 在AABB-Tree的帮助下,可以高效计算出分离的点云与模型三角网格的对应关系。网格特征是三角网格平面上距离对应扫描点最近的虚拟点。
  2. 如果没有AABB-Tree,最简单的寻找扫描点与mesh对应关系的算法是蛮力算法(遍历),计算量非常大;而遍历AABB-Tree非常高效,因为只有在bounding box内的点才会被考虑。
  3. 一但为每个扫描点都找到了mesh面上的虚拟点,point-to-mesh对应关系就找到了。

3) 联合优化
fM(cM,q,t)=(qp1q−1+t)−p2,withp1,p2∈cMf^{\mathcal{M}}(c^{\mathcal{M}},q,t)=(qp_1q^{-1}+t)-p_2 ,{\rm{with}\ } p_1,p_2\in c^{\mathcal{M}} fM(cM,q,t)=(qp1q1+t)p2,with p1,p2cM

J(q,t)=1CSˉˉ∑cS∈CSρ(∥fS(cS,q,t)∥2)+1CCˉˉ∑cC∈CCρ(∥fC(cC,q,t)∥2)+λCMˉˉρ(∥fM(cM,q,t)∥2)J(q,t)=\dfrac{1}{\bar{\bar{C^{\mathcal{S}}}}}\sum_{c^{\mathcal{S}}\in C^{\mathcal{S}}}\rho(\Vert f^{\mathcal{S}}(c^{\mathcal{S}},q,t) \Vert^2)+\dfrac{1}{\bar{\bar{C^{\mathcal{C}}}}}\sum_{c^{\mathcal{C}}\in C^{\mathcal{C}}}\rho(\Vert f^{\mathcal{C}}(c^{\mathcal{C}},q,t) \Vert^2) +\dfrac{\lambda}{\bar{\bar{C^{\mathcal{M}}}}}\rho(\Vert f^{\mathcal{M}}(c^{\mathcal{M}},q,t) \Vert^2) J(q,t)=CSˉˉ1cSCSρ(fS(cS,q,t)2)+CCˉˉ1cCCCρ(fC(cC,q,t)2)+CMˉˉλρ(fM(cM,q,t)2)

CSˉˉ,CCˉˉ,CMˉˉ\bar{\bar{C^{\mathcal{S}}}},\bar{\bar{C^{\mathcal{C}}}},\bar{\bar{C^{\mathcal{M}}}}CSˉˉ,CCˉˉ,CMˉˉ是对应关系集合的元素数;λ\lambdaλ是加权乘子,调整point-to-mesh残差的影响。

就像 LOAM 一样,在得出最终优化的 6-DoF 姿势之前,我们至少运行了两次对应估计和联合优化迭代。直观地说,联合优化问题最小化了扫描点和地图点之间的残差,同时也最小化了孤立扫描点对网格表面的残差。这有效地将扫描与网格表面对齐,在当前环境中提供绝对参考并减少长期漂移,同时还考虑了构建的地图。地图构建过程与LOAM相同。

在这里插入图片描述

和SOTA的对比结果

与LOAM算法的对比,在三个场景中 APE中位值分别降低了超过92%,69%,94%。

而随着迭代次数的增加,R-LOAM的提升更明显。

网格特征是对点特征的重要补充。在某些数据集上,由于点特征很稀疏,LOAM可能无法运行成功,而由于R-LOAM利用了3D参考模型补充了mesh feature可以成功跑通。

指标:

  • RPE(relative pose error)相对位姿误差

  • APE(Absolute Pose Error)绝对位姿误差
    APE 首先将真实值和估计值进行对齐,然后计算每个真实值和估计值之间的偏差得到,适合评估整条轨迹的全局一致性。

  • RMSE(Root Mean Square Error)均方根误差

  • STD(Standard Deviation)标准差

RE(Rotational Error)旋转误差

RO-LOAM

Motivation动机

R-LOAM没有对于扫描-模型误匹配的处理机制,一旦使用误匹配的扫描-模型误差项优化,会极大影响定位和建图的效果。R-LOAM中的利用先验信息的优化与LOAM中的map optimization紧耦合,这限制了算法在线运行下的地图优化迭代次数。

Challenge挑战

  1. 与R-LOAM类似,RO-LOAM依赖于参考对象的准确全局位姿估计和几何形状,全局位姿的误差会严重影响算法性能,模型与参考对象的实际几何形状之间的偏差也会增加扫描点-模型匹配阶段的误差。
  2. 该算法只针对激光雷达类距离传感器,应用场景受限。

主要贡献

  1. 提出了一种利用3D参考模型建图的扩展算法,可以用于任意其他3D LiDAR-SLAM的插件扩展,以实现基于参考对象的轨迹和地图优化。
  2. 提出了一种基于EKF的判断扫描点与参考模型的配准程度的评估方法,只有在高度准确的scan-to-model匹配时才会触发TMO(trajectory and map optimization)轨迹和地图优化。提高了算法对于误匹配的鲁棒性。
  3. 作为3DLiDAR-SLAM的松耦合扩展,可以与SLAM算法异步执行。与R-LOAM相比,该算法能够卸载到边缘云以完全并行的方式在线运行,降低机器人端侧的负载。

技术方案

在这里插入图片描述

  1. 扫描点云分离 Scan-Isolation

    点云分离阶段,与R-LOAM相同,目的是保留只属于参考对象的扫描点。

  2. 扫描点到模型的匹配 Scan-to-Model Alignment

    扫描点-模型匹配阶段的目的是精细化LOAM的输出map-optimized poses。这是通过匹配分离后的点云与参考模型来实现的,然而,扫描点与参考模型的匹配质量对于优化效果影响很大,错误的匹配会增大位姿误差。为此,RO-LOAM改进了R-LOAM的匹配方式,使用一系列连续的时序数据而不是只是某一时刻的数据去评估点云-模型匹配的准确性。

    在接收到L次分离雷达扫描点后,如果最近的M+1次分离扫描点云都超过50个点,则执行分离扫描点与模型的配准操作。之后的分离扫描点云和对应的校正位姿会被缓存直到这个条件被满足。M+1帧从时间t-M到t采集的被分离的扫描点PDt−M:t\mathcal{P}^{D_{t-M:t}}PDtM:t与模型的匹配可以多线程执行。参数L控制TMO的频率;参数M控制了下一阶段候选者评估的序列长度,M过小将导致EKF的输入序列过短,达不到收敛,M过大更可能导致由于状态转移函数的偏差而收敛到错误值,这两种情况下,执行TMO的次数都会减少。

    在匹配之前,会统一执行一次降采样将分离点云的数量限制在500以限制计算复杂度。使用距离阈值来去除外点提高鲁棒性。匹配方法为ICP迭代最近点,执行100次匹配估计和优化迭代以收敛到极小的位姿误差。

    该模块的输出是与模型配准后的位姿WT~Dt−M:t^W\tilde{T}_{D_{t-M:t}}WT~DtM:t

  3. 候选者评估 Candidate Evaluation

    接收上一模块的WT~Dt−M:t^W\tilde{T}_{D_{t-M:t}}WT~DtM:t 输出,并评估扫描-模型匹配的精度是否达标,如果达标则将WT~Dt^W\tilde{T}_{D_t}WT~Dt输出到下一模型。

    WT~Dt−M:t−1^W\tilde{T}_{D_{t-M:t-1}}WT~DtM:t1作为观测输入zKz_KzK,对于每个观测,EKF执行一次预测步和一次校正步,最终通过一步预测得到预测状态xK∣K−1x_{K|K-1}xKK1作为最后一个模型配准位姿WT~Dt^W\tilde{T}_{D_t}WT~Dt 的运动先验WT^Dt^W\hat{T}_{D_t}WT^Dt

    如果WT^Dt^W\hat{T}_{D_t}WT^DtWT~Dt^W\tilde{T}_{D_t}WT~Dt的平移误差和旋转误差均小于阈值,则说明扫描与模型配准的精度足够高,将WT~Dt^W\tilde{T}_{D_t}WT~Dt输出到下一个模块优化轨迹。

  4. 位姿图优化 Pose Graph Optimization (PGO)

    PGO校正自上次TMO以来的轨迹,使用校正后的位姿可以用来更新地图。

    在接收到模型配准位姿WT~Dt^W\tilde{T}_{D_t}WT~Dt之后,从LiDAR-SLAM算法的mapping module接收的map-optimized poses WTDt−X:t^WT_{D_{t-X:t}}WTDtX:t构建位姿图,前一个TMO在时间t−Xt-XtX执行,当前TMO在时间ttt执行。节点由边连接ε={e0,1,e1,2,⋯}\varepsilon=\{e_{0,1},e_{1,2},\cdots\}ε={e0,1,e1,2,},每一条边ei,j=<Ωi,j,qi,j,ti,j>e_{i,j}=\left<\Omega_{i,j},q_{i,j},t_{i,j}\right>ei,j=Ωi,j,qi,j,ti,j代表一个连接节点nin_ininjn_jnj的图约束,qi,jq_{i,j}qi,jti,jt_{i,j}ti,j描述两个节点之间的相对位姿,由DiTDj=WTDi−1WTDj^{D_i}T_{D_j}=^WT^{-1}_{D_i}\ ^WT_{D_j}DiTDj=WTDi1 WTDj得到,Ωi,j\Omega_{i,j}Ωi,j6×66\times 66×6的信息矩阵,描述相对位姿的可信程度。
    J(q^i,j,t^i,j)=∑e∈ερ(∥f(ei,j,q^i,j,t^i,j)∥2)f(ei,j,q^i,j,t^i,j)=Ω^i,j[Δti,j2Δq→i,j]Δti,j=ti,j−t^i,jΔqi,j=qi,jq^i,j∗J(\hat{q}_{i,j},\hat{t}_{i,j})=\sum_{e\in\varepsilon}\rho(\Vert f(e_{i,j},\hat{q}_{i,j},\hat{t}_{i,j}) \Vert^2)\\ f(e_{i,j},\hat{q}_{i,j},\hat{t}_{i,j})=\hat{\Omega}_{i,j}\begin{bmatrix}\Delta t_{i,j}\\ 2\Delta \overrightarrow{q}_{i,j}\end{bmatrix}\\ \Delta t_{i,j}=t_{i,j}-\hat{t}_{i,j}\\ \Delta q_{i,j}=q_{i,j}\hat{q}^*_{i,j} J(q^i,j,t^i,j)=eερ(f(ei,j,q^i,j,t^i,j)2)f(ei,j,q^i,j,t^i,j)=Ω^i,j[Δti,jqi,j]Δti,j=ti,jt^i,jΔqi,j=qi,jq^i,j
    其中q^i,j,t^i,j\hat{q}_{i,j},\hat{t}_{i,j}q^i,j,t^i,j是迭代优化的节点变量,Ω^i,j\hat{\Omega}_{i,j}Ω^i,j 是信息矩阵Ωi,j\Omega_{i,j}Ωi,j经过Cholesky 分解的下三角矩阵。

    对于每个相邻节点的相对位姿,取单位信息矩阵Ω=I\Omega=IΩ=I,在优化过程中每条相对位姿的边是平等的。最后加入上一个TMO位姿与当前TMO位姿的相对位姿边,约束Dt−XTDt=WTˉDt−X−1WT~Dt^{D_{t-X}}T_{D_{t}}=^W\bar{T}^{-1}_{D_{t-X}}\ ^W\tilde{T}_{D_t}DtXTDt=WTˉDtX1 WT~Dt,并将位姿图的第一个节点WTDt−X^WT_{D_{t-X}}WTDtX,即上一次TMO优化的位姿设置为常数,这样优化器就不会再优化它。设置这条边的信息矩阵为很大的值Ωt−X,t=4000∗I\Omega_{t-X,t}=4000*IΩtX,t=4000I。由于第一个节点是常数,并且对于当前TMO位姿设置了一个很大的信息矩阵,所以只有两个TMO pose之间的位姿节点被优化,输出结果为WTˉDt−X:t^W\bar{T}_{D_{t-X:t}}WTˉDtX:tWTˉDt−X=WT~Dt−X,andWTˉDt=WT~Dt^W\bar{T}_{D_{t-X}}=^W\tilde{T}_{D_{t-X}},and\ ^W\bar{T}_{D_{t}}=^W\tilde{T}_{D_{t}}WTˉDtX=WT~DtX,and WTˉDt=WT~Dt.

  5. 地图校正 Map Correction

    有了上一阶段的输出PG-optimized posesWTˉDt−X:t^W\bar{T}_{D_{t-X:t}}WTˉDtX:t,就可以通过重投影之前的雷达扫描点用来校正地图。

    地图校正模块是TMO扩展算法与LiDAR-SLAM算法直接的接口,是RO-SLAM中唯一与LiDAR-SLAM算法紧耦合的模块,因为它高度依赖于建图模块的地图结构。

和SOTA的对比结果

在LOAM和R-LOAM上激活RO扩展程序可以显著减少 LOAM 和 R-LOAM 的 APE,而在车载计算机上几乎没有额外的计算成本。

相关文章:

RLOAM/RO-LOAM

LOAM框架 LOAM框架包含三个步骤&#xff1a; Scan registration&#xff1a;从原始激光扫描点数据中提取点特征。点特征是角点或者面点。 odometry estimation&#xff1a;在特征提取之后&#xff0c;特征点传递到里程计模块&#xff0c;通过特征匹配和优化步骤计算相对坐标变…...

JUC并发编程之Semaphore-应用与深度源码剖析

目录 JUC并发编程之Semaphore-应用与深度源码剖析 1. Semaphore 是什么&#xff1f; 2.怎么使用Semaphore&#xff1f; 2.1构造方法 2.2 重要方法 2.3 基本使用 需求场景 基础版代码实现 tryAcquire()引入代码实现 acquireUninterruptibly(),acquire()对比代码实现 3.…...

JWT详细介绍使用

一、JWT介绍 JWT是JSON Web Token的缩写&#xff0c;即JSON Web令牌&#xff0c;是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务…...

C/C++开发,无可避免的多线程(篇六).线程池封装类

一、线程池概念 线程池是一种多线程处理方式&#xff0c;它包含一个线程工作队列和一个任务队列。当有任务需要处理时&#xff0c;线程池会从线程工作队列中取出一个空闲线程来处理任务&#xff0c;如果线程工作队列中没有空闲线程&#xff0c;则任务会被放入任务队列中等待处理…...

HIVE中如何实现针对IPv6 CIDR的查询

Hive默认情况下不支持IPv6 CIDR查询,因为IPv6 CIDR查询需要使用一些额外的函数。 但是可以通过使用UDF(用户自定义函数)来实现这一点。 IPv6 CIDR表示为网络地址/前缀长度,其中网络地址是一个IPv6地址,前缀长度是一个介于0和128之间的整数,表示网络地址中前多少位是网络…...

【微信小程序】-- 生命周期(二十八)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

Kafka 概述

Kafka 概述Broker消费者Kafka 属于分布式的消息引擎系统&#xff0c;主要功能 &#xff1a;提供一套完备的消息发布与订阅解决方案 生产者和消费者都是客户端&#xff08;Clients&#xff09;&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1a;向主题发布消息…...

详解Java8中如何通过方法引用获取属性名/::的使用

在我们开发过程中常常有一个需求&#xff0c;就是要知道实体类中Getter方法对应的属性名称&#xff08;Field Name&#xff09;&#xff0c;例如实体类属性到数据库字段的映射&#xff0c;我们常常是硬编码指定 属性名&#xff0c;这种硬编码有两个缺点。 1、编码效率低&#x…...

0106广度优先搜索和最短路径-无向图-数据结构和算法(Java)

1 单点最短路径 单点最短路径。 给定一幅图和一个起点s&#xff0c;回答“从s到给定目的顶点v是否存在一条路径&#xff1f;如果有&#xff0c;找出其中最短的那条&#xff08;所含边数最少&#xff09;。“等类似问题。 深度优先搜索在这个问题上没有什么作为&#xff0c;因为…...

僵尸(Zombie)进程

文章目录1.僵尸进程2.产生僵尸进程的原因3.利用 wait 函数销毁僵尸进程4.使用 waitpid 函数销毁僵尸进程1.僵尸进程 进程完成工作后&#xff08;执行完 main 函数中的程序后&#xff09;应被销毁&#xff0c;但有时这些进程将变成僵尸进程&#xff0c;占用系统中的重要资源。这…...

JS实现:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

题目&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 数列是 1,1,2,3,5,8,13,21....观察可以看出来从第三个数字开始…...

Verilog如何编写一个基础的Testbench

本文将讲述如何使用Verilog 编写一个基础的测试脚本&#xff08;testbench&#xff09;。在考虑一些关键概念之前&#xff0c;先来看看testbench的架构是什么样的。架构包括建模时间、initial块&#xff08;initial block&#xff09;和任务&#xff08;task&#xff09;。此文…...

基于JavaEE社区物业管理系统开发与实现(附源码资料)

文章目录1. 适用人群2. 你将收获3.项目简介4.技术栈5.测试账号6.部分功能模块展示6.1.管理员6.2.业主1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计或者是需要实战项目的Java开发学习者。 2. 你将收获 提供&#xff1a;项目源码、项目文档、数据库脚本、软件工…...

问一下ChatGPT:DIKW金字塔模型

经常看到这张DIKW金字塔模型图&#xff0c;还看到感觉有点过份解读的图&#xff0c;后面又加上了insight&#xff0c;impact等内容。 Data&#xff1a;是数据&#xff0c;零散的、无规则的呈现到人们眼前&#xff0c;如果你只看到这些数字&#xff0c;如果没有强大的知识背景&a…...

javaScript基础面试题 ---闭包

闭包1、闭包是什么&#xff1f;2、闭包可以解决什么问题&#xff1f;3、闭包的缺点1、闭包是什么&#xff1f; 闭包是一个函数加上到创建这个函数的作用域的链接&#xff0c;就是一个作用域可以访问到另一个作用域的变量&#xff0c;闭包‘关闭’了函数的自由变量 function f…...

如何自定义您的网站实时聊天图标

实时聊天图标是您网站上的一个按钮&#xff0c;可在访问者单击时打开实时聊天。它代表了您的企业与客户沟通的门户。这是您的网站访问者与您联系、提出问题和接收个性化推荐的一种方式&#xff0c;聊天图标的设计最好是简单且引人入胜&#xff0c;个性化的图标往往更能提现企业…...

Vue侦听器Watch

31. Vue侦听器Watch 1. 定义 Watch是Vue.js提供的一个观察者模式&#xff0c;用于监听数据的变化并执行相应的回调函数。虽然计算属性Computed在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器Watch。因为在有些情况下&#xff0c;我们需要在状态变化时执行一…...

云快充研发中心平台架构师谈云原生稳定性建设之路

作者&#xff1a;吕周洋 大家好&#xff0c;我是来自云快充研发中心的平台架构师吕周洋&#xff0c;今天我给大家分享云快充云原生稳定性之路。 点击查看&#xff1a;云快充研发中心平台架构师 吕周洋&#xff1a;云快充云原生稳定性治理之路 云快充成立于2016年&#xff0c…...

ENVI IDL学习笔记之基本操作

前言ENVI IDL&#xff08;交互式数据语言&#xff09;是一个通用的科学计算包&#xff0c;它提供了一套数学函数、数据分析工具&#xff0c;以及一些科学可视化和动画工具。IDL 是 ENVI 图像处理和分析软件的基础&#xff0c;可用于编写脚本并自动执行许多使用 ENVI 图形用户界…...

多线程面试题

1. Sychronized的锁升级过程是怎样的&#xff1f; 2. Tomcat 中为什么要使用自定义类加载器&#xff1f; 3. 说说对线程安全的理解 4. 对守护线程的理解 5. 并发、并行、串行之间的区别 6. Java死锁如何避免&#xff1f; 7. 谈谈你对AQS的理解&#xff0c;AQS如何实现可重入锁&…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...