我正在使用ROS和python,我已经编写了这段代码 . 这段代码应该订阅一个名为“map”的ROS主题(来自hector_slam,使用LIDAR)并将其保存到一个名为“mapdata”的变量中,稍后将使用该变量 . 我只想通过将其作为另一个名为'mapprob'的ROS主题发布来确保正确导入它 . 代码编译并运行正常,但“mapprob”中没有任何内容发布 . 我确保“map”发布'OccupancyGrid'消息,我们想要提取OccupancyGrid.data以用作'mapdata' .
任何帮助将不胜感激 .
谢谢,
CDS
#!/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
3 回答
问题是您将
mapdata
声明为全局变量,因此每次要发布时都会重置为默认值初始化(即mapdata = Int8MultiArray()
) .您可以将节点定义为类并将
mapdata
作为实例变量,有关示例,请参阅此answer .希望能帮助到你 .
rospy.spin()在节点关闭之前不会返回,无论是通过调用ros :: shutdown()还是Ctrl-C . this means that your pub.publish(mapdata) command will never be executed once you spin() is reached .
有一个 C++ solution ,利用
ros::spinonce() usually in a while(ros::ok()) loop
,并在获取消息后做任何你想做的事情 . 不幸的是对于python用户,the equivalent of spinonce() in python dosen't exist
. 所以,要么使用线程进行旋转
将您的代码转换为C(最佳替代方案,因为代码并不那么重) .
似乎下面的代码