ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Header frame_id

asked 2012-05-23 07:48:36 -0500

ZeroCool gravatar image

I am learning ros and I have a question regarding frame_id in the Header (like in PoseStamped). If I understand correctly frame_id means to which tf the position is relative to. So does that mean if I have a point which I get from kinect and I want to send the robot the goal with frame_id /camera_rgb_optical_frame and it will automaticly transform the point into the correct space? Or have I misunderstood?

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted

answered 2012-05-23 08:37:34 -0500

DimitriProsser gravatar image

updated 2012-05-25 03:34:56 -0500

The frame_id in a message specifies the point of reference for data contained in that message.

For example, if I want to specify a goal that is 10 meters directly in front of my robot, I would first declare the "origin" of the robot, which I will name the /base_link frame. The origin of this /base_link frame (0,0,0) is located at the center of mass of my robot. I would send a goal of (10,0,0) in the /base_link frame.

In your scenario in which you have a sensor, the tf tree becomes slightly more complex. Let's say that I have a Kinect that's mounted at the very front of my robot, directly in front of the center of mass. I now declare an "origin" for that sensor and name it the /kinect frame. Since the sensor is mounted 0.25 meters in front of the center of mass, the transform (tf) from /base_link to /kinect is (0.25,0,0), or the transform from /kinect to /base_link is (-0.25,0,0) (because /base_link is 0.25 BEHIND the sensor).

Now is when tf becomes useful. Your sensor data arrives in the frame_id of the sensor collecting it (i.e. your kinect points arrive in the /kinect frame in my example). If the Kinect receives a point of 10.0 meters directly ahead, and you want to navigate to that point, your goal is (10,0,0) in the /kinect frame. However, remember that since your sensor is 0.25 meters IN FRONT of the robot's center, this goal is actually (10.25,0,0) in the /base_link frame. The beauty of tf is that it can transform points from the /kinect frame to the /base_link frame for you.

The only catch is that you must tell tf to perform this transform (you can learn to do this in the tf tutorials). If you're trying to specify a goal for move_base or some other ROS navigation software, chances are that this transform is done for you already (move_base definitely does this for you). This has to be determined on a case-by-case basis, since sometimes it is done for you, but sometimes it is not.

TL;DR: If you're trying to send a goal to move_base using the navigation stack, you don't need to change the frame of the point. If you collect the data in the /camera_rgb_optical_frame, then you can send a goal in the camera_rgb_optical_frame and the navigation stack will take care of the transform for you.

edit flag offensive delete link more


So if I understand correctly if I am using move_base in your example i would just pass frame_id=/kinect to setGoal? Thank you very much for you thorough answer. You've cleared a lot!

ZeroCool gravatar image ZeroCool  ( 2012-05-23 09:05:56 -0500 )edit

In my example, yes, you could specify it in the /kinect frame

DimitriProsser gravatar image DimitriProsser  ( 2012-05-23 10:03:58 -0500 )edit

@DimitriProsser your explaination is very comprehensive, however, it contains a bug. The goal is at (10.25,0,0) in the /base_link frame: /base_link (+0.25,0,0) /kinect (+10,0,0) goal. If you want to transform _data_ from one frame to another frame, you have to take the inverse of their tf.

Stephan gravatar image Stephan  ( 2012-05-24 23:49:19 -0500 )edit

Thank you @Stephan. Good catch

DimitriProsser gravatar image DimitriProsser  ( 2012-05-25 03:35:49 -0500 )edit

Question, if the frame_id is the frame reference of all points in the message, what is the bearing of the info.origin.position.x, y, z and info.origin.orientation.x, y, z, w?? I assume that the origin is with respect to the frame_id.. Are they points projected to its parent frame??

Xegara gravatar image Xegara  ( 2014-05-23 01:35:36 -0500 )edit

Question Tools



Asked: 2012-05-23 07:48:36 -0500

Seen: 20,252 times

Last updated: May 25 '12