无法在rospy中发布订阅的主题

时间:2016-04-30 00:46:02

标签: python publish-subscribe rospy

我正在使用ROS和python,我编写了这段代码。这段代码应该订阅一个名为“map”的ROS主题(来自hector_slam,使用LIDAR)并将其保存到一个名为“mapdata”的变量中,稍后将使用该变量。我只想通过将其作为另一个名为'mapprob'的ROS主题发布来确保正确导入它。代码编译并运行正常,但“mapprob”中没有任何内容发布。我确保“map”发布'OccupancyGrid'消息,我们想要提取OccupancyGrid.data以用作'mapdata'。

任何帮助将不胜感激。

谢谢,

CDS

#!/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

3 个答案:

答案 0 :(得分:1)

问题是您将mapdata声明为全局变量,因此每次要发布时都会重置为默认值初始化(即mapdata = Int8MultiArray())。

您可以将节点定义为类,并将mapdata作为实例变量,请参阅此answer作为示例。

希望它有所帮助。

答案 1 :(得分:0)

rospy.spin()在节点关闭之前不会返回,无论是通过调用ros :: shutdown()还是Ctrl-C。 这意味着一旦达到spin(),您的pub.publish(mapdata)命令将永远不会被执行。

有一个 C ++解决方案,利用ros::spinonce() usually in a while(ros::ok()) loop,并在获取消息后做任何你想做的事情。不幸的是,对于python用户,the equivalent of spinonce() in python dosen't exist。所以,要么

  • 使用线程进行旋转
  • 将您的代码转换为C ++(最好的选择,因为代码并不那么重)。

答案 2 :(得分:0)

下面的代码似乎

addData function