摘要

可靠准确的定位和建图是大多数自主系统的关键组成部分。除了地图环境的几何信息外,语义对智能导航行为的实现也起着重要作用。在大多数现实环境中,由于移动对象引起的动态会导致这个任务特别复杂。在本文中,我们提出了一种基于表面的制图方法的扩展,利用三维激光扫描集成语义信息来促进制图过程。利用全卷积神经网络有效地提取语义信息,并在激光距离数据的球面投影上进行渲染。这种计算的语义分割结果为整个扫描的点添加标签,允许我们建立一个语义丰富的带标签的面元地图。这种语义建图使我们能够可靠地过滤运动目标,同时也通过语义约束改善了投影扫描匹配。我们对来自KITTI数据集的具有挑战性的高速公路序列的实验评估显示,与纯几何的、最先进的方法相比,我们的语义SLAM方法具有优势,该数据集具有很少的静态结构和大量的移动汽车。

引言

准确的定位和未知环境的可靠测绘是大多数自动驾驶汽车的基础。这类系统通常在高度动态的环境中运行,这使得生成一致的地图变得更加困难。此外,需要关于建图区域的语义信息来实现智能导航行为。例如,自动驾驶汽车必须能够可靠地找到合法停车的位置,或在乘客安全出口可能的地方靠边停车,即使是在从未见过的、因此之前没有精确地图的位置。
在这项工作中,我们提出了一种新的方法同步定位和建图(SLAM),能够使用三维激光距离扫描生成语义地图。**我们的方法利用了LiDAR SLAM[2]的思想,并结合了由全卷积神经网络(FCN)[20]生成的语义分割获得的语义信息。**这允许我们生成高质量的语义地图,同时改善地图的几何形状和里程计的质量。
FCN为激光扫描测距的每个点提供类别标签。**我们首先使用球面投影执行高效的点云处理,然后将二维球面投影的分类结果反投影到三维点云上。**然而,反向投影引入了人工现象,我们通过两步过程来减少这种现象,即先对语义标签进行侵蚀,然后再对语义标签进行基于深度的填充。语义标签随后被集成到基于面元的地图表示中,并用于更好地将新的观测结果注册到已经建立的地图中。此外,当在更新地图时,我们通过在新的观测和世界模型之间使用语义一致性检测方法去过滤移动物体。通过这种方式,我们降低了将动态对象集成到建图中的风险。图1显示了语义建图表示的一个示例。语义类别由FCN生成,该FCN由Behley等人[1]使用SemanticKITTI数据集进行训练.
本文的主要贡献是将语义集成到基于面元的地图表示中,以及利用这些语义标签过滤动态对象的方法。总之,(1)能够准确地建图一个环境,特别是在有大量的移动对象的情况下,(2)比相同的建图系统能够实现更好的性能,简单地删除可能在一般环境中是移动的对象,包括在城市、农村,和高速公路场景。我们在具有挑战性的KITTI[10]序列上实验评估了我们的方法,并显示了我们的基于面元的语义建图方法(称为SuMa++)的优越性能,与纯粹的基于面元的几何建图相比,并比较了基于类标签删除所有潜在移动对象的建图。我们的方法的源代码可在:

相关工作

里程计估计和SLAM是机器人领域的经典主题,有许多概述文章涵盖了大量的科学工作[?]],[6],[27]。本文主要研究基于学习方法和动态场景的语义SLAM的相关工作。
出于深度学习的进步和卷积神经网络(cnn)场景理解,有很多语义SLAM技术利用这些信息使用相机[5]、[30],相机+ IMU数据[4],立体相机[9],[14],[17],[32],[37],或RGB-D传感器[3],[18],[19],[25],[26],[28],[38]。这些方法大多只应用在室内,使用目标检测器或摄像机图像的语义分割。相比之下,我们只使用激光距离数据,并利用语义分割的信息,对激光雷达扫描生成的深度图像进行操作。
也有大量的文献处理定位和建图变化的环境,例如通过过滤移动目标[13],考虑匹配[21]中的残差,或者利用序列信息[33]。为了实现户外大规模语义SLAM,还可以将3D LiDAR传感器与RGB相机相结合。Yan等人[36]将二维图像与三维点进行关联,以改进检测运动目标的分割。Wang和Kim[34]使用来自KITTI数据集[10]的图像和3D点云,通过应用相对位置先验,在语义上联合估计道路布局和分割城市场景。Jeong等人[11],[12]也提出了一种基于多模态传感器的语义三维建图系统,以改进大规模环境以及特征较少环境下的分割结果。Liang等人提出了一种新的三维物体检测器,可以利用激光雷达和相机数据来执行精确的目标定位。所有这些方法都侧重于结合3D激光雷达和摄像机来改进目标检测、语义分割或3D重建。最近由Parkison等人[22]开发了一种点云配准算法,直接将基于图像的语义信息合并到两点云之间的相对变换估计中。Zaganidis等人的后续工作[39]实现了激光雷达结合图像和激光雷达仅语义三维点云配准。这两种方法都使用语义信息来改进姿态估计,但由于处理时间较长,不能用于在线操作。
与本文提出的方法最相似的是Sun et al.[29]和Dube et al.[8],他们只用一个激光雷达传感器实现语义SLAM。Sun等人[29]提出了一种语义建图方法,它被表述为一个序列到序列的编码-解码问题。Dube等人[8]提出了一种SegMap方法,该方法基于从点云中提取的段,并给它们分配语义标签。它们的主要目的是在语义类类型非常有限的情况下,提取有意义的特征,用于全局检索和多机器人协同SLAM。与之相反,我们专注于生成包含大量语义类的语义地图,并使用这些语义过滤由动态对象(如移动的车辆和人)引起的异常值,以提高地图和里程计的准确性。

