我写了一个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()
答案 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