首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用tf_remap?

如何使用tf_remap?
EN

Stack Overflow用户
提问于 2015-08-27 16:23:39
回答 2查看 4.8K关注 0票数 5

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

我需要重新映射包中的所有tf帧,其中引用名为/world的框架,以引用名为/vision的新框架。我尝试了以下几种方法,但不幸的是,它不起作用:

代码语言:javascript
复制
rosrun tf tf_remap _mappings:='[{old: /world, new: /vision}]'

我是不是遗漏了什么?

我也尝试通过一个启动文件来完成这个任务。

代码语言:javascript
复制
    <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还应该按照以下方式运行:

代码语言:javascript
复制
rosbag play x.bag /tf:=/tf_old

也是这样的..。还是不起作用。

tf_frame仍然指的是/world而不是/vision

任何帮助都将不胜感激!

编辑

这是为了更清楚地说明我正在努力实现的目标:

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

EN

回答 2

Stack Overflow用户

发布于 2017-12-07 22:15:13

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

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2022-03-23 14:42:49

您的重映射命令似乎是正确的。但是,您离解决方案只有一步之遥:简单地描述一下,tf_remap会侦听tf主题,进行所需的更改,然后将转换发布到新的tf主题。这些主题分别默认为tf_oldand/tf`。

因此,您首先启动tf_remap节点,就像在您的问题中所做的那样。

代码语言:javascript
复制
rosrun tf tf_remap _mappings:='[{old: /world, new: /vision}]'

然后,开始播放rosbag,将/tf主题重新映射为/tf_old

代码语言:javascript
复制
rosbag play ... /tf:=/tf_old

现在,rosbag play通过/tf_old主题发布消息。tf_remap节点订阅/tf_old主题,并在/tf主题上发布更改后的转换(与替换的帧)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32254799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档