1. 五轴线性插补基础

任务目标

实现五轴线性插补:给定起点与终点的位置坐标(X, Y, Z)及姿态角(A, C),在指定进给速度与插补周期下,生成中间点序列,并验证插补精度满足要求。

实现方案

采用时间分割法:将起点到终点的总位移按插补周期离散化,每个周期内各轴按比例同步运动,保证合成运动为直线。姿态角同样按线性比例插值。核心数据结构为五轴坐标点,核心函数为linearInterpolate,输入起点、终点、速度与周期,输出中间点数组。

关键完整代码

import numpy as np

class FiveAxisPoint:
    """五轴坐标点:位置(X,Y,Z) + 姿态(A,C)"""
    def __init__(self, x, y, z, a, c):
        self.x = x; self.y = y; self.z = z
        self.a = a; self.c = c

    def to_array(self):
        return np.array([self.x, self.y, self.z, self.a, self.c], dtype=float)

def linearInterpolate(start, end, feed_mm_min, period_s):
    """
    五轴线性插补(时间分割法)
    start/end: FiveAxisPoint
    feed_mm_min: 进给速度 (mm/min)
    period_s: 插补周期 (s)
    返回: 中间点列表(含起点,不含终点)
    """
    start_arr = start.to_array()
    end_arr = end.to_array()

    # 位置位移(前3轴)
    delta_xyz = end_arr[:3] - start_arr[:3]
    dist = np.linalg.norm(delta_xyz)
    if dist < 1e-9:
        return [start]  # 零位移,仅返回起点

    # 总插补周期数(向上取整保证覆盖全程)
    feed_mm_s = feed_mm_min / 60.0
    total_time = dist / feed_mm_s
    n = int(np.ceil(total_time / period_s))

    points = []
    for i in range(n):
        # 归一化比例:当前周期结束时到达的位置比例
        t = (i + 1) / n
        # 线性插值各轴
        interp = start_arr + t * (end_arr - start_arr)
        points.append(FiveAxisPoint(*interp))

    return points

# ===== 最小验证示例 =====
if __name__ == "__main__":
    # 给定输入
    start = FiveAxisPoint(0, 0, 0, 0, 0)
    end = FiveAxisPoint(10, 0, 0, 0, 0)   # X轴移动10mm
    feed = 600.0    # 600 mm/min = 10 mm/s
    period = 0.01   # 10ms插补周期

    pts = linearInterpolate(start, end, feed, period)

    # 验证1:周期数正确性
    expected_n = int(np.ceil(10.0 / (10.0 * 0.01)))  # 100
    assert len(pts) == expected_n, f"周期数错误: {len(pts)} != {expected_n}"

    # 验证2:终点精度(最后一个点应到达终点)
    last = pts[-1]
    err = np.linalg.norm(last.to_array() - end.to_array())
    assert err < 1e-6, f"终点误差过大: {err}"

    # 验证3:中间点均在直线上(Y/Z/A/C恒为0,X线性递增)
    for i, p in enumerate(pts):
        assert abs(p.y) < 1e-9 and abs(p.z) < 1e-9
        assert abs(p.a) < 1e-9 and abs(p.c) < 1e-9
        # X轴单调递增
        if i > 0:
            assert p.x > pts[i-1].x

    # 验证4:最大弦高误差(理论为0,因严格线性)
    print(f"插补点数: {len(pts)}")
    print(f"终点误差: {err:.2e} mm")
    print(f"X轴步长(恒定): {pts[1].x - pts[0].x:.6f} mm")
    print("所有验证通过:线性插补正确")

运行与验证

运行方式:直接执行python five_axis_interp.py(需安装NumPy)。

验证方法:程序内置4项断言验证:

  • 周期数 = ceil(位移/(速度×周期))
  • 最后一个点与终点坐标误差 < 1e-6 mm
  • 非运动轴(Y/Z/A/C)始终为0,X轴单调递增
  • 输出X轴步长恒定,证明匀速线性运动

通过条件:所有断言无异常,且打印的终点误差在1e-6量级以下,X轴步长恒定值约为0.1mm(10mm/100步)。

精度说明

本实现采用时间分割线性插补,插补点严格位于起点到终点的直线上,理论弦高误差为0。实际精度仅受浮点计算舍入影响(约1e-12量级),验证中终点误差阈值设为1e-6已留足裕量。若需验证姿态插补,可将起点/终点A、C设为不同值,断言中间点姿态角按比例单调变化即可。