Hi Erik-
Just wondering if you were able to solve your problem.
--Chris
On Sun, Apr 9, 2017 at 5:00 PM, Chris Marshall <[email protected]>
wrote:
> Here is a quick Least Squares computation (unchecked):
>
> pdl> use PDL::Slatec;
> pdl> ($circle,$xp,$xi,$yp,$yi,) = rcols('cmm.txt',0,1,2,4,5);
> pdl> $A = cat(-$yi,$xi,pdl(1),pdl(0),$xi,$yi,pdl(0),pdl(1))->mv(0,1)
> ->splitdim(0,4)->clump(1,2);
> pdl> $b = cat($xp,$yp)->mv(0,1)->clump(2);
> pdl> p matinv($A->mv(0,1) x $A) x $A->mv(0,1) x $b(*1);
>
> Hope this helps.
> Chris
>
>
> On 4/9/2017 15:59, Chris Marshall wrote:
>
> Hi Erik-
>
> Here is a sequence of commands in the pdl2 shell that
> show how you can read the data from your coordinates files
> and generate the A matrix as in your URL link:
>
> # read in these columns into piddles
> pdl> ($circle,$xp,$xi,$yp,$yi,) = rcols('cmm.txt',0,1,2,4,5);
>
> # generate the A matrix from colum data, the sequence shows
> # how the data ordering and dimensions are rearranged.
> pdl> p cat(-$yi,$xi,pdl(1),pdl(0),$xi,$yi,pdl(0),pdl(1));
>
> pdl> p cat(-$yi,$xi,pdl(1),pdl(0),$xi,$yi,pdl(0),pdl(1))->mv(0,1);
>
> pdl> p cat(-$yi,$xi,pdl(1),pdl(0),$xi,$yi,pdl(0),pdl(1))->mv(0,1)
> ->splitdim(0,4);
>
> pdl> p cat(-$yi,$xi,pdl(1),pdl(0),$xi,$yi,pdl(0),pdl(1))->mv(0,1)
> ->splitdim(0,4)->clump(1,2);
>
> pdl> $A = cat(-$yi,$xi,pdl(1),pdl(0),$xi,$yi,pdl(0),pdl(1))->mv(0,1)
> ->splitdim(0,4)->clump(1,2);
> pdl> p $A
>
> [
> [ -56.986366 -0.00536711 1 0]
> [-0.00536711 56.986366 0 1]
> [ -58.030087 0.01315322 1 0]
> [ 0.01315322 58.030087 0 1]
> [ -59.001671 0.00179112 1 0]
> [ 0.00179112 59.001671 0 1]
> [ -59.998104 0.02253121 1 0]
> [ 0.02253121 59.998104 0 1]
> [ -61.004448 0.00609248 1 0]
> [ 0.00609248 61.004448 0 1]
> [ -61.990383 0.01154447 1 0]
> [ 0.01154447 61.990383 0 1]
> [ -62.993629 0.00199315 1 0]
> [ 0.00199315 62.993629 0 1]
> [ -63.989956 0.02241261 1 0]
> [ 0.02241261 63.989956 0 1]
> [ -65.007301 0.00174078 1 0]
> [ 0.00174078 65.007301 0 1]
> [ -65.987686 0.01188208 1 0]
> [ 0.01188208 65.987686 0 1]
> [ -67.993156 -0.00039018 1 0]
> [-0.00039018 67.993156 0 1]
> [ -69.007614 0.0049898 1 0]
> [ 0.0049898 69.007614 0 1]
> ]
>
> I hope that gets you started. You should take a look at the PDL Book
> which goes into more details about using and working with PDL:
>
> http://pdl.perl.org/?page=FirstSteps
>
> Looking at the problem, I would consider combining the measurements
> for each circle to estimate the coordinates of the hole centers and
> using those reduced set of positions for your alignment calculation.
>
> Also, you may wish to verify that the least squares estimates for the
> sin and cos of the rotation have sin*sin + cos*cos = 1.
>
> Cheers,
> Chris
>
> On 4/9/2017 15:03, butchert erik wrote:
>
>
> Sorry for using too large attachments with the previous copy of my message.
>
> Erik Butchert
>
> ---------- Original Message ----------
> From: butchert erik <[email protected]>
> <[email protected]>
> To: [email protected]
> Date: 09 April 2017 at 17:51
> Subject: RE: [Pdl-general] 2d rigid transformation
>
>
> Hi
> Perhaps I can explain my issue better if I send you a copy of part of one
> of the text files I get from the co-ordinate measuring instrument
> (attached). The rows are the data for each hole in a test piece for
> assessing XY accuracy of a drilling machine.
> Column 1 is the hole number
> 2 is the X program position
> 3 is the X measured position
> 4 is the X error
> 5, 6 and 7 are the same but for the Y axis
> You can ignore the rest for the purposes of this exercise.
> The problem is that when the test piece is aligned to the measuring
> machine it uses 2 drilled holes that have the same programmed X (or Y)
> position to establish a line parallel to the instrument axis, but of course
> there’s nothing magical about these “datum” holes they are as inaccurate as
> any other hole, this skews the panel against the CMM axes so the measured
> positions become more inaccurate as the distance from the constructed
> origin increases. What I am trying to get to is to calculate the best fit
> of the measured values to the programmed ones, and therefor the X,Y
> positions with the alignment error removed. If you examine the Xerror v
> Yerror plot in the pdf you will see instead of being round it is elongated
> in the Y axis,as typically the test piece is longer in the Y than in the X
> so I wonder how much of this is rotational error.
> I can see references to the problem such as
> https://elonen.iki.fi/code/misc-notes/2d-rigid-fit/
> but haven’t found anything similar within Perl/PDL
>
> BTW I use PDL’s extracted from the measurement files and GnuPlot to show
> very useful interactive plots so to be able to build the alignment
> correction within the existing Perl script would be a good step forward.
>
> Erik
>
>
>
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
pdl-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pdl-general