文章的方法

我们的语义SLAM方法的基础是基于面元的Mapping (SuMa)[2]方法,我们通过使用如图2所示的FCN RangeNet++[20]来集成语义分割提供的语义信息来扩展该方法。标签是由RangeNet++使用点云的球面投影提供的。然后利用该信息对动态目标进行过滤,并在扫描配准中添加语义约束,提高了SuMa姿态估计的鲁棒性和准确性。

A.Notation

我们用TBA∈R4×4T_{BA}\in R^{4\times 4}TBA​∈R4×4表示坐标系AAA中的点pAp_ApA​到坐标系BBB中的点pBp_BpB​的变换,使pB=TBApap_B = T_{BA}p_apB​=TBA​pa​。设RBA∈SO(3)R_{BA}\in SO(3)RBA​∈SO(3)和tBA∈R3t_{BA}\in R^3tBA​∈R3表示变换TBAT_{BA}TBA​的相应旋转和平移部分。
我们称时间步长ttt处的坐标系为CtC_tCt​。坐标系CtC_tCt​中的每个变量通过姿态TWCt∈R4×4T_{WC_t}\in R^{4\times 4}TWCt​​∈R4×4与世界坐标系WWW相关联,将观测到的点云转化为世界坐标系。

B.基于面元的建图

我们的方法依赖于SuMa,但在这里我们只总结与我们的方法相关的主要步骤,并参考原始论文[2]的更多细节。SuMa首先生成点云PPP在时间步长ttt处的球面投影,即所谓的顶点建图VDV_DVD​,然后用它生成相应的法向建图NDN_DND​。有了这些信息,SuMa通过在时间步长t−1t - 1t−1的渲染地图视图VMV_MVM​和NMN_MNM​中的投影ICP来确定位姿更新TCt−1CtT_{C_{t - 1}C_t}TCt−1​Ct​​,进而通过链接所有位姿增量来确定TWCtT_{WC_t}TWCt​​。
地图由面元表示,其中每个面元由位置vs∈R3v_s\in R^3vs​∈R3,法线ns∈R3n_s\in R^3ns​∈R3,和半径rs∈Rr_s\in Rrs​∈R定义。每个面元额外携带两个时间戳:创建时间戳tct_ctc​和通过测量的最后一次更新的测量时间戳tut_utu​。此外,使用二值贝叶斯滤波器[31]来确定一个面元是稳定的还是不稳定的,从而维持一个稳定对数比值lsl_sls​。SuMa还通过随后的姿态图优化执行闭环检测,以获得全局一致的建图。

C.语义分割

对于每一帧,我们使用RangeNet++[20]来预测每个点的语义标签并生成语义建图SDS_DSD​。RangeNet++语义分割由每个激光扫描的球面投影生成的距离图像。简单地说,该网络基于Wu等人[35]提出的SqueezeSeg架构,并使用了Redmon等人[24]提出的DarkNet53,通过使用更多的参数来提高结果,同时保持方法的实时性。关于语义分割方法的更多细节,参考Milioto et al.[20]的论文。传感器视野内点方向标签的可用性也使得将语义信息集成到地图中成为可能。为此,我们为每个面元添加估计的语义标签yyy和语义分割中该标签的相应概率。

D.精细语义地图

