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设为不同值,断言中间点姿态角按比例单调变化即可。