ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | Q&A answers.ros.org

# Transform Quaternion

Hi!

Is there a package witch transforms the quaternion coordinates automatically in an other system? (Axis-Angle, Kardan, Euler)

Thanks.

edit retag close merge delete

Sort by » oldest newest most voted

The tf::Quaternion class is (currently) built on top of the Bullet quaternion class - here's an overview.

You have all the methods available in btQuaternion. You can also create a btMatrix3x3 from the btQuaternion and use any of the class methods.

After a quick scan, I'm seeing

• getAngle()
• getAxis()
• getEulerYPR(..)
• getEulerZYX(..)

EDIT: as per narcispr's comment:

Let's say q is your quaternion. This is what I usually do (there might be a more elegant way, but I haven't found it)

tf::Matrix3x3 m(q);
double roll, pitch, yaw;
m.getRPY(roll, pitch, yaw);

more

I was also looking for some way to transform from quaternion to euler in C++. Can you post a code snippet please?

( 2013-02-07 04:45:33 -0500 )edit

Just to complete the previous response:

#include <tf/transform_datatypes.h>
// ...
tf::Quaternion q(quat.x, quat.y, quat.z, quat.w);
tf::Matrix3x3 m(q);
double roll, pitch, yaw;
m.getRPY(roll, pitch, yaw);
std::cout << "Roll: " << roll << ", Pitch: " << pitch << ", Yaw: " << yaw << std::endl;


Where quat contains the quaternion values to be transformed to roll, pitch, yaw.

more

It seems that creating a Matrix3X3 from the quaternion is not necessary since a transform already contains the rotation matrix. If you are working with TF, inside every Quaternion there is a Matrix3x3 called m_basis. When you call Transform::getRotation(), what you get is

00120         Quaternion getRotation() const {

00121                 Quaternion q;

00122                 m_basis.getRotation(q);

00123                 return q;

00124         }


So it could be that you may get away with:

transform.getBasis().getRPY(roll, pitch, yaw);

more

4

If you have a transform object, yes. The original question asks how to do this with get rotation from a quaternion object.

( 2014-10-16 07:56:01 -0500 )edit