1 | initial version |

1) how this line (internally) works? or what is the mathematical concept behind this?

You can see the source code for `tf::Pose`

here. You should check out the `inverse()`

and `operator*(tf::Pose)`

methods. I've illustrated the concept here:

Say you have two poses, `pose1`

(red) and `pose2`

(blue). `pose1`

and `pose2`

are drawn as vectors from the origin. You want to find the pose `diff`

(green), which is the difference from `pose2`

to `pose1`

. To do this, you have to "subtract" `pose2`

from `pose1`

. The mathematical concept here is called homogeneous transformation, part of linear algebra. Each pose can be represented as a 4x4 transformation matrix that contains both translation and rotation (these can also be represented as a vector + a quaternion, but the matrix lets you put both in one object). To compose (or "add") the poses, you multiply the matrices, which is what the `*`

operator does when you "multiply" one pose by another. In this case, because we want to "subtract" `pose2`

from `pose1`

, we use the inverse, which is a matrix inverse. Also, note that the order of the multiplication matters with matrices--matrix multiplication is not commutative like scalar multiplication is.

2) does this line also calculate the difference between the two quaternions of the poses?

Yes. I wasn't able to draw the orientations into the sketch above, but composition of poses includes rotation as well.

3) Another question is what is the difference between

`tf::Pose`

and`tf::Transform`

Just semantics. On line 50 of geometry/transform_datatypes.h, you'll see they're actually the same type! `tf::Pose`

is just a typedef of `tf::Transform`

. A `tf::Pose`

represents a position+orientation of an object, and it's meant to be a direct analog to the `geometry_msgs::Pose`

message, whereas a `tf::Transform`

is an object that can perform a translation+rotation transform. Mathematically (and in code) they're identical.

2 | No.2 Revision |

1) how this line (internally) works? or what is the mathematical concept behind this?

You can see the source code for `tf::Pose`

~~here. ~~~~You should check out the ~~Unfortunately, it's not the most readable code. As for the math, I've illustrated the concept here:`inverse()`

and `operator*(tf::Pose)`

methods.

Say you have two poses, `pose1`

(red) and `pose2`

(blue). `pose1`

and `pose2`

are drawn as vectors from the origin. You want to find the pose `diff`

(green), which is the difference from `pose2`

to `pose1`

. To do this, you have to "subtract" `pose2`

from `pose1`

. The mathematical concept here is called homogeneous transformation, part of linear algebra. Each pose can be represented as a 4x4 transformation matrix that contains both translation and rotation (these can also be represented as a vector + a quaternion, but the matrix lets you put both in one object). To compose (or "add") the poses, you multiply the matrices, which is what the `*`

operator does when you "multiply" one pose by another. In this case, because we want to "subtract" `pose2`

from `pose1`

, we use the inverse, which is a matrix inverse. Also, note that the order of the multiplication matters with matrices--matrix multiplication is not commutative like scalar multiplication is.

2) does this line also calculate the difference between the two quaternions of the poses?

Yes. I wasn't able to draw the orientations into the sketch above, but composition of poses includes rotation as well.

3) Another question is what is the difference between

`tf::Pose`

and`tf::Transform`

Just semantics. On line 50 of geometry/transform_datatypes.h, you'll see they're actually the same type! `tf::Pose`

is just a typedef of `tf::Transform`

. A `tf::Pose`

represents a position+orientation of an object, and it's meant to be a direct analog to the `geometry_msgs::Pose`

message, whereas a `tf::Transform`

is an object that can perform a translation+rotation transform. Mathematically (and in code) they're identical.

ROS Answers is licensed under Creative Commons Attribution 3.0 Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.