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
-------------------------------------------------------------------