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

Transformation of poses between camera frame and base frames

asked 2020-05-16 07:58:23 -0500

ThreeForElvenKings gravatar image

updated 2020-05-16 07:59:51 -0500

Many variations of these questions seem to have been asked quite a few times, however, I was not able to find and compute the right answer for my problem.

I am trying out a custom picking of an object using a Robotic Arm. I have a separate perception module that detects objects and estimates the pose for grasping. It, however (as expected) is in the camera frame and follows image processing convention of coordinate frames, i.e. with right: +x-axis, forward: +z-axis, down: +y-axis. From this perception module, I get two values - 3x3 Rotation matrix and 1x3 translation vector.

Example T1 :

Tra: [0.09014122 0.16243269 0.6211668 ]
 Rot: [[ 0.          0.03210089 -0.99948463]
 [ 0.          0.99948463  0.03210089]
 [ 1.         -0.          0.        ]]

(i.e. I have to grasp at that location and in that orientation)

My robot to camera transform is understandably in the right hand coordinate system. Here is an example of the same, say T2:

translation: 
  x: 0.0564581200121
  y: 0.318823912978
  z: 0.452250135698
rotation: 
  x: -0.6954818376
  y: 0.693982204231
  z: -0.13156524004
  w: 0.13184954074

Now, to get the pose of the object from the robot, is a simple transformation T2 times T1. However, T1 follows a different convention from T2.

How would I go about this ? A detailed explanation using this example will be highly appreciated! I am trying to understand from scratch, hence I would prefer to arrive at a transformation matrix on my own to apply to the above ones to get the final pose

Additional note: The robot to camera transformation is using the depth_camera_optical_frame to base_link. Should I use this or just depth_camera_frame?

I have checked out similar issues like 33091, gazebo-4226, and other ones. However, all of them seem to give solutions for 3D points, and I could not find any that is applicable for the pose transformation matrix.

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
2

answered 2020-05-20 10:46:59 -0500

fvd gravatar image

updated 2020-05-20 10:48:04 -0500

This is just a matter of unifying the representations of T1 and T2. Quaternions are the preferred orientation in ROS, and the TF C++ and Python APIs offer methods to convert between them and rotation matrices. But you shouldn't bother multiplying transformation matrices directly in ROS. TF was made to take care of this for you.

The easiest way to get the position of your object should be:

1) Create a PoseStamped object called p.

2) Set the frame_id of its header to depth_camera_optical_frame (the frame that your object is detected in)

3) Set p.pose.position to the translation vector you posted, and p.pose.orientation to the quaternion that you obtain from the rotation matrix.

4) To obtain the quaternion in C++, set the rotation of a Transform with this function and this matrix type, then get the quaternion from this function. In Python, simply use quaternion_from_matrix. Don't forget that tf and geometry_msgs quaternions are not the same.

5) Use the transformPose function of the TransformListener (Python API) to transform p to the frame base_link.

edit flag offensive delete link more

Comments

Oh the 4th point is where I guess I was going wrong. Thanks a ton!

ThreeForElvenKings gravatar image ThreeForElvenKings  ( 2020-05-21 11:50:43 -0500 )edit

Question Tools

3 followers

Stats

Asked: 2020-05-16 07:58:23 -0500

Seen: 4,008 times

Last updated: May 20 '20