FitCircle - Points array from RobTargets/JointTargets?
I'm wanting to utilize Fitcircle in determining the center of a circle feature, using the X,Y,Z point data extracted from a series of robtargets, or joint targets if that's easier.
The idea being the targets would be produced using Search1D, X,Y,Z data extracted and then used to find the center of the circle feature searched.
Robot searches the part, pints recorded, center of circle calculated and other routines run from there.
My programming skills are very, very, basic so you might have to dumb things down for me. Let me know if you need any other details, robot details etc. I'll do my best to fill in the gaps.
The idea being the targets would be produced using Search1D, X,Y,Z data extracted and then used to find the center of the circle feature searched.
Robot searches the part, pints recorded, center of circle calculated and other routines run from there.
My programming skills are very, very, basic so you might have to dumb things down for me. Let me know if you need any other details, robot details etc. I'll do my best to fill in the gaps.
0
Comments
-
Check out this thread
https://forums.robotstudio.com/discussion/10406/finding-coordinates-x-y-z-of-circle-center-point
Keke seems to have written a function called Circle3P that can find the center of a circle from three points, but the forum seems to have formatted it in a funky way. I've tried to clean it up but there may be some small syntactical mistakes, check it out:MODULE MainModuleCONST num nEPSILON:=1e-6;PROC main()VAR pos p1;VAR pos p2;VAR pos p3;VAR pos c;VAR pos a;VAR num r;VAR bool b;p1:=[200,0,100];p2:=[0,0,100];p3:=[0,200,100];b:=Circle3P(p1,p2,p3,c,a,r);Stop;ENDPROCFUNC num Max(num n1, num n2)!--------------------------------!Return maximum of two numbers !--------------------------------!IF n1 > n2 THENRETURN n1;ELSERETURN n2;ENDIFENDFUNCFUNC num PosLength(pos p)!-------------------------------- !Length of a vector (pos) !--------------------------------!VAR num nL;nL:=sqrt(Max(0,p.x*p.x+p.y*p.y+p.z*p.z));RETURN nL;ENDFUNCFUNC pos CrossProd(pos p1,pos p2)!--------------------------------!Calculate cross product for vectors p1 and p2.!--------------------------------!VAR pos px;px:=[0,0,0];px.x:=p1.y*p2.z-p2.y*p1.z;px.y:=p2.x*p1.z-p1.x*p2.z;px.z:=p1.x*p2.y-p2.x*p1.y;RETURN px;ENDFUNCFUNC bool Circle3P(pos p1,pos p2,pos p3,INOUT pos center,INOUT pos axis,INOUT num radius)!--------------------------------!Calculate center point, axis and radius for a circle formed by three point p1, p2 and p3. Axis is unit vector.!--------------------------------!!Returns True if found, False if points are on a on a single line (infinite radius).!--------------------------------!VAR pos v12;VAR pos v23;VAR pos px;VAR pos p12mid;VAR pos p23mid;VAR pos n12;VAR pos n23;VAR pos diff;VAR num l;VAR dnum A{3,3};VAR dnum b{3};VAR dnum x{3};center:=[0,0,0];axis:=[0,0,0];radius:=0;v12:=p2-p1;v23:=p3-p2;px:=CrossProd(v12,v23);l:=PosLength(px);IF l<nEPSILON THENRETURN FALSE;ENDIFpx:=(1.0/l)*px;axis:=px;p12mid:=p1+0.5*v12;p23mid:=p2+0.5*v23;n12:=CrossProd(v12,axis);n23:=CrossProd(v23,axis);A:=[[NumToDnum(v12.x),NumToDnum(v12.y),NumToDnum(v12.z)],[NumToDnum(v23.x),NumToDnum(v23.y),NumToDnum(v23.z)],[NumToDnum(axis.x),NumToDnum(axis.y),NumToDnum(axis.z)]];b:=[NumToDnum(DotProd(v12,p12mid)),NumToDnum(DotProd(v23,p23mid)),NumToDnum(DotProd(axis,p2))];center:=[DnumToNum(x{1}),DnumToNum(x{2}),DnumToNum(x{3})];diff:=center-p1;radius:=PosLength(diff);RETURN TRUE;ENDFUNCENDMODULE1
Categories
- All Categories
- 5.5K RobotStudio
- 396 UpFeed
- 18 Tutorials
- 13 RobotApps
- 297 PowerPacs
- 405 RobotStudio S4
- 1.8K Developer Tools
- 250 ScreenMaker
- 2.8K Robot Controller
- 316 IRC5
- 61 OmniCore
- 7 RCS (Realistic Controller Simulation)
- 799 RAPID Programming
- AppStudio
- 3 RobotStudio AR Viewer
- 18 Wizard Easy Programming
- 105 Collaborative Robots
- 5 Job listings