Python 无法在rospy中发布订阅的主题
我正在使用ROS和python,我已经编写了这段代码。这段代码应该订阅一个名为“map”的ROS主题(来自hector_slam使用激光雷达),并将其保存到一个名为“mapdata”的变量中,稍后将使用该变量。我只是想通过将它发布为另一个名为“mapprob”的ROS主题来确保它正确导入。代码编译和运行良好,但“mapprob”中没有发布任何内容。我已确保“地图”正在发布“OccupncyGrid”消息,我们希望提取OccupncyGrid.data以用作“地图数据” 任何帮助都将不胜感激 谢谢 光盘 rospy.spin()在节点关闭之前不会返回,无论是通过调用ros::shutdown()还是通过Ctrl-C。这意味着您的Python 无法在rospy中发布订阅的主题,python,publish-subscribe,rospy,Python,Publish Subscribe,Rospy,我正在使用ROS和python,我已经编写了这段代码。这段代码应该订阅一个名为“map”的ROS主题(来自hector_slam使用激光雷达),并将其保存到一个名为“mapdata”的变量中,稍后将使用该变量。我只是想通过将它发布为另一个名为“mapprob”的ROS主题来确保它正确导入。代码编译和运行良好,但“mapprob”中没有发布任何内容。我已确保“地图”正在发布“OccupncyGrid”消息,我们希望提取OccupncyGrid.data以用作“地图数据” 任何帮助都将不胜感激 谢谢
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