Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法在rospy中发布订阅的主题_Python_Publish Subscribe_Rospy - Fatal编程技术网

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

Python 无法在rospy中发布订阅的主题,python,publish-subscribe,rospy,Python,Publish Subscribe,Rospy,我正在使用ROS和python,我已经编写了这段代码。这段代码应该订阅一个名为“map”的ROS主题(来自hector_slam使用激光雷达),并将其保存到一个名为“mapdata”的变量中,稍后将使用该变量。我只是想通过将它发布为另一个名为“mapprob”的ROS主题来确保它正确导入。代码编译和运行良好,但“mapprob”中没有发布任何内容。我已确保“地图”正在发布“OccupncyGrid”消息,我们希望提取OccupncyGrid.data以用作“地图数据” 任何帮助都将不胜感激 谢谢

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

任何帮助都将不胜感激

谢谢

光盘

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

有一个C++解决方案,通常在一段时间内使用
ros::spinonce()(ros::ok())循环
,并在获取消息后执行任何操作。不幸的是,对于python用户来说,
python中不存在与spinonce()等效的
。所以,也

  • 用线纺纱
  • 将代码转换为C++(最好的替代方案,因为代码不是那么重)。
      下面的代码似乎

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

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

      您可以将节点定义为类,并将
      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.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