我有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
的关系。
答案 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()