繁体   English   中英

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

[英]Python class variable delayed outside of its callback function

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

我已将其设置为类变量“ self.radii”,但控制台会抛出一个错误,指出该实例没有属性“ rospy.sleep(2) ”,除非我使用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()

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

你可以做的,是初始化self.radii在初始化函数的东西,就像你做radii

 def __init__(self):

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

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

要检查接收关于/line_segments主题的第一条消息所/line_segments您可以在终端中使用以下命令来查看其发布速度:

rostopic hz /line_segments

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM