Newsgroups: comp.robotics
Path: brunix!sgiblab!swrinde!cs.utexas.edu!uwm.edu!rpi!utcsri!cannon.ecf!hertz
From: hertz@ecf.toronto.edu (HERTZ  ROGER BARRY)
Subject: Re: Getting OAT-Coordinates for PUMA-560 out of EULER or YPR?
Message-ID: <CE83H7.EyG@ecf.toronto.edu>
Sender: news@ecf.toronto.edu (News Administrator)
Organization: University of Toronto, Engineering Computing Facility
References: <1993Sep30.094403.163@Informatik.TU-Muenchen.DE>
Date: Fri, 1 Oct 1993 14:41:31 GMT
Lines: 100

In article <1993Sep30.094403.163@Informatik.TU-Muenchen.DE>,
Christian Ettenhuber <ettenhub@Informatik.TU-Muenchen.DE> wrote:
>
>Has someone informations about transforming Euler or YPR - Angles to
>the O, A, T - System. It would be very nice if someone can help me.
>
>
>Ettenhuber Christian

The three systems (Euler, RPY and OAT) are all ways you can represent 
angular displacements for the wrist.
 
The Euler set of angular displacements is represented by the angles
(a, b, g), which can be expressed as the product of the following
principal rotations:
 
C_euler = C(z,a) C(y,b) C(z,g)
 
The Roll-Pitch-Yaw (RPY) set is given by:
 
C_RPY = C(z,R) C(y,P) C(x,Y)
 
Now for the PUMA, I believe the (OAT) set of rotations are defined
from a reference orientation frame Fe'.  The rotation matrix
from this frame to the end-effector is defined by the angles
(OAT):
 
C_e'e =  C(y,O) C(x,A) C(z,T)
 
For the 560, I understand that that reference frame is located such 
that
 
C_oe' = I
 
in other words, the OAT system locates the end-effector with respect
to the base, 
 
C(y,O) C(x,A) C(z,T) = C_oe,
 
unlike the Euler and RPY.  (Someone please correct me if I'm wrong).
 
Given C_euler or C_RPY, one must first calculate the orientation of the
tool with respect to the ground.
 
C_oe = C_arm C_euler (or) = C_arm C_RPY
 
Another way to do this would be to use the n, o, a vectors:
 
C_oe = [ n  o  a ]
 
Here's a little Maple session:
 
> CyO := array( [ [cO, 0, sO],[0,1,0],[-sO,0,cO]]);
 
                                    [  cO   0  sO ]
                                    [             ]
                             CyO := [   0   1   0 ]
                                    [             ]
                                    [ - sO  0  cO ]
 
> CxA := array( [ [1,0,0],[0,cA,-sA],[0,sA,cA] ]);
 
                                    [ 1   0    0  ]
                                    [             ]
                             CxA := [ 0  cA  - sA ]
                                    [             ]
                                    [ 0  sA   cA  ]
 
> CzT := array( [ [cT, -sT,0],[sT,cT,0],[0,0,1] ]);
 
                                    [ cT  - sT  0 ]
                                    [             ]
                             CzT := [ sT   cT   0 ]
                                    [             ]
 
> C_oe := evalm(CyO &* CxA &* CzT);
 
                   [  cO cT + sO sA sT   - cO sT + sO sA cT  sO cA ]
                   [                                               ]
           C_oe := [        cA sT               cA cT         - sA ]
                   [                                               ]
                   [ - sO cT + cO sA sT   sO sT + cO sA cT   cO cA ]
 
 
The OATs can be found by thrashing C_oe around (excuse the pun), for example:
 
O =   atan2(ax,az)
A = - asin(ay)
T =   atan2(ny,oy)
 
My question: why did PUMA do it this way?
 
Hope this helps.
 
Roger Hertz

-- 
hertz@ecf.toronto.edu
University of Toronto                               Ph: (416) 667-7744
Institute for Aerospace Studies                    Fax: (416) 667-7799
