Python 全局变量在函数中不可用
Python global variables not available in function
我正在使用以下代码读取传感器数据,对其进行处理并将一些反馈发布到不同的主题,/scans_freespace。
#!/usr/bin/env python
import rospy
from rospy.core import is_shutdown
from sensor_msgs.msg import LaserScan
from sweep_bot.msg import Space
from sweep_bot.msg import SpaceArray
class FreeSpace :
def __init__(self) :
rospy.loginfo('starting')
self.scans = ()
self.regions = {}
self.publisher = self.subscriber = ''
def callbackScans(self, data) :
self.scans = data.ranges
self.regions = {
'starboard_aft' : self.scans[0:135],
'starboard_abeam_aft' : self.scans[136:271],
'starboard_abeam_bow' : self.scans[272:407],
'starboard_bow' : self.scans[408:543],
'port_aft' : self.scans[949:1084],
'port_abeam_aft' : self.scans[814:949],
'port_abeam_bow' : self.scans[679:814],
'port_bow' : self.scans[544:679],
}
def publish(self) :
self.getSomeData('port_bow')
def getSomeData(self, region) :
rospy.loginfo("Checking region: %s", region)
rospy.loginfo("Checking scans: %s", self.scans)
return self.scans[region]
if __name__ == '__main__' :
rospy.init_node('space_identifier')
rate = rospy.Rate(10)
spacer = FreeSpace()
subscriber = rospy.Subscriber("scans", LaserScan, spacer.callbackScans)
publisher = rospy.Publisher("scans_freespace", SpaceArray, queue_size=10)
while not rospy.is_shutdown() :
spacer.publish()
rate.sleep()
如代码所示,我从我的 publish() 函数调用 getSomeData() 函数,传递单个字符串参数。 getSomeData() 按预期接收参数 但是 从 callbackScan() 函数填充的全局变量是空的。
脚本输出如下:
[INFO] [1629830370.246796, 0.000000]: starting
[INFO] [1629830370.253719, 0.000000]: Checking region: port_bow
[INFO] [1629830370.256151, 0.000000]: Checking scans: ()
Traceback (most recent call last):
File "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 49, in <module>
spacer.publish()
File "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 31, in publish
self.getSomeData('port_bow')
File "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 37, in getSomeData
return self.scans[region]
TypeError: tuple indices must be integers, not str
具有讽刺意味的是,在我尝试更新输出之前,代码确实有效。
我错过了什么?
这里有一些错误。但是,您的错误是因为您没有正确初始化消息字段。当在接收到 LaserScan 消息之前调用 publish()
时,这又会导致问题。同样,ranges
是一个 std_msg/Float32[]
,因此即使在回调中正确分配了它,您在尝试使用字符串索引浮点列表时也会遇到另一个错误。有点不清楚你想做什么,但查看键名 getSomeData()
应该看起来更像这样:
def getSomeData(self, region) :
rospy.loginfo("Checking region: %s", region)
rospy.loginfo("Checking scans: %s", self.scans)
return self.regions[region] if region in self.regions else None
另一点是,如果您希望通过 publish()
函数发布此函数的结果,您需要在 class 中使用正确的类型实际定义发布者.
我正在使用以下代码读取传感器数据,对其进行处理并将一些反馈发布到不同的主题,/scans_freespace。
#!/usr/bin/env python
import rospy
from rospy.core import is_shutdown
from sensor_msgs.msg import LaserScan
from sweep_bot.msg import Space
from sweep_bot.msg import SpaceArray
class FreeSpace :
def __init__(self) :
rospy.loginfo('starting')
self.scans = ()
self.regions = {}
self.publisher = self.subscriber = ''
def callbackScans(self, data) :
self.scans = data.ranges
self.regions = {
'starboard_aft' : self.scans[0:135],
'starboard_abeam_aft' : self.scans[136:271],
'starboard_abeam_bow' : self.scans[272:407],
'starboard_bow' : self.scans[408:543],
'port_aft' : self.scans[949:1084],
'port_abeam_aft' : self.scans[814:949],
'port_abeam_bow' : self.scans[679:814],
'port_bow' : self.scans[544:679],
}
def publish(self) :
self.getSomeData('port_bow')
def getSomeData(self, region) :
rospy.loginfo("Checking region: %s", region)
rospy.loginfo("Checking scans: %s", self.scans)
return self.scans[region]
if __name__ == '__main__' :
rospy.init_node('space_identifier')
rate = rospy.Rate(10)
spacer = FreeSpace()
subscriber = rospy.Subscriber("scans", LaserScan, spacer.callbackScans)
publisher = rospy.Publisher("scans_freespace", SpaceArray, queue_size=10)
while not rospy.is_shutdown() :
spacer.publish()
rate.sleep()
如代码所示,我从我的 publish() 函数调用 getSomeData() 函数,传递单个字符串参数。 getSomeData() 按预期接收参数 但是 从 callbackScan() 函数填充的全局变量是空的。
脚本输出如下:
[INFO] [1629830370.246796, 0.000000]: starting
[INFO] [1629830370.253719, 0.000000]: Checking region: port_bow
[INFO] [1629830370.256151, 0.000000]: Checking scans: ()
Traceback (most recent call last):
File "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 49, in <module>
spacer.publish()
File "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 31, in publish
self.getSomeData('port_bow')
File "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 37, in getSomeData
return self.scans[region]
TypeError: tuple indices must be integers, not str
具有讽刺意味的是,在我尝试更新输出之前,代码确实有效。
我错过了什么?
这里有一些错误。但是,您的错误是因为您没有正确初始化消息字段。当在接收到 LaserScan 消息之前调用 publish()
时,这又会导致问题。同样,ranges
是一个 std_msg/Float32[]
,因此即使在回调中正确分配了它,您在尝试使用字符串索引浮点列表时也会遇到另一个错误。有点不清楚你想做什么,但查看键名 getSomeData()
应该看起来更像这样:
def getSomeData(self, region) :
rospy.loginfo("Checking region: %s", region)
rospy.loginfo("Checking scans: %s", self.scans)
return self.regions[region] if region in self.regions else None
另一点是,如果您希望通过 publish()
函数发布此函数的结果,您需要在 class 中使用正确的类型实际定义发布者.