由于RangeNet++的网络下采样导致投影输入和块状输出,当标签被重新投影到建图时,我们必须处理语义标签的错误。为了减少这些误差,我们使用了泛填充算法,总结在Alg. 1。它位于预处理模块内部,该模块使用来自顶点建图VDV_DVD​的深度信息来精炼语义掩码SDS_DSD​。
填充的输入是由RangeNet++生成的原始语义掩码SrawS_{raw}Sraw​和相应的顶点建图VDV_DVD​。掩码SrawS_{raw}Sraw​中每个像素的值都是一个语义标签。顶点图中对应的像素包含了激光雷达坐标系中最近的三维点的三维坐标。该方法的输出是改进的语义掩码SDS_DSD​。
考虑到目标边界的预测不确定性高于目标[15]中心,我们在填充过程中采用了以下两个步骤。第一步是去除半径为ddd的边界像素或者错误像素(至少一个不同语义标签的像素)从而导致被侵蚀的掩模SrawS_{raw}Sraw​被侵蚀。将这个掩模与顶点建图VDV_DVD​生成的深度信息相结合,然后填充侵蚀的掩模。为此,如果对应点的距离一致,即小于阈值θ,我们将空的边界像素的标签设为相邻标签像素。
该算法的中间步骤如图3所示。注意,与原始预测相比,过滤后的语义建图包含的细节更少。例如,建筑物墙上的错误标签大都被纠正了,如图3(e)所示。

E.使用语义过滤动态物体

大多数现有的SLAM系统依赖几何信息来表示环境,并将观测结果与地图联系起来。它们在假定环境基本是静态的情况下工作得很好。然而,世界通常是动态的,特别是在考虑驾驶场景时,一些传统的方法不能考虑移动物体引起的动态场景变化。因此,在这种情况下,移动的物体可能会导致观测结果和地图之间的错误关联,必须谨慎对待。通常,SLAM方法使用某种异常值拒绝,要么通过直接过滤观测数据,要么通过构建建图表示来过滤掉由移动对象引起的变化。
在我们的方法中,我们利用语义分割提供的标签来处理移动对象。更具体地说,当我们更新地图时,我们通过检查新的观测SDS_DSD​和世界模型SMS_MSM​之间的语义一致性来过滤动态。
如果标签不一致,我们假设这些面元属于在扫描之间移动的对象。因此,我们在递归贝叶斯滤波器稳定性项的计算中加入了惩罚项。经过几次观察,我们可以去除不稳定面元。通过这种方法,我们实现了动态检测和最终去除。
更准确地说,我们通过给它的稳定对数比lsl_sls​来惩罚这个面元,lsl_sls​更新如下:
(1)
其中odds(p)=log(p(1−p)−1)odds(p) = log(p(1-p)^{-1})odds(p)=log(p(1−p)−1)和pstablep_{stable}pstable​和ppriorp_{prior}pprior​分别是给定一个兼容测量和先验概率的稳定面元的概率。exp(−x2σ−2)exp(-x^2σ^{-2})exp(−x2σ−2)项用于解释噪声测量,其中ααα是面元的法向量nsn_sns​和要积分的测量法向量之间的角度,ddd是测量相对于相关面元的距离。测量法线取自NDN_DND​,对应于帧到模型ICP,详见[2]。
Pomerleau等人提出了一种通过存储速度的时间轨迹来推断地图中主导运动模式的方法,而不是使用语义信息。与我们的方法相反,他们的方法需要一个给定的全局地图来估计当前扫描中的点的速度。此外,他们的机器人姿态估计是相当准确的.
在图4中,我们展示了我们的过滤方法与简单地从对应于可移动对象的类中删除所有曲面相比的效果。当使用朴素方法时,停靠汽车上的面元被删除,即使这些可能对增量姿态估计有价值的特征。利用该过滤方法,我们可以有效地去除动态异常值,获得一个更清晰的语义世界模型,同时避免了静态对象(如停放的汽车)的面元。这些静态对象对于ICP是有价值的信息,简单地删除它们可能会由于缺少对应而导致迭代失败。

F.语义ICP

