feat(arm): P04顶缘改R3圆角+竖直前壁消除刀刃状凸起,并带上承压面R35圆腔等未提交改动

用户截图圈的"非常尖的凸起"实测是顶面前沿一条刀刃:2026-10-04 把前脸改成与顶面
相切的 Hermite 弧面,但只有 9.0mm 的 Y 预算却要吸收 120.5mm 落差,90° 转弯全挤在
起点——离开顶面 0.28mm 就转到 45°,起始曲率半径 0.571mm,Y=164.32 处顶面与前脸之间
料厚只剩 0.027mm。2026-10-05 的起点加密又抹掉了第一段 57° 折线那层意外钝化。
且历次只碰前缘一条棱,顶面左缘(X=11.5)与后缘(Y=91.5)仍是 89° 直棱。

现改为常规形状:顶面 -> 前侧 R3 圆角 -> 竖直前壁 Y=164.5 直落到 Z=566 -> Hermite
(两端切线沿 -Z,G1) 顺收到 (155.5,526);顶面后缘对称再倒 R3,弧心切点按背面那条
0.24° 斜线取值以免露出台阶。crest 不再是独立最外凸点,尖从根上消失。

代价与核验:P04 体积 276.2 -> 296.2 cm3(+20.0,填掉原内凹腔);Y 最大仍 164.5,
与 P03 止脱环 R36.5/顶646.5 的齐平不变;13/13 单实体、静态干涉 8/8 零、97 颗螺钉。
J1 扫掠半径由 51.6 增至 57.2mm,动态行程数据(collide.json/travel.json)待重扫。

