news 2026/10/14 7:16:46

PCL点云VFH特征原理与模板库构建实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PCL点云VFH特征原理与模板库构建实战

1. 为什么识别前要先训练模板库

1.1 VFH描述子到底描述了什么

很多刚接触PCL的朋友问过我:VFH描述子到底是什么?我的回答是,你可以把它理解成点云物体的“指纹”。同样是杯子,不管它是正着放、倒着放、侧着放,只要形状没变,它计算出的VFH特征就应该大体一致;而杯子和盘子之间的特征差异,会明显大于同一物体不同姿态之间的差异。这个性质,就是VFH能用于识别的基础。

VFH全称是Viewpoint Feature Histogram,视点特征直方图。它比我们常用的PFH、FPFH多了一部分“视点信息”。PFH/FPFH描述的是点云局部几何特征,适合做配准;但物体识别更关心的是整个物体的全局特征,并且要尽量不受传感器视角影响。VFH的做法是:先把点云中所有点的法线方向统计成直方图,再引入从视点出发的方向与每个表面法线之间的夹角关系。这样既保留了全局形状信息,又带上了“传感器从哪个方向看到的”这个约束。

具体到PCL实现里,VFH特征算出来是308维的直方图。这308维不是随便定的,它由两部分拼凑而成:一部分是视点相关的直方图,另一部分是扩展的FPFH描述子。默认参数下,视点相关部分会统计45个bin,扩展部分又分成了几个方向分量,加起来正好是308维。这个维度意味着,你可以很自然地把它丢给支持向量机、最近邻分类器,或者直接做模板匹配。

我在实际项目里最常用的做法,不是用VFH做端到端的深度学习分类,而是把它和“聚类识别”配合起来:先对场景点云做分割聚类,拿到一个个独立的目标点云,然后计算每个目标的VFH特征,再和模板库里的特征做最近邻匹配。这样做的好处是实时性可控,可解释性强,出了问题你还能知道是哪一步误差变大。

1.2 模板库在识别流程中的位置

如果你把整个识别流程画成一条流水线,通常会是这样:

  1. 原始点云采集;
  2. 预处理(去噪、下采样、去地面/平面);
  3. 目标分割与聚类;
  4. 计算每个聚类的VFH特征;
  5. 与训练好的模板库比对;
  6. 输出类别和置信度。

上一篇我们讲到了第3步,也就是聚类分割;这一篇要讲的就是第5步之前的训练准备——构建模板库。很多人容易忽略一个事实:模板库的质量,决定了整个识别系统的天花板。你的分类器再强,如果模板库里的特征本身就是畸形的、不完整的,那么匹配出来的结果一定不可靠。

模板库本质上是一组“标准答案”。每个类别(比如“黑色圆柱罐”、“红色工具箱”、“白色塑料筐”)都要有若干个经过预处理和特征提取后的VFH特征向量。这些向量被存成PCD文件或者二进制文件,识别的时候,从场景聚类算出一个VFH向量,然后在这个库里找最相似的。相似度可以用欧氏距离、卡方距离或者直方图相交距离来度量,PCL里有现成的函数。

所以,训练模板库这个环节,核心目标只有一个:让每个类别的特征既能代表该类别的共性,又能容纳合理的姿态变化。要做到这一点,采集样本、做预处理、计算特征、验证特征一致性,每一步都不能马虎。

2. 模板数据采集与预处理

2.1 样本采集的姿势与数量要求

先说样本采集。很多第一次做模板库的人,会犯一个错误:觉得只要每个类别采一个样板就够了。实际上,一个类别至少要有5到10个不同姿态的样本,才能覆盖视点变化。原因很简单:同一物体,你从正上方、斜45度、侧面看过去,点云形状差异很大,VFH特征也会跟着变化。如果模板库只包含一个姿态,那么识别时只有恰好也在那个姿态附近才能命中。

那姿态怎么选?我的经验是,先分析实际识别场景里目标物体最常出现的姿态。比如分拣场景中,物体通常放在传送带上,传感器从正上方俯视,那么你就主要采俯视和略微倾斜的姿态;如果是机械臂抓取,物体可能在料筐里,角度就很随机,那就要尽可能均匀地覆盖球面视角。理论上,采样姿态越密集,识别鲁棒性越好,但模板库也会膨胀,匹配速度变慢。所以要在覆盖度和实时性之间找平衡。

