三点求圆心
西门子SINUMERIK OPERATE“测量工件”提供了四点分中的方法来设置零偏——设定工件坐标系,大大简化了以圆心为工件坐标原点的零偏设置操作。但是,实际生产中,四点分中存在一定的局限性,有时候想要将其圆心设置为工件坐标原点的轮廓不一定是整圆,如半圆,这时就无法使用四点分中来设置零偏本。我们知道,空间任意三点,如果任意两点不重合且三点不在同一直线上,那么这三个点就可以确定一个圆,即可以确定唯一的圆心和半径。因此,我们可以通过采集圆形轮廓上的任意不重合的三个点来求得圆形轮廓的圆心坐标,进一步将其设置为工件坐标系的原点。本文将介绍三点求圆心的推到计算,并通过参数传递的子程序来计算三点的圆心坐标。
设圆上任意三点的坐标分别为P0(X0, Y0), P1(X1, Y1), P2(X2, Y2), 圆心坐标P(X, Y),P0、P1和P2三点可以通过手动巡边或者通过测头测量得到,P点为需要求的圆心。因此,按圆的标准方程,有关于X、Y的二元2次方程组:
化简上述方程组可得如下关于X、Y的二元一次方程组:
设:
A = X1+X0
B = X1-X0
C = Y1+Y0
D = Y1-Y0
E = X2+X1
F = X2-X1
G = Y2+Y1
H = Y2-Y1
I = B/D – F/H
J = D/B – H/F
将A~H带入③和④得方程组:
解上述方程组可得:
这样,这测出P0、P1和P2三点后,就可以很方便的计算出圆心的坐标。根据上述推导,很容易编制出下列计算圆心坐标的子程序,程序代码如下:
N10 PROC SUB(REAL _X0,REAL _Y0,REAL _X1,REAL _Y1,REAL _X2,REAL _Y2,VAR REAL _X,VAR REAL _Y)
N20 DEF REAL _A, _B ,_C, _D, _E, _F, _G, _H , _I, _J
N30 _A = _X1 + _X0
N40 _B = _X1 - _X0
N50 IF _B == 0
N60 _B = 0.000000000001
N70 ENDIF
N80 _C = _Y1 + _Y0
N90 _D = _Y1 - _Y0
N100 IF _D == 0
N110 _D = 0.000000000001
N120 ENDIF
N130 _E = _X2 + _X1
N140 _F = _X2 - _X1
N150 IF _F == 0
N160 _F = 0.000000000001
N170 ENDIF
N180 _G = _Y2 + _Y1
N190 _H = _Y2 - _Y1
N200 IF _H == 0
N210 _H = 0.000000000001
N220 ENDIF
N230 _I = _B/_D - _F/_H
N240 IF _I == 0
N250 _I = 0.000000000001
N260 ENDIF
N270 _J = _D/_B - _H/_F
N280 IF _J == 0
N290 _J = 0.000000000001
N300 ENDIF
N310 _X = (_A*_B/_D + _C - _E*_F/_H - _G)/(2*_I)
N320 _Y = (_A + _C*_D/_B - _E - _G*_H/_F)/(2*_J)
N340 RET
注意:为了避免出现分母为零的情况,当分母为零时用0.000000000001代替0以避免出现分母为零时计算出错。
上述子程序通过参数传递的方式将三个已知点的坐标传递到子程序,同时将计算结果通过参数传递的方式返回到所调用的程序。限于硬件条件原因,本文不讨论测量P0、P1和P2的过程,而是设计一个主程序来验证子程序的计算的正确性。
图1
DEF REAL _X0, _Y0, _X1, _Y1, _X2, _Y2, _X, _Y
EXTERN SUB(REAL, REAL, REAL, REAL, REAL, REAL,VAR REAL,VAR REAL)
_X0 = 50
_Y0 = 0
_X1 = 50
_Y1 = 100
_X2 = 100
_Y2 = 50
SUB(_X0,_Y0,_X1,_Y1,_X2,_Y2,_X,_Y)
N330 MSG("("<<_X<<", "<<_Y<<")")
M0
M30
执行上述程序,可以得到如图1所示的结果。图1左上角消息栏显示出了计算所得的圆心坐标(50,50),这与实际完全吻合。