41  3D 测量

点云经过配准对齐(章节 39)、滤波清理(章节 37)之后,产线真正要的不是一团漂亮的点,而是——这块工件的台阶差是多少、圆形台面够不够大、结合面平不平、有没有局部凸起缺陷。把这些数算出来、并据此判定合格与否,就是 3D 测量要做的事。本章是 章节 21 那一套二维测量方法论在三维里的对应:测量链依旧是 点云 → 拟合基元 → 几何量 → 判定,每一级的角色、误差如何传递、带宽类公差与尺寸类公差在统计上为何不同,都与二维一一对照——只是基元从直线、圆升格成平面,评定也从像素换成了毫米。

实验对象(图 41.1)是一幅真实的 Smart3 距离图sample/height01.srt,1600×1600,取自 SDK”高度测量”示例方案):一块精密机加工件,俯视约 19.2×19.2 mm,横向分辨率 \(0.012\) mm/像素、纵向 \(0.001\) mm/计数。表面结构是一片下沉的栅格状沟槽底面(floor),其上一阵列抬起的圆形台面(boss lands),每个台面带两处小凹坑,其中一个台面还有一处明显的局部凸起缺陷(bump)。这是真实扫描数据:没有解析真值标签,所有数都按测量值如实报告;约 26 万个未命中像素(原始计数为 0)即背景无效区,逐点跳过。

图 41.1: 真实距离图的俯视高度图(jet 编码,蓝 30.5 mm → 红 38.2 mm):深蓝为下沉的栅格沟槽底面,黄/橙为抬起的圆形台面阵列,右中台面上的暗红团块是一处凸起缺陷,每个台面上两个小蓝点是凹坑。白色为未命中的无效像素。

41.1 拟合基元:平面与圆

二维测量的基元是直线和圆(章节 14),三维的主力是平面。拟合之前,先要把整片点云分割到各自的特征面上(图 41.2)。本例的段差(≈4.4 mm)远大于工件在台架上的装夹倾斜(±0.6 mm),所以一个全局高度阈值 \(z=33.5\) mm 就能把沟槽底面(约 31.2 mm)与台面(约 35.6 mm)干净二分;真实产线则靠区域生长、法向聚类或对配准后的 CAD 模型做最近面归属来完成同一步。分好之后还要剔除过渡壁与飞点:台面到沟槽的侧壁像素会骑在分界阈值附近,先拟合一次、再剔掉残差超过 \(0.1\) mm 的点重拟合,留下的才是干净的平面点集。

图 41.2: 点云按高度带分割着色(俯视):蓝色为沟槽底面、绿色为圆形台面、红色为凸起缺陷、白色为侧壁/无效。中左台面上叠了一圈黑色,是下文 Kasa 圆拟合得到的台面轮廓圆。

最小二乘平面拟合(least-squares plane fit) 把一面点云拟合成 \(z=ax+by+c\),三个系数由一组 \(3\times3\) 正规方程(normal equations)一次解出:

\[ \begin{bmatrix}\sum x^2 & \sum xy & \sum x\\ \sum xy & \sum y^2 & \sum y\\ \sum x & \sum y & N\end{bmatrix} \begin{bmatrix}a\\b\\c\end{bmatrix}= \begin{bmatrix}\sum xz\\ \sum yz\\ \sum z\end{bmatrix}. \]

这正是 章节 2 里”超定方程的最小二乘解”在三维的落地,未知量从二维直线的两个变成三个。解得系数后,平面的单位法向为 \(\mathbf n=(-a,-b,1)/\sqrt{a^2+b^2+1}\),截距由质心确定。拟合出的沟槽底面是 \(z=-0.0151x+0.0250y+31.217\),法向与竖直方向偏了 1.675°——这就是工件在台架上的实际装夹倾斜,真实数据里它必然存在,下文测段差、平行度时都要沿基准面法向而非沿 \(z\) 轴,才不把这点倾斜烘进结果。

平面拟合的稳健性与二维同源:少数离群点(飞点、侧壁像素)会把最小二乘基准拉偏,工业实现普遍叠一层迭代重加权(IRLS)或 RANSAC 预筛。本章用最朴素的”拟合→按残差阈值剔除→重拟合”两轮,已足以把沟槽底面的 RMS 压到 19.0 µm

