How do I obtain the relative orientation given two orientations (represented by quaternions q0
and q1
)?
-
\$\begingroup\$ not sure what you are asking here, since you are not telling how did you calculate the quaternion in the first place. but my answer here might be related gamedev.stackexchange.com/questions/67199/… and btw you are mixing euler angles with quaternions which is sth I also addressed in the answer. \$\endgroup\$– concept3dCommented Jan 1, 2014 at 23:09
-
\$\begingroup\$ which API are you using? it is supposed to be stated in the documentation of how do you interpret orientation. \$\endgroup\$– concept3dCommented Jan 1, 2014 at 23:37
-
\$\begingroup\$ from what I understand you can't extract euler angles in the traditional sense. Try converting the quaternion to a matrix and there is a way of analyzing that matrix to extract the euler angles which may not work. But TBH I feel you are asking the wrong question. why do you want to extract pitch in the first place ? \$\endgroup\$– concept3dCommented Jan 1, 2014 at 23:48
2 Answers
The relative orientation is obtained simply by division:
q = q0 / q1
Or, if division is not available:
q = q0 * inverse(q1)
Note that since the quaternions used to represent rotations are unit quaternions, the inverse of q1
is simply its conjugate q1*
, and is obtained by flipping the sign of x
, y
, z
but not w
.
-
\$\begingroup\$ if you checked the edits, he is already doing that
q = q0 * inverse(q1)
, so am not particularly sure what he is trying to do. \$\endgroup\$ Commented Jan 2, 2014 at 10:54
Quaternion is another representation of axis angle. The solution is to create a new quaternion from the original quaternion that only has the needed components.
An axis angle representation can be converted to a quaternion using the following formula
q[0] = cos(R/2);
q[1] = sin(R/2)*x;
q[2] = sin(R/2)*y;
q[3] = sin(R/2)*z;
Where R
is the angle in radians, and (x,y,z)
represents the axis, and quaternion is (R,x,y,z).
So in order to create a new quaternion with only the pitch component you just zero out the other components and normalize the quaternion:
Quaternion q; // this is your original quaternion
q.x = 0.0;
q.z = 0.0;
q.Normalize();
Edit based on your update:
Sensors AFAIK calculate orientation relative to gravity, in other words Y (or Z) is the direction of the gravity. You need take that into consideration. And I think you don't need to multiply it with the inverse initial orientation.
-
\$\begingroup\$ This works great if I know that the motion is pitch. In general, that is unknown. \$\endgroup\$– ilpCommented Jan 2, 2014 at 0:32
-
\$\begingroup\$ @ilp well, what you can do, is extract the component with the highest contribution to the rotation and use that. So instead of taking a fixed axis. Use the one with the highest contribution and zero out the others. \$\endgroup\$ Commented Jan 2, 2014 at 0:35
-
\$\begingroup\$ @ilp at this point I can't answer your question, because I don't know the neccessary details :-) maybe you should edit the question and give it a context so we are able to help. \$\endgroup\$ Commented Jan 2, 2014 at 0:43
-