解读 33 · 47 个 STL 反推出装配体的方法
解读对象:
microduck-replica/docs/紧固件反推.md(约 5.2KB)+microduck-replica/docs/hole_analysis.json+microduck-replica/README.md(装配结构节)
需要的前置:零基础可读。会"直径、数量"这两个词就行。
为什么需要"反推"
官方没有给这张鸭子的机械图纸——没有 SolidWorks 装配体、没有机械 BOM、连一张螺丝清单都没有。能拿到的只有 MuJoCo 仿真项目里的 47 个 STL 网格(STL 是一种用三角面片描述物体表面的文件格式,只有"皮",没有装配关系)。这些网格原本是给物理仿真用的:外形对、质量对,仿真就能跑;孔径差 0.1mm、螺丝几号,仿真根本不关心。
但复刻者关心。《紧固件反推》记录了把 47 张"皮"变成一张采购单的完整过程——这也是本辑(解读 34–40)所有结构文章的共同地基。
方法:让程序数孔
核心脚本 scripts/analyze_holes.py,五步:
- 焊接重复顶点,建立面片邻接图;
- 按二面角 35° 切割,把网格分成一片片"光滑曲面"(在锐边处断开);
- 每片拟合圆柱——圆柱面上所有法向都垂直于轴线,所以轴 = 法向协方差矩阵的最小特征向量;
- 顶点投影到垂直于轴的平面做代数圆拟合求直径,残差 >3% 丢弃;
- 法向指向轴心 = 孔;背离轴心 = 凸台,排除;只保留包角 ≥300° 的完整圆孔。
47 个零件全部扫完,耗时 2.5 秒。
数出来的结论
直径分布直接暴露了紧固件体系(《紧固件反推》,不加权口径,每个 STL 数一次):
| 直径 | 数量 | 判读 |
|---|---|---|
| Ø2.2 | 77 | M2 过孔(螺丝穿过) |
| Ø4.4 | 28 | M2 沉头孔(螺丝头埋入) |
| Ø1.6 | 20 | M2 攻丝底孔(拧自攻) |
| Ø2.4 / Ø2.0 | 22 / 12 | 松配 / 紧配过孔 |
| Ø2.7–2.8 | 20 | 少量 M2.5 |
| Ø5.4–6.0 | 16 | 轴孔 / 轴承座,不是螺丝 |
三个最有用的交叉验证:Ø2.2 与 Ø4.4 总是成对出现在 yaw2roll、leg、ankle_left 这些件上——"过孔+沉头"正是一颗内六角圆柱头螺丝的两个特征;xl330.stl(舵机模型)自带 Ø2.0×4 + Ø1.6×8,与 Dynamixel XL330 官方安装孔一致;按装配体用量加权后 xl330 出现 15 次——第 15 个舵机驱动嘴,不在 14 维动作空间里。
还有一堂"勘误课":早期文档写整机 213 个孔,复算发现没按装配用量加权(leg 实际用 4 次)且混入了未引用网格,公开更正为 237;打印工艺调整表另按打印件口径给过孔×111、沉头×48、攻丝×27。同一批孔,不同口径,引用必须注明。
这个方法信到什么程度
构建日志已有实物验证:黑色腿部件上 M2 螺丝真实装入、孔位可用,但个别孔仍需钻孔修正。仿真网格不保证配合公差,打印还会收缩(解读 40 专门讲)——反推结果用来定螺丝规格、轴承型号、采购量是可靠的;直接当加工图纸,不行。
你带走的收获
- 拿到无名模型先做特征统计(孔径分布、重复间距),标准件的尺寸指纹会自己浮出来。
- 圆柱孔的轴线可用"法向协方差最小特征向量"求出——几何直觉能变成算法。
- 统计数字必须写清口径(加权/不加权),否则不可复算、不可勘误。
- 仿真网格保真"外形+惯量",不保真"公差+工艺",两者别混着用。
- 交叉验证胜过单点证据:舵机自带孔位与反推结果对上,结论才算钉死。