Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Ros订户即使使用设置的buff_大小也会处理旧消息_Python_Publish Subscribe_Ros_Subscriber - Fatal编程技术网

Python Ros订户即使使用设置的buff_大小也会处理旧消息

Python Ros订户即使使用设置的buff_大小也会处理旧消息,python,publish-subscribe,ros,subscriber,Python,Publish Subscribe,Ros,Subscriber,我正在使用ROS、ubuntu16.04和Python3 我有一个以7.5赫兹的频率发布自定义消息的发布者。它包含2个点云和一个图像。一条消息的大小约为2.8 MB,平均带宽为21.64 MB/s 我有一个订阅该主题的订阅者,但它有一个明显的延迟,即使queue\u size=1。当我在网上搜索这个问题时,我找到了多个指南,上面说,原因是缓冲区的大小。默认缓冲区大小对于消息来说显然太小。但当我调整缓冲区大小时,仍然会得到相同的延迟 下面是一段代码片段: def listener(): r

我正在使用ROS、ubuntu16.04和Python3

我有一个以7.5赫兹的频率发布自定义消息的发布者。它包含2个点云和一个图像。一条消息的大小约为2.8 MB,平均带宽为21.64 MB/s

我有一个订阅该主题的订阅者,但它有一个明显的延迟,即使
queue\u size=1
。当我在网上搜索这个问题时,我找到了多个指南,上面说,原因是缓冲区的大小。默认缓冲区大小对于消息来说显然太小。但当我调整缓冲区大小时,仍然会得到相同的延迟

下面是一段代码片段:

def listener():
    rospy.init_node('node', anonymous=True)
    rospy.Subscriber("imgAndPoints", customMsg, cb, queue_size=1, buff_size = 2**28)
    #buff_size is 268MB
    rospy.spin()
cb(msg):
    msg_time = msg.header.stamp.to_sec()
    current_time = rospy.Time.now().to_sec()
    print("Delay is ", current_time - msg_time)
    time.sleep(2) #instead of performance intensive cb
    return

延迟从第一次回调时的0.008s(超过1.7秒和3.5秒)增长到3.9秒,然后一直保持不变。看起来buff\u size=2**28实际上什么都没做。当我在没有
buff\u size
参数的情况下运行订阅服务器时,我会得到相同的延迟

我建议将发布服务器的缓冲区大小更改为1

由于所有消息都是按FIFO顺序传递的,因此如果要确保新发布的值始终阻止发送任何旧的尚未发送的值,则将队列大小设置为1是一种有效的方法。例如,这对于只关心最新测量的传感器来说是很好的。e、 g.如果存在较新的测量值,切勿发送较旧的测量值


您有没有找到解决该问题的方法?我现在面临着同样的问题。不,不幸的是不是。我当时做的不是将大消息发送到新节点,而是让创建消息的节点处理数据。