我有一个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的关系。
发布于 2017-12-07 22:15:13
您可以使用rosbag python/c++ API编辑包文件的内容。下面是python的一个示例,它只需将包中的/world的任何实例替换为/vision记录的/tf消息。
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()发布于 2022-03-23 14:42:49
您的重映射命令似乎是正确的。但是,您离解决方案只有一步之遥:简单地描述一下,tf_remap会侦听tf主题,进行所需的更改,然后将转换发布到新的tf主题。这些主题分别默认为tf_oldand/tf`。
因此,您首先启动tf_remap节点,就像在您的问题中所做的那样。
rosrun tf tf_remap _mappings:='[{old: /world, new: /vision}]'然后,开始播放rosbag,将/tf主题重新映射为/tf_old。
rosbag play ... /tf:=/tf_old现在,rosbag play通过/tf_old主题发布消息。tf_remap节点订阅/tf_old主题,并在/tf主题上发布更改后的转换(与替换的帧)。
https://stackoverflow.com/questions/32254799
复制相似问题