为了进一步改进帧到模型的姿态估计,我们在优化问题中加入了语义约束,这有助于降低离群值的影响。ICP的误差最小化函数:
(2)
其中每个顶点u∈VDu\in V_Du∈VD​被投影到一个参考顶点vu∈VMv_u\in V_Mvu​∈VM​和它的法向量nu∈NMn_u\in N_Mnu​∈NM​通过
(3,4)
rur_uru​和wuw_uwu​分别是相应的残量和权重。
对于最小化,我们使用高斯-牛顿方法,通过迭代求解增量δδδ
(5)
其中W∈Rn×nW\in R^{n\times n}W∈Rn×n是一个对角矩阵,包含权重wuw_uwu​对应的每个残差rur_uru​,r∈Rn×nr\in R^{n\times n}r∈Rn×n是堆叠的残差向量,J∈Rn×6J\in R^{n\times6}J∈Rn×6是RRR相对于增量δδδ的雅可比矩阵。除了硬关联和Huber规范加权外,我们还添加了来自更高层次语义场景理解的额外约束来对残差进行加权。这样,我们可以将语义和几何信息结合起来,使ICP过程对离群点更有鲁棒性。
在ICP中,在第kkk次迭代中,残差ru(k)r^{(k)}_uru(k)​的权值wu(k)w^{(k)}_uwu(k)​如下所示:
(6)
其中ρHuber(r)ρ_{Huber}(r)ρHuber​(r)对应于Huber范数,由:
(7)
对于语义相容性Csemantic((yu,Pu),(yvu,Pvu))C_{semantic}((y_u,P_u),(y_{v_u},P_{v_u}))Csemantic​((yu​,Pu​),(yvu​​,Pvu​​)),定义为:
(8)
即利用预测标签的确定性来加权残差。通过Ⅱ{a}Ⅱ\{a\}Ⅱ{a},如果参数aaa为真,则指示函数为1,否则为0。
图5为扫描时可见有两辆车行驶的高速公路场景的加权过程,如图5(a)所示。注意,我们使用语义对动态进行过滤,如第III-E节所述,从地图中删除了移动的汽车,见图5(b)。因此,我们也可以在图5©中看到对应较低强度的低权重,因为观测的类别与地图不一致。

实验部分

实验评价主要是为了支持我们声称我们是(我)能够准确地建图甚至在大量的移动对象的情况下,我们(ii)能够实现更好的性能比简单地删除可能移动对象在一般环境中,包括城市、农村,和高速公路场景。
为此,我们使用KITTI Vision Benchmark[10]的数据来评估我们的方法,其中我们使用Velodyne HDL-64E S2以10hz速率记录的点云生成。为了评估里程计的性能,该数据集提出计算相对于平移和旋转在不同姿态间距离上的平均误差,并将其平均。地面真位姿是利用惯性导航系统的位姿信息生成的,在大多数序列中,GPS位置参考了一个基站,这使得它相当准确,但通常仍然只是局部一致.
在下面,我们将我们提出的方法(由SuMa++表示)与原始的基于surfer的建图(由SuMa表示)进行比较,并将SuMa与删除所有可移动类(汽车、公共汽车、卡车、自行车、摩托车、其他车辆、人员、自行车、motorcyclist)的语义分割(表示为SuMa nomovable)。
用于语义分割的RangeNet++使用点注释[1]进行训练,使用的是来自KITTI Odometry Benchmark的所有训练序列,这些序列是用于训练目的的标签。这包括序列00到10,除了序列08,因为验证而被忽略了。
我们在Intel Xeon® W-2123和Nvidia Quadro P4000上测试了我们的方法。RangeNet++为每次扫描生成逐点标签平均需要75毫秒,面元mapping平均需要48毫秒,但在某些情况下(在具有多个循环闭包的训练集序列00上),我们最多需要190毫秒来集成循环闭包。

A.KITTI Road Sequences

