如何使用tf_remap?

时间:2015-08-27 16:23:40

标签: ros remap

我有rosbag,其中记录了/tf主题。

我需要重新映射该包中引用名为tf的帧的所有/world帧,以引用名为/vision的新帧。我尝试了以下但不幸的是它没有工作:

rosrun tf tf_remap _mappings:='[{old: /world, new: /vision}]'

我错过了什么吗?

我还尝试从启动文件

执行此操作
<launch>
  <node pkg="tf" type="tf_remap" name="tf_remapper" output="screen">
    <rosparam param="mappings">
      - {old: "/world",
         new: "/vision"}
    </rosparam>
  </node>
</launch>

同样的结果......

我发现有人说,除了运行tf_remap节点外,rosbag应按以下方式运行:

rosbag play x.bag /tf:=/tf_old

也做到了......仍然无法正常工作。

tf_frame仍指代/world而不是/vision

任何帮助都将受到高度赞赏!

修改

这是为了澄清我想要实现的目标:

我想要的是重新映射包中记录的所有帧并引用/world,然后将它们引用到/vision。包的重映射输出中不应有/world帧。在代码的其他地方,我将定义名为/world的框架及其与/vision的关系。

1 个答案:

答案 0 :(得分:0)

您可以使用rosbag python / c ++ API编辑bag文件的内容。这是一个python的例子,它只是用你的包的记录/ tf消息中的/ vision替换/ world的任何实例。

import rosbag
from copy import deepcopy
import tf

bagInName = '___.bag'
bagIn = rosbag.Bag(bagInName)
bagOutName = '___fixed.bag'
bagOut = rosbag.Bag(bagOutName,'w')
with bagOut as outbag:
    for topic, msg, t in bagIn.read_messages():
        if topic == '/tf':
            new_msg = deepcopy(msg)
            for i,m in enumerate(msg.transforms): # go through each frame->frame tf within the msg.transforms
                if m.header.frame_id == "/world":
                    m.header.frame_id = "/vision"
                    new_msg.transforms[i] = m
                if m.child_frame_id == "/world":
                    m.child_frame_id = "/vision"
                    new_msg.transforms[i] = m

            outbag.write(topic, new_msg, t)
        else:
            outbag.write(topic, msg, t)

bagIn.close()
bagOut.close()