2. 三轴空间直线插补

任务目标

实现三轴(X/Y/Z)空间直线插补器:输入起点、终点与进给速度,输出各轴同步运动的位置序列,保证三轴同时到达终点。通过不同方向组合的测试用例验证插补正确性。

实现原理

采用时间分割插补法:将空间直线按插补周期等分为N段,每周期各轴增量 = 该轴总位移 / N。由于各轴每周期增量比例恒定,三轴严格同步。总步数N由最长轴决定,确保小位移轴不因取整丢失终点。

关键完整代码


import numpy as np

class LinearInterpolator3D:
    def __init__(self, feed_rate=100.0, period=0.01):
        """
        feed_rate: 合成进给速度 (mm/s)
        period: 插补周期 (s)
        """
        self.feed = feed_rate
        self.T = period

    def plan(self, start, end):
        """
        规划三轴直线插补
        参数: start, end = (x, y, z) 元组/列表
        返回: list of (x, y, z) 位置点,含起点不含终点
        """
        s = np.array(start, dtype=float)
        e = np.array(end, dtype=float)
        delta = e - s
        dist = np.linalg.norm(delta)

        if dist < 1e-9:
            return []  # 起点终点重合

        # 总插补周期数(向上取整保证覆盖全程)
        total_time = dist / self.feed
        n = int(np.ceil(total_time / self.T))
        n = max(n, 1)  # 至少1步

        # 每周期各轴增量
        step = delta / n

        points = []
        current = s.copy()
        for _ in range(n):
            current = current + step
            points.append(tuple(current))
        return points

    def verify_sync(self, points, start, end, tol=1e-6):
        """验证终点精度与同步性"""
        if not points:
            return False, "无插补点"
        last = np.array(points[-1])
        target = np.array(end)
        err = np.linalg.norm(last - target)
        if err > tol:
            return False, f"终点误差 {err:.2e} > {tol}"

        # 同步性:各轴位移比例应全程一致
        s = np.array(start)
        total_disp = target - s
        ratios = []
        for p in points:
            disp = np.array(p) - s
            # 各轴已完成比例
            r = [disp[i]/total_disp[i] if abs(total_disp[i])>1e-9 else 1.0
                 for i in range(3)]
            ratios.append(r)
        # 检查每点三轴比例最大偏差
        max_dev = max(max(abs(r[0]-r[1]), abs(r[0]-r[2]), abs(r[1]-r[2]))
                      for r in ratios)
        if max_dev > 1e-6:
            return False, f"同步偏差 {max_dev:.2e}"
        return True, f"通过 (终点误差 {err:.2e}, 同步偏差 {max_dev:.2e})"

# ===== 测试不同方向组合 =====
if __name__ == "__main__":
    interp = LinearInterpolator3D(feed_rate=100.0, period=0.01)

    cases = [
        ((0,0,0), (100,0,0)),      # 纯X轴
        ((0,0,0), (0,80,0)),       # 纯Y轴
        ((0,0,0), (0,0,60)),       # 纯Z轴
        ((0,0,0), (60,80,0)),      # XY平面
        ((0,0,0), (60,80,100)),    # 空间对角线
        ((10,20,30), (70,-40,90)), # 负方向组合
        ((0,0,0), (-50,-60,-70)),  # 全负方向
    ]

    for i, (s, e) in enumerate(cases):
        pts = interp.plan(s, e)
        ok, msg = interp.verify_sync(pts, s, e)
        print(f"用例{i+1}: {s} -> {e}")
        print(f"  插补点数: {len(pts)}, 验证: {msg}")

运行与验证

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

预期输出:7个用例全部打印“验证: 通过”,且终点误差与同步偏差均小于1e-6。例如用例5(空间对角线)输出类似:


用例5: (0,0,0) -> (60,80,100)
  插补点数: 13, 验证: 通过 (终点误差 0.00e+00, 同步偏差 0.00e+00)

判定标准:所有用例验证函数返回True。若任一用例终点误差>1e-6或同步偏差>1e-6,则插补实现有误。

关键说明

  • 插补点数N = ceil(距离/(速度×周期)),距离为空间直线长度,保证合成速度恒定。
  • 每周期增量 = 总位移/N,浮点累加可能引入微小误差,验证容差设为1e-6。
  • 同步性验证原理:任意时刻各轴已完成位移与总位移之比应相等(比例相同即同步)。
  • 负方向组合用例验证了增量方向正确性,纯单轴用例验证了退化情况。