[英]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.