feat(arm): 电机双向夹紧与2mm厚度公差让位,立柱减重槽及文档同步更新

This commit is contained in:
cbb
2026-10-04 13:16:32 +08:00
parent b593e47c76
commit e3b25452e1
70 changed files with 14420 additions and 496 deletions
+73
View File
@@ -0,0 +1,73 @@
## 【2026-10-05e】前端围挡整改推广到全机 5 处(J2/J3/J4/J5/J6)
**用户要求**:"其他几个也有一样的情况,也修一下"
→ J3/M3 那一处的前端围挡,其余四处电机舱(J2/M2、J4/M4、J5/M5、J6/M6)完全同构,一并处理。
### 根因(几何实测,不是残留料)
`Joint.front_collar_pocket(r_bore=30.25)` 把座孔从 R30.15 扩到 R30.25,于是留下一圈
**r30.25..35、6mm 高的环墙**,比电机前端盖 Ø60.3 凸出 4.75mm,把前端盖整圈围住;
J2/J3/J4/J5 上还骑着 R35 前端压盖(Ø70 再凸 3.2mm)。
实测五处环段都在**关节局部 z 49.5..56**:Y 轴电机 Y150..156、roll 电机 Z395.5..389。
### 做法:把 P05 专用盒切泛化成 `cut_motor_fence()`
- 开关 `M3_FENCE_OPEN_CUT` → **`FENCE_OPEN_CUT`**(语义从 P05 专用变全机共用)。
- 新函数 `cut_motor_fence(shape, j, tag, name3, z0=49.4, z1=56.1)`:
在**关节局部坐标系**里切 `x ±40 / y -3..+40 / z 49.4..56.1`,再 `j.L()` 摆到全局。
- 敞口方向恒为**局部 +y**,**无需逐件配置**:实测 5 处电机舱的本体
(环外 r=37/40 有料处 = 背脊侧)方位角全部落在局部角 180~360
(J2 240..315 / J3 225..315 / J4 210..330 / J5 210..330 / J6 195..345)。
- 一对 z 参数通吃全机(因为五处环段都在局部 z 49.5..56)。
- 切口边界取 **y=-3.0 而非 0**:环壁在该处仍与背脊侧实体连通,切出来是真正的缺口
而不是零厚度缝,单实体拓扑天然保持。
- 四个调用点(都在压盖熔接之后、收尾刀具之前):
P04 7b2(j2)、P06 5b2(j4)、P07 7c2(j5)、make_pitch_to_roll_bracket 第13步(j_roll,
条件放宽为 `roll_clamp or FENCE_OPEN_CUT`,这样**尚无前端压盖的 P08/M6 也只切定位环**)。
### 关键教训(值得记住)
1. **P05 的全局盒切其实是局部盒切**:当时那记
`(X_ARM±40, Y_AXIS-40..+3, Z388.9..395.6)` 换算到 J3 局部系正好是
`x±40 / y -3..+40 / z 49.4..56.1`。一开始我按全局坐标去复用,语义就错了 ——
泛化时必须先确认原刀在局部系里是什么。
2. **P05 回归验证**:改用通用函数后 P05 体积 151.60 cm³ 与 2026-10-05d 版**逐位一致**,
剖面 0..165° 敞口侧全空、180..345° 背脊侧有料,证明泛化没有改变既有行为。
3. **写文件务必"先在内存改好、断言全过、最后一次性写出"**:本轮用
`io.open(P,"w").write(s)` 时中途抛异常(`newline="\\n"` 非法值),
**把 119KB 的 arm_model.py 截成了 0 字节**,靠 `.bak/arm_model.py.bak20261005e` 救回。
后续改成 `写 .tmp 再 os.replace()` + 所有 `assert` 前置,原子性才可靠。
4. **heredoc 里 `sed -i` 转义`**:`sed -i 's/newline="\\\\n"/newline="\\n"/'` 这类在
Bash heredoc 里层数容易错,直接改脚本文件更稳。
### 验证结果(全过)
| 项目 | 结果 |
|:--|:--|
| 单实体 | **13/13** ✓ |
| 静态碰撞 | **8/8 零干涉** ✓ |
| 电机 ±2mm 公差 | **15/15** ✓(现覆盖 J2~J6 全部 5 个关节) |
| 3MF | **12/12** ✓ |
| 全行程重扫 | 696 s,`docs/travel.json` 与改前**完全一致**(J2 −105…+9、J4 −111…+16、J5 −93…+34、J1/J3/J6 整周) |
| 逐方位剖面 | 5/5 敞口侧 0/12 有料、背脊侧 11/12 有料 |
| 误伤检查 | 环外本体(r=37/40)改前改后**逐方位完全一致**;压盖沉孔段(z=58)一致 |
减重:P04 −3.4 / P05 −3.2 / P06 −3.2 / P07 −2.1 / P08 −3.0 cm³
(P07 只减 2.1 是因为它 `front_collar_pocket` 用了 `r_bore=30.25+CLEARANCE_GAP=32.25`,
环壁只有 r32.25..35 更薄)。
### 文档同步
- `README.md`:零件表 P04/P06/P07/P08 行加"前端围挡只切敞口那半圈"标记;把
2026-10-05d 的 P05 专用段落升级合并成 2026-10-05e 全机版(去掉了重复叙述)。
- `docs/bom.json`:P04/P06/P07/P08 四件说明各追加一段(bom.json 是 **CRLF**,
写出时必须保持原行尾风格,否则整文件 diff 会被刷满)。
- `docs/screws.json`:S12 备注把 `M3_FENCE_OPEN_CUT` 旧名改掉 + 追加推广说明,
强调 16 颗螺钉的数量/型号/孔位/相位/沉孔深度**一概不变**。
### 产出
- `docs/shots/fence_all_sections.svg` / `.png` —— 五处「改前 vs 改后」横剖面对比图
(脚本 `scratch/gen_fence_sections.py`,用 BRepClass3d_SolidClassifier 沿 720 个方位
逐 0.2mm 步进探测材料外缘半径,直接画材料剖面多边形;比调相机截图可靠得多)。
- `docs/shots/fence_j2_after.png` / `j4` / `j5` / `j6` —— 四处查看器渲染图。
### 查看器渲染的坑(省得再踩)
`look.py` 的相机参数是**世界坐标偏移**:`tx/ty` 要填 **95 / 部件高度**(例
`az=1.5708&po=1.95&rd=150&tx=95&ty=520&tz=-128`),tz 是**负值**。
我先前按局部坐标猜(`tx=19.5`、`tz=+440`),四张图 md5 完全相同 —— 那是渲染没生效,
不是"参数无效但画面相同"。判断参数是否生效要看 **md5 是否互不相同**。