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),匀速验证显示“通过”。

关键说明

  • 本实现适用于任意二维直线,三维或多轴扩展只需增加对应轴的增量计算;
  • 若总长度不能被步长整除,末段位移会小于标准步长,这是时间分割法的正常取整行为,实际工程中可通过减速规划处理;
  • 浮点累积误差通过末点强制赋终点值消除。
X (mm) Y (mm) 0 10 20 30 40 0 10 20 30 40 P0(0,0) P1(30,40) ΔL ΔL F=600mm/min 插补轨迹(500段)