2. 两轴直线插补
任务目标
编写一个两轴直线插补程序,输入起点坐标 (x0, y0) 与终点坐标 (x1, y1),输出从起点到终点路径上的一系列插补点。通过本案例掌握直线插补的核心原理:将直线运动离散化为等间距的坐标点序列,供后续运动控制使用。
直线插补原理
直线插补的核心是参数化直线方程。设起点为 P0(x0, y0),终点为 P1(x1, y1),则直线上任意一点可表示为:
P(t) = P0 + t × (P1 − P0),其中 t ∈ [0, 1]
将 t 按插补步数 N 等分,即可得到 N+1 个插补点。步长由插补周期与进给速度决定:若插补周期为 T(秒),进给速度为 F(单位/秒),则每步移动距离 d = F × T,总步数 N = ceil(L / d),其中 L 为直线总长度。
完整实现代码
import math
def linear_interpolation(x0, y0, x1, y1, feed_rate, period):
"""
两轴直线插补
参数:
x0, y0: 起点坐标
x1, y1: 终点坐标
feed_rate: 进给速度(单位/秒)
period: 插补周期(秒)
返回:
插补点列表 [(x, y), ...],包含起点和终点
"""
# 计算直线长度
dx = x1 - x0
dy = y1 - y0
length = math.hypot(dx, dy)
if length == 0:
return [(x0, y0)]
# 计算步长与步数
step_dist = feed_rate * period
steps = max(1, math.ceil(length / step_dist))
# 生成插补点
points = []
for i in range(steps + 1):
t = i / steps
x = x0 + dx * t
y = y0 + dy * t
points.append((round(x, 4), round(y, 4)))
return points
# 示例:从 (0, 0) 到 (10, 5),进给速度 2 单位/秒,插补周期 0.5 秒
if __name__ == "__main__":
result = linear_interpolation(0, 0, 10, 5, 2, 0.5)
for pt in result:
print(pt)
运行方式
将上述代码保存为 linear_interp.py,在命令行执行:
python linear_interp.py
验证方法
程序输出应为从 (0,0) 到 (10,5) 的插补点序列。直线总长度 L = √(10² + 5²) ≈ 11.18,步长 d = 2 × 0.5 = 1,步数 N = ceil(11.18 / 1) = 12。因此应输出 13 个点,首点为 (0,0),末点为 (10,5),中间点均匀分布在直线上。
通过条件:
- 输出点数 = 13
- 第一个点为 (0,0),最后一个点为 (10,5)
- 任意相邻两点间距 ≈ 1.0(允许浮点舍入误差)
- 所有点满足直线方程:y = 0.5x(即 y/x = 0.5)
预期输出(前5个点)
(0, 0)
(0.8333, 0.4167)
(1.6667, 0.8333)
(2.5, 1.25)
(3.3333, 1.6667)
...
验证时可将输出点绘制在坐标图上,观察是否形成一条从原点到 (10,5) 的直线段。若需实际运动控制,将返回的坐标点依次发送给两轴伺服驱动器即可。