ROS:变换器始终为空

3 投票
3 回答
1376 浏览
提问于 2025-04-17 20:44

理论上来说,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())

这样就应该可以正常工作了。

撰写回答