3

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

任何帮助将不胜感激。

谢谢,

光盘

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

3 回答 3

1

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

您可以将节点定义为一个类并将其mapdata作为实例变量,请参阅此答案以获取示例。

希望能帮助到你。

于 2016-11-21T13:26:45.247 回答
0

下面的代码似乎

#!/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
于 2016-06-21T06:52:40.523 回答
0

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

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

  • 使用线程旋转
  • 将您的代码转换为 C++(最好的选择,因为代码不是那么重)。
于 2016-05-01T22:17:57.600 回答