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

基于视觉的语义匹配见多了,那基于雷达的呢?

论文题目:

LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection

论文作者:

Yansong Gong, Xinglian Zhang, Jingyi Feng, Xiao He and Dan Zhang

作者单位:北京驭势科技有限公司

导读:

本文为驭势科技最新的车辆定位算法论文,介绍了一种使用广义语义ICP和道路标记检测的基于激光雷达的高精地图定位方法,并且在现实世界场景中进行了大量实验,证明了该方法的有效性和鲁棒性。©️【深蓝AI】编译

1.摘要

在GPS信号不可用的场景下,强大的环境感知与定位系统对于自动驾驶而言变得至关重要。本文提出了一种基于激光雷达的在线定位系统,该系统融合了道路标记检测以及在高精地图上的配准功能。该系统使用了一种具备实时性能的道路标记检测方法,其中首先引入了一种自适应分割技术来提取与道路标记相关的高反射率点,从而提升实时处理的效率。接着,通过汇总历史激光雷达扫描数据,构建了一个时空概率局部地图,提供了一个密集的点云。最终,生成了一个激光雷达鸟瞰图(LiDAR Bird’s-Eye View, LiBEV)图像,并利用实例分割网络对道路标记进行精确标注。针对道路标记的配准,设计了一种SG-ICP(Semantic Generalized Iterative Closest Point, SG-ICP)算法。线性道路标记被建模为嵌入在二维空间中的1维流形,缓解了沿着线性方向约束的影响,解决了欠约束问题,并且在HD地图上实现了比传统的ICP算法更高的定位精度。在真实世界环境中进行了大量实验,证明了本文系统的有效性和鲁棒性。

2.介绍

精准定位在自动驾驶研究中至关重要,尽管GPS是露天环境下的主要定位技术,但在信号受阻时(如高架桥下)会变得不稳定。因此,使用摄像头和LiDAR等传感器的环境感知就成了处理问题的关键,尤其在GPS受限区域。道路标记检测是确保稳定感知的核心技术,它通过关联标记与高精地图来估算车辆位置。

摄像头因其丰富的环境纹理信息而广泛用于道路标记识别,但受光照变化和鸟瞰视图失真影响。LiDAR则较少受光照影响,提供精确的3D环境模型,且可从高反射材料中提取道路标记,但需平衡点云密度与实时处理需求。

在这里插入图片描述
图1|在高精地图上的定位效果和检测到的道路标志©️【深蓝AI】编译

为了应对上述视觉匹配的难点和挑战,本作研究者提出了一种基于LiDAR的实时道路标记检测与地图配准方法,如图1所示,(a)板块是本文的方法中高精地图定位被可视化展示,其中车辆定位的轨迹用绿色标记,而车辆当前的姿态由一个红色立方体表示。蓝色的点云代表来自单帧激光雷达数据的地面点。这些地面点通过自适应分割来识别高反射点。随后,它们通过连续的数据帧汇聚形成更密集的点云。最后,应用语义分割获得语义点云,然后将其与高精地图配准,以估计车辆的姿态。(b)板块则为使用本文的方法提取的道路标记被可视化展示,包括虚线车道、实线车道、停车线、文字、箭头、菱形标志、三角标志、路缘石以及人行横道。本文的主要贡献有:

●提出了基于LiDAR的道路标记检测方法,用于在线环境感知,其中通过自适应分割高反射率点和更新时空概率局部地图来平衡点密度和实时性能。最终生成LiBEV图像,使用实例分割网络在LiBEV图像上能够准确检测出9种不同类型的道路标记。

●提出了一个新的道路标记配准算法,用于在HD地图上定位自动驾驶车辆,其中线性道路标记被表示为嵌入在二维空间中的1维流形。这种表示法可以为配准问题提供一个稳健且准确的解决方案,对欠约束维度的影响最小。与传统的ICP相比,SG-ICP实现了更高的定位精度。

●在真实世界场景中进行了全面的实验,展示了本文系统的实时性能和定位精度。实验结果表明,该方法适用于各种类型的LiDAR传感器,以及在不同的车速和天气条件下表现出的鲁棒性。

3.相关工作

在城市NOA领域,道路标记检测凭借其对车辆导航的引导作用成为环境感知的核心。激光雷达因能高效区分逆反射材料制成的标记与普通路面而成为主流检测工具,其原理在于标记物对近红外激光脉冲有较高反射率。此技术广泛用于构建高精地图,通过离线聚合高密度点云来详尽描绘环境,但处理速度慢,不适于实时应用。

实时检测中,单次激光雷达扫描的强度数据经阈值分割用于识别标记,如AnnieWAY在DARPA挑战中所展示。极坐标网格和改进的Otsu阈值算法也被用于标记检测,但单次扫描的稀疏性使检测结果不够稳定。多帧累积技术改善了这一点,通过固定阈值提取车道标记,且后续研究扩展至更多高反射目标,提升定位精度。然而,固定阈值策略在变动态势下表现欠佳。
近年来,深度学习在道路标记检测中崭露头角。LLDN-GFC等方法利用点云的车道线特征,如空间分布特性,优化了检测过程并降低计算需求。尽管如此,其专注车道线而忽略其他标记的局限性,可能影响车辆定位的全面性,特别是在横向约束方面存在潜在缺陷。

