我正在使用ROS和python,我已经编写了这段代码。这段代码应该订阅一个名为“map”的ROS主题(来自hector_slam,使用LIDAR)并将其保存到一个名为“mapdata”的变量中,稍后将使用该变量。我只想确保它是正确的导入,通过发布它作为另一个名为‘mapprob’的ROS主题。代码编译和运行良好,但“mapprob”中未发布任何内容。我已经确定“map”正在发布“oconcygrid”消息,我们希望提取oconcygrid.data作为“mapdata”使用。
任何帮助都将不胜感激。
谢谢,
光盘

#!/usr/bin/env python

import rospy
import sys
import time
import os
from nav_msgs.msg import OccupancyGrid
from nav_msgs.msg import MapMetaData
from std_msgs.msg import String
from std_msgs.msg import Float64
from std_msgs.msg import Int8MultiArray

def callback(OccupancyGrid):
#   mapdata = Int8MultiArray()
    mapdata.data = OccupancyGrid.data

def talker():
    global mapdata
    mapdata = Int8MultiArray()
    pub = rospy.Publisher('mapprob', Int8MultiArray, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rospy.Subscriber("map", OccupancyGrid, callback)
#   mapdata.data = OccupancyGrid.data
    rospy.loginfo(mapdata)
    pub.publish(mapdata)
    rospy.spin()


if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

最佳答案

问题是您将mapdata声明为全局变量,因此每次您要发布时,它都会重置为其默认值初始化(即mapdata = Int8MultiArray())。
您可以将节点定义为一个类,并将mapdata作为一个实例变量,请参见下面的answer示例。
希望有帮助。

关于python - 无法在rospy中发布已订阅的主题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36949518/

10-17 02:47