MATLAB Answers

0

How to find the angle between two quaternions?

Asked by Silas Waxter on 17 Aug 2019
Latest activity Commented on by Silas Waxter on 19 Aug 2019
If quaternions represent an orientation in space, there is an axis between any two orientations and an angle between them. I'm looking for the procedure to find that angle.

  0 Comments

Sign in to comment.

2 Answers

Answer by James Tursa
on 17 Aug 2019
Edited by James Tursa
on 17 Aug 2019
 Accepted Answer

For example purposes I am using the coordinate frames as ECI and BODY
Q1 = quaternion from ECI->BODY1
Q2 = quaternion from ECI->BODY2
Then perform the following calculation
Q12 = conj(Q1) * Q2 % <- quaternion conjugate and quaternion multiply
Q12 = quaternion from BODY1->BODY2
There may be MATLAB functions to do the conjugate and multiply, but I don't know at the moment. The conjugate of Q1 is simply [Q(1),-Q(2:4)] of course assuming the scalar is the first element.
If we assume the scalar is the first element of the quaternion, matching the MATLAB quaternion functions convention, then you have
Q12(1) = cos(angle/2)
and
Q12(2:4) = sin(angle/2) * e
where e is the unit axis of rotation
From these you can solve for the angle
angle = 2 * atan2(norm(Q12(2:4)),Q12(1))
See also this post:
and this post:

  5 Comments

Using this method with the quaternions from this post, the returned angle is 118.252098940265 deg, whereas the mehtod used in that post returns 127.7227 deg. Is my question and the post's question the not the same?
The confusion is caused by which element is the scalar part. The scalar part can be either the 1st element or the 4th element ... both are widely used in industry and both are "correct". If your quaternions are defined with the scalar as the 1st element (matching MATLAB toolboxes), then use the method above. If your quaternions are defined with the scalar in the 4th element (not matching MATLAB toolboxes), then use the other post.

Sign in to comment.


Answer by Jim Riggs
on 17 Aug 2019
Edited by Jim Riggs
on 17 Aug 2019

I am more comfortable working with direction cosine matrices, so the way I would do this is to first convert the quaternions to DCM's;
Assume Quaternion A represents the orientation of body A in the I frame
Quaternion B represents the orientation of Body B in the I frame.
The direction cosine matrix, C, that transforms from I to A is defined as:
If the Quaternion is defined as [a, b, c, d], (where a is the scalar part and b, c, d is the vector part) then the direction cosine matrix in terms of the quaternion is
So, first compute the direction cosine matrix from quaternion A (DCMA) and from quaternion B (DCMB).
Now the direction cosine matrix for the transformation from A to B is
DCMAB = DCMB * transpose(DCMA).
Now that you have the transformation matrix from A to B, you can get the Euler angles or rotation vector from this DCM.
Matlab Answers 20190816c.JPG
Using DCMAB, this gives the rotation vector from A to B.

  0 Comments

Sign in to comment.