The relationship between two frames is represented by a 6 DOF relative pose, a translation followed by a rotation. If /world and /sensor are two frames, the pose of /sensor in /frame is given by the translation from /world's origin to /sensor's origin, and the rotation of /sensor's coordinate axes in /world.

The translation is a vector in /world's coordinates, lets say **v_s_w**. It is represented by `tf::Vector3`

.

The rotation of /sensor is given by a rotation matrix, represented as **R_s_w**, using same convention. The way to read this is: "the rotation of the frame /sensor in /world's coordinate system." The columns of **R_s_w** are formed from the three unit vectors of /sensor's axes in /world: **r_x_s**, **r_y_s**, and **r_z_s**.

There is no tf type for a rotation matrix; instead, tf represents rotations via `tf::Quaternion`

(you could use an external library, such as KDL or Bullet, for transforming rotation matrix in quaternions and viceversa).

It's convenient to describe the translation + rotation in Homogeneous coordinates, as a single 4x4 matrix **W_s_w**. This can be read as: "the pose of frame /sensor relative to frame /world." The relative pose is constructed as follows:

```
W_s_w = | R_s_w v_s_w |
| 0 0 0 1 |
```

In tf, relative poses are represented as tf::Pose, which is equivalent to the bullet type `btTransform`

or `KDL::Frame`

. The member functions allow you to get the rotation (also the quaternion), and the translation of the pose. See respective class reference.

When you create a vector **b_s** in the /sensor frame you can obtain its components in the /world frame **b_w** by multiplying (in Homogeneous coordinates):

**b_w = W_s_w * b_s**

Obviously, you can apply the inverse transform in the opposite case (indicating with **W_w_s = W_s_w^(-1)**):

**b_s = W_w_s * b_w**

Hope this helps.

Good Luck!

Just a quick comment:

`tf::Quaternion`

is used for orientation only, not position.