1. 直线插补
任务目标
实现二维平面内从起点 P0(x0, y0) 到终点 P1(x1, y1) 的直线插补,按固定周期输出各轴位置序列,并验证运动过程为匀速(各插补周期内位移量恒定)。
实现方案
采用时间分割法:将直线总位移按插补周期 T 均匀分割为 N 段,每周期各轴增量固定,从而保证合成速度恒定。核心逻辑为:
- 计算总位移
dx = x1 - x0,dy = y1 - y0; - 根据进给速度
F(单位:mm/min)与插补周期T(单位:ms)计算每周期步长ΔL = F × T / 60000; - 总段数
N = ceil(总长度 / ΔL),各轴每周期增量Δx = dx / N,Δy = dy / N; - 逐周期累加输出位置序列,末点强制等于终点。
完整代码
import math
def line_interpolate(x0, y0, x1, y1, feed_rate, period_ms):
"""
直线插补:时间分割法
:param x0, y0: 起点坐标 (mm)
:param x1, y1: 终点坐标 (mm)
:param feed_rate: 进给速度 (mm/min)
:param period_ms: 插补周期 (ms)
:return: 位置序列 [(x, y), ...],含起点和终点
"""
dx = x1 - x0
dy = y1 - y0
length = math.hypot(dx, dy)
if length == 0:
return [(x0, y0)]
# 每周期步长 (mm)
delta_L = feed_rate * period_ms / 60000.0
# 总段数(向上取整,保证覆盖全长)
N = max(1, math.ceil(length / delta_L))
# 各轴每周期增量
step_x = dx / N
step_y = dy / N
# 生成位置序列
points = []
for i in range(N + 1):
# 末点强制为终点,避免浮点累积误差
if i == N:
points.append((x1, y1))
else:
points.append((x0 + step_x * i, y0 + step_y * i))
return points
# ========== 验证:匀速性检查 ==========
if __name__ == "__main__":
# 输入参数
start = (0.0, 0.0)
end = (30.0, 40.0) # 长度 50mm
F = 600.0 # 600 mm/min = 10 mm/s
T = 10.0 # 10ms 插补周期
pts = line_interpolate(start[0], start[1], end[0], end[1], F, T)
# 计算每段实际位移
seg_lengths = []
for i in range(1, len(pts)):
seg = math.hypot(pts[i][0] - pts[i-1][0], pts[i][1] - pts[i-1][1])
seg_lengths.append(seg)
# 输出结果
print(f"插补点数: {len(pts)}")
print(f"前5个点: {pts[:5]}")
print(f"末点: {pts[-1]}")
# 匀速判定:除末段外,各段长度应一致(末段因取整可能略短)
if len(seg_lengths) > 1:
typical = seg_lengths[0]
max_dev = max(abs(s - typical) for s in seg_lengths[:-1])
print(f"理论每周期步长: {F * T / 60000.0:.6f} mm")
print(f"实际段长(前3段): {[round(s, 6) for s in seg_lengths[:3]]}")
print(f"末段长度: {seg_lengths[-1]:.6f} mm")
print(f"除末段外最大偏差: {max_dev:.2e} mm")
print("匀速验证:", "通过" if max_dev < 1e-9 else "未通过")
else:
print("匀速验证: 仅1段,跳过")
运行方式
python line_interpolate.py
验证方法与判定标准
- 位置正确性:末点输出必须等于
(30.0, 40.0); - 匀速性:除末段因取整可能略短外,其余各段长度应完全相等(浮点偏差 < 1e-9);
- 预期输出(由代码逻辑直接推出):理论步长
0.1 mm,总段数500,插补点数501,前3段长度均为0.1 mm,末段长度约0.1 mm(因整除无余数,末段也为精确 0.1),匀速验证显示“通过”。
关键说明
- 本实现适用于任意二维直线,三维或多轴扩展只需增加对应轴的增量计算;
- 若总长度不能被步长整除,末段位移会小于标准步长,这是时间分割法的正常取整行为,实际工程中可通过减速规划处理;
- 浮点累积误差通过末点强制赋终点值消除。