圆拟合与”距离图能看见什么”。 圆形台面的直径用 Kasa 圆拟合(circle fit) 量:把台面连通域的外轮廓点投影到 \(xy\) 平面,解一组与平面拟合同构的 \(3\times3\) 正规方程,一步得到圆心与半径。这里有个真实数据的关键认识——距离图是 2.5D 高度场,只看得见朝上的表面,看不见竖直侧壁。所以台面在距离图里只留下一个圆形轮廓(可拟合直径),而它作为一段圆柱的侧面根本没被采到;要拟合真正的三维圆柱(轴线 + 半径,五个未知量),需要多视角扫描或完整点云,单幅俯视距离图做不到。本例取一个不触边、面积最大的内部台面,按角度分箱只保留每个方向上半径最大的外轮廓点(干净排除两处内凹坑的边界),拟合得直径 6.8608 mm(半径 3.4304 mm),圆度(径向峰谷)86.4 µm图 41.3)。

图 41.3: 选定圆形台面的外轮廓点(红)与 Kasa 拟合圆(灰)叠合,黑点为拟合圆心。720 个按角度取的外轮廓点紧贴拟合圆,圆度仅 86.4 µm(RMS 12.0 µm),说明台面外缘确为正圆。

41.2 段差、平行度与高度测量

拿到基元,几何量就是封闭公式,本身不产生新误差(与 章节 21 同理)。

段差(平面间距)——这正是本样图”高度测量”的核心。 台面相对沟槽底面的高度差,等于台面质心沿沟槽底面法向到底面的有符号垂距。实测 4.3915 mm。两个面各由近百万点拟合,段差完整继承了它们的亚微米级稳定性。值得强调的是”沿法向”而非”沿 \(z\) 轴”:工件装夹倾斜 1.675°,若直接取竖直高度差会差一个 \(\cos\theta\) 因子(约 4 µm 的系统偏差),工程上判定段差一律取沿基准面法向的垂距才干净。

面面角 / 平行度。 两平面的夹角由它们法向的点积给出,\(\theta=\arccos\lvert\mathbf n_1\!\cdot\!\mathbf n_2\rvert\)——这是 章节 21 线线角在三维的对应(法向之于平面,正如方向向量之于直线)。沟槽底面与台面的法向夹角实测 0.1085°,接近 0,证实这片机加工件的上下两组面确为平行——也就是说 1.675° 的整体倾斜是装夹引入的刚体姿态,被两个面共享,做差后抵消,不污染段差。这种”共模倾斜在面间作差时自动抵消”是 3D 测量沿用基准面(而非世界坐标系)评定的根本原因。

把台面阵列那一行过缺陷峰的 \(x\)\(z\) 剖面画出来(图 41.4),段差与凸起一目了然:黑色折线在台面高度(绿线)与沟槽底面之间反复跌落约 4.4 mm,正中那个鼓出绿线的圆顶就是凸起缺陷。

图 41.4: 过缺陷峰所在行的 \(x\)\(z\) 剖面:黑色折线为该行真实高度,绿色水平线标台面基准、棕色线标沟槽底面基准;折线在两者间反复跌落 ≈4.4 mm 的就是段差,正中冒出绿线、顶端红点标记的圆顶即凸起缺陷(高出台面 2.518 mm)。

把测得的几何量汇总(表 41.1)。这里要区分两类量:段差、直径这类平均类量随点数增多而单调变稳,偏差停在 \(\sigma/\sqrt N\) 的本底上;而下一节的平面度、圆度这类带宽类量恰恰相反,点越多极差期望越大,数会被采样密度抬高。同一片点云、同样的噪声,两类量对”点数”的响应方向完全相反——这是 3D 测量报告里最容易被误读的一点,也是为什么带宽量必须连同采样条件一起报告。

