0
$\begingroup$

Rosanswers logo

Hi all,

I wonder in which frame the interactive_marker.pose field is expressed? It seems relative to interactive_marker.header.frame_id but even considering that hypothesis, I get a strange behaviour. Let me explain...

I'm writing an application were several parts of furniture (leg, back of a chair...) are represented in RViz has interactive markers.

Each part is relative either to the world or to another part and all of them publish their transform with a TransformBroadcaster. view_frames gives: view_frames result http://cjoint.com/14ma/DClneaiqh6K_view_frames.png

It seems that InteractiveMarker.pose designates the coordinates of the IM with respect to the frame InteractiveMarker.header.frame_id so when I set a new frame_id for an existing object I recompute the InteractiveMarker.pose with respect to the new frame_id, so that the pose doesn't move in the world frame. This works well, the new coordinates are computed with respect to the new frame thanks to a tfListener and there are correct.

When I move the parent frame with RViz, the child frame also moves because the pose of the child doesn't change with respect to the parent and this is exactly want I want.

Except that, when I click on the child object it's suddenly teleported elsewhere. I have disabled all callbacks for the Interactive Marker, so the server does that on its own But I don't know why. The transformation applied to the object is not random, it is exactly the transformation from its parent to the world.

Here is as exemple, I start with the interactive marker "leg1" at x=0 y=0 z=5 with respect to /world. I set it relative to /sitting which is at 0 0 -1 with respect to /world. The coordinates of "leg1" with respect to the world are computed by a tfListener and are 0 0 6, so I give these coordinates to leg1.pose.position = (0, 0, 6). Then when I click on "leg1" without moving it, it's teleported to 0 0 5 relative to /sitting, and if I click again 0 0 4, 0 0 3, and so on.

[ INFO] [1394553885.833971573]: leg1 is at 0 0 5 relative to /world
[ INFO] [1394553885.834646868]: [callback] leg1 set relative to sitting which is at 0 0 -1 relative to /world
[ INFO] [1394553885.848262357]: leg1 0 0 6 relative to /sitting
[ INFO] [1394553885.845737564]: [callback] leg1 is clicked (but not moved and no code is executed)
[ INFO] [1394553886.719846935]: leg1 0.10338 0.06199 6.96599 relative to /sitting (so almost 0 0 7)

It sounds like I forgot to set a "frame_id" somewhere to avoid the server to apply this automatic pose transformation. But I don't know where because if I server->get("leg1") the frame_id is actually set to "sitting".

I have been tearing my hear out on this issue for one week, but it's still unsolved and I don't know what to do with that :( I hope my explanations are understandable.

All clues are welcome, many thanks by advance for your help.


Originally posted by courrier on ROS Answers with karma: 454 on 2014-03-11

Post score: 0

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

Concerning this teleportation bug, I figured out that the it came from the control InteractiveMarkerControl::MOVE_ROTATE_3D. I don't know if it's faulty or if I don't use it properly but I could reproduce the bug easily by changing 1 line of code in the tutorial "basic control": http://www.diffchecker.com/x733vxw2

Replacing this control by another one solved my issue.


Originally posted by courrier with karma: 454 on 2014-04-22

This answer was ACCEPTED on the original site

Post score: 0


Original comments

Comment by William on 2015-10-21:
This diff doesn't exist anymore, can you please fix the link?

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.