从机械台位置测量数据中分离系统误差与随机误差
机械台位置误差数据中系统误差的分离与NWARI方法验证优化
背景
机械台在二维平面内移动,测量数据包含台体的X、Y坐标及X、Y方向的位置误差。平面上有间隔1nm的标记网格,台体仅在这些标记点处进行测量,误差由标记真实位置与台体测量位置的差值计算得出。
数据格式
此处Skew代表误差,示例数据如下:
| StageCoords_X | StageCoords_Y | Skew_X | Skew_Y |
|---|---|---|---|
| 118760606 | 112836409 | -29 | -45 |
| 118760622 | 112836426 | -18 | 5 |
数据预处理
因工作在纳米尺度,同一标记位置的多次测量中台体位置会有小幅波动,因此对X、Y方向数据分箱,每个矩形箱对应单个标记的所有数据点,后续可计算每个箱的误差均值和峰峰值并绘图。预处理代码如下:
# Define bin edges based on bin width bin_width = 1000000 x_bins = np.arange(df['StageCoordsNM.X'].min(), df['StageCoordsNM.X'].max() + bin_width, bin_width) y_bins = np.arange(df['StageCoordsNM.Y'].min(), df['StageCoordsNM.Y'].max() + bin_width, bin_width) df['X_bin'] = pd.cut(df['StageCoordsNM.X'], bins=x_bins, labels=False) df['Y_bin'] = pd.cut(df['StageCoordsNM.Y'], bins=y_bins, labels=False)
需求
已对同一区域扫测25次,分箱后每个箱包含25个位置误差数据点,需要提取每个箱中误差的系统(可重复)成分。由于数据量较少,无法采用机器学习方法,希望通过统计方法实现。
已完成工作
计算了Normalized Weighted Adjusted Repeatability Index(NWARI),用于判断分箱误差的可重复性置信度(忽略下标_before),代码如下:
#*__Pk-to-Pk X and Y__ df['Error_pk2pk_X'] = df.groupby(['X_bin', 'Y_bin'])['SkewNM.X'].transform(lambda x: x.max() - x.min()) df['Error_pk2pk_Y'] = df.groupby(['X_bin', 'Y_bin'])['SkewNM.Y'].transform(lambda x: x.max() - x.min()) df['Mean_SkewNM_X_before'] = df.groupby(['X_bin', 'Y_bin'])['SkewNM.X'].transform(lambda x: x.mean()) df['Mean_SkewNM_Y_before'] = df.groupby(['X_bin', 'Y_bin'])['SkewNM.Y'].transform(lambda x: x.mean()) def compute_confidence_X_before(group): group = group.reset_index(drop=True) group['WARI_x_before'] = (w_a * np.abs(group['Mean_SkewNM_X_before'].mean()) ) / ( w_p * (np.abs(group['Error_pk2pk_X'].mean()) + epsilon) ) group['NWARI_x_before'] = (group['WARI_x_before']) / (1+group['WARI_x_before']) group['Confidence_X_before'] = ( np.abs(group['Mean_SkewNM_X_before'].mean()) - np.abs(group['Error_pk2pk_X'].mean()) ) / np.abs(group['SkewNM.X'].mean()) group['Confidence_X_before'] = group['Confidence_X_before'].apply(lambda x: max(x, -1)) return group def compute_confidence_Y_before(group): group = group.reset_index(drop=True) group['WARI_y_before'] = (w_a * np.abs(group['Mean_SkewNM_Y_before'].mean()) ) / ( w_p * (np.abs(group['Error_pk2pk_Y'].mean()) + epsilon) ) group['NWARI_y_before'] = (group['WARI_y_before']) / (1+group['WARI_y_before']) group['Confidence_Y_before'] = ( np.abs(group['Mean_SkewNM_Y_before'].mean()) - np.abs(group['Error_pk2pk_Y'].mean()) ) / np.abs(group['SkewNM.Y'].mean()) group['Confidence_Y_before'] = group['Confidence_Y_before'].apply(lambda x: max(x, -1)) return group df = df.groupby(['X_bin', 'Y_bin'], group_keys=False).apply(compute_confidence_X_before) df = df.groupby(['X_bin', 'Y_bin'], group_keys=False).apply(compute_confidence_Y_before) df['NWARI_X_before'] = df['NWARI_x_before'] df['NWARI_Y_before'] = df['NWARI_y_before']
疑问与求助
不确定上述NWARI方法是否正确,寻求验证方法及优化建议。
内容的提问来源于stack exchange,提问作者user2307540
相关产品推荐
相关产品推荐

