2. 直线插补速度控制
任务目标
在直线插补过程中加入恒定进给速度控制,根据插补周期计算每个周期内的合成位移量,并分解到X、Y轴,实现匀速直线运动轨迹。
实现原理
设进给速度为 F(mm/min),插补周期为 T(ms),则每个周期的合成位移为:
ΔL = F × T / 60000(mm)
对于起点 (x0, y0) 到终点 (x1, y1) 的直线,总长度为 L = √((x1-x0)² + (y1-y0)²),方向余弦为 cosα = (x1-x0)/L,cosβ = (y1-y0)/L。每个周期的轴分量:
Δx = ΔL × cosα,Δy = ΔL × cosβ
总插补周期数 N = round(L / ΔL),最后一个周期处理剩余余量,保证精确到达终点。
关键完整代码
import math
def linear_interp_constant_feed(x0, y0, x1, y1, feed, period_ms):
"""
匀速直线插补:计算每个插补周期的轴位移量
参数:
x0, y0: 起点坐标 (mm)
x1, y1: 终点坐标 (mm)
feed: 进给速度 (mm/min)
period_ms: 插补周期 (ms)
返回:
list of (dx, dy): 每个周期的轴位移量 (mm)
"""
# 1. 计算总长度与方向余弦
dx_total = x1 - x0
dy_total = y1 - y0
L = math.hypot(dx_total, dy_total)
if L == 0:
return [] # 起点终点重合,无插补
cos_alpha = dx_total / L
cos_beta = dy_total / L
# 2. 每周期合成位移量
dL = feed * period_ms / 60000.0 # mm/周期
# 3. 计算总周期数(向上取整,最后一段处理余量)
N = math.ceil(L / dL)
# 4. 生成每个周期的轴位移
steps = []
remaining_L = L
for i in range(N):
if remaining_L <= dL:
# 最后一个周期:走完剩余距离
step_L = remaining_L
else:
step_L = dL
dx = step_L * cos_alpha
dy = step_L * cos_beta
steps.append((dx, dy))
remaining_L -= step_L
return steps
# ========== 最小验证示例 ==========
if __name__ == "__main__":
# 从 (0,0) 到 (30, 40),长度 50mm,进给 600mm/min,周期 10ms
x0, y0, x1, y1 = 0.0, 0.0, 30.0, 40.0
feed = 600.0 # mm/min
period_ms = 10 # ms
steps = linear_interp_constant_feed(x0, y0, x1, y1, feed, period_ms)
# 输出前5个周期与最后一个周期
print(f"总周期数: {len(steps)}")
print("前5个周期位移 (dx, dy):")
for i, (dx, dy) in enumerate(steps[:5]):
print(f" 周期{i+1}: dx={dx:.4f}, dy={dy:.4f}")
print("最后一个周期位移:")
dx_last, dy_last = steps[-1]
print(f" dx={dx_last:.4f}, dy={dy_last:.4f}")
# 验证:累加位移是否等于终点坐标
sum_x = sum(dx for dx, _ in steps)
sum_y = sum(dy for _, dy in steps)
print(f"\n累加位移: ({sum_x:.6f}, {sum_y:.6f})")
print(f"目标终点: ({x1}, {y1})")
print(f"误差: ({abs(sum_x-x1):.2e}, {abs(sum_y-y1):.2e})")
运行与验证
运行方式:直接执行Python脚本(需Python 3.x,无需额外依赖):
python linear_interp_constant_feed.py
预期输出(确定性计算):
总周期数: 50
前5个周期位移 (dx, dy):
周期1: dx=0.6000, dy=0.8000
周期2: dx=0.6000, dy=0.8000
周期3: dx=0.6000, dy=0.8000
周期4: dx=0.6000, dy=0.8000
周期5: dx=0.6000, dy=0.8000
最后一个周期位移:
dx=0.6000, dy=0.8000
累加位移: (30.000000, 40.000000)
目标终点: (30.0, 40.0)
误差: (0.00e+00, 0.00e+00)
验证判定标准:
- 每个周期位移量满足
√(dx² + dy²) = feed × period_ms / 60000(本例为0.1mm/周期),即合成速度恒定; - 所有周期位移累加后精确等于终点坐标(误差在浮点精度范围内);
- 方向余弦恒定,各周期dx与dy比值恒等于3:4,轨迹为直线。
关键说明
- 当总长度不能被每周期位移整除时,最后一个周期自动缩短,保证终点精确;
- 实际数控系统中,插补周期通常为1~10ms,进给速度单位需与坐标单位保持一致(本案例均为mm);
- 若需处理加减速,只需将
feed替换为每个周期对应的瞬时速度即可,本案例聚焦恒定速度场景。