还有一个要点:采集样本时尽量把物体单独放在一个相对空旷的区域内,不要和其他物体紧密挨着。因为后续聚类如果无法把目标完整地分割出来,算出来的VFH特征就是残缺的。哪怕是同一个物体,只采到一半,特征差异也很大。我一直强调,模板库里的点云,应当和实际识别时经过预处理后的聚类点云保持“同质”状态,否则匹配就是拿苹果和橘子比。

实际操作中,我会用相机对一个物体拍摄3到5帧,分别改变物体朝向或相机角度,然后把每一帧单独保存。保存之前,先手动检查一下点云质量,剔除大量空洞或者严重拖影的帧。

2.2 点云预处理:去噪、下采样、去离群点

原始点云直接拿来算特征是没有意义的,因为噪声和背景会污染直方图。所以模板库里的样本,也必须走一遍和上线识别时一样的预处理流程。预处理我一般分三步。

第一步是去除离群点。用统计滤波(StatisticalOutlierRemoval)或者半径滤波(RadiusOutlierRemoval)都行。统计滤波更适合去除稀疏的飞点,半径滤波适合去除局部密度不高的孤立点。真实场景里,深度相机在物体边缘经常产生一串悬浮点,这些点如果不剔除,会使法线估算产生畸变,进而污染VFH。

第二步是降采样。点云密度太高,法线估算和特征计算都会变慢,而且高密度不会带来明显的精度提升。我常用体素栅格滤波(VoxelGrid)把点云分辨率统一到2到5毫米,具体看目标物体的尺寸和相机距离。比如说,相机离物体1米左右,分辨率5毫米就够了;如果物体很小,需要保留细节,可以设成2毫米甚至1毫米。模板库里的分辨率和实际识别时的分辨率最好一致,这一点经常被人忽略。

第三步是裁去不相关的背景平面。模板库里的样本是孤立物体,问题不大;但如果采集场景里有桌面、地面或者料筐边缘,必须用平面分割(RANSAC拟合平面)把它们去掉。否则点云里混入大量平面点,VFH里就会包含一个巨大的平面特征,把物体本身的特征淹没。我在某个项目里碰到过识别率突然下跌,最后查出来是模板库旧样本没去掉背景平面,新样本去掉了,两边特征空间对不上。

预处理完成后的点云,应当统一保存为PCD格式。我习惯把每个样本文件命名成:类别名_编号.pcd,比如cylinder_01.pcd,toolbox_02.pcd。这个命名规则在后面做批量训练时非常方便。

2.3 目标分割与聚类

有人会问:我采集的时候已经把物体单独放好了,是不是就不用分割聚类了?理论上可以省一步,但我还是建议对采集到的点云也聚类一下。为什么?因为模板库的边界条件要和线上保持一致。线上识别时,物体经过了聚类分割,聚类算法可能会切除一些边缘点,也可能把物体和邻近物体粘连的一部分算进来。如果模板库不做同样处理,特征就会存在系统性偏差。

模板阶段的聚类流程可以简化:先对去噪、下采样后的点云做欧氏聚类提取。PCL里用pcl::EuclideanClusterExtraction,设置一个合理的聚类容差。这个容差取决于物体表面点间距。一般设为体素栅格尺寸的2到3倍。比如体素是5毫米,聚类容差就设10到15毫米。容差太小,物体被拆成好几块;容差太大,会把相邻的物体并成一个聚类。

聚类之后,通常还要对每个聚类做一下是否完整的判断。怎么判断?最实在的办法是看聚类点云的点数和包围盒尺寸是否落在合理范围内。如果你提前知道目标物体的长宽高范围,可以过滤掉明显太小的聚类(可能是噪点簇)和明显太大的聚类(可能是背景没去干净)。这一步不复杂,但能省掉很多后面匹配阶段的麻烦。

我踩过一个很典型的坑:某次采集时,物体旁边放了一个很小的垫片,聚类容差设置过大,结果垫片被并进了目标聚类,VFH特征多出了一个凸台。模板库建好后,识别的结果总是偶尔分成两派,有的识别成目标类别,有的识别不出来。后来发现是模板库里混入了这一类“粘连样本”。所以,模板入库前最好人工抽查一下聚类后的点云可视化结果,别看都不看就批量入库。

