ROS:变换器始终为空
理论上来说,tf.Transformer
应该通过 getFrameStrings()
模块从 /tf
节点返回一个帧的列表,但它返回的列表总是空的。
我使用它的代码片段如下:
while not rospy.is_shutdown():
t = tf.Transformer(True, rospy.Duration(10.0))
rospy.loginfo("list: %s", t.getFrameStrings())
每次日志都只显示列表: []
如果我回显 tf
,它显示大约有30个不同的帧。
3 个回答
0
这是来自于 http://docs.ros.org/jade/api/tf/html/python/tf_python.html 的一个例子
t = tf.Transformer(True, rospy.Duration(10.0))
t.getFrameStrings() # prints []
m = geometry_msgs.msg.TransformStamped()
m.header.frame_id = 'THISFRAME'
m.child_frame_id = 'CHILD'
m.transform.translation.x = 2.71828183
m.transform.rotation.w = 1.0
t.setTransform(m)
t.getFrameStrings() # prints ['/CHILD', '/THISFRAME']
0
Transformer对象需要一个数据来源。TransformListener对象会订阅tf这个话题,当有新数据到达时,它会调用Transformer.setTransform,这样就可以查询到这些数据了。
这里有一个教程:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28Python%29
我还建议你去http://answers.ros.org搜索一下类似的问题。
2
我发现,在Python中,应该使用tf.TransformListener类来访问tf话题中的坐标框架。这个类是tf.TransformerROS的一个子类,它会订阅"/tf"这个消息话题,而tf.TransformerROS又是tf.Transformer的扩展(查看文档)。
另外,我建议在循环之前先初始化TransformListener,这样它就有时间去收集坐标转换信息。所以你的代码可以像这样写:
t = tf.TransformListener(True, rospy.Duration(10.0))
while not rospy.is_shutdown():
rospy.loginfo("list: %s", t.getFrameStrings())
这样就应该可以正常工作了。