我正在使用以下代碼來讀取傳感器資料,對其進行處理并將一些反饋發布到另一個主題/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.region={}。
self.publisher = self.subscriber = '
def callbackScans(self, data) :
self.scans = data. ranges
self.region = {
'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"/span>, self.scans)
return self.scans[region] 。
if __name__ == '__main__'/span> :
rospy.init_node('space_identifier')
rate = rospy.Rate(10)
spacer = FreeSpace()
subscriber = rospy.Subscriber("scans"/span>, LaserScan, spacer.callbackScans)
publisher = rospy.Publisher("scans_freespace"/span>, SpaceArray, queue_size=10)
while not rospy.is_shutdown() :
spacer.publish()
rate.sleep()
如代碼所示,我正在從我的publish()函式中呼叫getSomeData()函式,并傳遞一個單一的字串引數。getSomeData()如期收到引數但從callbackScan()函式填充的全域變數為空。
該腳本的輸出如下:
[INFO] [1629830370.246796, 0.000000]: start
[INFO] [1629830370.253719, 0.000000]: 檢查區域:port_bow
[INFO] [1629830370.256151, 0.000000]: 正在檢查掃描。()
回溯(最近一次呼叫)。
檔案"/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py",行49,in <module>
spacer.publish()
檔案 "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", 行 31, in 發布
self.getSomeData('port_bow')
檔案 "/home/sisko/catkin_ws/src/sweepbot/Sweeper/sweep_bot/src/freespace.py", line 37, in getSomeData
return self.scans[region] 。
型別錯誤。tuple索引必須是整數,不是 str。
事實上,在我試圖更新我的輸出之前,這段代碼確實有效。
我錯過了什么?
我錯過了什么?
uj5u.com熱心網友回復:
這里有幾處錯誤。然而,你的錯誤是由于你沒有正確地初始化你的訊息欄位。當publish()在收到LaserScan訊息之前被呼叫時,這又會導致問題。此外,ranges是一個std_msg/Float32[],所以即使它在回呼中被正確分配,當你試圖用一個字串來索引一個浮點串列時,也會出現另一個錯誤。你想做什么有點不清楚,但看一下鍵名getSomeData()應該是這樣的:
def getSomeData(self, region)。
rospy.loginfo("Checking region: %s", region)
rospy.loginfo("Checking scans: %s"/span>, self.scans)
return self.region[region] if region in self.region else None。
另一點要說明的是,如果你希望通過publish()函式將這個函式的結果發布出去,你需要在你的類中實際定義一個具有正確型別的發布器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309356.html
標籤:
