Announcement

Collapse
No announcement yet.

Re: Euler Angle Calculation

Collapse
This topic is closed.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Re: Euler Angle Calculation

    Dear all,

    I post this to Biomch-L since there may be some information
    of general interest in this reply.

    Dong CHEN wrote:
    > In my experiment, the global coordinations of four markers sticking on the
    > back of the human body were sampled and stored in a computer while the
    > object was walking on a treadmill. My task is to calculate the change of
    > the Euler Angles in this procedure according to the global coordinations of
    > the four markers.
    >
    > It is a over-determined problem. Because the error of the rigid body
    > assumption on the human body and error in the data collection, this
    > over-determined problem has no solutions !

    The overdetermined data will allow you to find a least-squares
    solution. On the ISB web site, you can find several algorithms
    to do this either in Matlab or Fortran. Look under
    "Movement Analysis" in http://www.lri.ccf.org/isb/software/
    Least squares solutions are better because they are less sensitive
    to errors in a single marker. And the more markers the better.

    Input is marker coordinates in a segment-fixed coordinate system
    and coordinates of the same markers in a laboratory coordinate
    system. Output is a rotation matrix and translation vector
    relating the two coordinate systems. Then you can extract Euler
    angles from the rotation matrix. First you must define the
    sequence of rotations and symbolically derive the equations for
    all matrix elements in terms of the Euler angles you have chosen.
    This is tedious, and below I have appended a Mathematica script
    to automate this for the XYZ sequence, but the script is easily
    modified for other sequences. After doing this,
    you can derive simple expressions to compute Euler angles from
    the matrix elements. Matlab routines for this can be found in
    http://www.lri.ccf.org/isb/software/kinemat/ but before using those
    take some time to make sure that you understand which Euler system
    you are using.

    Let R be defined as the rotation matrix relating the segment
    coordinates to the laboratory coordinates of markers on a rigid
    body:

    poslab = R*posseg + translation

    Then an Euler decomposition

    R = Rx*Ry*Rz

    means that the rotation is decomposed into rotations about the
    Z-axis of the segment reference frame, the X-axis of the laboratory
    reference frame, and a third ("Y") rotation about the mutual perpendicular axis.
    This interpretation may help you choose a suitable Euler sequence.
    To extract Euler angles from matrix elements, use the ATAN2 function
    (Matlab or Fortran) as much as possible, because this gives you
    a range of -180 to +180 degrees, as opposed to -90 to +90 for
    ASIN or ACOS. This was not done in the Kinemat package, so this
    is something you can improve upon.

    For whole body orientation relative to the laboratory reference
    frame, there is an ISB standardization proposal by M.R. Yeadon:

    http://www.lri.ccf.org/isb/standards/yeadon1.html

    This defines the Euler angles "somersault", "tilt", and "twist",
    which is consistent with existing terminology used in sport.
    I suggest that you use this Euler system for describing upper
    body rotations.

    Regards,

    Ton van den Bogert
    Dept. of Biomedical Engineering
    Cleveland Clinic Foundation
    bogert@bme.ri.ccf.org

    Appendix: Mathematica script for generating symbolic rotation matrices
    from Euler angles.

    ================================================== ===========================

    SetOptions[$Output, PageWidth -> Infinity]
    (* Print[ Options[$Output] ] *)

    Rx = { { 1, 0, 0},
    { 0, Cos[a], -Sin[a]},
    { 0, Sin[a], Cos[a]}
    }

    Ry = { { Cos[b], 0, Sin[b] },
    { 0, 1, 0},
    { -Sin[b], 0, Cos[b]}
    }

    Rz = { { Cos[c], -Sin[c], 0},
    { Sin[c], Cos[c], 0},
    { 0, 0, 1}
    }

    Rxyz = Rx . Ry . Rz
    Print["\n"]
    Print[ MatrixForm[Rxyz] ]
    Print[ TeXForm[Rxyz] ]
    Print["\n"]

    -------------------------------------------------------------------
    To unsubscribe send UNSUBSCRIBE BIOMCH-L to LISTSERV@nic.surfnet.nl
    For information and archives: http://www.bme.ccf.org/isb/biomch-l
    -------------------------------------------------------------------
Working...
X