4.本文算法

针对先前研究中确定的局限性,本文提出了一种基于LiDAR的道路标记检测系统,用于实时环境感知。此外,本文还引入了一种新的道路标记配准算法,以提高使用高精地图的自动驾驶汽车的定位准确性。本文算法的流程图如图2所示。

在这里插入图片描述
图2|本文算法的流程图©️【深蓝AI】编译

4.1 基于激光雷达的实时道路标线检测

◆高反射点分割:

此处理旨在适应性地识别高反射率的点,这些点通常与使用逆反射材料涂绘的道路标线相关联。为了确保在不同传感器和场景下都能适用,本文引入了一种自适应分割方法,专门设计用于提取高反射率的点,以构建一个更加稳健的系统。

该方法基于高度信息对地面点进行分割,并通过部分拟合地面平面来提取它们。随后,引入了一个分割系数 ρ k \rho_k ρk来区分第 k k k次扫描中的高反射率点。具体而言,强度低于 ρ k \rho_k ρk的点将从扫描中排除。值得注意的是,分割系数 ρ k \rho_k ρk并非人为预设,通过卡尔曼滤波器动态估计并持续更新,状态转移模型为:

ρ k = ρ k − 1 + w k , ( 1 ) \rho_k = \rho_{k-1} + w_k, \qquad (1) ρk=ρk1+wk,(1)

其中 w k ∼ N ( 0 , Q k ) w_k \sim N(0, Q_k) wkN(0,Qk)是过程噪声。测量模型则由下式给出:

z k = ρ k + v k , ( 2 ) z_k = \rho_k + v_k, \qquad (2) zk=ρk+vk,(2)

其中 v k ∼ N ( 0 , R k ) v_k \sim N(0, R_k) vkN(0,Rk)是测量噪声。在每次激光雷达扫描中,计算地面点强度的均值 μ k \mu_k μk和方差 σ k \sigma_k σk。然后测量值确定为 z k = μ k + 2 σ k z_k = \mu_k + 2\sigma_k zk=μk+2σk

该自适应方法基于两点假设以确保其在城市道路环境中的有效性:

1)相邻路段的分割系数相似,源于地面材质一致性。

2)大部分激光雷达点反映普通路面,而路标点有更高强度。

聚焦高反射点优化效率,剔除无关数据,减轻计算负担。

◆概率局部地图更新:

为了实现实时性,引入了一种新的概率局部地图更新方法。该方法采用概率性丢弃策略,其中地图上的每个点都会基于计算出的概率值被选择性地移除。分配给局部地图中第 i i i个点的概率,记作 p i p_i pi,通过下式计算:

p i = 1 1 + ( ∣ k − k i ∣ η ) 2 ( 3 ) p_i = \frac{1}{1 + \left(\frac{|k - k_i|}{\eta}\right)^2} \qquad (3) pi=1+(ηkki)21(3)

其中 k k k表示当前帧的索引,而 k i k_i ki代表第 i i i个点源自的帧数。是一个人工设定的参数,用于确定丢弃旧点的概率。当 η \eta η增大时,旧点更可能被保留,从而在概率局部地图中形成更高的点密度。

从公式3可以看出,激光雷达传感器新观察到的点被赋予较高的保留概率值。这种策略保证了时空一致性,缓解了时间累积误差。此外,与使用固定窗口内扫描的聚合方法相比,本文方法确保了局部地图数据更为平滑的过渡。

◆LiDAR 增强视图(LiBEV)图像生成:

生成LiBEV图像时,局部地图被分割为网格,各网格代表图像像素;RGB值基于色彩映射和点云强度确定。采用CenterMask网络精确分割LiBEV图像中的道路标记,接着从对应网格提取点,形成语义点云。此法支持9类标记,如虚线、实线、文字等,提升地图匹配定位的稳定性。语义分割图像比点云标注便捷,利于实际部署。

4.2 基于SG-ICP的高精地图(HD Map)道路标记配准

在SG-ICP中,道路标记按特性分为线、线段与其他三类。实线车道与路缘无明确端点,归为线;虚线、人行道等有端点,属线段;非线性分布的文字、箭头等标记为其他。线因无端点而在线性方向约束缺失;线段的端点虽提供约束,但端点误差影响配准精度;线性标记需减小其对姿态估计的影响,以缓解约束不足。非线性分布的其他标记则自然提供充足约束。本算法统一处理三类标记的配准,采用GICP目标函数。

广义迭代最近点(GICP)算法将概率模型融入优化过程中,定义如下:

