4. 螺旋线插补
任务目标
生成沿Z轴等距上升的螺旋线插补点,并支持通过参数控制每圈插补点数。螺旋线半径为R,螺距为P(每旋转一圈Z轴上升量),总圈数为N。输出为一系列三维插补点,相邻点之间Z轴增量恒定,且每圈点数可配置。
实现思路
螺旋线参数方程:x = R·cos(θ),y = R·sin(θ),z = (P/(2π))·θ。每圈点数pointsPerRev决定角度步长Δθ = 2π / pointsPerRev。总插补点数为N × pointsPerRev + 1(含终点)。通过循环累加角度生成各点坐标,确保Z轴严格等距上升。
关键完整代码
import math
def generate_helix_points(R, P, N, points_per_rev):
"""
生成螺旋线插补点
参数:
R: 螺旋半径
P: 螺距(每圈Z轴上升量)
N: 总圈数
points_per_rev: 每圈插补点数
返回:
list of (x, y, z) 插补点坐标
"""
if R <= 0 or P <= 0 or N <= 0 or points_per_rev < 3:
raise ValueError("参数必须为正数,且每圈点数至少为3")
points = []
total_points = N * points_per_rev + 1 # 含终点
d_theta = 2 * math.pi / points_per_rev
for i in range(total_points):
theta = i * d_theta
x = R * math.cos(theta)
y = R * math.sin(theta)
z = (P / (2 * math.pi)) * theta
points.append((round(x, 6), round(y, 6), round(z, 6)))
return points
# 示例:半径5,螺距2,3圈,每圈12个点
if __name__ == "__main__":
pts = generate_helix_points(R=5.0, P=2.0, N=3, points_per_rev=12)
# 验证输出
print(f"生成点数: {len(pts)}")
print("前5个点:", pts[:5])
print("最后1个点:", pts[-1])
# 验证Z轴等距性
z_diffs = [pts[i+1][2] - pts[i][2] for i in range(len(pts)-1)]
z_step = P / points_per_rev
all_equal = all(abs(d - z_step) < 1e-9 for d in z_diffs)
print(f"Z轴步长: {z_step:.6f}, 全部等距: {all_equal}")
# 验证每圈点数
print(f"每圈点数: {points_per_rev}, 总圈数: {N}")
运行与验证
运行方式:直接执行Python脚本。需Python 3环境,无需额外依赖。
验证方法:
- 程序输出点数应为
N × points_per_rev + 1 = 37; - Z轴相邻点差值恒为
P / points_per_rev = 2/12 ≈ 0.166667,程序打印全部等距: True; - 首点坐标为
(5, 0, 0),末点坐标为(5, 0, 6)(3圈后Z轴上升6),可观察x、y值周期性回到起点。
预期输出(示例):
生成点数: 37
前5个点: [(5.0, 0.0, 0.0), (2.5, 4.330127, 0.166667), (-2.5, 4.330127, 0.333333), (-5.0, 0.0, 0.5), (-2.5, -4.330127, 0.666667)]
最后1个点: (5.0, 0.0, 6.0)
Z轴步长: 0.166667, 全部等距: True
每圈点数: 12, 总圈数: 3
参数调整说明
修改points_per_rev可控制每圈插补密度:值越大轨迹越平滑,但点数增多。修改P控制Z轴上升速度,N控制总圈数。该实现可直接嵌入运动控制程序,将生成的点序列作为目标位置指令。