首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在rospy中发布订阅的主题

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

Stack Overflow用户
提问于 2016-04-30 08:46:02
回答 3查看 2.4K关注 0票数 3

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

任何帮助都将不胜感激。

谢谢,

光盘

代码语言:javascript
复制
#!/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
EN

回答 3

Stack Overflow用户

发布于 2016-11-21 21:26:45

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

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

希望能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-05-02 06:17:58

在关闭节点之前,rospy.spin()不会返回,可以通过调用ros:: shutdown ()或Ctrl-C组合键。这意味着,一旦达到()为,就永远不会执行 pub.publish(mapdata) 命令。

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

  • 使用线程将您的代码转换为C++ (最好的选择,因为代码不是那么繁重)。
票数 0
EN

Stack Overflow用户

发布于 2016-06-21 14:52:41

下面的代码似乎

代码语言:javascript
复制
#!/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.data = OccupancyGrid.data
    pub = rospy.Publisher('mapprob', Int8MultiArray, queue_size=10)
    pub.publish(mapdata)



def somethingCool():
    global mapdata
    mapdata = Int8MultiArray()
    rospy.init_node('test_name', anonymous=False)
    rospy.Subscriber("map", OccupancyGrid, callback)
    rospy.loginfo(mapdata)
    rospy.spin()


if __name__ == '__main__':
    try:
        somethingCool()
     except rospy.ROSInterruptException:
        pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36949518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档