From e348f8c8eba9ad76ef29993deb32514c2d80751d Mon Sep 17 00:00:00 2001 From: Thomas Moulard <thomas.moulard@gmail.com> Date: Sat, 11 Feb 2012 17:35:43 +0100 Subject: [PATCH] Add tf_publisher. --- scripts/tf_publisher | 65 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 scripts/tf_publisher diff --git a/scripts/tf_publisher b/scripts/tf_publisher new file mode 100755 index 0000000..bd2d6ee --- /dev/null +++ b/scripts/tf_publisher @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# This script looks for a particular tf transformation +# and publish it as a TransformStamped topic. +# This may be useful to insert tf frames into dynamic-graph +# through dynamic_graph_bridge. +# + +import roslib +roslib.load_manifest('dynamic_graph_bridge') +import rospy + +import tf +import geometry_msgs.msg + + +def main(): + rospy.init_node('tf_publisher', anonymous=True) + + frame = rospy.get_param('~frame', '') + childFrame = rospy.get_param('~child_frame', '') + topic = rospy.get_param('~topic', '') + rateSeconds = rospy.get_param('~rate', 5) + + if not frame or not childFrame or not topic: + logpy.error("frame, childFrame and topic are required parameters") + return + + rate = rospy.Rate(rateSeconds) + tl = tf.TransformListener() + pub = rospy.Publisher(topic, geometry_msgs.msg.TransformStamped) + + transform = geometry_msgs.msg.TransformStamped() + transform.header.frame_id = frame + transform.child_frame_id = childFrame + + ok = False + while not rospy.is_shutdown() and not ok: + try: + tl.waitForTransform(childFrame, frame, + rospy.Time(), rospy.Duration(0.1)) + ok = True + except tf.Exception, e: + rospy.logwarn("waiting for tf transform") + ok = False + + while not rospy.is_shutdown(): + time = tl.getLatestCommonTime(frame, childFrame) + (p, q) = tl.lookupTransform(childFrame, frame, time) + transform.header.seq += 1 + transform.header.stamp = time + + transform.transform.translation.x = p[0] + transform.transform.translation.y = p[1] + transform.transform.translation.z = p[2] + + transform.transform.rotation.x = q[0] + transform.transform.rotation.y = q[1] + transform.transform.rotation.z = q[2] + transform.transform.rotation.w = q[3] + + pub.publish(transform) + rate.sleep() + +main() -- GitLab