第一个实验是为了证明我们的方法即使在有许多移动物体的情况下也能够生成一致的地图。我们展示了来自KITTI视觉基准的原始数据的道路类别的序列结果。注意,这些序列不是里程计基准的一部分,因此没有为语义分割提供标签,这意味着我们的网络学会了推断道路驾驶场景的语义类,而不是简单的记忆。这些序列,特别是高速公路序列,对于SLAM方法来说是具有挑战性的,因为这里的大多数对象都是移动的汽车。
此外,道路两旁只有稀疏的明显特征,如交通标志或电线杆。没有建筑角或其他更明显的特征来指导注册过程。在这种情况下,对持续移动的异常值(如交通堵塞中的汽车)的错误对应通常会导致错误估计的姿态变化,从而导致生成的地图的不一致。
图6显示了使用SuMa生成的示例和提出的SuMa++。在纯几何方法的情况下,我们清楚地看到,姿势不能正确估计,因为突出的交通标志显示在不同的位置,导致很大的不一致。在我们提出的方法中,我们能够正确地过滤移动的车辆,相反,我们生成了一个一致的地图,突出显示一致的地图交通标志。在本例中,我们还绘制了SuMa和SuMa++测程结果的相对平移误差。这些点表示每个时间戳中的相对平移误差,曲线是给定点的多项式拟合结果。它表明,SuMa++在这样一个充满挑战的环境中实现了更准确的姿态估计,这些环境中有许多由移动对象引起的异常值。
选项卡。I显示了相对平移和相对旋转误差,图7显示了在这部分数据集上测试的不同方法的相应轨迹。总的来说,我们看到我们提出的方法,SuMa++,生成了更一致的轨迹,在大多数情况下实现了比SuMa更低的平移误差。与移除所有可能移动对象的基准SuMa nomovable相比,我们看到的性能与SuMa++非常相似。这证实了在这种情况下,SuMa性能较差的主要原因是实际移动的对象引起的不一致性。然而,我们将在接下来的实验中表明,去除所有潜在的移动物体也会对城市环境中的姿态估计性能产生负面影响。

B.KITTI Odometry Benchmark

第二个实验旨在表明,与简单地从观察中删除某些语义类相比,我们的方法表现得更好。该评估是在基蒂里程计基准上进行的。
选项卡。II表示相对平移误差和相对转动误差。IMLS-SLAM[7]和LOAM[40]是最先进的基于激光雷达的SLAM方法。在大多数序列中,我们可以看到与最先进的SuMa++相比相似的性能。更有趣的是,SuMa nomovable基线方法出现了分歧,尤其是在城市场景中。
这可能是违反直觉的,因为这些环境包含大量的人造结构和其他更明显的特征。但是有两个原因导致了这种糟糕的性能,当我们查看结果和出现建图错误的场景的配置时,就会发现这两个原因。首先,尽管我们试图改进语义分割的结果,但仍然存在错误的预测,导致地图中实际上是静态的surfers被删除。第二,移除停着的汽车是问题,因为这是对齐扫描的良好和独特的特征。这两种效果都有助于使面元地图更加稀疏。这一点更加重要,因为停放的汽车是唯一独特或可靠的特征。总之,简单地删除某些类至少在我们的情况下是次优的,并可能导致更差的性能。
为了在不可见的轨迹中评估我们的方法的性能,我们上传了我们的结果,以便在未知的KITTI测试序列上进行服务器端评估,这样就不可能对测试集进行参数调优。因此,这可以很好地反映我们的方法在现实世界中的性能。在测试集中,我们获得的平均旋转误差为0:0032 deg/m,平均平移误差为1:06%,与原始SuMa的0:0032 deg/m和1:39%相比,平移误差有所改善。

C.Discussion

地图更新过程中,我们只惩罚面元s动力学的可移动的物体,这意味着我们不惩罚语义静态对象,例如植被,尽管有时叶子的植被变化和植被变化的外观与观点由于激光束,只有从某些观点得到反映。我们这样做的动机是,它们也可以作为很好的地标,例如,树干是静态的,是一个很好的姿态估计特征。此外,采用Huber范数的原始基于几何的离群值剔除机构经常对这些部件进行降权。
我们的方法有一个明显的局限性:我们不能在第一次观察时过滤掉动态对象。一旦在第一次扫描中有大量的运动物体,我们的方法将失败,因为我们不能估计一个适当的初始速度或姿态。我们通过在初始化期间删除所有可能移动的对象类来解决这个问题。然而,一种更稳健的方法是回溯由于观测到的移动状态的变化而产生的变化,从而回溯更新地图。
最后,我们的第二次实验结果令人信服地表明,盲目删除某一组类会降低定位精度,但潜在的移动对象仍然可能从地图的长期表示中删除,以允许表示环境中可能在不同时间点可见的其他遮挡部分。

结论

在本文中,我们提出了一种新的方法来建立语义地图,通过基于激光的点云语义分割,不需要任何相机数据。我们利用这些信息来提高在其他模糊和具有挑战性的情况下的姿态估计精度。特别是,我们的方法利用扫描和建图之间的语义一致性来过滤掉动态对象,并在ICP过程中提供更高级别的约束。这使我们能够成功地结合语义和几何信息,仅仅基于三维激光距离扫描,以获得比纯几何方法更好的姿态估计精度。我们在KITTI Vision Benchmark数据集上评估了我们的方法,显示出与纯几何方法相比,我们的方法的优势。
尽管有这些令人鼓舞的结果,语义建图的未来研究仍有一些途径。在未来的工作中,我们计划研究语义在环路闭合检测中的使用,以及更细粒度的语义信息的估计,如车道结构或道路类型。