表 41.1: 真实距离图的 3D 测量结果(无真值标签,按测量值报告;平面度/圆度为带宽量,随采样密度变化)
几何量 实测值 说明
段差 / 沟槽底面→台面(mm) 4.3915 沿基准面法向,本样图主测量
平行度 底面∠台面(°) 0.1085 ≈0,确认两面平行
装夹倾斜(°) 1.675 底面法向相对竖直,刚体姿态
圆形台面直径(mm) 6.8608 Kasa 圆拟合外轮廓
台面圆度(径向 P2V,µm) 86.4 RMS 12.0
沟槽底面平面度 最小二乘 P2V(µm) 225.5 RMS 19.0
沟槽底面平面度 最小区域(µm) 194.3 ≤ 最小二乘
台面阵列平面度 最小二乘 P2V(µm) 255.4 RMS 22.3
台面阵列平面度 最小区域(µm) 234.2 ≤ 最小二乘
凸起缺陷高出台面(mm) 2.5180 横向尺度 ≈3.44 mm

41.3 平面度、圆度与 GD&T

尺寸之外,图纸上还有几何尺寸与公差(GD&T,geometric dimensioning and tolerancing)的框格,它们说的不是”测出多少”,而是公差带(tolerance zone):被测面必须整体落在某个厚度的带内。这与二维”平行度/圆度/直线度”的公差带思想完全一致(章节 21),只是带从二维的两条线之间升格为三维的两片面之间。平面度(flatness) 的带是两片平行平面之间的厚度,被测面的所有点都要夹在其中;圆度(roundness) 的带是两个同心圆之间的环。这套语言的出发点是装配功能:只要被测面整体落在带内,不管它具体起伏成什么形状,与配合件的贴合都有保证。视觉评定它们的通用配方与二维一致:取被测点集,对评定基准算偏差,max−min 即包容点集所需的最小带宽

平面度。 以拟合平面为基准,各点的有符号垂距 max−min 就是峰谷值(P2V)。沟槽底面实测 225.5 µm(最小二乘评定,RMS 仅 19.0 µm),台面阵列 255.4 µm(RMS 22.3 µm)——台面阵列的数略大,因为它把多块相互独立的台面合在一起评定,混入了台面之间的共面性误差,而不仅是单块台面的机加工起伏。图 41.5 把两片面的残差画成发散热图(±60 µm),沟槽底面(左)的红蓝长程渐变是大尺度的平面波纹,台面(右)每块的红蓝同心环则是各台面轻微的中心隆起——这些都是真实机加工与扫描共同留下的形貌,而非随机噪声。注意平面度是极值统计:RMS 才二十几微米,P2V 却到两百多微米,正是因为它由整片面上的最极端两点决定,采样越密、捕到极端点的概率越大、数越大。

图 41.5: 两片面的残差热图(蓝-白-红发散色标,半量程 ±60 µm)。左:沟槽底面,红蓝长程渐变是大尺度平面波纹;右:台面阵列,每块台面的同心红蓝环是轻微的中心隆起。两图都呈现结构化形貌而非白噪声,说明残差里含真实机加工与扫描特征。

圆度与凸起缺陷。 上一节那块台面的外轮廓圆度 86.4 µm图 41.3)——轮廓点均匀贴着拟合圆、无系统性椭圆或棱形,说明台面外缘确为正圆。而那处凸起缺陷则用另一种判据:它的峰值像素高出台面基准 2.5180 mm(横向尺度约 3.44 mm),用连通域分割定位、取域内最高点沿台面法向的垂距得到。这类局部凸起在装配里直接顶高配合面,是必须单独报告的缺陷量,与平面度这种全局带宽量是两套语言。

基准依赖(datum dependence)。 同一组点,换一种评定基准,平面度的数就不同:沟槽底面以最小二乘(least-squares) 平面为基准得 P2V 225.5 µm,以最小区域(minimum zone) 基准(微调平面倾角使包容带最薄)得 194.3 µm;台面阵列对应 255.4 µm234.2 µm。这是 章节 21 二维”圆度的基准之争”在三维的重现——最小区域按定义给出最薄的带,是 GD&T 语义的本体;最小二乘最稳健但带宽系统性偏大。所以报告任何形位公差,都必须连同评定方法一起报告,否则两台设备的数没有可比性。

最小区域 ≤ 最小二乘,恒成立。 最小区域基准是在所有可能的基准平面里专门挑使包容带最薄的那一个,最小二乘平面只是其中一个特解,因此最小区域评定值必然不大于最小二乘评定值(本章沟槽底面 194.3 ≤ 225.5、台面 234.2 ≤ 255.4,两组都验证了这一不等式)。