T ∗ = arg ⁡ min ⁡ T ( ∑ i = 1 n ( q m i − T ⋅ q L i ) T ( C m i + R C L i R T ) − 1 ( q m i − T ⋅ q L i ) ) ( 4 ) T^* = \underset{T}{\arg\min} \left( \sum_{i=1}^{n} (q_{mi} - T \cdot q_{Li})^T (C_{mi} + R C_{Li} R^T)^{-1} (q_{mi} - T \cdot q_{Li}) \right) (4) T=Targmin(i=1n(qmiTqLi)T(Cmi+RCLiRT)1(qmiTqLi))(4)

其中 q m i q_{mi} qmi q L i q_{L_i} qLi分别代表一对对应的点,前者属于高精地图元素,后者属于标记的点云。这些对应点是通过ICP算法中的最近邻搜索策略建立的。 C m i C_{mi} Cmi C L i C_{L_i} CLi分别表示来自地图和标记点云的点的协方差矩阵,它们在本文的语义GICP(SG-ICP)算法中被适当地构建,以缓解欠约束方向的影响。

在本文的SG-ICP算法中,概率模型是通过利用语义道路标记内在的语义和几何属性专门设计的。对于位于第 i i i个检测到的道路标记实例上的点,协方差矩阵 C ~ L i \tilde{C}_{Li} C~Li被估计为:

C ~ L i = 1 n i − 1 ∑ j ( p L ( i , j ) − p ~ L i ) ⋅ ( p L ( i , j ) − p ~ L i ) T ( 5 ) \tilde{C}_{Li} = \frac{1}{n_i - 1} \sum_{j} (p_{L(i,j)} - \tilde{p}_{Li}) \cdot (p_{L(i,j)} - \tilde{p}_{Li})^T\qquad(5) C~Li=ni11j(pL(i,j)p~Li)(pL(i,j)p~Li)T(5)

其中 p L ( i , j ) p_{L(i,j)} pL(i,j)表示第 i i i个道路标记实例的第 j j j个点, p ~ L i \tilde{p}_{Li} p~Li表示这些点的质心。接着,对 C ~ L i \tilde{C}_{Li} C~Li进行奇异值分解(SVD)。

C ~ L i = U i Σ ~ i V i T , Σ ~ i = [ σ 1 2 0 0 σ 2 2 ] ( 6 ) \tilde{C}_{Li} = U_i \tilde{\Sigma}_i V_i^T, \tilde{\Sigma}_i = \begin{bmatrix} \sigma_1^2 & 0 \\ 0 & \sigma_2^2 \end{bmatrix}\qquad(6) C~Li=UiΣ~iViT,Σ~i=[σ1200σ22](6)

σ 1 \sigma_1 σ1 σ 2 \sigma_2 σ2满足 σ 1 ≥ σ 2 \sigma_1 \geq \sigma_2 σ1σ2。然后,构建矩阵 Σ i = diag ( 1 , ϵ ) \Sigma_i = \text{diag}(1, \epsilon) Σi=diag(1,ϵ),其中满足:

