实际问题:
我有一个控制器节点,它订阅2个主题并发布到1个主题。虽然,在模拟中,一切似乎都像预期的那样工作,但在实际的HW中,性能下降。我怀疑问题在于,这两个输入主题之一落后于另一个主题的时间相当长。
问题:
为了测试控制器的鲁棒性,我想在仿真中重新创建这种行为。因此,我需要将其中一个主题延迟一定时间--理想情况下,这应该是可配置的参数。我可以编写一个具有FIFO内存缓冲区的节点,并通过监视主题的频率来调整延迟时间。在我这样做之前,是否有一个命令行工具或任何其他可以使用的快速实现方法?
附注:我用的是Ubuntu 16.04和ROS-运动。
发布于 2020-05-20 09:26:48
我不知道任何开箱即用的解决方案都能做到你在这里所描述的那样。
如果您的主题没有时间戳,并且节点只是在消息到达时接收消息,那么最简单的方法就是记录一个包,并从两个不同的rosbag play
实例中播放这两个主题。就像这样:
first terminal
rosbag play mybag.bag --clock --topics /my/topic
second terminal started some amount of time later
rosbag play mybag.bag --topics /my/other_topic
不确定--clock
标志,是否需要它主要取决于您所说的模拟是什么意思。如果您想要控制时间差,而不是在两个不同的终端中按enter,您可以编写一个小bash脚本来启动它们。
另一个仍然涉及包的选项,但它会让您更多地控制消息延迟的确切时间,那就是编辑包,使信息已经与正确的延迟放在袋子中。可以相对容易地通过修改玫瑰袋食谱中的第一个示例来完成
import rosbag
with rosbag.Bag('output.bag', 'w') as outbag:
for topic, msg, t in rosbag.Bag('input.bag').read_messages():
# This also replaces tf timestamps under the assumption
# that all transforms in the message share the same timestamp
if topic == "/tf" and msg.transforms:
outbag.write(topic, msg, msg.transforms[0].header.stamp)
else:
outbag.write(topic, msg, msg.header.stamp if msg._has_header else t)
将if with替换为:
...
import rospy
...
if topic == "/my/other_topic":
outbag.write(topic, msg, t + rospy.Duration.from_sec(0.5))
else:
outbag.write(topic, msg, t)
大部分的路都会带你去的。
除此之外,如果您认为该节点在未来会很有用,或者您希望它也能处理实时数据,那么您将需要使用某种队列来实现您描述的节点。你可以从中寻找灵感的一件事是主题工具,git代表主题工具源。
https://stackoverflow.com/questions/61874875
复制相似问题