41.4 SciVision 实现

真实距离图用 Sci3DFileOperation::LoadRangeImage 载入(链接 Sci3DFileOperation.librc=0 即成功;它会向 stderr 打一句无害的 “Directory does not exist.”)。GetValue(row,col) 返回原始计数,乘 ResolutionZ() 得物理高度(mm),计数 0 即无效像素。几何量由 SciSv3DGeometryMeasure 提供,形位公差由 SciSv3DGDTTools 提供。与二维相比有一个必须如实写明的关键差异3D 的 GDTTools 返回真实 mm 量纲的偏差值,而非 章节 42 邻近章节里二维 SciSvGDTTools 那种归一化到 \([0,1]\) 的分数——本章 ChebyshevFlatness 返回的 0.19731、Parallelism 返回的 0.26143 都是货真价实的毫米偏差,可以直接对图纸公差设阈值。

逐个 API 的本机实测状态(3D 模块整体易崩溃/静默,详见工程约定;所有 SDK 调用喂的都是与手写主链同样经稳健剔除的点集):

  • 可用并与手写吻合LeastSquarePlaneFit(沟槽底面 meanErr 0.01905 mm = 19.0 µm,与手写 RMS 四位吻合;台面 0.02229 mm)、AngleFromPlanes0.10861°,与手写平行度 0.1085° 四位吻合)、ChebyshevFlatness(最小区域 0.19731 mm = 197.3 µm,与手写最小区域 194.3 µm 仅差 3 µm,构成强交叉验证)、Parallelism0.26143 mm = 261.4 µm,与手写台面平面度 255.4 µm 同量级)。
  • 失败PlanesDistance 返回错误码 123501017 并给出 0(严格平行容差判定的缺陷)——所以段差改用手写(台面质心沿沟槽底面法向的垂距 4.3915 mm)。
  • 惰性无输出ResidualFlatness 返回 0,不可用。

3D 模块在本机普遍易崩溃或静默返回 0,因此 SDK 调用一律放进子进程探针:主进程出完图与数后,再 system() 调起自身的 sdkprobe 分支去碰 SDK,崩了也只是子进程退出、不拖垮主链。这套”主链手写、SDK 旁证”的相位分离,是本书 Part IX 各 3D 章节的统一工程策略。

SciRangeImage ri;  SCIMV::Sci3DFileOperation fop;
SciVar path("sample\\height01.srt");
long rc = fop.LoadRangeImage(path, &ri, false);          // rc=0 即成功
double z_mm = ri.GetValue(row, col) * ri.ResolutionZ();  // 原始计数 → 物理高度 mm(0 即无效)

SCIMV::SciSv3DGeometryMeasure gm;
Sci3DPlane floorPlane, bossPlane;  double meF = 0;
rc = gm.LeastSquarePlaneFit(floorA, 5.0, 5.0, 1, &floorPlane, &meF);  // meanErr 0.01905 mm
double ang = 0;                                          // 平行度:法向点积反余弦
rc = gm.AngleFromPlanes(floorPlane, bossPlane, &ang);    // 0.10861°(≈手写 0.1085)

SCIMV::SciSv3DGDTTools gdt;
double fCheb = 0, par = 0;
rc = gdt.ChebyshevFlatness(floorA, 1, 0.0, &fCheb);      // 最小区域 0.19731 mm ≈ 手写 0.1943
rc = gdt.Parallelism(bossA, floorPlane, 0, 0.0, &par);   // 0.26143 mm(真实 mm 量纲)
// 段差:PlanesDistance 失败(123501017) → 手写台面质心沿底面法向垂距 = 4.3915 mm

工程策略与二维一致:测量主链全部用手写最小二乘(平面/圆拟合都是确定可复现的”数学本体”),SDK 放进子进程探针做旁证。这样做有两重好处:一是手写实现确定可复现、不受 3D 模块崩溃影响,主链永远能出数;二是把可用的 SDK API 当作独立的第二实现来交叉验证——ChebyshevFlatness 用与手写完全不同的代码路径独立复现了最小区域平面度(197.3 µm vs 194.3 µm),LeastSquarePlaneFit 的 meanErr 与手写 RMS 在 19.0 µm 上严丝合缝,这种”两套实现独立吻合”远比单一实现的自证更可信。完整工程(含五张图的生成、子进程探针的全部打印)见 code/3d_measurement/

