Python类变量在其回调函数之外延迟

时间:2018-09-17 16:49:40

标签: python python-multithreading rospy

我写了一个python脚本,该脚本订阅了ROS主题,然后进入一个回调函数,然后该回调函数调用test函数,该函数通过提取主题中必要的数据点以升序返回半径列表。这可以正常工作,但是我想在整个课程中(以及在课程之外)访问此半径列表。

我已将其设置为类变量“ self.radii”,但控制台抛出一个错误,指出该实例没有属性“ radii”,除非我告诉我使用rospy.sleep(2)使其休眠2秒钟,然后返回一个值。如果我尝试在main函数中调用self.radii,情况也是如此。

我感觉这是一个Python线程问题,而不是ROS问题,因为实际的订户正在正确工作,似乎有很长的延迟,我不知道该如何解决。

如果我改为在回调函数中使用print(self.radii),则它可以正常工作,并立即显示值,但是我想在此之外访问此变量。

代码在下面。谢谢!

#!/usr/bin/env python
import rospy
import numpy as np
from laser_line_extraction.msg import LineSegmentList

class z_laser_filter():
    def __init__(self):
        self.sub_ = rospy.Subscriber("/line_segments",
                                     LineSegmentList,
                                     self.callback)
        rospy.sleep(2)
        print(self.radii)

    def callback(self, line_segments):
        self.radii = self.test(line_segments)
        print(self.radii)

    def test(self, line_segments):  
        number_of_lines = ((len(line_segments.line_segments)) - 1)
        i = 0
        radii = list()
        while (i!=number_of_lines):
            radii.append(line_segments.line_segments[i].radius)
            radii = sorted(radii, key=float)
            i = i + 1
        return radii

if __name__ == '__main__':
    rospy.init_node('line_extraction_filter', anonymous=True)
    node = z_laser_filter()
    rospy.spin()

1 个答案:

答案 0 :(得分:0)

您的问题是ROS订户的工作方式。仅当您预订的主题self.radii收到第一个消息后,才会创建类变量/line_segments。之后,您可以从该类中的任何其他函数调用self.radii。当您的节点启动时,init函数是运行的第一件事,因此它创建了订阅服务器,然后继续执行print()语句。在此期间,该主题尚未发布消息。当您添加sleep()时,它使订阅者有时间接收其第一条消息。

您可以做的是将self.radii初始化为init函数中的某项,就像您对radii所做的那样:

 def __init__(self):

    self.sub_ = rospy.Subscriber("/line_segments", LineSegmentList, self.callback)
    self.radii = list()
    print(self.radii)

然后,当您收到消息时,它将使用正确的信息填充。

要查看接收有关主题/line_segments的第一条消息需要多长时间,您可以在终端中使用以下命令来查看其发布速度:

rostopic hz /line_segments