ϵ = { 1 e − 6 , 如果标记被分类为线条; 1 e − 1 , 如果标记被分类为线段; 1 , 如果标记被分类为其他。 ( 7 ) \epsilon = \begin{cases} 1e-6, & \text{如果标记被分类为线条;} \\ 1e-1, & \text{如果标记被分类为线段;} \\ 1, & \text{如果标记被分类为其他。} \end{cases} (7) ϵ= 1e6,1e1,1,如果标记被分类为线条;如果标记被分类为线段;如果标记被分类为其他。(7)

这三种道路标记类别具有不同的 ϵ \epsilon ϵ值,代表着沿直线方向的不同约束程度。 ϵ \epsilon ϵ的值越接近1.0,表示沿直线方向的约束越强。与第 i i i个道路标记对应的最终协方差矩阵可以通过以下方式计算:

C L i = U i Σ i V i T ( 8 ) C_{Li} = U_i \Sigma_i V_i^T\qquad(8) CLi=UiΣiViT(8)

在高精地图中的第 i i i个语义元素表示为 { v m i , l m i , P m i } \{v_{mi}, l_{mi}, P_{mi}\} {vmi,lmi,Pmi},其中 v m i v_{mi} vmi l m i l_{mi} lmi P m i = { p m ( i , j ) , j = 1 , 2 , … , n m i } P_{mi} = \{p_{m(i,j)}, j = 1, 2, \ldots, n_{mi}\} Pmi={pm(i,j),j=1,2,,nmi}分别表示主要方向、语义标签和地图元素的点集。将基向量 e 1 = [ 1 , 0 ] T e_1 = [1, 0]^T e1=[1,0]T旋转到方向 v m i v_{mi} vmi的旋转矩阵可以按以下方式计算:

R v i = cos ⁡ ( θ ) I + ( 1 − cos ⁡ ( θ ) ) r r T + sin ⁡ ( θ ) [ r ] × ( 9 ) R_{vi} = \cos(\theta)I + (1 - \cos(\theta))rr^T + \sin(\theta)[r]_\times\qquad(9) Rvi=cos(θ)I+(1cos(θ))rrT+sin(θ)[r]×(9)

其中

r = [ e 1 ] × v m i , θ = arccos ⁡ ( e 1 T v m i ) ( 10 ) r = [e_1]_\times v_{mi}, \quad \theta = \arccos(e_1^T v_{mi})\qquad(10) r=[e1]×vmi,θ=arccos(e1Tvmi)(10)

符号 [ r ] × [r]_\times [r]×表示与向量 r r r关联的反对称矩阵。与第 i i i个语义元素对应的协方差矩阵由以下方式计算:

C m i = R v i Σ i R v i T ( 11 ) C_{mi} = R_{vi} \Sigma_i R_{vi}^T\qquad(11) Cmi=RviΣiRviT(11)

最后,可以在语义点云和共享相同语义标签的地图元素的最近点之间建立关联。

5.实验

5.1 实验配置

实验基于NVIDIA Jetson AGX Xavier平台,激光雷达采样率10Hz,利用RTK获取并同步车辆定位数据作为真值。图3示出实验场景及对应高精地图,包括两个房山城市区域(总面积0.30km x 0.25km,全长2.0km)、嘉善测试场0.20km内部道路及机场4.0km路段。方法参数中,卡尔曼滤波器的状态转移与测量模型初试方差设为0.1和2.0,点丢弃概率参数定为50.0。

在这里插入图片描述
图3|实验场景(上方)及其对应的高精地图(下方)。(a) Fangshan1 (b) Jiashan © Fangshan2 (d) Airport©️【深蓝AI】编译

5.2 道路标记检测评估

本小节通过精确度和召回率指标评估了道路标记检测方法的性能。实验中,80%的手动标注LiBEV数据用于训练,剩余20%用于测试。手动注解作为真实值,用于评估检测方法的精确度和召回率。当检测实例与标注实例的交并比(IoU)超过0.5且共享同一语义标签时,判定为真阳性;反之,未找到匹配实例则为假阳性,而未检测到真实存在的实例为假阴性。

在这里插入图片描述
表I|本文方法支持的所有类型道路标记的精确度、召回率和F1分数©️【深蓝AI】编译

表I概览了9类道路标记检测的精确度、召回率与F1分数,证实了方法对典型道路特征高精度识别的能力。尽管路缘和人行横道的精确度稍逊,受其与车道线视觉相似性的限制,但HD地图配准有效抑制了误检影响。该方案不仅成效显著,且运行高效,满足实时车辆感知需求,详述见D节。

5.3 定位性能评估

SG-ICP算法通过横向、纵向及偏航误差评估,跨八组实验序列,涵盖四场景七配置,彰显其适应性。对比通用ICP算法(表II),SG-ICP多数序列表现更优,尤其在侧向与偏航精度上,得益于其对充分约束方向的强化处理。

在这里插入图片描述
图4|使用由RTK提供的真实轨迹,对比了SG-ICP和ICP估计的轨迹©️【深蓝AI】编译

图4展示了基于SG-ICP和基于ICP两种方法估计的轨迹与通过RTK获取的真实值的对比可视化。值得注意的是,SG-ICP和ICP的显著定位误差分别用紫色和红色线条标记,其中估计距离误差超过2.0米或偏航误差超过5.0度。从图4可以看出,在所有序列中,SG-ICP相较于ICP显著减少了大量定位误差的发生。

在这里插入图片描述
表II|与通过RTK获得的真实值相比的平均定位误差©️【深蓝AI】编译

总的来说,所提出的方法在多种环境场景和不同类型激光雷达传感器下实现了厘米级的横向定位精度。测试的传感器包括VLP-32C、Hesai-Pandar64和Hesai-XT16传统机械激光雷达,还包括HAP固态激光雷达。全面说明了该方法在不同场景和传感器类型下的鲁棒性和适应性。此外,如表II所示,纵向误差略大于横向误差,这一点值得关注。在自动驾驶发生的城区道路场景中,大部分道路标记沿纵向呈线性形状。尽管如此,本文的方法保证了纵向误差保持在0.20米以下,确保了其在自动驾驶应用中的有效性。

5.4 运行时间评估

在八个序列进行的实验中,本文方法每个子步骤的运行时间在表III中,箱型图可在图5中。值得注意的是,检测子步骤的运行时间分为CPU时间和GPU时间。CPU时间指的是CPU处理步骤所消耗的时间,包括高反射点分割、概率局部地图更新和LiBEV图像生成。GPU时间指的是LiBEV图像实例分割的推断时间。配准子步骤仅由CPU处理。可以看到,当使用车载处理器XAVIER时,整个方法的平均运行时间和最大运行时间在各种场景和激光雷达传感器类型下始终低于50毫秒和200毫秒。

在这里插入图片描述
图5|一个箱线图,说明了所提出方法中每个子步骤的时间消耗情况©️【深蓝AI】编译

在这里插入图片描述
表III|所提出方法中每个子步骤的运行时间©️【深蓝AI】编译

此外,值得一提的是,在S1序列上的运行时间仅比S2序列长8.35毫秒,尽管S1的数据量是S2的两倍(如表II的激光雷达类型列所示)。说明运行时间并没有随着点云数据量的增加而线性增长,因为通过概率丢弃策略,聚合局部地图点的数量大幅减少。

5.5 鲁棒性评估

为了测试鲁棒性,本文在不同的车速下评估了定位误差,如表IV所示。在Fangshan1场景中,使用1台Hesai-Pandar64激光雷达,车辆分别以20、40和60公里/小时的速度行驶。然后,将得到的结果与RTK提供的真实值进行对比。

在这里插入图片描述
表IV|不同速度的定位误差©️【深蓝AI】编译

如表IV所示,尽管随着更高的驾驶速度,定位误差略有上升,但本文方法始终保持较高的定位精度水平。这证明了该方法在不同车辆速度下的鲁棒性。关于实时性能,如表IV所示,整体系统运行时间几乎不受车速增加的影响,表明了系统在处理车速变化时的鲁棒性。

在这里插入图片描述
图6|直方图展示了在Fangshan1场景中,(a)晴天和(b)雨天的激光雷达强度分布情况©️【深蓝AI】编译

在这里插入图片描述
图7|在Fangshan1场景中,(a)晴天和(b)雨天的LiBEV图像。像素颜色基于强度值,其中绿色代表高强度,红色代表低强度©️【深蓝AI】编译

在这里插入图片描述
表V|在不同路面条件下的定位误差©️【深蓝AI】编译

为了展示不同天气条件下的鲁棒性,本文在不同环境下进行了实验。如图6所示,干路面和湿路面上雷达点云的强度分布(晴天和雨天)表现出显著差异。因此,雨天对基于强度的道路标记提取构成重大挑战,尤其是对于依赖固定强度阈值的方法。图7展示了在晴天和雨天条件下生成的LiBEV图像。很明显,本文方法即使在由不同天气条件引起的不同的强度分布情况下,也能持续提供稳定和准确的分割结果。表V呈现了在Fangshan1场景中,使用1台Hesai-Pandar64激光雷达,在干地和湿地面上定位误差的对比。尽管在湿地上定位误差增加,但仍能确保平均横向误差在0.10米以内,纵向误差在0.20米以内。这些结果证明了本文方法在不同天气条件时的鲁棒性。

6.结论

本文介绍了一种基于激光雷达的在线环境感知与定位系统,利用自适应分割技术提高道路标记检测的效率,并设计了SG-ICP来实现语义信息的配准,再城市环境中的大量实验说明了该系统的有效性和鲁棒性。然而,本文的方法无法应用于地面无道路标记的道路上。在未来的工作中,本文将探索有效利用地面以上信息的方法,以提高定位的鲁棒性。

编译|蒙牛二锅头

审核|Los

移步公众号【深蓝AI】,第一时间获取自动驾驶、人工智能与机器人行业最新最前沿论文和科技动态👇

深蓝AI·赋能AI+智驾+机器人

相关文章:

基于视觉的语义匹配见多了,那基于雷达的呢?

论文题目: LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection 论文作者: Yansong Gong, Xinglian Zhang, Jingyi Feng, Xiao He and Dan Zhang 作者单位:北京驭势科技有限公司 导读&#xff…...

01、爬虫学习入门

爬虫:通过编写程序,来获取获取互联网上的资源 需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或内容 一、入门程序 #使用urlopen来进行爬取 from urllib.request import urlopen url "http://www.ba…...

我与C语言二周目邂逅vlog——6.文件操作

1. 为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久…...

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…...

HTTP代理揭秘:这些场景你都用对了吗?

HTTP代理是网络中常见的一种工具,可以帮助我们提升网络安全性和隐私保护,优化网络访问速度。本文将详细介绍什么是HTTP代理及其适用的场景。 HTTP代理是介于客户端(如浏览器)和服务器之间的中间服务器。它接收客户端的HTTP请求&a…...

电动汽车充电技术及运营知识问答pdf

电动汽车充电技术及运营知识问答 作者:马银山编著 出版社:北京:中国电力出版社 ISBN:9787512320406 资源大小:16.99MB 目录: http://literalink.top/resource/detail/7181601144102195200 第一章 电动汽车基本知识 1 1-1什么是电动汽车? 11-…...

playbooks 分布式部署 LNMP

1、环境配置 ansible 服务器 192.168.10.10nginx 服务器 192.168.10.20mysql 服务器 192.168.10.21php 服务器 192.168.10.22 2、安装 ansble #192.168.10.10节点 yum install -y epel-release #先安装 epel 源 yum install -y ansible配置主机清单 …...

成为git砖家(8): 使用 git log 查询范围内的 commit

文章目录 1. 查询 git log 的文档2. 不带任何参数: git log 啥意思&#xff1f;3. git log 最主要功能是什么&#xff1f;4. git log <commit1>..<commit2> 什么意思5. 查看最近n次commit6. References 1. 查询 git log 的文档 git help log --web市面上针对 git …...

Win10出现错误代码0x80004005 一键修复指南

对于 Windows 10 用户来说&#xff0c;错误代码 0x80004005 就是这样一种迷雾&#xff0c;它可能在不经意间出现&#xff0c;阻碍我们顺畅地使用电脑。这个错误通常与组件或元素的缺失有关&#xff0c;它可能源自注册表的错误、系统文件的损坏&#xff0c;或者是软件的不兼容。…...

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表&#xff08;尽量使用列表初始化&#xff09; 二. static成员 2.1static成员初始化 三.友元 3.1友元&#xff1a;提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫…...

java RestClientBuilder es 集群 鉴权

在Java中使用RestClientBuilder连接到Elasticsearch集群并进行鉴权&#xff0c;可以通过设置HttpHosts、RequestConfig以及添加相应的Header来实现。 以下是一个示例代码&#xff1a; import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.htt…...

【OpenCV】中saturate_cast<uchar>的含义和用法是什么?

saturate_cast<uchar>主要是为了防止颜色溢出操作&#xff08;0~255&#xff09; if(data<0) data0; elseif(data>255) data255;...

【数据结构】哈希表二叉搜索树详解

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f341;1. 二叉搜索树 二叉搜索树也称为二叉查找树或二叉排序树&#xff0c;是一种特殊的二叉树结构&#xff0c;它的特点是&#xff1a; 1. 若左树不为空&am…...

【SpringBoot】参数传递之@ModelAttribute

ModelAttribute标注的方法会在Controller类的每个映射URL的控制执行方法之前执行。 ModelAttribute public void findUserById(PathVariable("userId") Long userId,Model model){ model.addAttribute("user",userService.findUserById(userId)); } GetM…...

frp搭建ssh内网穿透

frp软件包下载 检查外网服务器架构 uname -i官网下载对应的版本 https://github.com/fatedier/frp/releases 使用wget或拷贝文件到外网服务器/opt目录下并解压 解压得到frp_0.59.0_linux_amd64文件夹 tar -zxvf frp_0.59.0_linux_amd64.tar.gzfrpc 这是 frp 的客户端可执…...

OpenCV库学习之cv2.normalize函数

OpenCV库学习之cv2.normalize函数 一、简介 cv2.normalize是OpenCV库中的一个函数&#xff0c;用于对图像进行归一化处理。归一化是一种线性变换&#xff0c;可以将图像像素值的范围缩放到指定的区间。这种操作在图像处理中非常有用&#xff0c;特别是在需要将图像数据用于某些…...

LINUX操作系统安全

一、概述内容 操作系统负责计算机系统的资产管理&#xff0c;支撑和控制各种应用程序运行&#xff0c;为用户提供管理计算机系统管理接口。操作系统也是构成网络信息系统的核心关键组件&#xff0c;其安全可靠性决定了计算机系统的安全性和可靠性。 操作系统安全是指满足安全…...

vue3.0学习笔记(三)——计算属性、监听器、ref属性、组件通信

1. computed 函数 定义计算属性&#xff1a; computed 函数&#xff0c;是用来定义计算属性的&#xff0c;计算属性不能修改。 计算属性应该是只读的&#xff0c;特殊情况可以配置 get set 核心步骤&#xff1a; 导入 computed 函数 执行函数 在回调参数中 return 基于响应…...

Elasticsearch面试三道题

针对Elasticsearch的面试题&#xff0c;从简单到困难&#xff0c;我可以给出以下三道题目&#xff1a; 1. Elasticsearch的基本概念与优势 问题&#xff1a;请简要介绍Elasticsearch是什么&#xff0c;并说明它相比传统数据库的优势有哪些&#xff1f; 答案&#xff1a; El…...

大厂面经:大疆嵌入式面试题及参考答案(4万字长文:持续更新)

目录 Linux 系统调用的过程,中间发生了什么? 表格总结 Linux 中断流程,谈谈你对中断上下文的理解 中断流程 中断上下文理解 Linux schedule() 函数的原理和调用的时机 schedule() 函数原理 调用时机 页表实现机制,分页的缺点? 页表机制 分页的缺点 介绍操作系…...

数据结构【有头双向链表】

目录 实现双向链表 双向链表数据 创建双向链表 初始化双向链表创建&#xff08;哨兵位&#xff09; 尾插 打印双向链表 头插 布尔类型 尾删 头删 查询 指定位置后插入 指定位置删除数据 销毁 顺序表和链表的分析 代码 list.h list.c test.c 注意&#xff1a…...

docker 安装jenkins详细步骤教程

Jenkins 是一个开源的持续集成(CI)和持续部署(CD)工具,用于自动化软件开发过程中的构建、测试和部署。 特点和功能: 持续集成:Jenkins 可以自动触发构建过程,检查代码变更并进行构建、测试和部署,以确保团队的代码始终保持可集成状态。 插件生态系统:Jenkins 拥有丰富…...

C++模板函数

C模板函数 函数模板简单的函数模板模板类型推导返回输入的类型&#xff0c;模板返回的类型由输入的决定返回类型的模板参数返回值使用auto&#xff0c;编译器自动推导 默认模板实参模板参数重载函数模板 constexpr关键字 函数模板 简单的函数模板 typename 可以使用class代替…...

c#中的正则表达式和日期的使用(超全)

在 C# 中&#xff0c;正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的文本处理工具&#xff0c;用于执行各种字符串搜索、替换和验证任务。以下是一些常用的正则表达式示例及其用途&#xff1a; 1. 邮箱地址验证 ​ string emailPattern "^[^\s][^…...

论文阅读【检测】:商汤 ICLR2021 | Deformable DETR

文章目录 论文地址AbstractMotivation技术细节多尺度backbone特征MSDeformAttention 小结 论文地址 Deformable DETR 推荐视频&#xff1a;bilibili Abstract DETR消除对目标检测中许多手工设计的组件的需求&#xff0c;同时表现出良好的性能。然而&#xff0c;由于Transfor…...

dpdk发送udp报文

dpdk接收到udp报文后&#xff0c;自己构造一个udp报文&#xff0c;将收到的报文中的源mac&#xff0c;目的mac&#xff0c;源ip&#xff0c;目的ip&#xff0c;源端口和目的端口交换下顺序填充到新的udp报文中&#xff0c;报文中的负载数据和收到的udp保持一致。 注&#xff1…...

网站后端管理和构建java项目的工具-Maven

maven是用于管理和构建java项目的工具。 管理Jar包 无论是使用eclipse、IDEA创建的maven项目&#xff0c;格式都是统一的。 不同开发工具创建的maven项目兼容。 test是对main测试的代码。main中的resources中放置配置文件。 对于Maven&#xff0c;一个Maven项目就是一个对象…...

深入理解计算机系统 CSAPP 家庭作业11.10

A: //home.html <form action"/cgi-bin/adder" method"GET"><ul><li><label for"n1">n1:</label><input type"text" id"n1" name"n1" /> //name的值决定页面提交后&#xf…...

Unity3D 二进制序列化器详解

前言 在Unity3D开发中&#xff0c;二进制序列化是一种重要的数据持久化和网络传输技术。通过二进制序列化&#xff0c;游戏对象或数据结构可以被转换成二进制格式&#xff0c;进而高效地存储于文件中或通过网络传输。本文将详细介绍Unity3D中的二进制序列化技术&#xff0c;包…...

js_拳皇(上)

文章目录 架构设计&#xff1a;一图胜千言绪论不能正常加载动图设计的思路渲染画布开发感想角色抽象为矩形ctx 是 canvas 的对象键盘控制角色Set键盘事件流程图在 canvas 里面使用 gif 图片继承存储动作ReferenceError: gif is not definedTypeError: Cannot read properties o…...

TCP请求如何获取客户端真实源IP地址

应用场景 在基于TCP的应用程序中&#xff0c;获取客户端真实源IP地址可以用于以下应用场景&#xff1a; 访问控制和安全策略&#xff1a;通过获取客户端真实源IP地址&#xff0c;应用程序可以实施访问控制策略&#xff0c;限制或允许特定IP地址的访问。这可以用于身份验证、防…...

【b站-湖科大教书匠】6 应用层 - 计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 6 应用层 6.1 应用层概述 6.2 客户-服务器方式和对等方…...

QT串口和数据库通信

创建串口 串口连接客户端并向服务器发送消息 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network QT core gui…...

WebKitWebKit简介及工作流程

简介 引擎能够解析HTML、CSS、JavaScript等网页标准&#xff0c;从而将互联网内容呈现给用户。 WebKit的主要特点包括&#xff1a; 开源性&#xff1a;它是一个开源项目&#xff0c;任何人都可以查看、修改和贡献代码。跨平台&#xff1a;WebKit可以在多个操作系统上运行&am…...

架构分析(CPU:ARM vs RISC-V)

ARM N2 ARM V2 对比 N2和V2&#xff0c;整体架构具有一致性。保证 SiFive P870 P870 Pipeline Veyron V1...

使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

前言 RabbitMQ 是一个功能强大的开源消息队列系统&#xff0c;它实现了高效的消息通信和异步处理。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验。 特点 成熟&#xff0c;稳定消息持久化灵活的消息路由高性能&#xff0c;高可用性&#xff0c;可扩展性高支…...

前端八股速通(持续更新中...)

1、深拷贝和浅拷贝的区别 浅拷贝&#xff1a;浅拷贝是拷贝一层&#xff0c;引用类型共享地址。 如果属性是基本类型&#xff0c;拷贝的就是基本类型的值。 如果属性是引用类型&#xff0c;拷贝的就是内存地址。 意思是&#xff0c;当进行浅拷贝时&#xff0c;对于对象的每一…...

【语音识别和生成】语音识别和语音合成技术

语音识别和生成&#xff1a;语音识别和语音合成技术 目录 引言语音识别技术 语音识别的基本原理语音识别系统的组成语音识别的关键技术 语音合成技术 语音合成的基本原理语音合成系统的组成语音合成的关键技术 语音识别和生成的应用 智能助理智能家居语音翻译医疗健康教育和学…...

Redis#架构师面试题

1、Redis锁存在哪些问题及如何解决&#xff1f; 1、死锁问题 加过期时间设定 2、原子性问题 通过“set…nx...ex…”命令&#xff0c;将加锁、过期命令编排到一起&#xff0c;它们是原子操作了&#xff0c;可以避免死锁。 3、释放其他线程的锁问题 当过期时间设置小于线程…...

关于#define的使用方法总结

文章目录 #define 预处理指令一、#define宏定义二、查看预处理文件三、#define 的使用方法四、C语言宏中“#”和“##”的用法五、常见的宏定义总结六、常考题目 #define 预处理指令 #define 是 C 和 C 编程语言中的预处理指令&#xff0c;用于定义宏&#xff08;macro&#xf…...

Unity顶点动画(Vertex Animation):创造动态视觉效果

在Unity中&#xff0c;顶点动画(Vertex Animation)是一种强大的技术&#xff0c;它允许开发者直接在顶点级别上操作和变形网格&#xff0c;从而实现各种动态视觉效果。顶点动画不依赖于骨骼绑定&#xff0c;因此非常适合模拟布料、流体、面部表情等复杂的动画效果。本文将探讨顶…...

WSL for Windows

1、安装 超详细Windows10/Windows11 子系统&#xff08;WSL2&#xff09;安装Ubuntu20.04&#xff08;带桌面环境&#xff09;_wsl安装ubuntu20.04-CSDN博客https://blog.csdn.net/weixin_44301630/article/details/122390018 注意&#xff0c;安装之后首次启动 Ubuntu 时&…...

Matlab freqz 代码简单实现

相关代码打开matlab源码也可以看到&#xff0c;这里做了简单实现&#xff0c;与源码并不完全一样。 实现代码 [h2 w2] freqzfir(data); [h1 w1] freqz(data); h2h2; h12 [h1, h2];[h4 w4] freqziir(b,a, 2001,true); [h3 w3] freqz(b,a, w4, whole); h4 h4; h34 h…...

待办app哪款好?高效待办软件推荐

在快节奏的现代生活中&#xff0c;一款高效的待办事项管理软件对于提升工作效率和个人时间管理至关重要。面对市场上众多的待办app&#xff0c;哪款才是你的最佳选择呢&#xff1f;经过深入体验和对比&#xff0c;我发现敬业签这款高效待办软件是个不错的选择。 敬业签的快速记…...

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录&#xff0c;有wordpress框…...

攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃

前言 最近看了《中国数据库前世今生》纪录片&#xff0c;感触颇深&#xff0c;也是一直在思考到底该用何种方式起笔来回顾这段筚路蓝缕却又充满民族自豪感的历程。大概构思了一周左右吧&#xff0c;我想&#xff0c;或许还是应该从那个计算机技术在国内刚刚萌芽的年代开始讲起…...

WEB前端12-axios基础

Vue2-axios基础 1.axios基本概念 在现代的前端开发中&#xff0c;处理网络请求是至关重要的一部分。Axios 是一个流行的基于 Promise 的 HTTP 客户端&#xff0c;它可以在浏览器和 Node.js 环境中使用。它的设计简单易用&#xff0c;支持并行请求、拦截器、CSRF 防护等特性&a…...

Ubuntu 防火墙设置

目录 1. 安装防火墙 2. 开启和关闭防火墙 3. 开放端口和服务规则 4. 关闭端口和删除服务规则 5. 查看防火墙状态 1. 安装防火墙 如果已经安装就忽略 # 安装ufw&#xff08;Uncomplicated Firewall&#xff09;&#xff0c;这是Ubuntu上管理防火墙的一个简单工具 sudo ap…...

JL 跳转指令的理解

一般情况下&#xff0c;JU 和 JC 是最常见的跳转指令&#xff1b;但有时会用到JL 指令&#xff0c;JL 说起来更像是一组指令&#xff0c;类似C,C# 语言中的 switch case 语句&#xff0c;但是有个明显的不同&#xff0c;前者的判断条件可以是任意合理数字&#xff0c;后者范围…...

vue大屏展示组件库datav

主要用于构建大屏数据展示页面&#xff0c;具有多种类型组件可供使用。详情参考 datav官网 一、安装 npm 安装 npm install jiaminghi/data-viewyarn安装 yarn add jiaminghi/data-view二、使用 在main.js中注册为全局组件 import dataV from jiaminghi/data-view Vue.us…...