首页 文章

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

提问于
浏览
3

我正在使用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 回答

  • 1

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

    您可以将节点定义为类并将 mapdata 作为实例变量,有关示例,请参阅此answer .

    希望能帮助到你 .

  • 0

    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(最佳替代方案,因为代码并不那么重) .

  • 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
    

相关问题