同时带上上一轮未提交的改动:承压面让位腔改 R35 圆腔、主腔统一 BAY_R=30.50、
M2/M3 前端压盖与围挡敞口侧切除、build_viewer 三副本逐个写盘(避免浏览器独占锁
导致"改了源码网页没变")。
This commit is contained in:
cbb
2026-10-07 02:27:38 +08:00
parent e3b25452e1
commit d8f6c69406
10 changed files with 725 additions and 574 deletions
+17 -17
View File
File diff suppressed because one or more lines are too long
+120 -120
View File
@@ -1,122 +1,122 @@
[
{
"id": "S01",
"规格": "M2 x 10",
"螺纹": "M2",
"长度mm": 10,
"头型": "圆柱头内六角",
"数量": 18,
"位置": "J1~J6 输出毂:P04/P05/P06/P07/P08/P09 各 3 颗",
"备注": "Ø2.8 通孔 + Ø5.6 沉孔,BCD 29(3 孔均布),旋入电机输出毂螺纹孔(深 6mm)"
},
{
"id": "S02",
"规格": "M3 x 10",
"螺纹": "M3",
"长度mm": 10,
"头型": "圆柱头内六角",
"数量": 20,
"位置": "P04/P05/P06/P07/P08 各 4 颗 -> 下级电机尾端面",
"备注": "Ø2.8 通孔 + Ø5.5 沉孔(深 4mm),旋入电机尾端面 4x M3 螺纹径向槽(电机.STEP 实测:BCD55、相位 39.9°+90k,槽宽 2.5,径向可调约 ±1.25mm)。【2026-10-03 电机厚度公差】各台电机轴向长度实测差可达 2mm,本孔的承压面已按 MOTOR_TOL=2.0 从 s=-0.6 让空到 s=-2.6(armcore.MOTOR_TOL / arm_build.REAR_SEAT),所以这 4 颗螺钉**不负责把电机压死在某个长度上**,只负责夹紧垫片:装配时在电机尾端面与承压面之间叠 0~2.6mm 的 M3 平垫(标称电机约 0.6mm),厚度 T = 58.6 - 电机实际长度 L,让前端盖正好落到前端压盖面上(压盖背面与前端盖 0.0 面压)。螺钉杆长按最坏情况 T=2.6 选:M3x10 在 T=0.6 时咬合最深,T 每加 1mm 咬合减 1mm;咬合不足 3mm 时改用 M3x12。【2026-10-05 承压面让位腔】承压面段(z=-2.6..+1.0)用 SEAT_R=35.0(= 外壁 R35)圆腔掏出垫片位。**刀半径必须等于 R35**:只要小于 R35,刀半径与外壁之间那圈环墙就必然保留并相对承压面凸起,把电机尾端面围成\"一圈围挡\"(P08 实测 1536.9mm3)—— 这是取值的必然产物,不是残留。取满 R35 后承压面成为完整 R35 平圆盘,凸台与围挡一并消失。SEAT_TOP=+1.0 用于吃掉半包开口处的 0.052cm3 残片(取 0 时该残片脱空成独立碎块)。沉孔位置与深度完全不变(Ø5.5 深 4,z=-8..-4,与圆腔 z 区间不重叠,实测残余 0.00mm³),螺钉头仍坐在沉孔底、杆穿承压面进入电机螺纹槽,咬合量不变。承压环同时由 1.95mm 窄环变 4.75mm 完整圆环,受压面积 383->974mm²。"
},
{
"id": "S03",
"规格": "M3 x 16",
"螺纹": "M3",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P03 后置重载法兰 -> M1 电机尾端面",
"备注": "Ø3.4 通孔 + Ø6.5 圆柱沉孔(深 5mm,头沉入 1.5mm),孔位 BCD55、相位 39.9°+90k(电机.STEP 实测螺纹径向槽),轴向锁死防拉脱;旧 35.1×40.9 矩形孔距对角两颗偏出槽位 ~4.7mm,2026-10-02 修正;头型按用户已采购件用圆柱头内六角(沉孔本为圆柱形)"
},
{
"id": "S04",
"位置": "P03 前置锁紧凸台(Ø10 x4) -> M1 电机前端面",
"备注": "Ø3.2 通孔 + Ø6.0 圆柱沉孔(深 2mm,头露出 1mm),孔位 BCD55 @17.8°+90k(电机.STEP 实测前端螺纹径向槽);头坐在沉孔底 x=9.5,M3x8 咬合电机前端面 3.5mm;2026-10-02 按用户已采购规格由 M3x10 沉头改回 M3x8 圆柱头",
"头型": "圆柱头内六角",
"数量": 4,
"螺纹": "M3",
"规格": "M3 x 8",
"长度mm": 8
},
{
"id": "S05",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 8,
"位置": "P01 立柱分段对锁:A-B 缝 4 颗 + B-C 缝 4 颗(每缝前后各 2 颗)",
"备注": "统一 Ø3.9 直孔(母口壁与公榫壁同径,只有这一个孔,无过孔/沉孔/预埋):M4x16 从外面直接拧入自攻成型,螺纹吃在母口壁 3.6 + 公榫壁 6.9 共 10.5mm;孔位 x=-131/-93 非对称物理防反装"
},
{
"id": "S06",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P09 末端工具法兰 -> 末端工具/夹爪",
"备注": "Ø4.4 通孔(贯穿法兰)+ Ø7.0 圆柱沉孔(深 4mm,头与法兰底面齐平),R22 @0/90/180/270°(BCD44)-> 末端工具;头型按用户已采购件用圆柱头内六角。2026-10-02 由 R20 改 R22:原 R20 与 3xS01 输出螺钉 Ø5.6 螺丝刀通道中心距 6.06mm < 所需 6.30mm,0° 孔的 Ø7.0 沉孔壁被啃穿成月牙形(圆柱面 88mm² 裂成 45.7+35.4);相位差仅 8.6°,转相位躲不开,R22 后余量 1.66mm、边壁仍余 9.5mm;同日修正通孔:原 Ø3.7 比 M4 杆 Ø4.0 还细且只到 z=105,而 M4x16 杆需走到 z=113,杆尾 8mm 埋在实心料里(干涉 147.3mm³),改为 Ø4.4 贯穿"
},
{
"id": "S07",
"规格": "M5 x 25",
"螺纹": "M5",
"长度mm": 25,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P02 底座中核心 -> P01 立柱底部榫头",
"备注": "Ø5.5 通孔 + Ø10 沉孔(深 6mm),非对称孔位防反装,轴向力由榫座面承载"
},
{
"id": "S08",
"规格": "M5 x 25",
"螺纹": "M5",
"长度mm": 25,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P02 前/后力臂 -> 中核心:前臂 2 颗 + 后臂 2 颗",
"备注": "Ø5.5 通孔 + Ø10 沉孔;需另配 M5 六角螺母 4 枚(嵌入螺母沉槽)"
},
{
"id": "S09",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P03 肩吊臂 -> P01_C 立柱顶面(从腔体上方往下拧)",
"备注": "统一 Ø3.9 直孔(鞍座与立柱顶环同径,只有这一个孔,无过孔/沉孔/预埋):M4x16 从上方直接拧入自攻成型,穿鞍座 9mm 后吃进立柱顶环 7mm;载荷走 2403mm² 承压面,螺钉只防上抬"
},
{
"id": "S11",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 1,
"位置": "P01_C 立柱后壁 -> P03 榫头(横向防脱锁紧)",
"备注": "与 S05/S09/S06 同为 M4x16(全机 M4x16 合计 17 颗);Ø3.9 直孔贯穿 11mm 后壁 + 榫头同径:从后方直接拧入自攻成型,榫头内咬合 4.7mm"
},
{
"id": "S10",
"规格": "M6 x 35",
"螺纹": "M6",
"长度mm": 35,
"头型": "外六角",
"数量": 6,
"位置": "底座 6 组 28x7 紧固腰槽 -> 工作台/桌面",
"备注": "需另配 M6 螺母 + 平垫圈各 6(建议加弹垫防松)"
},
{
"id": "S12",
"规格": "M3 x 8",
"螺纹": "M3",
"长度mm": 8,
"头型": "圆柱头内六角",
"数量": 16,
"位置": "P04/P05/P06/P07 前端压盖 -> M2/M3/M4/M5 电机前端盖(J2/J3/J4/J5 各 4 颗)",
"备注": "Ø3.4 通孔 + Ø6.0 圆柱沉孔(深 3.0,头 Ø5.5×3.0 全沉入),孔位 BCD55 @17.8°+90k—— 正是电机前端面 4 个 M3 螺纹径向槽的相位(与 S04 同一套,勿改);螺钉头面压在孔口台阶上(Y 轴关节 Y=158;J3 的 Z 轴版本 Z=387),压盖背面与电机前端盖外端面 0.0 间隙面压贴合—— 与后端安装板 S02 的 4xM3x10 一起把电机前后双向夹死,消掉大扭矩下电机绕 J 轴点头/翘起的倾向。J2(P04 夹 M2)/J4(P06 夹 M4)/J5(P07 夹 M5) 三处压盖几何完全相同;【2026-10-03 新增 J3】P05 夹 M3 是同一套配方的 Z 轴版本(roll 电机轴向 -Z,压盖占 Z384.0..389.0,背面 Z=389 与 M3 前端盖面压),沉孔台阶 Z=387,杆穿 2.0mm 压盖 + 3.5mm 端盖后旋入前端螺纹槽约 2.5mm。【2026-10-05d 只切敞口那一圈围挡】用户指出 M3 电机前端那圈围挡(P05 在 Z389.0..395.5 的 r30.25..35 前端定位环 + 骑在它上面的 R35 压盖外圈,Ø70 比电机 Ø63.6 凸出 3.2mm)需要删除。之前一版把整个前端(定位环 + 压盖 + 腔口下沿 389->395)都切了,电机前端没了支撑面 —— 过度;现已回退。现只切敞口(-Y)那一圈(盒切,Y 界限与 cut_open 一致),-Y 半圈从 Z=395.5 一路开到压盖背面 Z=389;背脊(+Y)侧整圈定位环保留,继续定位 M3 前端盖并作为R35 压盖唯一且足够强的支撑面(4.75mm 宽 x 0.5mm 熔接带)。压盖本体、Ø37 让位孔、4xM3x8 沉孔、腔口下沿 z_bot=389、P06 毂面 383.0 与直锁凸台 65.0 全部不动,本组 16 颗螺钉的孔位/相位/沉孔台阶/咬合量一概不变(M3 仍是后端板 4xM3x10 + 前端压盖 4xM3x8 双向面压)。不整圈削到 R31.8 的原因:那圈壁与 Loft 在 X=±35 处与 Ø70 柱面相切,整圈切完会脱空出 1.32mm3 碎块破坏单实体;且压盖根部熔接带会从 2.37mm2 缩到 0.78mm2,夹紧力会把压盖拉下来。开关 arm_model.FENCE_OPEN_CUT(2026-10-05e 起为全机 5 处共用)。。【2026-10-05e 推广到其余三处】上述\"只切敞口那半圈围挡\"的做法与 P05/M3 完全同源,已推广到 J2/M2(P04)、J4/M4(P06)、J5/M5(P07) 三处同样有 M2/M4/M5 前端压盖的电机,以及尚无前端压盖的 J6/M6(P08)(只切定位环)。切刀 cut_motor_fence() 按各关节自己的局部坐标切(y -3..+40 / z 49.4~56.1,5 处定位环都落在局部 z 49.5~56,一对参数通吃;敞口方向恒为局部 +y)。**本组 16 颗螺钉的数量、型号、孔位 BCD55、相位、沉孔台阶深度、拧紧力矩一概不变** —— 被切掉的只是压盖外侧那圈围挡环墙,压盖本体与沉孔区一根没动,夹紧力与夹紧面积不变。"
}
{
"id": "S01",
"规格": "M2 x 10",
"螺纹": "M2",
"长度mm": 10,
"头型": "圆柱头内六角",
"数量": 18,
"位置": "J1~J6 输出毂:P04/P05/P06/P07/P08/P09 各 3 颗",
"备注": "Ø2.8 通孔 + Ø5.6 沉孔,BCD 29(3 孔均布),旋入电机输出毂螺纹孔(深 6mm)"
},
{
"id": "S02",
"规格": "M3 x 10",
"螺纹": "M3",
"长度mm": 10,
"头型": "圆柱头内六角",
"数量": 20,
"位置": "P04/P05/P06/P07/P08 各 4 颗 -> 下级电机尾端面",
"备注": "Ø2.8 通孔 + Ø5.5 沉孔(深 4mm),旋入电机尾端面 4x M3 螺纹径向槽(电机.STEP 实测:BCD55、相位 39.9°+90k,槽宽 2.5,径向可调约 ±1.25mm)。【2026-10-03 电机厚度公差】各台电机轴向长度实测差可达 2mm,本孔的承压面已按 MOTOR_TOL=2.0 从 s=-0.6 让空到 s=-2.6(armcore.MOTOR_TOL / arm_build.REAR_SEAT),所以这 4 颗螺钉**不负责把电机压死在某个长度上**,只负责夹紧垫片:装配时在电机尾端面与承压面之间叠 0~2.6mm 的 M3 平垫(标称电机约 0.6mm),厚度 T = 58.6 - 电机实际长度 L,让前端盖正好落到前端压盖面上(压盖背面与前端盖 0.0 面压)。螺钉杆长按最坏情况 T=2.6 选:M3x10 在 T=0.6 时咬合最深,T 每加 1mm 咬合减 1mm;咬合不足 3mm 时改用 M3x12。【2026-10-05 承压面让位腔】承压面段(z=-2.6..+1.0)用 SEAT_R=35.0(= 外壁 R35)圆腔掏出垫片位。**刀半径必须等于 R35**:只要小于 R35,刀半径与外壁之间那圈环墙就必然保留并相对承压面凸起,把电机尾端面围成\"一圈围挡\"(P08 实测 1536.9mm3)—— 这是取值的必然产物,不是残留。取满 R35 后承压面成为完整 R35 平圆盘,凸台与围挡一并消失。SEAT_TOP=+1.0 用于吃掉半包开口处的 0.052cm3 残片(取 0 时该残片脱空成独立碎块)。沉孔位置与深度完全不变(Ø5.5 深 4,z=-8..-4,与圆腔 z 区间不重叠,实测残余 0.00mm³),螺钉头仍坐在沉孔底、杆穿承压面进入电机螺纹槽,咬合量不变。承压环同时由 1.95mm 窄环变 4.75mm 完整圆环,受压面积 383->974mm²。"
},
{
"id": "S03",
"规格": "M3 x 16",
"螺纹": "M3",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P03 后置重载法兰 -> M1 电机尾端面",
"备注": "Ø3.4 通孔 + Ø6.5 圆柱沉孔(深 5mm,头沉入 1.5mm),孔位 BCD55、相位 39.9°+90k(电机.STEP 实测螺纹径向槽),轴向锁死防拉脱;旧 35.1×40.9 矩形孔距对角两颗偏出槽位 ~4.7mm,2026-10-02 修正;头型按用户已采购件用圆柱头内六角(沉孔本为圆柱形)"
},
{
"id": "S04",
"位置": "P03 前置锁紧凸台(Ø10 x4) -> M1 电机前端面",
"备注": "Ø3.2 通孔 + Ø6.0 圆柱沉孔(深 2mm,头露出 1mm),孔位 BCD55 @17.8°+90k(电机.STEP 实测前端螺纹径向槽);头坐在沉孔底 x=9.5,M3x8 咬合电机前端面 3.5mm;2026-10-02 按用户已采购规格由 M3x10 沉头改回 M3x8 圆柱头",
"头型": "圆柱头内六角",
"数量": 4,
"螺纹": "M3",
"规格": "M3 x 8",
"长度mm": 8
},
{
"id": "S05",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 8,
"位置": "P01 立柱分段对锁:A-B 缝 4 颗 + B-C 缝 4 颗(每缝前后各 2 颗)",
"备注": "统一 Ø3.9 直孔(母口壁与公榫壁同径,只有这一个孔,无过孔/沉孔/预埋):M4x16 从外面直接拧入自攻成型,螺纹吃在母口壁 3.6 + 公榫壁 6.9 共 10.5mm;孔位 x=-131/-93 非对称物理防反装"
},
{
"id": "S06",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P09 末端工具法兰 -> 末端工具/夹爪",
"备注": "Ø4.4 通孔(贯穿法兰)+ Ø7.0 圆柱沉孔(深 4mm,头与法兰底面齐平),R22 @0/90/180/270°(BCD44)-> 末端工具;头型按用户已采购件用圆柱头内六角。2026-10-02 由 R20 改 R22:原 R20 与 3xS01 输出螺钉 Ø5.6 螺丝刀通道中心距 6.06mm < 所需 6.30mm,0° 孔的 Ø7.0 沉孔壁被啃穿成月牙形(圆柱面 88mm² 裂成 45.7+35.4);相位差仅 8.6°,转相位躲不开,R22 后余量 1.66mm、边壁仍余 9.5mm;同日修正通孔:原 Ø3.7 比 M4 杆 Ø4.0 还细且只到 z=105,而 M4x16 杆需走到 z=113,杆尾 8mm 埋在实心料里(干涉 147.3mm³),改为 Ø4.4 贯穿"
},
{
"id": "S07",
"规格": "M5 x 25",
"螺纹": "M5",
"长度mm": 25,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P02 底座中核心 -> P01 立柱底部榫头",
"备注": "Ø5.5 通孔 + Ø10 沉孔(深 6mm),非对称孔位防反装,轴向力由榫座面承载"
},
{
"id": "S08",
"规格": "M5 x 25",
"螺纹": "M5",
"长度mm": 25,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P02 前/后力臂 -> 中核心:前臂 2 颗 + 后臂 2 颗",
"备注": "Ø5.5 通孔 + Ø10 沉孔;需另配 M5 六角螺母 4 枚(嵌入螺母沉槽)"
},
{
"id": "S09",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 4,
"位置": "P03 肩吊臂 -> P01_C 立柱顶面(从腔体上方往下拧)",
"备注": "统一 Ø3.9 直孔(鞍座与立柱顶环同径,只有这一个孔,无过孔/沉孔/预埋):M4x16 从上方直接拧入自攻成型,穿鞍座 9mm 后吃进立柱顶环 7mm;载荷走 2403mm² 承压面,螺钉只防上抬"
},
{
"id": "S11",
"规格": "M4 x 16",
"螺纹": "M4",
"长度mm": 16,
"头型": "圆柱头内六角",
"数量": 1,
"位置": "P01_C 立柱后壁 -> P03 榫头(横向防脱锁紧)",
"备注": "与 S05/S09/S06 同为 M4x16(全机 M4x16 合计 17 颗);Ø3.9 直孔贯穿 11mm 后壁 + 榫头同径:从后方直接拧入自攻成型,榫头内咬合 4.7mm"
},
{
"id": "S10",
"规格": "M6 x 35",
"螺纹": "M6",
"长度mm": 35,
"头型": "外六角",
"数量": 6,
"位置": "底座 6 组 28x7 紧固腰槽 -> 工作台/桌面",
"备注": "需另配 M6 螺母 + 平垫圈各 6(建议加弹垫防松)"
},
{
"id": "S12",
"规格": "M3 x 8",
"螺纹": "M3",
"长度mm": 8,
"头型": "圆柱头内六角",
"数量": 20,
"位置": "P04/P05/P06/P07/P08 前端压盖 -> M2/M3/M4/M5/M6 电机前端盖(J2/J3/J4/J5/J6 各 4 颗)",
"备注": "Ø3.4 通孔 + Ø6.0 圆柱沉孔(深 3.0,头 Ø5.5×3.0 全沉入),孔位 BCD55 @17.8°+90k—— 正是电机前端面 4 个 M3 螺纹径向槽的相位(与 S04 同一套,勿改);螺钉头面压在孔口台阶上(Y 轴关节 Y=158;J3 的 Z 轴版本 Z=387),压盖背面与电机前端盖外端面 0.0 间隙面压贴合—— 与后端安装板 S02 的 4xM3x10 一起把电机前后双向夹死,消掉大扭矩下电机绕 J 轴点头/翘起的倾向。J2(P04 夹 M2)/J4(P06 夹 M4)/J5(P07 夹 M5) 三处压盖几何完全相同;【2026-10-03 新增 J3】P05 夹 M3 是同一套配方的 Z 轴版本(roll 电机轴向 -Z,压盖占 Z384.0..389.0,背面 Z=389 与 M3 前端盖面压),沉孔台阶 Z=387,杆穿 2.0mm 压盖 + 3.5mm 端盖后旋入前端螺纹槽约 2.5mm。【2026-10-05d 只切敞口那一圈围挡】用户指出 M3 电机前端那圈围挡(P05 在 Z389.0..395.5 的 r30.25..35 前端定位环 + 骑在它上面的 R35 压盖外圈,Ø70 比电机 Ø63.6 凸出 3.2mm)需要删除。之前一版把整个前端(定位环 + 压盖 + 腔口下沿 389->395)都切了,电机前端没了支撑面 —— 过度;现已回退。现只切敞口(-Y)那一圈(盒切,Y 界限与 cut_open 一致),-Y 半圈从 Z=395.5 一路开到压盖背面 Z=389;背脊(+Y)侧整圈定位环保留,继续定位 M3 前端盖并作为R35 压盖唯一且足够强的支撑面(4.75mm 宽 x 0.5mm 熔接带)。压盖本体、Ø37 让位孔、4xM3x8 沉孔、腔口下沿 z_bot=389、P06 毂面 383.0 与直锁凸台 65.0 全部不动,本组 16 颗螺钉的孔位/相位/沉孔台阶/咬合量一概不变(M3 仍是后端板 4xM3x10 + 前端压盖 4xM3x8 双向面压)。不整圈削到 R31.8 的原因:那圈壁与 Loft 在 X=±35 处与 Ø70 柱面相切,整圈切完会脱空出 1.32mm3 碎块破坏单实体;且压盖根部熔接带会从 2.37mm2 缩到 0.78mm2,夹紧力会把压盖拉下来。开关 arm_model.FENCE_OPEN_CUT(2026-10-05e 起为全机 5 处共用)。。【2026-10-05e 推广到其余三处】上述\"只切敞口那半圈围挡\"的做法与 P05/M3 完全同源,已推广到 J2/M2(P04)、J4/M4(P06)、J5/M5(P07) 三处同样有 M2/M4/M5 前端压盖的电机,以及尚无前端压盖的 J6/M6(P08)(只切定位环)。切刀 cut_motor_fence() 按各关节自己的局部坐标切(y -3..+40 / z 49.4~56.1,5 处定位环都落在局部 z 49.5~56,一对参数通吃;敞口方向恒为局部 +y)。**本组 16 颗螺钉的数量、型号、孔位 BCD55、相位、沉孔台阶深度、拧紧力矩一概不变** —— 被切掉的只是压盖外侧那圈围挡环墙,压盖本体与沉孔区一根没动,夹紧力与夹紧面积不变。【2026-10-03 补齐 M6】P08 原先 roll_clamp=False,是五处电机腔里唯一只被后端板4xM3x10 单面锁死的;现按同一配方给 M6 加上前端压盖(轴向 -Z,占全局 Z115.0..120.5,沉孔台阶 Z=118,与 J3 的 Z 轴版本逐项同源),对侧 P09 毂面后移 CLAMP_BACKOFF=5.5让位(工具端点 Z_TIP=93 不变)。至此五处电机全部是「后端板 + 前端压盖」双向面压。"
}
]
+38 -12
View File
@@ -82,6 +82,24 @@ SEAT_R = R35_SEAT # 35.0 承压面段腔口 = 外壁
SEAT_TOP = 1.0 # 圆腔顶端越过电机尾端面 1mm(吃掉开口处残片)
BORE_Z0 = 5.5 # 座孔起点:R35 圆腔挖到此处,与 R30.15 座孔相接
# ---------------------------------------------------------------- 电机腔统一半径
# 【2026-10-05f 接缝整改】腔内壁此前有 4 个互相打架的半径,逐层都能实测到台阶:
# R35(承压面) -> R30.15(座孔) -> R30.25(前端定位) -> R30.50(前端盖让位)
# 每一处单看都有理由,合在一起却让内壁变成「圆-台阶-圆-台阶-圆」,从腔里看全是横向接缝。
#
# 实测依据(scratch/probe_motor_env.py,剖切取 Rmax,112 层):
# 电机本体从 z=0.43 到 z=55.9 **全程 R30.14~30.15 的正圆**,全程无任何台阶。
# 即电机根本没有需要让位的形状变化 —— 那些台阶全是零件自己凭空造出来的。
#
# 故统一取 BAY_R = 30.50 = CB_R:
# - 比电机实测最大半径 30.15 单边大 0.35(直径 0.7),打印件足以塞进去;
# - 前端盖让位本来就是 30.50,沿用它可省掉一处台阶;
# - 比 R30.15 座孔大 0.35,换来的是内壁从 z=-2.6 一直到前端只有一段正圆。
# 代价:R30.15 座孔原本的单边 0.15 滑配变成 0.35,电机在座孔里的径向游隙变大。
# 但电机前后已被后端板 4xM3x10 + 前端压盖 4xM3x8 双向面压夹死(见 motor_front_clamp),
# 径向游隙不影响定位,倾倒自由度已归零。
BAY_R = 30.50
PARTS = []
CENTS = {}
@@ -279,15 +297,18 @@ class Joint:
1. 方腔半宽 32.2 < 外壁 R35,在四个方位留下一圈 2.8mm 环形台肩;
2. 方腔对角 45.5 > R35,四个角把外壁咬穿,形成四个凸角。
两者叠加使内壁呈"圆—方—圆"三段,与同族零件的整体圆弧语言不一致。
现改为**单一 R35 圆腔从承压面一直挖到座孔起点 BORE_Z0(=5.5)**,
与其上的 R30.15 座孔正交相接,内壁成为两段同心正圆(仅一处正常台阶),
承压面到外壁之间再无任何凸起或方角。P04 走自己那套刀具,本来就无方腔。
【2026-10-05f 承压面段也并进主腔,全腔只剩一段正圆】
去掉方腔后内壁还剩两段:R35(承压面段 z=-2.6..5.5)+ R30.15 座孔(z>5.5),
接缝处仍是一道 4.85mm 深的横向台阶。加上前端定位 R30.25、前端盖让位 R30.50,
实测内壁依次是 35.0 / 30.5 / 30.2 / 30.5 / 30.2 —— 四道台阶(scratch/bay_step_profile.py)。
根因是**电机根本没有那么多形状变化**:实测电机 STEP 全程 R30.15 正圆,
那些半径全是零件自己造的。
现改为**单一 BAY_R 圆柱从承压面一直挖到前端盖外**,
SEAT_R / BORE_R / CB_R 三把刀合并成一把,承压面 -> 前端内壁全程一段正圆,
接缝归零。承压面仍是 R35 的完整平圆盘(SEAT_TOP 段保留,只是不再往上延伸)。
"""
c = [cyl(BORE_R, BORE_Z0, COVER_Z - 3.5), cyl(CB_R, COVER_Z - 3.5, COVER_Z + front_pad),
# 承压面段 + 尾部过渡段:SEAT_R(=R35 外壁) 圆腔,从承压面一路挖到座孔起点。
# 取满 R35 才能让承压面与外壁齐平成一个平面;取小于 R35 就会留下
# 一圈凸起的"围挡"(见 docstring)。
cyl(SEAT_R, -REAR_SEAT, BORE_Z0)]
c = [cyl(BAY_R, -REAR_SEAT, COVER_Z + front_pad)]
return shape.cut(*[self.L(s) for s in c])
def rear_mount_holes(self, shape, t_plate=8.0, hole_d=2.8, cb_d=5.5, cb_depth=4.0):
@@ -309,10 +330,15 @@ class Joint:
cuts.append(self.L(cb))
return shape.cut(*cuts)
def front_collar_pocket(self, shape, r_bore=30.25, z0=50.0, z1=56.5):
"""Cut front locating collar pocket for the motor front rim."""
p = cyl(r_bore, z0, z1)
return shape.cut(self.L(p))
# 【2026-10-03i】front_collar_pocket 已整段删除。
# 它切的是 cyl(r_bore, z0=50.0, z1=56.5),而 Joint.pocket 切的是
# cyl(BAY_R, -REAR_SEAT, COVER_Z+front_pad) —— 同半径、且完全是后者的子集。
# 两次「同半径圆柱布尔相减」不会多挖掉材料,却会让 OCC 在腔壁上留下一条
# s=50.0 的零宽棱:实测 P05 的 R30.500 腔壁裂成 5090.5 + 493.9 两张面,
# P06 同样在 50.0 处裂开,而没调它的 P04/P08 腔壁是完整一张。
# 这条棱在着色渲染里就是横穿腔内的一道线 —— 属于纯自找的接缝。
# 前端定位环本身(前段 r30.5..35 的 6mm 环墙)不受影响:
# 它由各零件自己的 lower_block / front_* 圆柱构成,不再靠这刀掏内孔。
def pinch(self, shape, fracs=(0.26, 0.58, 0.86), r_out=48.0, n=2):
"""Radial M3 pinch screws through the boss wall onto the housing."""
+160 -54
View File
@@ -222,7 +222,15 @@ def motor_front_clamp(px, pz, plate_t=CLAMP_T, tag="", axis="Y", py=0.0, z_face=
s0, s1 = -CLAMP_ROOT, plate_t
fp = C(35.0, s0, s1)
fp = fp.cut(C(18.5, s0 - 0.5, s1 + 0.5)) # Ø37 中央让位孔
fp = fp.cut(C(30.15, s0 - 0.5, 0.0)) # Ø60.3 让位槽
# 【2026-10-03h 接缝整改】根部让位槽原来切 R30.15,比腔壁 BAY_R=30.50 小 0.35,
# 于是压盖根部那圈 r30.15..35 的定位唇内壁比腔壁**内凸 0.35**,从腔里看就是
# 腔口一圈 0.5mm 宽、0.35mm 深的环槽(P04/P05/P06/P07 各有一圈,实测台阶面
# 31.2mm2 + R30.15 环带 44.4mm2,四件完全相同)。这刀是腔还是 R30.15/R30.25
# 那个年代留下的:当时必须让到电机实测外圆,压盖根部才啃不到电机。
# 现在主腔已统一到 BAY_R,电机实测 R30.15,让位槽取 BAY_R 即可:
# 定位唇内壁与腔壁同一根正圆,两张圆柱面首尾相接,中间不再有任何台阶,
# 对电机的单边间隙仍是 0.35(唇内径 Ø61.0 > 电机 Ø60.3)。
fp = fp.cut(C(AB.BAY_R, s0 - 0.5, 0.0)) # Ø61.0 根部让位槽(= 腔径)
for deg in CLAMP_CLOCK_LOCAL:
rad = math.radians(-deg) # 全局相位 = -局部相位
fu, fv = CLAMP_BCD * math.cos(rad), CLAMP_BCD * math.sin(rad)
@@ -254,14 +262,29 @@ def hub_m2_holes(shape, j, cb_z1, th_z1=58.0, th_z0=54.0, cb_z0=58.0,
return shape
def make_direct_hub(shape, j, r_disc=35.0, z_out=74.0):
"""优化直连法兰:增加导向倒角"""
disc = cyl(r_disc, 56.5, z_out)
boss = cyl(17.8, 54.942, 56.5)
def make_direct_hub(shape, j, r_disc=35.0, z_out=74.0, backoff=0.0):
"""优化直连法兰:增加导向倒角
backoff = 毂面沿电机轴**远离电机**的让位量(2026-10-03 新增,目前只有 P09 用)。
场景:J6/M6 补上前端压盖后(见 p_wrist_bracket 的 roll_clamp=True),压盖占
局部 z 55.5..61.0(= 全局 Z 120.5..115),而毂面原来在局部 56.5,两者直接打架。
按 P06 给 J3 让位的同一套办法,把毂面整体后移 CLAMP_BACKOFF=5.5:
毂面 56.5 -> 62.0,压盖前端面在 61.0,中间正好留 CLAMP_CLR=1.0。
只动"外端"坐标,不动"电机端"坐标,否则咬合量就变了:
直锁凸台起点 54.942 不动、长度 54.942..56.5 -> ..62.0 加长 5.5,
进入电机输出毂的深度与改前完全一致(与 p_humerus_bone 的 J3 处理同源);
导向锥 54.5..54.942 不动;
3xS01 输出螺钉让位通道与 4xM2 直锁沉孔的**内**端(54.0 / 58.0)不动,
只把外端(z_out+30 / z_out+40)跟着放长。
"""
disc = cyl(r_disc, 56.5 + backoff, z_out + backoff)
boss = cyl(17.8, 54.942, 56.5 + backoff)
chamfer_cone = cyl(18.5, 54.5, 54.942)
shape = shape.fuse(j.L(disc)).fuse(j.L(boss)).cut(j.L(chamfer_cone))
shape = shape.cut(j.L(cyl(3.5, 54.0, z_out + 30.0)))
return hub_m2_holes(shape, j, cb_z1=z_out + 40.0)
shape = shape.cut(j.L(cyl(3.5, 54.0, z_out + 30.0 + backoff)))
return hub_m2_holes(shape, j, cb_z1=z_out + 40.0 + backoff)
# ========== 躯干部分 ==========
@@ -1135,34 +1158,62 @@ def p_fork(j1, j2):
xz_shape = cq.Shape(xz_wire.extrude(100.0, both=True).val().wrapped)
# 5. YZ 平面包络
# 【2026-10-04 视觉整改】电机上方那块 4048mm2 的大平面改成 Hermite 弧面。
# 原来第 2->3 点之间是一条直线 (164.5,646.5)->(155.5,526),沿 X 方向拉成
# 4048mm2 的平板(实测法向 (0,1,-0.07),带 4 度斜度),正对电机上方 ——
# 两侧被 xz_wire 的 R18 圆弧挤出去,形成"中间一块平、两边鼓"的观感。
# 改法:把这段直线换成三次 Hermite 曲线,两端切线分别沿 Y(接上面 Z=646.5
# 的顶段)与沿 Z(接下面 Y=155.5 的竖直段),保证 G1 连续无缝;
# 中部向 +Y 外凸约 3mm,弧度观感与两侧 R18 一致。
# 为什么不用单段圆弧:A 处切线要沿 Y、B 处要沿 Z,单个圆心无法同时满足
# (解出来 R=9 与 R=120.5 矛盾),必须用 Hermite/Bezier —— 与 P05/P06
# 的 Loft 过渡同一套做法。
# 注意:顶点绕序必须与原列表一致(先 y_b 后 y_a),否则多边形自交、
# 布尔后零件会碎掉(实测会掉到 48cm3 / 3 块实体)。
y_a = (Y_COVER - 0.5, Z_SH + 36.0) # (155.5, 526.0) 曲线终点
y_b = (Y_AXIS + 36.5, Z_RL + 36.5) # (164.5, 646.5) 曲线起点
_d = math.hypot(y_b[0] - y_a[0], y_b[1] - y_a[1])
_m0y, _m1z = -0.5 * _d * 0.35, 0.5 * _d * 0.5 # 切线:起点沿 -Y,终点沿 +Z
yz_pts = [(Y_AXIS - 36.5, Z_RL + 36.5)]
for k in range(13):
t = k / 12.0
# 【2026-10-07 按用户手绘红线改成"R3 圆角 + 竖直前壁",消掉顶面前沿那颗尖】
# 来历:2026-10-04 那版把前脸做成与顶面**相切**的 Hermite 弧面,但这条曲线
# 只有 9.0mm 的 Y 预算(164.5->155.5),却要吸收 120.5mm 的落差,于是 90° 的
# 转弯全挤在起点:实测离开顶面 0.28mm 落差就转到 45°,起始曲率半径 0.571mm。
# 后果是顶面前沿 Y=164.5 成了**全件最外凸点**,往下前脸立刻后退,
# 在 Y=164.32 处顶面与前脸之间的料厚只剩 0.027mm —— 就是用户截图圈的那颗尖。
# 2026-10-05 的"起点加密采样"把第一段 57° 折线(那其实是一层意外的钝化)抹平,
# 反而让它变成真正的刀刃。两次都只碰了前缘**一条**棱,
# 顶面左缘(X=11.5, 73mm)与后缘(Y=91.5, 17.5mm)仍是 89° 直棱,所以没解决。
# 现在的形状:顶面 -> 前侧 R3 圆角 -> 竖直前壁 Y=164.5 一路直落到 Z=566
# -> Hermite(两端切线均沿 -Z,G1) 顺收到 (155.5, 526);
# 顶面**后缘**同样倒 R3(与前缘对称,用户 2026-10-07 追加要求),
# 弧心落在背面那条斜线上(背面从 (91.5,646.5) 斜到 (92.0,526),斜 0.24°,
# 切点 Y 必须按该斜线取,否则弧端会露出 0.01mm 台阶)。
# crest 不再是独立的最外凸点(整条前壁同为 Y=164.5),尖由此从根上消失;
# 全件 Y 最大值仍是 164.5,与 P03 止脱环 R36.5/顶646.5 的齐平关系不变。
# 后缘圆角只减料:体积 296.24 -> 296.20 cm3,Y 最小值 91.50 -> 91.51。
# 代价(实测):P04 体积 276.2 -> 296.2 cm3 (+20.0),因为填掉了原来那个内凹腔;
# 且 J1 扫掠半径由 crest 的 hypot(36.5,36.5)=51.6 增到前壁 (Y164.5,Z566) 的
# hypot(36.5,44.0)=57.2 (+5.6mm) —— 全行程碰撞/行程必须重扫才算完成。
# 注意:顶点绕序必须与原列表一致(先顶面、再前壁、再竖直段),否则多边形自交、
# 布尔后零件会碎掉(实测会掉到 48cm3 / 3 块实体)。
y_a = (Y_COVER - 0.5, Z_SH + 36.0) # (155.5, 526.0) 顺收终点
y_b = (Y_AXIS + 36.5, Z_RL + 36.5) # (164.5, 646.5) 顶面前沿 = 前壁所在 Y
R_TIP = 3.0 # 顶面 -> 竖直前壁 的圆角半径
R_BACK = 3.0 # 顶面 -> 背面 的圆角半径(与前缘对称)
Z_WALL_END = 566.0 # 竖直前壁落到此处,再往里顺收
_c = (y_b[0] - R_TIP, y_b[1] - R_TIP) # 前侧圆角心 (161.5, 643.5)
# 背面那条线是斜的:(91.5, 646.5) -> (92.0, 526.0),斜 0.24°。
# 后侧圆角必须切在这条线上,否则弧端点会露出 0.01mm 的台阶。
_zb0, _zb1 = Z_RL + 36.5, Z_SH # 背面上下端 Z
_yb0, _yb1 = Y_AXIS - 36.5, Y_REAR - 8.0 # 背面上下端 Y
_z_ab = _zb0 - R_BACK # 弧与背面的切点高度 643.5
_y_ab = _yb0 + (_zb0 - _z_ab) / (_zb0 - _zb1) * (_yb1 - _yb0)
_cb = (_y_ab + R_BACK, _z_ab) # 后侧圆角心
yz_pts = [(_cb[0], _zb0), # 顶面后缘改从圆角起点开始
(_c[0], y_b[1])] # 顶面走到前侧圆角起点 Y=161.5
for _k in range(1, 31): # R3 圆角:90° -> 0°,切线由水平转竖直
_a = math.radians(90.0 - 90.0 * _k / 30.0)
yz_pts.append((_c[0] + R_TIP * math.cos(_a), _c[1] + R_TIP * math.sin(_a)))
yz_pts.append((y_b[0], Z_WALL_END)) # 竖直前壁 Y=164.5 直落(直线段)
_m = 0.5 * math.hypot(y_b[0] - y_a[0], Z_WALL_END - y_a[1]) * 0.5
for _k in range(1, 121): # 底部顺收 Hermite:两端切线都沿 -Z
t = _k / 120.0
h00 = 2 * t ** 3 - 3 * t ** 2 + 1
h10 = t ** 3 - 2 * t ** 2 + t
h01 = -2 * t ** 3 + 3 * t ** 2
h11 = t ** 3 - t ** 2
yz_pts.append((h00 * y_b[0] + h10 * _m0y + h01 * y_a[0],
h00 * y_b[1] + h11 * _m1z + h01 * y_a[1]))
yz_pts.append((h00 * y_b[0] + h01 * y_a[0],
h00 * Z_WALL_END + h01 * y_a[1] - _m * (h10 + h11)))
yz_pts += [(Y_COVER - 0.5, Z_SH),
(Y_REAR - 8.0, Z_SH),
(Y_REAR - 8.0, Z_SH + 36.0)]
for _k in range(0, 30): # 后侧 R3 圆角:180° -> 90°
_a = math.radians(180.0 - 90.0 * _k / 30.0)
yz_pts.append((_cb[0] + R_BACK * math.cos(_a), _cb[1] + R_BACK * math.sin(_a)))
yz_solid = Xplate(yz_pts, -20.0, 60.0)
c_int = BRepAlgoAPI_Common(yz_solid.wrapped, xz_shape.wrapped)
@@ -1172,21 +1223,20 @@ def p_fork(j1, j2):
s = s.fuse(column)
# 6. 中部电机定子散热切除
s = s.cut(Ycyl(30.5, Y_REAR + 0.5, Y_COVER - 6.5, X_ARM, Z_SH))
# 【2026-10-05f】这刀原本是独立存在的(挖 R30.5 让定子裸露)。现在主腔已经
# 统一到 BAY_R=30.50 并从承压面一路挖到前端,这刀完全落在主腔范围内 ——
# 留着不改也不会多挖,但它是「同一段腔被两个不同半径各挖一次」的残留,
# 正是接缝的来源,删掉以免后人以为散热口另有深意。
# 通风靠 cut_open(第 6b 步的敞口盒切)实现,不依赖这刀。
# s = s.cut(Ycyl(30.5, Y_REAR + 0.5, Y_COVER - 6.5, X_ARM, Z_SH))
# 7. M2 接口成型
# 承压面起点用 AB.REAR_SEAT(=0.6 台肩 + 2.0 公差),与 Joint.pocket 同源:
# P04 走的是自己那套 BORE_R 圆柱刀具(没调 Joint.pocket),这里必须同步改,
# 否则 J2 关节的电机公差位仍是旧的 0.6,与 J3~J6 不一致。
# 【2026-10-05】承压面段加一刀 SEAT_R(=R35) 圆腔,SEAT_TOP=+1.0。
# 取满 R35 才能让承压面与外壁齐平成**一个平面**(用户要求:把凸台、围挡
# 一起弄平,做成和电机两头齐平的平面)。取小于 R35 必然留下一圈凸起
# 2.6mm 的围挡环墙 —— 详见 Joint.pocket 的 docstring。
s = j2.front_collar_pocket(s, r_bore=30.25, z0=50.0, z1=56.5)
# 【2026-10-05f】与 Joint.pocket 同步:主腔统一为单一 BAY_R 圆柱,
# 从承压面一路挖到前端盖外,内壁不再有 R35/R30.15/R30.25/R30.50 四段台阶。
# (承压面段不再单独挖 SEAT_R:BAY_R 从 -REAR_SEAT 起就覆盖了它,
# 承压面本身仍是 R35 外壁围出的完整平圆盘。)
s = j2.rear_mount_holes(s, t_plate=8.0, hole_d=2.8, cb_d=5.5, cb_depth=4.0)
c_m2 = [cyl(BORE_R, -AB.REAR_SEAT, COVER_Z - 3.5), cyl(CB_R, COVER_Z - 3.5, COVER_Z + 0.6),
cyl(AB.SEAT_R, -AB.REAR_SEAT, AB.SEAT_TOP)]
s = s.cut(*[j2.L(item) for item in c_m2])
s = s.cut(j2.L(cyl(AB.BAY_R, -AB.REAR_SEAT, COVER_Z + 0.6)))
# 7b. M2 前端压盖熔接(见 2b):必须在 6/7 步所有 R30.15~30.5 圆柱刀具走完之后,
@@ -1211,8 +1261,28 @@ def p_fork(j1, j2):
# 槽底 Z525 以下保留整块实心过渡到电机座;顶部敞开故非封闭腔、免支撑。
# 必须在 8 步 J1 凸台/螺钉孔之前切:槽的 X23..35 范围离 J1 凸台(X<=11.5)与
# 3xS01 沉孔(X12..14)都有富余,但先切可以保证后面那些刀具不会把槽壁打薄。
# 7c2.【2026-10-05 槽右壁跟随外轮廓,去掉右上角两段尖楔】
# x1=35 是按立柱中段定的(Z525~630,X11.5~45 全宽都在,中性面 X29,
# 两片腹板 X13~23 / X35~45 各 10mm)。可 Z630 以上零件被 R18 圆角收窄:
# 顶面只剩 X11.5~29,再往右是圆角带 X29~45。
# 原先一刀切到底,槽就横着切进圆角带;又因为槽在 Y=102/154 收尾,
# 圆角带被切成两段悬空的楔料(一头尖一头宽),从右上角看就是"一小段尖的"
# —— 它悬在槽口上方 1.7mm(Z644.76~646.5)没有支撑,尖头正好落在收尾处。
# 改法:**上段跟着外轮廓收窄**,Z>630 只切到 X29(顶面右边缘),
# 圆角带 X29~45 一整条保持连续,中/左/右三段料都不再悬空,
# 尖楔和新台阶一起消失(先前只在 Z644.8 削平顶面,等于把尖顶削成一条
# 新台阶,尖头本身还在,更难看 —— 已回退)。
# 下段 X23..35 原样保留,腹板位置和厚度都不动,强度结论不受影响。
# 分界 Z=630 取自 xz_wire:R18 圆弧正是从 (X45,Z630) 起往左上收。
Z_TAPER = 630.0 # = 圆角起点 Z,槽右壁在此处收窄
X_TOP_EDGE = 29.0 # = 顶面右边缘(圆角带上沿),槽不许越过
s = s.cut(hollow_channel(P04_CH["x0"], P04_CH["x1"], P04_CH["y0"], P04_CH["y1"],
P04_CH["z_floor"], 660.0, tag="P04立柱"))
P04_CH["z_floor"], Z_TAPER, tag="P04立柱下段"))
s = s.cut(hollow_channel(P04_CH["x0"], X_TOP_EDGE, P04_CH["y0"], P04_CH["y1"],
Z_TAPER, 660.0, tag="P04立柱上段(随外轮廓收窄)", fil=0.0))
# 上段 fil=0:槽宽只剩 6mm(X23~29),R4 内角圆角在 6mm 宽的槽上两侧
# 叠加会退化成零面积而失败(实测报 BRep_API: command not done)。
# 这里本来就是直壁窄槽,不倒角也符合"跟随外轮廓"的意图。
# 8. 头部转接凸台加长(贯通 P03 前盖中心孔,跨越装配缝直连 J1 输出盘)
boss = cyl(17.8, 54.942, 61.5 + X_FORK_GAP)
@@ -1243,7 +1313,9 @@ def make_pitch_to_roll_bracket(j_pitch, j_roll, z_pitch, z_r, name="bracket", hu
roll 电机(J3/J6)轴向是 -Z,前端盖外端面在 z_r-56,-Z 侧是从动件:
压盖朝 -Z 长(Z_COVER-5..Z_COVER),从动件毂面必须整体后移 CLAMP_BACKOFF=5.5
让位(与 Y 轴关节 hub_gap=6.0 同一个道理,只是基准间隙 0.5 而非 1.0)。
P08 传 False:J6 的 M6 前端压盖尚未做(从动件 P09 让位要改工具法兰直锁凸台)。
P08 自 2026-10-03 起也传 True:M6 前端压盖补齐,对侧 P09 让位 CLAMP_BACKOFF
(见 make_direct_hub 的 backoff),五处电机腔至此全部是「后端板 + 前端压盖」
双向面压,配方同源。
"""
z_bot = z_r - 56.0 # roll 电机底端 (front collar)
z_plate = z_r + 8.0 # roll 电机顶端安装板 (rear plate top);见第 8 步 t_plate 说明
@@ -1324,11 +1396,17 @@ def make_pitch_to_roll_bracket(j_pitch, j_roll, z_pitch, z_r, name="bracket", hu
# 台阶只剩 t_plate-cb_depth-REAR_SEAT = 8-4-2.6 = 1.4mm 膜厚;给到 8 而不是原来的
# 7,是为了不让这层膜退化成 0.4mm。7->8 让 P05/P08 的杯体外壳顶 z_plate 抬 1mm。
s = j_roll.rear_mount_holes(s, t_plate=8.0, hole_d=2.8, cb_d=5.5, cb_depth=4.0)
s = j_roll.front_collar_pocket(s, r_bore=30.25, z0=50.0, z1=56.5)
# 【2026-10-03i 接缝整改】front_collar_pocket 已删。
# 它切的是 cyl(BAY_R, z0=50.0, z1=56.5),而紧接着的 Joint.pocket 切的是
# cyl(BAY_R, -REAR_SEAT, COVER_Z+front_pad) —— **同一根圆柱、同一个半径**,
# 前者完全是后者的子集。两次半径相同的圆柱布尔相减,等于让 OCC 在腔壁上
# 留下一条 s=50.0 的零宽棱:实测 P05 的 R30.500 腔壁被切成 5090.5 + 493.9
# 两张面(-2.6..50.0 与 50.0..55.5),P06 同样在 50.0 处裂开。着色时那条
# 棱就是腔里横穿的一道线。P04/P08 本来就没调它,腔壁是完整一张面。
s = j_roll.pocket(s)
# 9. 电机定子配合空腔
s = s.cut(cyl(30.5, z_r - 49.5, z_r - 0.5, HL.X_ARM, HL.Y_AXIS))
# 【2026-10-05f】原 cyl(30.5, ...) 定子配合空腔已删,同上:已被主腔 BAY_R 覆盖。
# 10. 俯仰轴直连法兰结构(凸台延伸至法兰盘背面之后 2.5mm,跨过间隙与法兰盘牢固熔接,
# 保持单实体)。凸台长度跟着 y_hub_in 走:法兰盘后移时凸台同步加长,
@@ -1352,7 +1430,10 @@ def make_pitch_to_roll_bracket(j_pitch, j_roll, z_pitch, z_r, name="bracket", hu
# 熔接必须放在最后:第 6/7/8/9 步所有 R30.15~30.5 圆柱刀具都走完之后才接,
# 否则压盖根部那 0.5mm 薄环会被 front_collar_pocket / 定子孔啃掉一圈。
if roll_clamp:
s = s.fuse(motor_front_clamp(HL.X_ARM, 0.0, tag="%s/M3" % name[:3],
# tag 里的电机号从 j_roll.jid 取(P05->M3 / P08->M6),别再写死 M3 ——
# 写死的话 P08 的构建日志会谎报自己夹的是 M3,排查时容易被带偏。
s = s.fuse(motor_front_clamp(HL.X_ARM, 0.0,
tag="%s/M%d" % (name[:3], int(j_roll.jid[1])),
axis="Z", py=HL.Y_AXIS, z_face=z_r - COVER_Z))
# 13.【2026-10-05d】只切"围挡"那一圈:敞口(-Y)侧的前端定位环 + 压盖根部薄环。
@@ -1374,9 +1455,9 @@ def make_pitch_to_roll_bracket(j_pitch, j_roll, z_pitch, z_r, name="bracket", hu
# 附带效果:盒切把 Loft 在 X=±35 与 Ø70 柱面相切的那两片切向楔形一起带走
# (楔形位于 Y_AXIS 附近 < Y_AXIS+3),不会留下孤立碎块 -> 单实体拓扑保持。
# 13.【2026-10-05e】删掉前端"围挡"在敞口侧的那半圈环墙(见 FENCE_OPEN_CUT)。
# P05(M3) 有前端压盖、环上骑着压盖;P08(M6) 还没有 M6 前端压盖(roll_clamp=False),
# 环是光板 —— 两者都只切敞口(局部 +y)那半圈定位环,背脊侧整圈保留,
# 继续定位电机前端盖。P05 的压盖因此仍有 4.75mm x 0.5mm 的熔接带作支撑面。
# P05(M3)/P08(M6) 现在都有前端压盖、环上骑着压盖 —— 两者都只切敞口(局部 +y)
# 那半圈定位环,背脊侧整圈保留,继续定位电机前端盖,并给压盖当 4.5mm x 0.5mm
# 的熔接带支撑面。
if roll_clamp or FENCE_OPEN_CUT:
s = cut_motor_fence(s, j_roll, "%s/M3" % name[:3], name[:3])
@@ -1464,10 +1545,14 @@ def p_humerus_bone(j3, j4):
s = s.fuse(loft.val())
# 4. 电机中间定子散热裸露切除 (100% 裸露)
s = s.cut(Ycyl(30.5, Y_REAR + 0.5, Y_COVER - 6.5, X_ARM, Z_EL))
# 【2026-10-05f】原 Ycyl(30.5, ...) 定子散热切除已删:主腔统一 BAY_R=30.50
# 且从承压面挖到前端,这刀完全落在主腔内,属同段腔被两个半径各挖一次的残留。
# 通风由敞口盒切实现,不依赖它。
# 5. M4 接口成型
s = j4.front_collar_pocket(s, r_bore=30.25, z0=50.0, z1=56.5)
# 【2026-10-03i 接缝整改】front_collar_pocket 已删,理由同 p_shoulder_roll_base:
# 它与 Joint.pocket 切的是同一根 BAY_R 圆柱,是后者的子集,两次同半径布尔
# 相减会在腔壁上留下 s=50.0 的零宽棱(本件实测 R30.500 裂成 5168.4 + 493.9 两张面)。
s = j4.rear_mount_holes(s, t_plate=8.0, hole_d=2.8, cb_d=5.5, cb_depth=4.0)
s = j4.pocket(s)
@@ -1610,10 +1695,21 @@ def p_forearm_bone(j4, j5, half=None):
P07_CH["z_floor"], 300.0, tag="P07顶板"))
# 7. M5 电机安装接口与定子空腔
s = j5.front_collar_pocket(s, r_bore=30.25 + CLEARANCE_GAP, z0=50.0, z1=56.5)
# 【2026-10-05f 接缝整改】本件原先是全机唯一给腔径加 CLEARANCE_GAP(2.0) 的地方:
# front_collar_pocket(r_bore=32.25) + 一刀 Ycyl(32.5, Y_REAR-0.5, y_front-6)。
# 结果内壁是 35 -> 32.5 -> 30.2 -> 32.3 -> 30.2,比兄弟件多两道台阶
# (实测 scratch/bay_step_profile.py:z=5.5 处 32.5、z=49.5 处掉到 30.2、
# z=50.25 又回到 32.3)。
# 这 2.0mm 是「关节间隙」,但关节间隙是**轴向**让位(见 hub_gap / CLAMP_CLR),
# 径向把腔径撑大 2mm 只会让电机在腔里晃,且与 P05/P06/P08 不一致。
# 现统一走 BAY_R(30.50),与兄弟件同径,接缝归零。
# 【2026-10-03i】front_collar_pocket 随之删除:它切 cyl(BAY_R, 50.0..56.5),
# 是 Joint.pocket 那根 cyl(BAY_R, -2.6..61.6) 的子集,同半径重复相减
# 只会在腔壁上多出一条 s=50.0 的零宽棱。
s = j5.rear_mount_holes(s, t_plate=8.0, hole_d=2.8, cb_d=5.5, cb_depth=4.0)
s = j5.pocket(s)
s = s.cut(Ycyl(30.5 + CLEARANCE_GAP, HL.Y_REAR - 0.5, y_front - 6.0, X_ARM, Z_WR))
# 【2026-10-05f】原 Ycyl(30.5+CLEARANCE_GAP=32.5, ...) 整刀删除:
# 它既撑大了腔径(接缝主因),又已被主腔 BAY_R 完全覆盖(纯冗余)。
# 半包散热设计:-Z底部电机定子通风口
vent_cut = bx(X_ARM - 40.0, X_ARM + 40.0, y_rear + 8.0, y_front - 6.0, Z_WR - 40.0, Z_WR - 25.0)
@@ -1663,10 +1759,16 @@ def p_wrist_bracket(j5, j6):
hub_gap=6.0:J5 处 P07 新增了 M5 前端压盖(Y 155.5..161.0),从动法兰盘背面必须
从 Y=157 后移到 Y=162 让位;J5 直锁凸台同步加长,3xS01 输出螺钉咬合量不变。
roll_clamp=True【2026-10-03】:M6 补上前端压盖,与 P04/P05/P06/P07 的
M2/M3/M4/M5 同一套配方(R35、4xM3x8 BCD55 @17.8°+90k、Ø6.0 沉孔、Ø61.0 根部
让位槽),轴向 -Z,压盖占全局 Z 120.5..115。此前本件是五处电机腔里**唯一**
只被后端板 4xM3x10 单面锁死的,电机大扭矩下会在 Ø60.3 座孔里点头;对侧
P09 让位 CLAMP_BACKOFF=5.5(见 make_direct_hub 的 backoff),工具端点不动。
"""
return make_pitch_to_roll_bracket(j5, j6, Z_WR, Z_R6,
name="P08_腕偏转座_螺旋体25%_墙4底5_竖打",
hub_gap=6.0)
hub_gap=6.0, roll_clamp=True)
def p_tool_flange(j6):
@@ -1703,7 +1805,11 @@ def p_tool_flange(j6):
s = s.cut(pilot).cut(thru)
# 直连法兰
s = make_direct_hub(s, j6, r_disc=35.0, z_out=74.0)
# 【2026-10-03】M6 补上前端压盖后,J6 毂面必须让位 CLAMP_BACKOFF=5.5
# (详见 make_direct_hub 的 backoff)。P09 的法兰本体 z_bot/Z_HUB6 一个字没动,
# 让位的只是伸进 J6 腔里的那圈毂面 —— 圆盘下移后仍与法兰本体在局部 65..79.5
# 大面积交叠,熔接不受影响;工具端点 Z_TIP=93 也随之不变。
s = make_direct_hub(s, j6, r_disc=35.0, z_out=74.0, backoff=CLAMP_BACKOFF)
# 4x M4 孔(必须在 make_direct_hub 之后切)
#
+20 -4
View File
@@ -50,12 +50,28 @@ def rebuild_viewer():
.replace("/*__IKGLUE__*/", ik_glue))
assert "/*__" not in out, [l for l in out.split("\n") if "/*__" in l][:3]
dst = WEB + "/机器人手臂3D查看器.html"
io.open(dst, "w", encoding="utf-8").write(out)
io.open(WEB + "/index.html", "w", encoding="utf-8").write(out)
io.open(WORKSPACE + "/机器人手臂3D查看器.html", "w", encoding="utf-8").write(out)
# 【2026-10-06】三个副本逐个写、逐个报错,不要一把梭。
# 原来三行连写,任一份被浏览器独占(Windows 上打开中的 html 是独占锁)就抛异常,
# 而调用方 arm_model.py 把整个 rebuild_viewer() 包在 try/except 里,
# 于是只写成功第一份、另外两份静默停在旧版本 —— 表现为"代码改了但网页没变"。
# 实测就是这个坑:18:52 那次 dst 是新的,web/index.html 和根目录那份还停在 18:12。
ok, failed = True, []
for path in (dst, WEB + "/index.html", WORKSPACE + "/机器人手臂3D查看器.html"):
try:
io.open(path, "w", encoding="utf-8").write(out)
except Exception as e:
ok = False
failed.append("%s (%s)" % (path, e))
sz_mb = os.path.getsize(dst) / 1e6
print(f" 完成 ({sz_mb:.2f} MB, 耗时: {time.time()-t0:.2f}s) ✓", flush=True)
print(f"-> 3D查看器已更新至: {dst} 与 根目录/机器人手臂3D查看器.html\n", flush=True)
if failed:
print("!! 以下副本写入失败(多半是浏览器正打开着该文件,Windows 独占锁):", flush=True)
for f in failed:
print(" - %s" % f, flush=True)
print(" 关掉对应页面后重跑 python src/build_viewer.py 即可。\n", flush=True)
else:
print(f"-> 3D查看器已更新至: {dst}、{WEB}/index.html 与 根目录/机器人手臂3D查看器.html\n",
flush=True)
if __name__ == "__main__":
rebuild_viewer()
+6 -3
View File
@@ -29,7 +29,8 @@ docs/screws.json 是紧固件清单的唯一事实源(规格 / 长度 / 数量
沿 +X Ø3.9 直孔穿 11mm 后壁 + 榫头同径,直接拧入自攻(榫头内咬合 4.7mm)
S10 底座腰槽 6xM6 :3 件底座的 6 组 28x7 通腰槽中心(-97.5/120/-215 × 53/203/58/198),
头面 z=22(底座顶面;腰槽为通槽无沉孔,桌面紧固螺栓头必然外露)
S12 电机前端压盖 4xM3x8:J2(P04 夹 M2) / J3(P05 夹 M3) / J4(P06 夹 M4) / J5(P07 夹 M5) 各 4 颗。
S12 电机前端压盖 4xM3x8:J2(P04 夹 M2) / J3(P05 夹 M3) / J4(P06 夹 M4) / J5(P07 夹 M5)
/ J6(P08 夹 M6) 各 4 颗。
配方唯一事实源 = arm_model.motor_front_clamp(R35、4xM3x8 BCD55 @17.8°+90k、Ø6.0 沉孔
深 3.0、沉孔台阶 = 前端盖外端面 +2.0mm、压盖背面 0.0 面压);J3 是同一套配方的 Z 轴版本
(台阶落在 Z=(z_r-56)-2=387),半径/相位直接取 arm_model 的 CLAMP_BCD/CLAMP_CLOCK。
@@ -217,7 +218,8 @@ def instances(m2_bcd, m2_clock):
"P03 后置法兰", "BCD55 @39.9° 螺纹槽 -> M1 尾端面"))
# S12 电机前端压盖 -> 电机前端盖:J2(P04 夹 M2) / J3(P05 夹 M3) / J4(P06 夹 M4) /
# J5(P07 夹 M5) 各 4 颗。J2/J4/J5 三处压盖几何完全相同,J3 是同一套配方的 Z 轴版本。
# J5(P07 夹 M5) / J6(P08 夹 M6) 各 4 颗。J2/J4/J5 三处压盖几何完全相同,
# J3/J6 是同一套配方的 Z 轴版本(M6 压盖 2026-10-03 补齐,见 p_wrist_bracket)。
# R35、沉孔台阶都在"前端盖外端面 + 2.0mm":Y 轴是 Y_COVER+2=158,Z 轴是 (z_r-56)-2=387。
# 4xM3x8 @BCD55 17.8°+90k、沉孔 Ø6.0 深 3.0、压盖背面与前端盖 0.0 面压,
# 相位与 S04(P03→M1 前端锁紧)同一套约定,全机 BCD55 孔位一致。
@@ -230,7 +232,8 @@ def instances(m2_bcd, m2_clock):
# (布尔校验:M3 圆柱头沉在 Ø6.0 沉孔里却与压盖实体重叠 71.27 mm^3,装不进去)。
# 故此处显式用全局平面复刻成孔公式,与建模脚本一一对应。
for tag, prox in (("J2", "P04 肩叉"), ("J3", "P05 大臂旋转座"),
("J4", "P06 大臂骨架"), ("J5", "P07 小臂骨架")):
("J4", "P06 大臂骨架"), ("J5", "P07 小臂骨架"),
("J6", "P08 腕偏转座")):
dt = frame(tag)[1]
rear = tuple(HL.AXIS[tag]["rear"])
roll = HL.AXIS[tag]["d"][1] == 0 # J3/J6 是 roll 电机(轴向 -Z)
+121 -121
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long