What may scale with blade length, what is pinned to the mount or to the cup and must never scale, the one quantity that has to be back-solved, and a thirteen-item check to run after any change. All three lengths — 89.4, 100 and 120 mm — rebuilt and re-measured 2026-08-21.
目的:把 S_LEN 当自由变量,改成 100mm / 120mm 或任何长度,而
与安装座的配合、尖端形状、内扣贴合面、根部结构全都自动成立。
2026-08-21 建立。三个长度(89.4 / 100 / 120)已实测验证,见文末。
openscad -D S_LEN=93.8 -D TEETH=true -o Blade_teeth.stl generate_blade_arcsweep.scad
S_LEN 的换算S_LEN 是沿弧长的长度,不是 z 方向高度。
总长 = 6.985(装配脚,z −33.985 → −27) + S_LEN × cos(phi)
| 目标总长 | S_LEN | 实测总长 | 尖端内梁 x | 尖端厚 | 宽 Y |
|---|---|---|---|---|---|
| 89.4 mm(当前) | 83 | 88.97 | −6.560 | 1.73 | 23.00 |
| 100 mm | 93.8 | 99.89 | −6.554 | 1.65 | 23.00 |
| 120 mm | 114 | 120.25 | −6.541 | 1.54 | 23.00 |
尖端内梁 x 在三个长度下差 0.02mm —— 这就是 §2 反解生效的判据。若把 RAIL_SLOPE 写成常数,120mm 版的尖端会外移 4mm。
RAIL_SLOPE这是整个参数化的关键,写错就全废。
RAIL_SLOPE 的物理含义是「每单位弧长,内梁往 +x(远离另一片爪)飘多少」。 如果把它写成常数,爪一加长,尖端就继续往外飘:
S_LEN 83 → 尖端内梁 x = −2.96 S_LEN 114 → 尖端内梁 x = +1.09 外移 4.05 mm
尖端外移 4mm,内扣贴合面整体跟着走,与安装座的配合关系(外侧螺栓 → 凸起面)当场作废 —— 而那正是决定两片爪能不能"刚好顶上"的量。
所以做法是把尖端内梁的 x 定死,反解斜率:
X_TIP_RAIL = -2.96; // 与长度无关,由配合关系决定 _R = (X_TIP_RAIL - X_IN) / S_LEN; RAIL_SLOPE = _R / sqrt(1 - _R * _R); // S_LEN=83 时 = 0.1316,与原实测 0.1317 一致
推导:内梁在弧长 s 处的 x 增量是 k·s·cos(atan k) = k·s/√(1+k²)。 令它在 s=S_LEN 时等于 ΔX = X_TIP_RAIL − X_IN,记 r = ΔX/S_LEN,解出 k = r/√(1−r²)。
这三个都写成了 s / S_LEN 的函数,所以自动按比例铺开:
| 量 | 定义 | 含义 |
|---|---|---|
bow(s, amp) | amp × sin(180 s/S_LEN) | 中段微凸,两端归零 |
rib_incl(s) | RIB_INCL_ROOT + (TIP−ROOT)·s/S_LEN | 肋倾角从根部 0°(平行底边)渐变到尖端 50° |
depth(s) | DEPTH_ROOT + (TIP−ROOT)·(s/S_LEN)^TAPER_POW | 桁架深度从根部 27.42 收到尖端 1.0 |
rib_incl 的方向别改反。 根部 0° 意味着最下面那几条肋平行于底边,越往尖端越斜 —— 这是照实物红爪定的(2026-08-20 操作者当面核对),原来做反过一次。
这些锚定在硬件接口或物理尺度上,跟刀片多长无关。缩放它们会直接破坏配合。
| 量 | 值 | 出处 |
|---|---|---|
Z_TRANS | −27 | 装配脚顶面 |
X_IN | −13.79 | 根部内梁 x |
孔距 HOLE_SPAN | 10.000 | 操作者卡尺实测真机。不要根据 STL 改成 12.0,见 generate_v4_finish.scad 里的警告 |
孔高 HOLE_Z | −31.485 | 孔心距底面 2.5mm,官方实测 |
| 孔径 | Ø2.80 | change 1 |
Y_HALF | 11.5(宽 23mm) | 夹套按这个宽度做的 |
| 量 | 值 | 理由 |
|---|---|---|
LIP_PEAK | 12 | 操作者实测凸起特征总长 10–12mm |
LIP_DEPTH | 3.5 | 内扣量 |
LIP_BLEND_OUT | 20 | 外梁内扣段长度,见 §5。内梁用 LIP_PEAK |
DEPTH_TIP | 1.0 | 尖端要尖。4.0 会做出钝梯形 |
X_TIP_RAIL | −2.96 | §2 的反解目标 |
加长爪子不该让尖端变大。 尖端接触的是同一个杯子、对合的是同一片爪。
| 量 | 值 | 理由 |
|---|---|---|
RIB_PITCH | 4.0 | 肋密度。加长应当多出几条肋,不是把现有的拉开 |
ROOT_SOLID_LEN | 0 | |
ROOT_FILL | 2 | 见 §6 |
TIP_SOLID_LEN | 14 | 尖端侧实心段。约束绑的是外梁曲线的形状,不是长度 —— 见 §6.5 |
操作者 2026-08-21:「靠近尖端有一个外梁缓和内扣的区域,跟下面斜率计算应该区分开算」。
早先 ptOut 直接减同一个 tooth(s):内外梁共用一条过渡曲线,于是脊背在同一个位置 跟着内梁一起转弯。内梁是抓取面,转弯是设计意图;外梁是受力脊背,同一处的转折就是应力集中。
现在外梁走自己的、更长更缓的过渡:
LIP_BLEND_OUT = 20; // 内梁是 LIP_PEAK = 12 function tooth_out(s) = LIP_DEPTH * para(S_LEN - s, LIP_BLEND_OUT); // 同一条抛物线,铺得更长 function ptOut(s) = railP(s) + nrm(s)*(depth(s)+bow(...)) - nrm(s) * tooth_out(s);
两条梁用同一种曲线,只是长度不同 —— 形状一致,但脊背的弯曲摊在 20mm 上而不是 12mm。 后果是过渡区内厚度略增:材料堆在转弯处,而不是在那里被削薄,这正是想要的。
这一点前后搞混过一次,后果是白跑了两个完整的 生成→渲染→提交 循环。
| 内梁(抓取面) | 外梁(脊背) | |
|---|---|---|
| 形状 | 凸起平面一路平着到尖端 | 抛物线连续内收 |
| 与梁的交接 | 垂直切断,干脆 | 相切,无折角 |
| 长度 | LIP_PEAK = 12 | LIP_BLEND_OUT = 20 |
| 为什么 | 那道垂直面就是咬住杯子的钩面 | 脊背在与抓取面同一站转折 = 应力集中 |
操作者原话:「那个平滑内收说的是外梁,你怎么把内凸和内梁交接处也做成平滑了, 那个应该干脆利落的垂直」。
实测(逐 1mm):内梁在 d=11.5→12.5 跳 3.314mm(钩面),其余每段只变 0.09–0.14mm; 外梁全程 0.33–1.02mm 平缓递减,无跳变。
function para(d, L) = let(u = (L - d) / L) u * u; // u: 根侧 0 → 尖端 1
三种写法先后被否掉两种:
| 写法 | 问题 |
|---|---|
| 阶跃 | 留台阶。操作者:「不是这样突然往里凹进去一下」。实测 d=12→13 跳 3.4mm |
smoothstep u²(3−2u) | 两端斜率都是 0 ⇒ 中间必有拐点,收完还接一段平台 —— 整体是 S 形。平滑,但不是抛物线 |
抛物线 u² ✅ | 根侧 f=0 且 f′=0(与内梁相切,无折角);尖端 f=1 且斜率最大(一路在收,无平台无拐点);二阶导恒定 = 均匀弯曲 |
操作者 2026-08-21:「平滑内收整体是类似抛物线的感觉」。
操作者 2026-08-21:「靠近底部实心的范围太多了,肋条至少覆盖掉 1cm」。
ROOT_SOLID_LEN 10 → 0 ROOT_FILL 12 → 2
实测效果:
| 改前 | 改后 | |
|---|---|---|
| 肋空腔最低出现在 | z = −14 | z = −24(多覆盖 10mm ✓) |
| 肋间空腔总数 | 11 | 13(多出 2 条肋 ✓) |
| z=−26 实心宽 | 27.445 | 27.325(几乎不变) |
注意最后一行 —— 这是安全线。 档案里记着 ROOT_SOLID_LEN = 4 曾经把 z=−26 的实心宽度 压到 7.47mm,在受力最大处只剩一条窄颈。现在虽然把它降到 0,但靠 ROOT_FILL 的楔形补实 守住了衔接处,实测 27.3mm。
改长度或改这两个参数后,必须重量 z=−26 的实心宽度。 低于 20mm 就要回退。 量法见 03-software/scripts/measure_blades.py 配合精确 z 截面。
操作者 2026-08-21:「尖角那一侧的实心部分也太多了,至少被肋骨覆盖多 1cm 厚度」。
TIP_SOLID_LEN 原本是 24,并带一条约束「必须 > LIP_BLEND_OUT」。 实测证明这条约束写保守了。 建了一个 TIP_SOLID_LEN=14 而 LIP_BLEND_OUT 保持 20 的件:
| 判据 | 结果 |
|---|---|
check_mesh | PASS,shells=1,水密,无碎面 |
| 尖端厚度 | 2.428mm,与 TIP_SOLID_LEN=24 完全相同 |
| 尖端区 y=0 多余小闭环(豁口) | 0 个 |
| 最靠尖端的肋腔 | d=23 → d=14,推进 9mm |
为什么早先那次会塌尖: 当时外梁用的是 smoothstep,它在根侧不相切,收不干净, 肋腔提前开始就会捅穿;抛物线两端相切,能平顺落回梁上。
约束的真实条件是「外梁过渡曲线在根侧相切」,不是「实心段要比曲线长」。
若把外梁改回非相切的曲线(smoothstep、直线过渡等),必须把 TIP_SOLID_LEN
提回大于该曲线长度,并重量尖端厚度。
操作者:「尖端实心部分的边界可以按照最靠近的那个肋条来,就是边界顺着肋条的形状」。
原来 s1 = S_LEN - TIP_SOLID_LEN 是一个垂直于刀身的截面,而肋落在 RIB_S0 + n × RIB_PITCH 上,两者一般对不齐 —— 最后一条肋与那道平切面之间会剩一小段 无肋空腔,它的尖端侧壁就是那道平切,看上去像被横着削了一刀。现在:
s1 = RIB_S0 + floor((S_LEN - TIP_SOLID_LEN - RIB_S0) / RIB_PITCH) * RIB_PITCH;
对齐到最后一条肋的站位,残留段消失,边界跟着肋的倾角走。
1. 算 S_LEN = (目标总长 − 6.985) / cos(phi) ≈ (总长 − 6.985) / 0.9914 2. 三步生成 3. check_mesh.py connected shells 必须 = 1 4. 量总长 与目标差 < 0.5mm 5. 量尖端内梁 x 应恒为 −2.96(§2 若写对了,这项自动成立) 6. 量尖端厚度 应恒为 ~1.0mm 7. 量宽度 Y 应恒为 23.2mm 8. 量 z=−26 实心宽 必须 > 20mm(§6 安全线) 9. 量外侧螺栓 → 凸起面 应恒为 ~21.8mm(决定与另一片爪的对合) 10. 数肋间空腔数 应随长度线性增加(RIB_PITCH 恒定) 11. 量内梁在 d=LIP_PEAK 的跳变 必须【是】一次大跳(≈LIP_DEPTH)= 钩面还在 12. 量外梁逐 1mm 的跳变 必须【没有】任何一处突跳 = 抛物线还在 13. 量最靠尖端的肋腔位置 应 ≈ TIP_SOLID_LEN(空腔边界对齐到肋,见 §6.5)
第 5、6、7、9 条不随长度变,是这套参数化是否成立的判据。
第 11、12 条是 2026-08-21 补的,因为这两项各错过一次,而且两次 check_mesh 都是 PASS —— 网格合法不等于形状正确。量法:
# 沿 y=0 截面逐 1mm 取内梁最内 / 外梁最外的 x,看一阶差 内梁:d=11.5→12.5 应跳 ≈3.3mm(钩面),其余每段 0.09-0.14mm 外梁:全程 0.33-1.02mm 平缓递减,无跳变
改完「肋腔边界对齐到肋」和 TIP_SOLID_LEN 24→14 之后,三个长度各建一遍, 跑的就是 §7 的检查清单:
| 判据 | S_LEN=83(成品) | S_LEN=93.8(100mm) | S_LEN=114(120mm) | 判定 |
|---|---|---|---|---|
check_mesh | PASS | PASS | PASS | 水密、单壳、无碎面 |
| 尖端 d=1mm 处厚度 | 2.004 | 1.914 | 1.802 | 都 > 0,没有塌尖 ✓ |
| 尖端 d=2mm 处厚度 | 3.000 | 2.820 | 2.591 | 单调 ✓ |
| z=−26 实心宽度 | 27.325 | 27.349 | 27.377 | 安全线 20mm,全过 ✓ |
| 肋间空腔数 | 18 | 21 | 26 | 加长是多出肋,不是把现有的拉开 ✓ |
| 最靠尖端的肋腔 d | 16.0 | 15.5 | 15.8 | ≈ TIP_SOLID_LEN + 一个肋厚 ✓ |
| 肋腔尖端侧壁 | 斜的 | 斜的 | 斜的 | 顺着肋走,不是横着一刀 ✓ |
注意第四行:ROOT_SOLID_LEN 已经降到 0(比当初出过事的 4 还小), 三个长度的 z=−26 实心宽度依然是 27.3mm,没有退回 7.47mm 的窄颈。 守住它的是 ROOT_FILL 的楔形补实 —— 见 §6。
| 项 | 状态 |
|---|---|
TIP_SOLID_LEN 约束 | ✅ 已重新定案,见 §6.5。 早先写成「必须 > LIP_BLEND_OUT」是把现象当成了原因 —— 当时塌尖是因为外梁用了根侧不相切的 smoothstep,不是因为实心段太短。换成抛物线后 TIP_SOLID_LEN = 14 < LIP_BLEND_OUT = 20 三个长度全部正常。真实条件:外梁过渡曲线在根侧相切。 |
HOLE_DX | 0。v4 的 21.77 已接近官方 22–23,等精确单值 |
FLATTEN | 0。贴合面角度符号,需实测 A(两脚外角)与 T(两尖端) |
*所有实测值出自 MEASUREMENTS-2026-08-21.md。* *在线图解:https://suyang99-xlerobot-build-reports.static.hf.space*