台面物件
标定板、PCB、芯片、晶圆、料盘、胶点——台面上的东西怎么生成、怎么上色、有多高,每一步的公式。
「公式公开、实现闭源」:引擎怎么把台面上的物件画成相机看到的像素,全部写在这里。
物件是算出来的,不是贴图
台面上的每个物件都是参数化的:给它一个世界坐标和采样足迹,它回答三件事——
| 回答 | 用在哪 |
|---|---|
| 外观:这一点的灰度 | 相机成像 |
| 高度:这一点表面比台面高多少 | 离焦、测距读数、打标光斑大小 |
| 特征真值:圆心、角点、孔心、焊盘中心、芯片中心 | 自动评分(只在开放真值时才能读到) |
物件由生成器生成,预设是生成器的一组命名参数。现在有这些生成器:
| 生成器 | 是什么 | 特征真值 |
|---|---|---|
dot_grid |
圆点阵列标定板 | 每颗圆心(阵列) |
checker |
棋盘格 | 内角点(阵列) |
ring_target |
同心环靶标,可排成阵列 | 靶心 |
line_grid |
线阵 | 交点(阵列) |
blank / patch |
均质的板(空白打标板、铜箔) | — |
fiducial |
基准点:圆 / 十字 / 方 / 菱形 / 环 | 中心 |
pcb |
基板 + 阻焊 + 走线 + 焊盘 + 基准点 + 通孔 | 基准点、孔心、焊盘中心 |
die |
裸芯片:周边焊盘或凸点阵列 + 对位十字 | 焊盘、凸点、十字 |
wafer |
晶圆:圆片 + 缺口 + 切割道 + 芯片阵列 + 墨点 | 芯片阵列、完整芯片、墨点、缺口 |
tray |
料盘:穴位阵列,穴里有芯片 | 穴位、每颗料的实际位姿 |
holes / shapes |
任意孔组 / 图形,可从文件导入 | 孔心 / 图形中心 |
image |
一张灰度图片 | — |
内置预设 31 个(圆点板、棋盘格、靶标、线阵、四种空白打标板、四种基准点、三种 PCB、三种芯片、两种晶圆、两种料盘), 每个都写明它是为验证哪个算法而存在的。
图形:到边界的距离
每个图元(圆、矩形、圆角矩形、环、线段、十字、菱形、多边形)只回答一件事:这一点到边界的有向距离 d
(在里面为负,在外面为正)。覆盖度由它推出:
t = clamp((d − a/2) / (−a), 0, 1) a = 采样足迹(一个像素在台面上覆盖多大)
覆盖 = t² (3 − 2t) 边界上正好 0.5
圆心、角点严格落在参数给的位置上,不经过任何量化——这就是特征真值能精确到纳米的原因。
规则阵列(圆点板上万颗圆、晶圆上几百颗芯片)不逐个试:用 round(坐标 / 间距) 直接定位最近的一个。
不规则的点集(导入的钻孔文件)用网格分桶,每个采样点只看自己格子里那几个。
叠放:从上往下合成
物件有层级(layer,大的在上)。一个采样点从最上面的物件开始往下合成:
G ← 0, A ← 0
对每个物件(从上往下):
w = (1 − A) × 覆盖度
G ← G + w × 灰度
A ← A + w
A 到 1 就停
灰度 = G + (1 − A) × 台面底纹
不透明的物件(板、基板)在自己的外形里覆盖度处处为 1;只画图形、不带底的物件(印在 PCB 上的基准点、导入的轮廓) 在图形外为 0,下面的东西透上来。高度取第一个自带高度且覆盖过半的物件。
材料与光照
每种材料有一个漫反射灰度 g(含纹理)和一个镜面强度 s(0–1)。光源有四类:
同轴 coax、低角度环光 ring、背光 back、穹顶 dome,按各自亮度归一成份额 c r b d(和为 1)。
平 = exp(−(斜率 / 0.08)²) 平的表面把同轴光反回镜头
斜 = 1 − exp(−(斜率 / 0.35)²) 斜面把低角度光反进镜头
灰度 = g × (1 − 0.8 s r)
+ s × (250 − g) × c × 平
+ s × 200 × r × 斜
+ s × (250 − g) × d × 0.35
通孔 = g + (245 − g) × b
s = 0 的材料(标定板、FR4)对光源方向不敏感,只随总亮度变化。铜、硅、焊锡、胶点的 s 在 0.6–0.8:
同轴光下亮、低角度环光下平面发暗、斜面(胶点边缘、焊球)发亮——对位算法选哪路光,就是在这里看出区别的。
内置材料(灰度 / 镜面):标定板白 205/0、黑 35/0、FR4 150/0.05、绿阻焊 95/0.25、铜 185/0.6、喷锡 200/0.7、 硅 120/0.8、铝焊盘 215/0.5、黑色阳极氧化铝 38/0.15、不锈钢 165/0.45、PET 膜 230/0.1、陶瓷 225/0.05、胶 175/0.7。
激光打在什么材料上留下什么颜色也由材料决定:黑色阳极氧化铝打出白字(只会变亮),其它材料打出暗痕(只会变暗)。
高度与分层离焦
物件有厚度:PCB 1.6 mm、陶瓷片 0.635 mm、芯片 0.3 mm、料盘 3 mm……而景深只有零点一几毫米。 所以对焦在台面上时 PCB 是糊的,要把 Z 抬高一个板厚才合焦——这是真机现象。
一个视场里同时有好几种高度时(基板上放了芯片),离焦按高度分层:
层宽 = 景深 / 4(最多 12 层)
第 k 层的离焦量 = 帧离焦量 − 该层平均高度
每层各模糊一遍整张图,每个像素取它所在那一层的结果
视场里只有一种高度时就是一层,与没有物件时完全一样。测距仪读的也是"台面 + 物件"的合成表面。
变体:放料误差、涨缩、翘曲、缺陷
真实的料每次都放得不一样。变体按种子抽样落定,之后是确定的:
| 变体 | 效果 |
|---|---|
placement |
中心偏移 ΔX ΔY、转角 Δθ(固定值或按 σ 抽样) |
scalePpm |
局部 X / Y 各自涨缩(PCB 热涨缩、软板拉伸) |
warpUm |
翘曲:中心拱起、四角为 0 的二次曲面 |
missingPadRate |
随机缺掉的焊盘比例(不画、也不进真值) |
defects |
颗粒(有高度)、划痕、脏污 |
contrast |
灰度的增益与偏置 |
随机源由 (机台种子, 物件 id, variant.seed) 派生,与加载顺序、线程调度无关。
特征真值记的是抽样后的实际值,自动评分比的是"算法测出来的"对"实际落成的",不是对图纸上的标称值。
控制台和 3D 画的是标称值——实际值只有开放真值才能读到。
加工:烧蚀、点胶、钻孔、取放
| 过程 | 对世界的改变 |
|---|---|
| 烧蚀(激光打标) | 胶囊形痕迹,线宽随离焦按高斯光束变化;颜色由材料决定 |
| 点胶 | 长出一个球冠。体积 V、接触角 θ:t = tan(θ/2),底面半径 a = ∛(6V / (π t (3 + t²))),顶高 h = a·t;胶线为抛物线截面,线宽 w = √(3A / t),A 为每毫米体积 |
| 钻孔 | 露出通孔(背光下透亮),那一点的高度回到台面 |
| 取放 | 从料盘某穴取走一颗料(穴空了),放到目标位置:底面落在目标处的表面上,放置误差按 σ 抽样 |
点胶、钻孔、取放目前由引擎控制台和宿主接口触发;上位机侧的点胶阀、吸嘴设备接口还在规划中。
从文件导入
| 来源 | 支持的内容 |
|---|---|
| Gerber(RS-274X) | 坐标格式、单位、圆 / 矩形 / 长圆 / 多边形光圈,画线、闪烁、直线与圆弧插补、区域填充;宏光圈与清除极性跳过 |
| Excellon 钻孔 | 公制 / 英制、前导零 / 尾零省略、刀具表、坐标模态 |
| DXF | 直线、圆、圆弧、多段线(含凸度圆弧);闭合轮廓可画实心或画轮廓线 |
| 坐标表 CSV | x, y[, 直径] |
| 晶圆图 CSV | 行, 列, 分级,分级不为 1 打墨点 |
| 图片 | PNG(8 / 16 位,非隔行)、PGM |
Gerber、钻孔、DXF 是 Y 向上的,导入时翻成台面的 Y 向下。