工业案例:结合面的平面度验收

某机加工结合面要求平面度在数十 µm 级,验收却屡屡扯皮。供应商先用三坐标测量机(CMM)打点验收:采样稀疏(几十个点),漏掉了结合面边缘的局部翘曲,报出的平面度偏乐观、判合格。客户改用 3D 面扫描全覆盖采样,翘曲是抓到了,可几十万点里又混进了扫描仪的噪声底与装夹倾斜,平面度被极值统计抬高——正如本章真实样图,沟槽底面 RMS 仅 19 µm,P2V 却到 225 µm,且整面还带 1.675° 的装夹倾斜,不沿基准面法向评定就会再叠一层系统偏差。更棘手的是评定方法:客户按最小区域法(194 µm)、供应商按最小二乘法(225 µm),同一个面算出两个数。最终的解决不在算法而在协议——检测协议里白纸黑字写明三件事:评定方法(最小区域 vs 最小二乘)、采样密度(点距上限)、滤波截止频率。教训只有一句:3D 测量报告必须三件套——数值、评定方法、采样/滤波条件,缺一个,数就没有可比性。

41.5 小结

  • 测量链与二维同构:点云 → 拟合基元(平面/圆)→ 几何量(段差/角度/直径)→ 判定(平面度/圆度/缺陷);几何量级是精确公式不产生新误差,精度全部由单点噪声经 \(1/\sqrt N\) 拟合传递而来。本章用的是真实 Smart3 距离图,没有真值标签,一切按测量值如实报告。
  • 距离图是 2.5D,只看得见朝上的面:圆形台面只留下可拟合直径(6.8608 mm)的俯视轮廓,其圆柱侧面根本没被采到——真三维圆柱拟合需要多视角或完整点云,单幅俯视距离图做不到。
  • 共模倾斜在面间作差时抵消:工件 1.675° 的装夹倾斜被上下两面共享,段差沿底面法向取垂距(4.3915 mm)、平行度 0.1085° 都把它干净抵掉——这是 3D 测量沿用基准面而非世界系评定的根本原因。
  • 带宽量是极值统计:平面度(沟槽底面 225.5 µm / 台面 255.4 µm,RMS 都才二十几 µm)、圆度 86.4 µm 都对采样密度敏感,与”越多越准”的尺寸量相反。
  • 基准依赖必须连同评定方法报告:同一面,最小二乘 225.5 µm vs 最小区域 194.3 µm(最小区域 ≤ 最小二乘恒成立),SDK 的 ChebyshevFlatness 用独立代码路径复现了最小区域值(197.3 µm)——报形位公差不报评定方法等于没报。
  • 3D SDK 量纲与二维不同:3D GDTTools 返回真实 mm 值(非二维的归一化 \([0,1]\) 分数);可用 API 与手写吻合(平面拟合 meanErr 19.0 µm、夹角 0.10861°、最小区域平面度 197.3 µm),但 PlanesDistance 失败、ResidualFlatness 惰性,主链仍以手写最小二乘为准、SDK 作旁证。

关于三维几何量的不确定度分析与最小区域评定的系统论述,可进一步阅读 Steger 等人的著作 (Steger, Ulrich, 和 Wiedemann 2018)。本章用到的形位公差,其符号语言与公差带定义由几何尺寸与公差(GD&T)标准规定,国际体系见 ISO 1101 (International Organization for Standardization 2017);针对单一面的平面度,ISO 12781 进一步规定了术语与参数(含最小区域、最小二乘等基准面定义)(International Organization for Standardization 2011b),圆柱度的对应规范见 ISO 12180 (International Organization for Standardization 2011a)。本章反复触及的”最小二乘 vs 最小区域”基准之争,在形状误差拟合文献中有专门讨论,Moroni 与 Petrò 比较了各类最小区域拟合算法的原理与代价 (Moroni 和 Petrò 2008)