需求:计算凸轮相位角误差
关于凸轮的相位角误差计算直接需求是求取凸轮的实际最大升程点与理论最大升程点的角度误差,所以写出了下面的程序
def calculate_phase_error(self):
"""计算实际曲线与理论曲线的相位角误差"""
if self.theory_r is None or self.r is None:
return
# 找到实际曲线和理论曲线的最大升程点
actual_max_idx = np.argmax(self.r)
theory_max_idx = np.argmax(self.theory_r)
# 获取对应的角度
actual_max_angle = self.theta[actual_max_idx]
theory_max_angle = self.theory_theta[theory_max_idx]
# 计算相位角误差(转换为度)
self.phase_error = (actual_max_angle - theory_max_angle) * 180 / np.pi
# 确保误差在 -180 到 180 度之间
while self.phase_error > 180:
self.phase_error -= 360
while self.phase_error < -180:
self.phase_error += 360
这种方法通过比较实际曲线和理论曲线的最大升程点对应的角度来计算相位角误差,但是这种方法的局限性在于:
仅依赖于单个点(最大升程点)的位置,对噪声和局部偏差敏感
如果实际凸轮存在磨损或加工误差,最大升程点可能不是最具代表性的特征点
没有考虑整个凸轮轮廓的相位关系,仅关注峰值位置
考虑一些相对专业的相位角计算方法
在凸轮分析中相位角误差可以通过以下几种方法计算:
特征点匹配法:除了最大升程点外,还可以考虑缓冲段起点、工作段起点等特征点的角度偏差,然后取平均值或加权平均
曲线对齐法:使用优化算法将实际曲线与理论曲线在角度域上进行最佳对齐,计算所需的旋转角度
傅里叶分析法:将凸轮轮廓转换到频域,比较实际曲线和理论曲线的相位谱差异
综合考虑选择了第二种方式(加权比较均衡):实际上就是曲线计算的最佳拟合通过形状拟合反向找到旋转角度,如下图:
def minimize_normal_error(x_ref, y_ref, x_actual, y_actual):
# 目标函数:最小化法向误差
def objective(params):
tx, ty, angle = params
x_transformed, y_transformed = transform_points(x_actual, y_actual, tx, ty, angle)
return compute_normal_least_squares_error(x_ref, y_ref, x_transformed, y_transformed)
# 初始猜测:基于质心的平移和零旋转
center_ref = (np.mean(x_ref), np.mean(y_ref))
center_actual = (np.mean(x_actual), np.mean(y_actual))
tx_initial = center_ref[0] - center_actual[0]
ty_initial = center_ref[1] - center_actual[1]
angle_initial = 0
initial_guess = [tx_initial, ty_initial, angle_initial]
# 优化
result = minimize(objective, initial_guess, method='SLSQP')
if result.success:
tx, ty, angle = result.x
min_error = result.fun
return tx, ty, angle, min_error
else:
raise ValueError("法向误差最小化失败")