探索一种2D曲线偏差的简单计算方式

线的轮廓度误差是提取线与名义线在垂直于名义轮廓方向上的最大误差。更简单的说就是实际值和名义值沿着名义法线上的偏差。

ZEISS CALYPSO软件对于曲线偏差的计算,不止于此,有着一些更为深度的计算方法。比图:2D曲线和3D曲线均支持沿着名义法线方向评价,可按照实际值到名义值进行评价,可以沿着坐标轴,法线网格,径向偏差进行空间点评价。

名义法向上的偏差是由每个名义点在名义法线方向上与实际点的交点之间的偏差来测量的。

实际->名义偏差是实际曲线上的测量点到名义曲线之间的距离。

坐标方向偏差是在X方向偏差,在Y方向偏差和在Z方向偏差是名义点到实际曲线点的在基本坐标系坐标轴方向的距离的组合

当然有些计算方式过于复杂,涉及到整个曲线的插补计算以及样条拟合,这也是CALYSPO的在复杂曲线曲面上洞察秋毫的亮点,作为几何尺寸和公差测量的灯塔软件,CALYPSO自90年代的1.0到现在7.8,一代一代的升级更为其赋予了许多新功能,使其在智能化、易用化的特点更为突出。而且在CALYPSO软件中曲线被分为平面曲线和空间曲线,CALYPSO曲线模块还能对已知的二维或三维曲线等进行测量和评价,也可以用于对未知轮廓进行逆向。

曲线模块可以应用于:曲柄轴,凸轮轴,涡轮叶片,传动装置,医疗技术,模具设计,发动机制造等。

这里深感其在计算线轮廓度上面的重要性,对于控制曲面工件是个非常重要的工具。为了深究一些其中的底层逻辑,我们从应用的角度出发对其计算方式做了一些简单的窥视,希望能从原理上理解曲线的具体计算方法。

起初的想法是处理样条曲线的方式进行计算,通过实际测量点拟合曲线,求名义点和名义法向与实际曲线交点,然后求两点距离作为实测偏差,但是拟合实际曲线不太理想,只有放弃这种方法。

# 尝试不同的平滑参数
for s in np.linspace(0, 1, 3):
    # 使用样条插值进行数据拟合
    tck, _ = splprep([x_data_actual, y_data_actual], s=s, u=u)
    # 使用拟合的样条曲线生成数据点
    splined_data = splev(unew, tck)
    # 计算偏差
    deviations = compute_deviations(x_data_actual, y_data_actual, splined_data)
    avg_deviation = np.mean(np.abs(deviations))
    # 如果当前的平均偏差小于已知的最佳偏差,更新最佳偏差和tck
    if avg_deviation < best_avg_deviation:
        best_avg_deviation = avg_deviation
        best_tck = tck

# 使用最佳的tck来获得样条数据
splined_data = splev(unew, best_tck)

假设三坐标都是按照名义位置取点,是否可以直接通过就实际点名义点距离来评价偏差距离呢?大物之道,化繁为简,出于这样的推测写出python程序进行验证。

def get_nearest_point(x, y, x_data, y_data):
    min_dist = float('inf')
    nearest_point = None
    for xi, yi in zip(x_data, y_data):
        dist = math.sqrt((x - xi)**2 + (y - yi)**2)
        if dist < min_dist:
            min_dist = dist
            nearest_point = (xi, yi)
    return nearest_point

def get_normals(length, x_1, y_1, x_2, y_2):
        # 计算法向量
        if idx < len(x_1) - 2:
            # 使用相邻点计算切线方向
            tangent_vector = np.array([x_1[idx + 1] - x_1[idx], y_1[idx + 1] - y_1[idx]])
            tangent_vector /= np.linalg.norm(tangent_vector)
            normal_vector = np.array([-tangent_vector[1], tangent_vector[0]])  # 垂直法向量
        else:
            # 对最后一个点,使用之前的切线方向
            normal_vector = previous_vector

        # 计算点积以判断偏差的正负
        if normal_vector is not None:
            dot_product = np.dot(deviation_vector, normal_vector)
            if dot_product > 0:
                deviation = -deviation

      
# 去除3sigma以外的数据
mean_deviation = np.mean(deviations)
sigma = np.std(deviations)
filtered_deviations = [dev for dev in deviations if abs(dev - mean_deviation) <= 3*sigma]
# 从过滤后的数据种找到最大最小点
max_deviation = max(filtered_deviations)
min_deviation = min(filtered_deviations)
form_value = max_deviation - min_deviation

本次实验使用了ZEISS 三坐标机器CONTURA 7106加主动式探头VAST XT,实验使用2D曲线选项,针对不同的点数

实验一:300点

实验二:1000点

实验三:名义1000点-实际3000点

实验四:5000点

从实验结果来看和CALYPSO的计算几乎一样,是否也侧面反应了CONTURA三坐标在采集点的优秀特性....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值