3. 计算VFH特征并生成模板文件

3.1 估算法线并统一方向

VFH特征的前置条件是法线。虽然PCL的VFHEstimation内部会计算法线,但我不建议你直接用默认的,因为法线方向如果不统一,特征直方图会发生明显跳变。我习惯先用pcl::NormalEstimation单独算法线,再对法线做方向一致性处理,然后才交给VFH估计。

法线方向问题先说清楚:深度传感器得到的点云,每个点算出来的法线有两个方向(n和-n),它们几何上等价。但VFH统计的是法线与视点方向之间的夹角,如果法线朝向反了,夹角就会变成补角,直方图分布就完全变了。PCL里NormalEstimation默认法线指向视点方向,这通常没问题,前提是你设对视点坐标。

视点怎么设?我一般用传感器光心在世界坐标系下的位置。固定安装的相机,直接把相机位置填进去;如果是随机摆放物体后采集,就把视点设在传感器当时的位置上。如果所有模板样本都用同一个视点,特征空间会不一致吗?这就涉及VFH的视点规范化了。实际上PCL的VFHEstimation里有个归一化机制,它会根据点云质心和视点的相对位置计算一个视点方向,再把这个方向映射到直方图。所以,不同样本只要物体在视野里的位置别差太远,视点设置相同也能兼容。

法线估算半径的选择也很关键。半径太小,法线噪声大;半径太大,细节被平滑。我一般取体素尺寸的8到12倍。比如体素5毫米,法线搜索半径设40到60毫米。这个值要看物体实际几何尺度,如果物体本身很小,半径就不能太大,不然会把整个物体表面的曲率都抹平。自己拿几个样本试算,看一眼可视化法线有没有乱飞,比单纯调参数靠谱。

3.2 VFH特征计算的核心参数

PCL里的VFH估计核心类是pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<308>>。你需要给它输入三个东西:输入点云、输入法线、视点坐标。代码结构大概是这样:

pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<308>> vfh; vfh.setInputCloud(cloud); vfh.setInputNormals(normals); vfh.setViewPoint(camera_x, camera_y, camera_z); vfh.setNormalizeBins(true); vfh.setNormalizePointSize(true); pcl::PointCloud<pcl::Histogram<308>>::Ptr histCloud(new pcl::PointCloud<pcl::Histogram<308>>()); vfh.compute(*histCloud);

有几个参数值得细说。

setNormalizeBins(true)会做直方图归一化,让每个bin的值除以总点数量。点云密度不同,如果直接统计频数,高密度样本直方图数值会整体偏大,归一化之后就能消除密度影响。这个我建议基本都开。

setNormalizePointSize(true)是对整个特征向量的模做归一化。你可以理解成把所有特征向量拉到一个标准长度,这样在做距离匹配时,不会因为某个样本的点数多导致特征向量的值域变大。两个归一化同时开,模板特征就在值域上一致了。

还有一个没在构造函数里直接暴露、但是很重要的事情是:聚类点云需要先移除质心或做归一化吗?有些人会把点云平移到原点,让VFH不受物体位置影响。实际上VFH本身对视点方向做了归一化,但物体在空间中的绝对位置还是会通过视点方向体现出影响。位置偏移太大,会改变视点与物体的相对角度,特征自然变。所以,如果你希望识别不受物体位置影响,最好在提取特征前把聚类点云做一次中心化,让物体质心处于原点。但中心的“原点”是指物体自身的质心,不是传感器坐标系的原点。做完中心化之后,视点坐标也要相应平移。

在模板库里,我强烈建议每个样本都存两种:原始坐标系下的点云和中心化后的点云。线上识别时,聚类后的点云也要做同样的中心化再算特征,两边流程才完全一致。

3.3 模板文件的结构与保存

模板文件保存成什么格式,我推荐直接用PCD,因为PCL原生支持,加载快,不用额外写解析器。但要注意:PCD里存的不是普通的三维点坐标,而是VFH特征直方图。每个“点”其实就是一个308维的向量,你可以用pcl::PointCloud<pcl::Histogram<308>>来表示。

保存的代码很直接:

pcl::io::savePCDFileBinary("cylinder_01.pcd", *histCloud);

保存后,文件里每一行对应一个特征向量。因为模板库里一个样本一般只有一个聚类目标,所以每个PCD文件里通常只有一行308维数据。这不代表文件没内容,它承载的是一个模板。

更工程化的管理方式是:不要把所有模板堆在一个目录里就完事。我建议目录结构这样设计:

templates/ cylinder/ cylinder_01.pcd cylinder_02.pcd ... toolbox/ toolbox_01.pcd ... cabinet/ cabinet_01.pcd

这样好处是,训练脚本和识别程序都可以通过文件夹名自动获取类别标签。如果你用的是一个扁平目录,就得额外维护一个标签映射表,维护起来容易出错。

除此之外,我还会在模板库里存一个meta.json或者meta.yaml,记录每个模板对应的传感器型号、体素尺寸、法线半径、视点坐标、采集时间。这些元信息在调试识别率下降时非常有用。比如某一天识别率突然崩了,翻一下meta发现最新一批模板用的法线半径和之前不一样,问题原因一目了然。

4. 训练模板库的关键参数与调优

4.1 视点原点与距离的影响

VFH名字里就有“视点”两个字,所以视点设置是无论如何都绕不开的。我遇到过一个非常典型的例子:模板库是用固定式工业相机采集的,视点设在相机光心(比如从正上方垂直俯视,视点为(0,0,1.2))。但线上识别时,因为机械臂中途会遮挡,我把相机挪到了侧面,成了斜视。结果识别率从95%掉到60%出头。排查下来,问题就出在视点不一致导致VFH视点相关的那几段直方图分布全变了。

解决思路有两个。第一,如果识别时传感器位置基本固定,就把模板库视点统一固定到传感器光心。第二,如果传感器位置会变,比如装在不同高度或者不同角度的多个工位,那就要为每个工位单独建一个模板库,或者干脆把视点对特征的影响“抹平”。怎么抹平?可以在训练时对同一个物体采集多个视角的样本,让模板库覆盖各种视点情况,再把所有模板合并成一个类别特征集。这样虽然增加了模板数量,但换来的是对视角变化的鲁棒性。

视点到物体中心的距离也会影响VFH。距离越远,同一个物体在点云里的分辨率越低,法线越粗糙,特征自然偏。所以模板库采集距离和实际识别距离不要差太多。比如识别时相机离物体1米,采集模板时也放在1米左右,偏差控制在20厘米以内。

我还有一些习惯:在计算特征之前,先把视点坐标打印出来复核一遍。很多代码里视点是硬编码在配置里的,一旦相机换过支架,坐标忘了改,模板库就悄悄“变形”了。调这类问题最费时间,不如一开始做规范。

4.2 直方图bin数与特征归一化

PCL默认VFH输出308维,内部具体怎么划分bin,普通用户一般不需要改,但理解它有助于你做特征分析和降维。比如你想用PCA或者t-SNE可视化模板库分布的时候,308维向量里各段的含义就很重要。如果你发现某些段落的直方图对姿态变化特别敏感,可以考虑在匹配阶段选择性屏蔽它们。

在PCL的VFH实现中,视点相关部分通常是45个bin,表面形状部分再用45或128个bin去统计法线角度关系。具体来说,它会把FPFH中的三对角度统计直方图各拆分到不同的bin范围。你不需要手动拼接,compute之后得到的histogram自动就是完整特征向量。

调bin数一般不建议动,除非你有明确理由。默认308维已经能很好地区分类别。bin数太低,区分度不够;bin数太高,样本量不够时会出现很多空bin,特征稀疏,距离计算不稳定。

特征归一化更值得关注。除了代码里的setNormalizeBins和setNormalizePointSize,我还在匹配阶段对特征向量做一次标准化:先计算整个模板库所有特征向量在每个维度上的均值和标准差,然后做z-score标准化。这样做可以防止某个维度的方差过大主导整个距离计算。标准化参数要保存下来,识别阶段用同一套均值和标准差去处理在线特征,否则特征空间不一致。

