我正在使用ROS和python,并且我已经编写了这段代码。这段代码应该订阅一个名为"map“的ROS主题(来自使用激光雷达的hector_slam ),并将其保存到一个名为”mapdata“的变量中,稍后将使用该变量。我只是想通过将它发布为另一个名为'mapprob‘的ROS主题来确保它被正确导入。代码可以很好地编译和运行,但是在'mapprob‘中没有发布任何内容。我已经确保"map“正在发布”OccupancyGrid“消息,并且我们希望提取OccupancyGrid.data以用作”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 = 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发布于 2016-11-21 21:26:45
问题是您将mapdata声明为一个全局变量,因此每次您要发布它时,它都会被重置为其缺省值初始化(即mapdata = Int8MultiArray())。
您可以将您的节点定义为一个类,并将mapdata作为一个实例变量,有关示例,请参阅此answer。
希望能有所帮助。
发布于 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。所以,要么
发布于 2016-06-21 14:52:41
下面的代码似乎
#!/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:
passhttps://stackoverflow.com/questions/36949518
复制相似问题