DEEP 33 · 第四辑 · 结构 · LEARN NOTES

收进学习手册 · 2026-09-11 · duck.whatled.com

解读 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,五步:

  1. 焊接重复顶点,建立面片邻接图;
  2. 按二面角 35° 切割,把网格分成一片片"光滑曲面"(在锐边处断开);
  3. 每片拟合圆柱——圆柱面上所有法向都垂直于轴线,所以轴 = 法向协方差矩阵的最小特征向量;
  4. 顶点投影到垂直于轴的平面做代数圆拟合求直径,残差 >3% 丢弃;
  5. 法向指向轴心 = 孔;背离轴心 = 凸台,排除;只保留包角 ≥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 专门讲)——反推结果用来定螺丝规格、轴承型号、采购量是可靠的;直接当加工图纸,不行。

你带走的收获

延伸

什么鸭 WHATDUCK · 复刻学习笔记 ← 全部手册 · 首页