找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 94|回复: 6

[职场/生活] 大家用AI办公了吗

[复制链接]

25

主题

791

回帖

1万

积分

中校

积分
10177
发表于 2 小时前 | 显示全部楼层 |阅读模式
我尝试用WorkBuddy自己写NX后处理,在一问一答间自动生成后处理文件,不知成功不成功,大家感觉怎么样
  1. """
  2. AC双摆头五轴后处理运动学验证脚本
  3. 用法: python verify_kinematics.py
  4. """
  5. import math

  6. PI = math.pi
  7. RAD = 180.0 / PI


  8. def calc_angles(ax, ay, az):
  9.     """刀轴矢量(I,J,K) -> A角, C角"""
  10.     # A角: 刀轴与-Z的夹角
  11.     # az=-1 -> A=0(向下), az=0 -> A=90(水平)
  12.     a_rad = math.acos(-az)
  13.     a_ang = a_rad * RAD

  14.     # C角: atan2(-ax, ay)
  15.     if abs(a_ang) < 0.5:
  16.         c_ang = 0.0  # 奇异区冻结
  17.     else:
  18.         c_ang = math.atan2(-ax, ay) * RAD

  19.     return a_ang, c_ang, a_rad


  20. def calc_machine_pos(Xp, Yp, Zp, L, a_ang, c_ang, a_rad):
  21.     """编程坐标 -> 机床坐标"""
  22.     c_rad = c_ang / RAD
  23.     sinA = math.sin(a_rad)
  24.     cosA = math.cos(a_rad)
  25.     sinC = math.sin(c_rad)
  26.     cosC = math.cos(c_rad)

  27.     Xm = Xp + L * sinA * sinC
  28.     Ym = Yp - L * sinA * cosC
  29.     Zm = Zp + L * cosA
  30.     return Xm, Ym, Zm


  31. def verify(name, ax, ay, az, Xp, Yp, Zp, L,
  32.            exp_X, exp_Y, exp_Z, exp_A, exp_C, tol=0.01):
  33.     """验证单个测试用例"""
  34.     a_ang, c_ang, a_rad = calc_angles(ax, ay, az)
  35.     Xm, Ym, Zm = calc_machine_pos(Xp, Yp, Zp, L, a_ang, c_ang, a_rad)

  36.     ok = (abs(Xm - exp_X) < tol and abs(Ym - exp_Y) < tol and
  37.           abs(Zm - exp_Z) < tol and abs(a_ang - exp_A) < tol and
  38.           abs(c_ang - exp_C) < tol)

  39.     status = "PASS" if ok else "FAIL"
  40.     print(f"\n{'='*60}")
  41.     print(f"  测试: {name}  [{status}]")
  42.     print(f"{'='*60}")
  43.     print(f"  刀轴矢量:  I={ax:.4f}  J={ay:.4f}  K={az:.4f}")
  44.     print(f"  编程坐标:  X={Xp:.3f}  Y={Yp:.3f}  Z={Zp:.3f}")
  45.     print(f"  摆长 L:    {L:.3f}")
  46.     print(f"  ---")
  47.     print(f"  A角:  计算={a_ang:.4f}°  期望={exp_A:.4f}°  {'OK' if abs(a_ang-exp_A)<tol else 'MISMATCH'}")
  48.     print(f"  C角:  计算={c_ang:.4f}°  期望={exp_C:.4f}°  {'OK' if abs(c_ang-exp_C)<tol else 'MISMATCH'}")
  49.     print(f"  X轴:  计算={Xm:.4f}    期望={exp_X:.4f}    {'OK' if abs(Xm-exp_X)<tol else 'MISMATCH'}")
  50.     print(f"  Y轴:  计算={Ym:.4f}    期望={exp_Y:.4f}    {'OK' if abs(Ym-exp_Y)<tol else 'MISMATCH'}")
  51.     print(f"  Z轴:  计算={Zm:.4f}    期望={exp_Z:.4f}    {'OK' if abs(Zm-exp_Z)<tol else 'MISMATCH'}")
  52.     return ok


  53. def main():
  54.     print("=" * 60)
  55.     print("  AC双摆头五轴运动学验证 (非RTCP, 摆心距=0)")
  56.     print("=" * 60)

  57.     L = 150.0
  58.     Xp, Yp, Zp = 100.0, 100.0, -50.0
  59.     all_pass = True

  60.     # 测试1: A=0°, C=0°, 刀轴垂直向下
  61.     all_pass &= verify(
  62.         "A=0 C=0 刀轴向下",
  63.         ax=0, ay=0, az=-1,
  64.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  65.         exp_A=0, exp_C=0,
  66.         exp_X=100, exp_Y=100, exp_Z=100  # Z = -50 + 150*1 = 100
  67.     )

  68.     # 测试2: A=90°, C=0°, 刀轴指向+Y
  69.     all_pass &= verify(
  70.         "A=90 C=0 刀轴指+Y",
  71.         ax=0, ay=1, az=0,
  72.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  73.         exp_A=90, exp_C=0,
  74.         exp_X=100, exp_Y=-50, exp_Z=-50  # Y=100-150=-50, Z=-50+0=-50
  75.     )

  76.     # 测试3: A=90°, C=90°, 刀轴指向-X
  77.     all_pass &= verify(
  78.         "A=90 C=90 刀轴指-X",
  79.         ax=-1, ay=0, az=0,
  80.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  81.         exp_A=90, exp_C=90,
  82.         exp_X=250, exp_Y=100, exp_Z=-50  # C=90: sin(90)=1, X=100+150*1*1=250  # X=100+150=175
  83.     )

  84.     # 测试4: A=90°, C=180°, 刀轴指向-Y
  85.     all_pass &= verify(
  86.         "A=90 C=180 刀轴指-Y",
  87.         ax=0, ay=-1, az=0,
  88.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  89.         exp_A=90, exp_C=180,
  90.         exp_X=100, exp_Y=250, exp_Z=-50  # Y=100+150=250
  91.     )

  92.     # 测试5: A=90°, C=-90°, 刀轴指向+X
  93.     # C=-90: sin(-90)=-1, X=100+150*1*(-1)=100-150=-50
  94.     all_pass &= verify(
  95.         "A=90 C=-90 刀轴指+X",
  96.         ax=1, ay=0, az=0,
  97.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  98.         exp_A=90, exp_C=-90,
  99.         exp_X=-50, exp_Y=100, exp_Z=-50
  100.     )

  101.     # 测试6: A=45°, C=0°
  102.     a45 = math.radians(45)
  103.     all_pass &= verify(
  104.         "A=45 C=0",
  105.         ax=0, ay=math.sin(a45), az=-math.cos(a45),
  106.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  107.         exp_A=45, exp_C=0,
  108.         exp_X=100, exp_Y=100 - L*math.sin(a45),
  109.         exp_Z=-50 + L*math.cos(a45)
  110.     )

  111.     # 测试7: A=45°, C=45°
  112.     all_pass &= verify(
  113.         "A=45 C=45",
  114.         ax=-math.sin(a45)*math.sin(a45),
  115.         ay=math.cos(a45)*math.sin(a45),
  116.         az=-math.cos(a45),
  117.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  118.         exp_A=45, exp_C=45,
  119.         exp_X=100 + L*math.sin(a45)*math.sin(a45),
  120.         exp_Y=100 - L*math.sin(a45)*math.cos(a45),
  121.         exp_Z=-50 + L*math.cos(a45)
  122.     )

  123.     # 测试8: A=110°(过顶), C=0°
  124.     a110 = math.radians(110)
  125.     all_pass &= verify(
  126.         "A=110 C=0 过顶区域",
  127.         ax=0, ay=math.sin(a110), az=-math.cos(a110),
  128.         Xp=Xp, Yp=Yp, Zp=Zp, L=L,
  129.         exp_A=110, exp_C=0,
  130.         exp_X=100, exp_Y=100 - L*math.sin(a110),
  131.         exp_Z=-50 + L*math.cos(a110)  # cos(110)<0, Z会减小
  132.     )

  133.     # 测试9: 刀尖不动验证 (不同A角, 同一编程点)
  134.     print("\n" + "=" * 60)
  135.     print("  测试9: 刀尖定点不动验证")
  136.     print("=" * 60)
  137.     print("  编程点固定 (100, 100, -50), L=150")
  138.     print("  不同刀轴方向, 后处理输出机床坐标应使刀尖不动\n")

  139.     angles = [0, 15, 30, 45, 60, 75, 90, 105, 110]
  140.     for a_deg in angles:
  141.         a_r = math.radians(a_deg)
  142.         ax_t = 0
  143.         ay_t = math.sin(a_r)
  144.         az_t = -math.cos(a_r)
  145.         a_out, c_out, _ = calc_angles(ax_t, ay_t, az_t)
  146.         Xm, Ym, Zm = calc_machine_pos(Xp, Yp, Zp, L, a_out, c_out, math.radians(a_out))
  147.         # 反算刀尖位置: Xm - L*sin(A)*sin(C), Ym + L*sin(A)*cos(C), Zm - L*cos(A)
  148.         tip_x = Xm - L * math.sin(math.radians(a_out)) * math.sin(math.radians(c_out))
  149.         tip_y = Ym + L * math.sin(math.radians(a_out)) * math.cos(math.radians(c_out))
  150.         tip_z = Zm - L * math.cos(math.radians(a_out))
  151.         ok = abs(tip_x - Xp) < 0.01 and abs(tip_y - Yp) < 0.01 and abs(tip_z - Zp) < 0.01
  152.         all_pass &= ok
  153.         print(f"  A={a_deg:6.1f}°  C={c_out:8.3f}°  "
  154.               f"机床X={Xm:9.3f}  Y={Ym:9.3f}  Z={Zm:9.3f}  "
  155.               f"刀尖反算=({tip_x:.3f}, {tip_y:.3f}, {tip_z:.3f})  "
  156.               f"{'OK' if ok else 'FAIL'}")

  157.     print("\n" + "=" * 60)
  158.     if all_pass:
  159.         print("  >>> 所有测试通过! 运动学公式正确 <<<")
  160.     else:
  161.         print("  >>> 部分测试失败, 请检查公式 <<<")
  162.     print("=" * 60)


  163. if __name__ == "__main__":
  164.     main()
复制代码

3

主题

264

回帖

711

积分

四级士官

积分
711
发表于 2 小时前 来自手机 | 显示全部楼层
豆包做文件算嘛

25

主题

791

回帖

1万

积分

中校

积分
10177
 楼主| 发表于 1 小时前 | 显示全部楼层

当然算啊,能轻松不少。

6

主题

171

回帖

951

积分

五级士官

积分
951
发表于 1 小时前 | 显示全部楼层
大佬牛逼9999

1

主题

9

回帖

74

积分

上等兵

积分
74
发表于 1 小时前 | 显示全部楼层
大佬nb,666

10

主题

1915

回帖

9777

积分

少校

积分
9777
发表于 半小时前 | 显示全部楼层
没用过嗷嗷嗷

10

主题

865

回帖

3466

积分

中尉

积分
3466
发表于 26 分钟前 | 显示全部楼层
  没有过!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2026-8-10 12:18

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表