What is the default sequence of hierarchical rotation matrix, e.g. xyz ?


  • I wonder that what a sequence of rotation matrix provided by microsoft kinect sdk version 1.6. given from code below

    Matrix rotMat = skeleton.BoneOrientation[JointType.KneeRight].HierarchicalRotation.Matrix;

    I want to know its sequence for example rotMat = Rz*Ry*Rx in order to compute the euler angle. 

    I have been finding the document telling about this but I still haven't got it. 

    The solution I think if anyone doesn't know is using quaternion and convert it to euler. Does anyone know? 

    Thank you so much.

    Wednesday, January 30, 2013 9:44 AM

All replies

  • I have been struggling with the same issue and hope that we can find an answer soon!
    Thursday, January 31, 2013 7:53 PM
  • No one knows. T__________T

    Monday, February 04, 2013 6:08 AM
  • Check out...

    As I understand it, there is no default sequence of Euler rotations.  If you want to decompose the matrix into Euler angles, the order would depend on the sequence you require for whatever purpose you intend.

    Many papers will give the rotations as Rzyx (as you state): a rotation about x, followed by a rotation about y, followed by a rotation about z.  The links above both have formulas to compute Euler angles in that sequence.

    I have been working on a system that wants angles in HPR (heading, pitch, roll).  In the Kinect sensor coordinate system, that is most analagous to Z (roll), followed by X (pitch), followed by Y (heading): so, the rotation matrix would be Ryxz.

     (cos y)(cos z) + ((sin y)(sin x))(sin z),  (cos y)(-sin z) + ((sin y)(sin x))(cos z), (sin y)(cos x)
                               (cos x)(sin z),                             (cos x)(cos z),         -sin x
    (-sin y)(cos z) + ((cos y)(sin x))(sin z), (-sin y)(-sin z) + ((cos y)(sin x))(cos z), (cos y)(cos x)

    Angles can then be computed as...

    doublerx = asin( -rotationMatrix.M23 );

    doublery = atan2( rotationMatrix.M13 / cos( rx ), rotationMatrix.M33 / cos( rx ) );

    doublerz = atan2( rotationMatrix.M21 / cos( rx ), rotationMatrix.M22 / cos( rx ) );

    Double check for errors.  Hope that helps.

    • Proposed as answer by PSU Mike Saturday, February 23, 2013 10:53 PM
    • Unproposed as answer by PSU Mike Saturday, February 23, 2013 10:54 PM
    • Edited by PSU Mike Friday, March 15, 2013 1:55 PM
    Friday, February 22, 2013 9:00 PM