feat: 新增螺丝网格生成与强度校核功能,重建模型数据与查看器,补充定位图与BOM文档
新增 screw_mesh.py 螺丝网格划分模块与 strength_check.py 强度校核逻辑,arm_model.py 同步集成网格生成与校核流程;viewer_tpl.html、web/index.html 与 web/机器人手臂3D查看器.html 更新查看器模板以支持新数据展示;docs/bom.json 与 docs/travel_detail.json 调整 BOM 清单与行程参数;docs/print_settings.md 新增打印设置说明,新增螺丝采购清单 HTML;补充大量定位图与验证截图。
This commit is contained in:
+69
-45
@@ -653,7 +653,7 @@ def p_girdle(j1):
|
||||
|
||||
|
||||
def p_fork(j1, j2):
|
||||
"""P04_肩叉 (Shoulder Fork / L-Bracket) - 加长避让顺滑流线版:
|
||||
"""P04_肩叉_螺旋体30%_墙5底5_竖打 (Shoulder Fork / L-Bracket) - 加长避让顺滑流线版:
|
||||
1. 头部与身子起点自 X=5.5 前移加长至 X=10.5,与 P03 前置锁紧法兰 (X=8.5) 保持 2.0mm 均匀轴向安全间隙
|
||||
(X_FORK_GAP=0:不做整体前移,保持 J1 输出端最短悬伸力臂,避免额外弯矩负荷);
|
||||
2. J1 从动法兰圆盘已删除(盘面在 column 前缘形成鼓楞):J1 由 boss(Ø35.6)贯通 P03 前盖中心孔直连电机输出盘;column 顶边保持 Z=646.5 与 P03 环齐高,R=18mm 大圆弧顺滑过渡;
|
||||
@@ -772,32 +772,30 @@ def make_pitch_to_roll_bracket(j_pitch, j_roll, z_pitch, z_r, name="bracket"):
|
||||
s = s.fuse(disc)
|
||||
|
||||
# 3. 前侧从底端 Ø70mm 圆柱到顶端法兰的有机相切平滑渐变过渡体 (Loft Morph)
|
||||
# 后缘不取恒定 v=-5(那会在 y=123 处相对 R35 柱面 (x=53.14) 外凸 0.36mm,
|
||||
# 形成一条 z 向竖鳍,并在顶端被 cut_top_solid 切出 z=452 硬台面):
|
||||
# 改为从柱面 (v=0, y=128) 平滑长到顶壁 (v=+29, y=157):
|
||||
# - 低端后角落在 R35 柱面上,与立柱共面零外凸,底端裙边不再有拼接竖筋;
|
||||
# - 高端后角与 top_fill 矩形 (y 157..174) 齐平,z=452 台面与 R2 小圆角
|
||||
# 不再需要,立柱到竖直壁完全由放样曲面相切过渡。
|
||||
Z_top = z_pitch - 35.0
|
||||
z_start = z_bot
|
||||
N = 24
|
||||
N = 16
|
||||
wp = cq.Workplane("XY")
|
||||
for i in range(N + 1):
|
||||
t = i / float(N)
|
||||
z_curr = z_start + t * (Z_top - z_start)
|
||||
st = 3.0 * (t**2) - 2.0 * (t**3)
|
||||
sb = 6.0 * (t**5) - 15.0 * (t**4) + 10.0 * (t**3) # 后缘 smoothstep(两端切线水平)
|
||||
y_center = y_cyl_max + st * (y_out - y_cyl_max)
|
||||
y_side = HL.Y_AXIS + st * (y_out - HL.Y_AXIS)
|
||||
v_c = y_center - HL.Y_AXIS
|
||||
v_s = y_side - HL.Y_AXIS
|
||||
v_b = sb * (y_hub_in - HL.Y_AXIS) # 0 (柱面) -> +29 (顶壁)
|
||||
v_mid = max(v_c, v_s + 0.02)
|
||||
# 后缘两角 R2 圆角:把 y=123 凸包与 R35 柱面交汇的两条 90° 竖棱圆润化
|
||||
# (磨掉"凸起来的"尖角,不动后缘高度/位置,打印无悬挂)
|
||||
FR = 2.0
|
||||
w = (cq.Workplane("XY", origin=(HL.X_ARM, HL.Y_AXIS, z_curr))
|
||||
.moveTo(-35.0, v_s)
|
||||
.threePointArc((0.0, v_mid), (35.0, v_s))
|
||||
.lineTo(35.0, v_b)
|
||||
.lineTo(-35.0, v_b)
|
||||
.lineTo(35.0, -5.0 + FR)
|
||||
.radiusArc((35.0 - FR, -5.0), FR)
|
||||
.lineTo(-35.0 + FR, -5.0)
|
||||
.radiusArc((-35.0, -5.0 + FR), FR)
|
||||
.lineTo(-35.0, v_s)
|
||||
.close())
|
||||
wp = wp.add(w)
|
||||
|
||||
@@ -865,12 +863,12 @@ def make_pitch_to_roll_bracket(j_pitch, j_roll, z_pitch, z_r, name="bracket"):
|
||||
|
||||
|
||||
def p_shoulder_roll_base(j2, j3, half=None):
|
||||
"""P05_大臂旋转座(深度圆角优化版)"""
|
||||
return make_pitch_to_roll_bracket(j2, j3, Z_SH, Z_R3, name="P05_大臂旋转座")
|
||||
"""P05_大臂旋转座_螺旋体30%_墙4底5_竖打(深度圆角优化版)"""
|
||||
return make_pitch_to_roll_bracket(j2, j3, Z_SH, Z_R3, name="P05_大臂旋转座_螺旋体30%_墙4底5_竖打")
|
||||
|
||||
|
||||
def p_humerus_bone(j3, j4):
|
||||
"""P06_大臂骨架 (Humerus Bone - Loft 圆弧转方有机过渡版):
|
||||
"""P06_大臂骨架_螺旋体25%_墙4底5_竖打 (Humerus Bone - Loft 圆弧转方有机过渡版):
|
||||
受 J3 (大臂自转, -Z轴, hub@Z_HUB3=380) 驱动,
|
||||
向下延伸构成大臂主体骨架,底端抱紧 M4 (肘部俯仰电机, +Y轴, 轴线位于 Z_EL=332.0)。
|
||||
1. 借鉴 P05 大臂旋转座几何放样算法:
|
||||
@@ -944,7 +942,7 @@ def p_humerus_bone(j3, j4):
|
||||
|
||||
|
||||
def p_forearm_bone(j4, j5, half=None):
|
||||
"""P07_小臂骨架 L型高刚度无干涉版(深度圆角优化版)
|
||||
"""P07_小臂骨架_螺旋体30%_墙5底5_竖打 L型高刚度无干涉版(深度圆角优化版)
|
||||
设计要点:
|
||||
1. 改为与 P05/P08 统一的 L 型结构(L-bracket):
|
||||
- +Y侧垂直背脊立柱(Y: y_hub_in..y_out),避开上级大臂骨架 P06(Y <= 155.5)
|
||||
@@ -1060,12 +1058,12 @@ def p_forearm_bone(j4, j5, half=None):
|
||||
|
||||
|
||||
def p_wrist_bracket(j5, j6):
|
||||
"""P08_腕偏转座(深度圆角优化版)"""
|
||||
return make_pitch_to_roll_bracket(j5, j6, Z_WR, Z_R6, name="P08_腕偏转座")
|
||||
"""P08_腕偏转座_螺旋体25%_墙4底5_竖打(深度圆角优化版)"""
|
||||
return make_pitch_to_roll_bracket(j5, j6, Z_WR, Z_R6, name="P08_腕偏转座_螺旋体25%_墙4底5_竖打")
|
||||
|
||||
|
||||
def p_tool_flange(j6):
|
||||
"""P09_工具法兰 深度圆角优化版
|
||||
"""P09_工具法兰_螺旋体100%_墙4底5_竖打 深度圆角优化版
|
||||
关键改进:
|
||||
1. 外轮廓全圆角(R=4mm)
|
||||
2. 法兰面倒角(2mm)
|
||||
@@ -1136,17 +1134,17 @@ def build():
|
||||
AB.CENTS.clear()
|
||||
AB.GRP = {}
|
||||
par = {"J1": "root", "J2": "J1", "J3": "J2", "J4": "J3", "J5": "J4", "J6": "J5"}
|
||||
driven = {"J1": "P04_肩叉", "J2": "P05_大臂旋转座", "J3": "P06_大臂骨架",
|
||||
"J4": "P07_小臂骨架", "J5": "P08_腕偏转座", "J6": "P09_工具法兰"}
|
||||
driven = {"J1": "P04_肩叉_螺旋体30%_墙5底5_竖打", "J2": "P05_大臂旋转座_螺旋体30%_墙4底5_竖打", "J3": "P06_大臂骨架_螺旋体25%_墙4底5_竖打",
|
||||
"J4": "P07_小臂骨架_螺旋体30%_墙5底5_竖打", "J5": "P08_腕偏转座_螺旋体25%_墙4底5_竖打", "J6": "P09_工具法兰_螺旋体100%_墙4底5_竖打"}
|
||||
motor_of = {"J1": "M1_J1", "J2": "M2_J2", "J3": "M3_J3",
|
||||
"J4": "M4_J4", "J5": "M5_J5", "J6": "M6_J6"}
|
||||
for t in ("J1", "J2", "J3", "J4", "J5", "J6"):
|
||||
AB.GRP[motor_of[t]] = par[t]
|
||||
AB.GRP[driven[t]] = t
|
||||
AB.GRP.update({
|
||||
"P01_A_立柱下段": "root", "P01_B_立柱中段": "root", "P01_C_立柱上段": "root",
|
||||
"P02_Center_底座中核心": "root", "P02_Front_前向防翻力臂": "root", "P02_Rear_后向防翻力臂": "root",
|
||||
"P03_肩吊臂": "root"
|
||||
"P01_A_立柱下段_三角形30%_墙4底5_竖打": "root", "P01_B_立柱中段_三角形30%_墙4底5_竖打": "root", "P01_C_立柱上段_三角形30%_墙4底5_竖打": "root",
|
||||
"P02_Center_底座中核心_螺旋体30%_墙5底6_平打": "root", "P02_Front_前向防翻力臂_螺旋体30%_墙4底5_平打": "root", "P02_Rear_后向防翻力臂_螺旋体30%_墙4底5_平打": "root",
|
||||
"P03_肩吊臂_螺旋体35%_墙5底5_竖打": "root"
|
||||
})
|
||||
AB.JAW = {}
|
||||
|
||||
@@ -1155,31 +1153,31 @@ def build():
|
||||
p02_c, p02_f, p02_r = make_p02_poka_yoke()
|
||||
|
||||
parts_to_build = [
|
||||
("P01_A_立柱下段", "立柱下段", lambda: p01_a, 0x0284c7,
|
||||
("P01_A_立柱下段_三角形30%_墙4底5_竖打", "立柱下段", lambda: p01_a, 0x0284c7,
|
||||
"200mm适配分段A:高166mm+16mm阶梯公榫+非对称M4防反装通孔+底部50x50x12榫头+P01-A 竖排TOP刻字"),
|
||||
("P01_B_立柱中段", "立柱中段", lambda: p01_b, 0x2563eb,
|
||||
("P01_B_立柱中段_三角形30%_墙4底5_竖打", "立柱中段", lambda: p01_b, 0x2563eb,
|
||||
"200mm适配分段B:高165mm+双端公母榫+非对称M4防反装通孔+P01-B 竖排TOP刻字"),
|
||||
("P01_C_立柱上段", "立柱上段", lambda: p01_c, 0x1d4ed8,
|
||||
("P01_C_立柱上段_三角形30%_墙4底5_竖打", "立柱上段", lambda: p01_c, 0x1d4ed8,
|
||||
"200mm适配分段C:高149mm+底端母榫+非对称M4防反装通孔+顶面P03安装台+P01-C 竖排TOP刻字"),
|
||||
("P02_Center_底座中核心", "底座核心承力座", lambda: p02_c, 0x475569,
|
||||
("P02_Center_底座中核心_螺旋体30%_墙5底6_平打", "底座核心承力座", lambda: p02_c, 0x475569,
|
||||
"200mm适配中座:195x190mm核心承力座+48mm套筒+12mm阶梯榫座(轴向面承载)+前后三角加强筋+前后非对称防呆母榫槽+刻字"),
|
||||
("P02_Front_前向防翻力臂", "前向防翻力臂", lambda: p02_f, 0xe11d48,
|
||||
("P02_Front_前向防翻力臂_螺旋体30%_墙4底5_平打", "前向防翻力臂", lambda: p02_f, 0xe11d48,
|
||||
"200mm适配前臂:145x190mm扩展力臂+104mm宽跨距双公榫+底部M5预埋螺母沉槽+P02-FRONT刻字"),
|
||||
("P02_Rear_后向防翻力臂", "后向防翻力臂", lambda: p02_r, 0xd97706,
|
||||
("P02_Rear_后向防翻力臂_螺旋体30%_墙4底5_平打", "后向防翻力臂", lambda: p02_r, 0xd97706,
|
||||
"200mm适配后臂:45x190mm扩展力臂+80mm窄跨距双公榫+底部M5预埋螺母沉槽+P02-REAR刻字"),
|
||||
("P03_肩吊臂", "肩关节安装悬臂", lambda: p_girdle(j1), 0x4b5563,
|
||||
("P03_肩吊臂_螺旋体35%_墙5底5_竖打", "肩关节安装悬臂", lambda: p_girdle(j1), 0x4b5563,
|
||||
"高强多肋机架:10mm后置法兰+双侧8mm大三角加强筋+下腹12mm抗弯龙骨筋+侧开式电机托架(M1从+Y侧滑入装配,前后法兰8xM3双向锁死)+前置止脱锁紧法兰(4xM3止脱螺孔)+大散热窗与对流槽"),
|
||||
("P04_肩叉", "肩叉", lambda: p_fork(j1, j2), 0x2563eb,
|
||||
("P04_肩叉_螺旋体30%_墙5底5_竖打", "肩叉", lambda: p_fork(j1, j2), 0x2563eb,
|
||||
"加长避让版:头部与身子前移加长至X=10.5,与P03锁紧法兰保持2.0mm轴向安全间隙(不做前移,保持输出端最短悬伸力臂),J1输出凸台贯通直连电机,J1从动法兰圆盘鼓楞已删(接缝区与P03止脱环齐径齐高R36.5/顶646.5),单实体全角度零干涉"),
|
||||
("P05_大臂旋转座", "大臂旋转座", lambda: p_shoulder_roll_base(j2, j3, None), 0x059669,
|
||||
"V2圆角:Loft外轮廓R=10mm,L型转角内部2mm倒角,彻底清除立壁保证J2全角度0干涉"),
|
||||
("P06_大臂骨架", "大臂骨架", lambda: p_humerus_bone(j3, j4), 0x0d9488,
|
||||
("P05_大臂旋转座_螺旋体30%_墙4底5_竖打", "大臂旋转座", lambda: p_shoulder_roll_base(j2, j3, None), 0x059669,
|
||||
"V3圆角:Loft外轮廓R=10mm,L型转角内部2mm倒角,后缘凸包两角90°竖棱磨R2圆角(结构/后缘高度不变,打印无悬挂),保证J2全角度0干涉"),
|
||||
("P06_大臂骨架_螺旋体25%_墙4底5_竖打", "大臂骨架", lambda: p_humerus_bone(j3, j4), 0x0d9488,
|
||||
"Loft有机过渡版:借鉴P05圆弧变方形放样算法,顶端Ø70正圆与J3平齐无台阶,底端渐变融入M4抱紧套筒与壳体,单实体0干涉"),
|
||||
("P07_小臂骨架", "小臂骨架", lambda: p_forearm_bone(j4, j5, None), 0x7c3aed,
|
||||
("P07_小臂骨架_螺旋体30%_墙5底5_竖打", "小臂骨架", lambda: p_forearm_bone(j4, j5, None), 0x7c3aed,
|
||||
"V2 L型结构:+Y侧背脊立柱避让大臂骨架,过渡区采用与顶板和立柱双相切的R=28mm平滑内凹大圆弧,彻底消除直斜线折角与悬空阶梯小块,顶板前后外缘2mm倒角改R3圆角,顶板整条加高19mm(z261->280)加强连接且gusset弧R28->R14重定相切融入,J4圆盘外沿与立柱外棱不倒圆保持原始尖角,下方M5电机半包散热,俯仰大范围自由运动零干涉"),
|
||||
("P08_腕偏转座", "腕部转接座", lambda: p_wrist_bracket(j5, j6), 0xd97706,
|
||||
("P08_腕偏转座_螺旋体25%_墙4底5_竖打", "腕部转接座", lambda: p_wrist_bracket(j5, j6), 0xd97706,
|
||||
"V2圆角:Loft外轮廓R=10mm,L型转角内部2mm倒角,彻底清除立壁保证J5全角度0干涉"),
|
||||
("P09_工具法兰", "末端工具法兰", lambda: p_tool_flange(j6), 0xdc2626,
|
||||
("P09_工具法兰_螺旋体100%_墙4底5_竖打", "末端工具法兰", lambda: p_tool_flange(j6), 0xdc2626,
|
||||
"V2圆角:外轮廓R=3mm,法兰面倒角2mm"),
|
||||
]
|
||||
|
||||
@@ -1212,19 +1210,19 @@ SEP = 74.0
|
||||
def explode_chain(p, JS, cents, gmean):
|
||||
"""爆炸图偏移:立柱垂直阶梯拉开,底座前后防呆拉开,电机沿轴拉出,机械臂整体随上段分离"""
|
||||
nm = p["name"]
|
||||
if nm == "P01_A_立柱下段":
|
||||
if nm == "P01_A_立柱下段_三角形30%_墙4底5_竖打":
|
||||
return [0.0, 0.0, 0.0]
|
||||
if nm == "P01_B_立柱中段":
|
||||
if nm == "P01_B_立柱中段_三角形30%_墙4底5_竖打":
|
||||
return [0.0, 0.0, 60.0]
|
||||
if nm == "P01_C_立柱上段":
|
||||
if nm == "P01_C_立柱上段_三角形30%_墙4底5_竖打":
|
||||
return [0.0, 0.0, 120.0]
|
||||
if nm == "P02_Center_底座中核心":
|
||||
if nm == "P02_Center_底座中核心_螺旋体30%_墙5底6_平打":
|
||||
return [0.0, 0.0, 0.0]
|
||||
if nm == "P02_Front_前向防翻力臂":
|
||||
if nm == "P02_Front_前向防翻力臂_螺旋体30%_墙4底5_平打":
|
||||
return [65.0, 0.0, 0.0]
|
||||
if nm == "P02_Rear_后向防翻力臂":
|
||||
if nm == "P02_Rear_后向防翻力臂_螺旋体30%_墙4底5_平打":
|
||||
return [-65.0, 0.0, 0.0]
|
||||
if nm == "P03_肩吊臂":
|
||||
if nm == "P03_肩吊臂_螺旋体35%_墙5底5_竖打":
|
||||
return [0.0, 0.0, 120.0]
|
||||
|
||||
grp = AB.GRP.get(p["name"], "root")
|
||||
@@ -1266,6 +1264,15 @@ if __name__ == "__main__":
|
||||
|
||||
AB.explode_vec = explode_chain
|
||||
bom = AB.export(JS)
|
||||
|
||||
# 紧固件(螺钉)实例注入:把 docs/screws.json 的 72 颗螺钉按真实孔位还原成三维实例,
|
||||
# 追加进 web/mesh_arm.json 的 parts(查看器可点 BOM 螺丝行高亮定位;纯数据,不动 CAD)
|
||||
try:
|
||||
import screw_mesh
|
||||
screw_mesh.main()
|
||||
except Exception as e:
|
||||
print("螺钉实例注入失败(不影响主流程,可手动跑 src/screw_mesh.py):", e, flush=True)
|
||||
|
||||
cl = AB.collide()
|
||||
|
||||
try:
|
||||
@@ -1274,6 +1281,23 @@ if __name__ == "__main__":
|
||||
except Exception as e:
|
||||
print("rebuild_viewer error:", e, flush=True)
|
||||
|
||||
# 可达包络自动注入:AB.export 刚重写过 mesh_arm.json(包络件会被冲掉),
|
||||
# 这里重跑 FK 采样 + 包络网格注入,再重打包一次查看器(约 3~4s,纯数据无 CAD 计算)
|
||||
try:
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
"..", "scratch"))
|
||||
import ws_sweep
|
||||
import gen_env_mesh
|
||||
t_env = time.time()
|
||||
ws_sweep.main()
|
||||
gen_env_mesh.main()
|
||||
from build_viewer import rebuild_viewer as _rbv
|
||||
_rbv()
|
||||
print(f"-> 可达包络已自动注入查看器(+{time.time()-t_env:.1f}s)✓\n", flush=True)
|
||||
except Exception as e:
|
||||
print("可达包络自动注入失败(不影响主流程,修复后手动跑 scratch/gen_env_mesh.py + src/build_viewer.py):",
|
||||
e, flush=True)
|
||||
|
||||
print("=" * 80, flush=True)
|
||||
print("✅ 机器人手臂编译、导出与查看器发布全流程完成!", flush=True)
|
||||
print("=" * 80, flush=True)
|
||||
|
||||
Reference in New Issue
Block a user