SuMa++: Efficient LiDAR-based Semantic SLAM相关推荐

  1. SuMa++:Efficient LiDAR-based Semantic SLAM

    SuMa++:Efficient LiDAR-based Semantic SLAM 摘要 提出了一种扩展的基于表面建图的方法,利用三维激光集成语义信息来促进制图过程. 利用FCNN提取语义信息,并在 ...

  2. SuMa++: LiDAR-based Semantic SLAM

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文由知乎作者robot L授权转载,不得擅自二次转载.原文链接:https://zhuanlan.z ...

  3. 【论文精读】Hybrid Bird‘s-Eye Edge Based Semantic Visual SLAM for Automated Valet Parking

    [论文精读]Hybrid Bird's-Eye Edge Based Semantic Visual SLAM for Automated Valet Parking 论文出处 ICRA2021 摘要 ...

  4. VPS-SLAM: Visual Planar Semantic SLAM for Aerial Robotic Systems

    VPS-SLAM: Visual Planar Semantic SLAM for Aerial Robotic Systems ABSTRACT:室内环境中存在大量的高级语义信息,这些信息可以为机器 ...

  5. 《论文阅读》Efficient LiDAR Odometry for Autonomous Driving

    留个笔记自用 Efficient LiDAR Odometry for Autonomous Driving 做什么 Lidar Odometry激光雷达里程计,里程计作为移动机器人相对定位的有效传感 ...

  6. Semantic SLAM with Autonomous Object-Level Data Association 论文笔记

    Semantic SLAM with Autonomous Object-Level Data Association 系列文章 摘要&介绍 系统框架 目标检测和追踪 目标检测 物体级数据关联 ...

  7. SegFormer: Simple and Efficient Design for Semantic Segmenta

    前言 将 Transformer 与轻量级多层感知 (MLP) 解码器相结合,表现SOTA!性能优于SETR.Auto-Deeplab和OCRNet等网络,代码即将开源! 注1:文末附[视觉Trans ...

  8. 【视觉SLAM】Visual-Based Semantic SLAM with Landmarks for Large-Scale Outdoor Environment

    Z. Zhao, Y. Mao, Y. Ding, P. Ren and N. Zheng, "Visual-Based Semantic SLAM with Landmarks for L ...

  9. 3-论文笔记--《Privacy-preserving and Efficient Aggregation based on Blockchain for Power Grid...》

    题目         <Privacy-preserving and Efficient Aggregation based on Blockchain for Power Grid       ...

最新文章

  1. android打不开链接,安卓的webView的loadUrl打不开,太长的url超链接,求解
  2. 【PMP】知识点总结20170528
  3. 判断windows进程是否存在
  4. 亲测有效的网易云音乐歌单转换到apple music 的方法!
  5. 深入理解python异步编程_深入理解Python异步编程
  6. Codeforces Edu Round 64 A-D
  7. 二、python基础
  8. Django获取请求参数方式
  9. 处理机和处理器的区别
  10. 细等线体cass_CASS打开图形出现字体替换怎么解决?
  11. ToLua 入门06_LuaCoroutine
  12. 全员全域安全守护,蔚来ET7获Euro NCAP五星安全评级背后的硬核实力
  13. 程序员被PUA的一天有多可怕......35 岁,真的是职场荣枯线吗?
  14. 为什么OpenCV4 “pkg-config --modversion opencv”显示“ No package ‘opencv‘ found”?解决方法!
  15. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何 设计。
  16. Aspose.Cells 单元格格式设置 如设置为数字
  17. 51单片机蜂鸣器操作
  18. Java核心技术36讲(个人整理)
  19. 2021年互联网大厂Java面经总结,保准看明白!
  20. 掏心掏肺,教你如何把苍白的人生写成老板都心动的简历

热门文章

  1. 通达信客户端程序化下单
  2. 测试-小程序打码平台
  3. iOS图案解锁(九宫格)
  4. java不是关键字_以下( )不是Java的关键字。_学小易找答案
  5. c语言提供的合法关键字,c语言提供的合法的数据类型关键字是什么
  6. 【codeforces 791A】Bear and Big Brother
  7. Rails 中 scope
  8. python中readlines是什么意思_python中read、readline、readlines之间的区别
  9. GDB内存断点(Memory break)的使用举例
  10. 樊登读书会终身成长读后感_(完整版)《终身成长》读后感