如果你嫌标准化麻烦,也可以直接使用直方图相交距离(Histogram Intersection)作为相似度度量。它比欧氏距离对幅度变化更鲁棒。PCL的KdTree默认用欧氏距离,如果要用直方图相交,可以自己写一个简单的匹配函数,或者用FLANN的L1距离近似。我们在实际项目里试过L1距离,效果不错,而且计算速度很快。

4.3 一个类别多模板的合并策略

模板库每个类别会有多个样本,那在线识别时,是拿一个类别所有模板分别比一遍,然后取最小值?还是先把这些模板合并成一个原型?两种思路都在工业界常用。

逐个模板匹配的优点是简单,不会丢失姿态信息,缺点是匹配时间随模板数线性增长。假设有10个类别,每个类别30个模板,总共300个,匹配一次要计算300次距离,在CPU上也就几毫秒,一般够用。但如果模板量上千,就有点压力了。

合并成原型(比如对同类特征的每一维取平均)能把模板数量从300压缩到10,匹配速度极快,但代价是牺牲姿态多样性。平均值会模糊掉一些极端姿态,对识别准确率有负面影响。我自己的做法是折中:先对每个类别的所有模板做一次聚类,聚成5到10个子类,然后拿每个子类的中心代表一个模板。这样既压缩了模板数量,又保留了主要姿态模式。这个思路和你做聚类识别时的目标是一致的,模板库本身也可以看成一个小型的聚类问题。

还有一点要注意:类别内的模板可能存在异常值。比如采集失误导致的残缺点云、混入背景的样本、计算特征时法线炸裂的样本。这些异常模板混进去,不仅拉低平均原型质量,还可能在逐个匹配时“撞”出错误的高相似度。所以在建库时,我建议先算一下每个样本特征和该类其他样本的平均距离,剔除距离过大的。这个简单粗糙的离群点检测,能明显提高模板库整体质量。

5. 常见问题与排查技巧实录

5.1 模板特征差异不明显怎么办

这是我最常被问到的问题:两个类别的VFH特征长得差不多,匹配老是搞混。遇到这种情况,先别急着调算法,回到数据层面看。

第一,确认两个类别在预处理后真的几何差异明显。如果A是空塑料筐,B是装满物料的塑料筐,从正上方看,B的可见表面就是A的底面加上一点物料点云,VFH差异确实不大。这种问题通过换特征也不一定解决,你需要引入颜色信息或者增加采集视角,让侧面几何进入特征。

第二,检查聚类是否把物体完整包含进来了。经常有物体侧面点云稀疏,导致VFH主要统计了顶面平面特征,不同物体就都成了“一块平板”。这种情况下,可以适当调整预处理参数,提高输入点云质量,或者增加多次扫描融合。

第三,可以在VFH基础上叠加其他特征,比如物体包围盒长宽比、投影面积、点云颜色直方图。分类时加权融合多个特征,往往比单靠VFH可靠。这不是说VFH没用,而是单一描述子描述能力有上限。

5.2 法线方向不一致导致的特征跳变

法线方向搞反是VFH计算中最隐蔽的问题。你从可视化里看法线,好像都垂直表面,但直方图却乱七八糟。原因就是部分法线指向内、部分指向外。

排查方法:输出法线方向与视点方向的点积分布。如果大量点为负值,说明法线朝向和视点相反。PCL的NormalEstimation在计算时,默认会把法线朝向视点方向,但如果你之前对点云做了变换,比如中心化、旋转,视点坐标没有同步更新,法线就可能朝外。

解决方法是:在进行点云变换时,把视点也一起变换;或者在计算法线后,手动做方向翻转。更保险的是用重定向算法,比如PCL的flipNormalTowardsViewpoint,强制法线朝向视点。记住:特征计算的每一步,都要保证点云和视点在同一个坐标系下。

5.3 模板库需要多大才够用

这个问题没有标准答案,取决于目标物体的对称性和实际使用场景。如果是近似对称的圆柱,可能3到5个姿态就够;如果是不规则的工具箱,至少8到12个姿态。

我一般用“留一法”验证模板库是否够用:把每个样本轮流作为测试样本,其余样本作为模板库,计算识别正确率。如果正确率低于90%,说明模板覆盖度不足或者特征区分度不够,需要增加样本。这个流程虽然朴素,但在工程上非常有效。

