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

标签 python publish-subscribe rospy

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

我们将不胜感激。

谢谢,

光盘

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

相关文章:

python - Python多处理图像压缩-100%时只有一个CPU

python-2.7 - 关于ROS包的必要性

Python 未完成 for 循环

python - TensorFlow/TFLearn : ValueError: Cannot feed value of shape (64, ) 用于张量 u'target/Y : 0', which has shape ' (? , 10)'

model-view-controller - 观察者、发布/订阅和数据绑定(bind)之间的区别

nservicebus - 我应该针对这种情况发布或发送消息吗?

python - 在 AutoCAD 中使用 Item Method 查找 block

python 打印循环中的第一行

python - 如何在 ROS 中发布/订阅 python “list of list” 作为主题