另外,模板库不要一次建完就再也不动。实际运行一段时间后,把识别失败的样例收集起来,补充进模板库。这种“在线扩容”机制能让系统越用越准。最好在程序里为识别置信度设置一个阈值,当新样本和最近模板的距离大于阈值时触发人工确认,确认后自动加入模板库。

5.4 一个实用的自查清单

我把建库过程中容易踩坑的点整理成一份清单,每次建库都会过一遍:

  • 原始点云是否存在大量遮挡和空洞;
  • 离群点滤波参数是否让边缘点丢失;
  • 体素尺寸是否和识别阶段一致;
  • 平面去除后目标点云是否完整;
  • 聚类容差是否导致过分割或粘连;
  • 法线方向是否全部朝向视点;
  • 视点坐标是否和变换后的坐标系匹配;
  • VFH是否开了归一化;
  • 模板文件名和类别标签是否对应;
  • 有没有用离群样本剔除筛选过模板。

这10项里有一项不对,都可能在后续识别中放大成误检。模板库建设最忌讳的就是“差不多就行”,因为识别系统的性能瓶颈往往就卡在这些看似不起眼的一致性问题上。

我做模板库做得多了,最大的体会是:这活儿看起来是体力活,其实是需要反复验证和迭代的过程。每个类别都要建立开发者自己的“标准数据审视习惯”——保存样本前先可视化,跑完特征后再抽检直方图,入库前还要做一次类间距离分析。你把这些流程固定下来,后面无论换什么相机、识别什么物体,都能快速搭出一套可用的模板库。

最后分享一个小技巧:如果你手头有GPU环境,完全可以用类似VFH思想的三维特征网络先跑批量的特征提取,再用PCL做传统流程做交叉验证。但传统的VFH加模板库方案,在嵌入式设备上依然有它不可替代的优势——稳定、可溯源、调试直观。这也是我至今仍在项目中坚持用它的原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 7:16:30

AI综述工具实测:从文献综述生成到引用核查的完整避坑指南

最近好多朋友来问&#xff1a;那种号称“自动生成结构完整、引用规范综述”的AI工具&#xff0c;到底能不能信&#xff1f;我自己过去一个月密集试用了标题里提到的这类产品&#xff0c;结论是——确实能省时间&#xff0c;而且省得不是一点半点&#xff0c;但前提是你要知道怎…

作者头像 李华
网站建设 2026/10/14 7:16:28

SpringBoot+Vue构建匿名情绪宣泄平台的技术实践

1. 项目背景与核心价值最近在整理过往项目时&#xff0c;翻出了这个情绪宣泄平台的完整实现方案。这个系统最初是为某高校心理咨询中心开发的线上辅助工具&#xff0c;后来经过多次迭代&#xff0c;逐渐发展成一个功能完善的匿名情绪表达社区。现代人普遍面临各种压力&#xff…

作者头像 李华
网站建设 2026/10/14 7:15:26

OpenClaw数据分析工具:从采集到可视化的全流程解析

1. 项目概述OpenClaw数据分析与可视化是一个专注于数据挖掘与呈现的实用项目。作为一名长期从事数据处理工作的从业者&#xff0c;我发现很多企业在面对海量业务数据时&#xff0c;往往缺乏有效的分析工具和可视化手段。这个项目正是为了解决这个痛点而生。OpenClaw这个名字很有…

作者头像 李华
网站建设 2026/10/14 7:15:15

Go逃逸分析实战指南:从原理到性能优化与GC调优

1. 逃逸分析&#xff1a;Go程序员的进阶必修课先问一个直击灵魂的问题&#xff1a;当你写出var x int 42或者ptr : new(MyStruct)的时候&#xff0c;这个变量到底被分配到了哪里&#xff1f;如果你的第一反应是“局部变量在栈上&#xff0c;new出来的在堆上”&#xff0c;那这…

作者头像 李华
网站建设 2026/10/14 7:15:15

HikariCP连接池泄漏排查:MyBatis游标未关闭导致连接被占满

1. 事故现场&#xff1a;连接池说没就没先交代一下背景。前两周一个导出功能翻车了&#xff0c;表现很典型&#xff1a;白天平稳运行&#xff0c;上午十点一过接口大面积超时&#xff0c;后台日志滚动刷屏&#xff0c;全是 HikariCP 的Connection is not available, request ti…

作者头像 李华