如何多次订阅一个ROS主题?

1 投票
1 回答
4604 浏览
提问于 2025-04-18 18:29

我有一个包含5个位置的列表,机器人需要去这些位置。对于每个位置,我希望订阅一个主题,以获取传感器数据,并在rviz中添加一个标记。以下是我的代码:

def addMarkerCallback(msg):
    draw_functions = DrawFunctions('visualisation_marker')
    if msg.data:
        draw_functions.draw_rviz_sphere(0.02)
    else:
        print 'no data'

rospy.init_node("sensor_marker", anonymous = True)

for item in scanlist:    
    moveit_cmd.go(item, wait=True)
    sub1 = rospy.Subscriber('sensor/right', SensorData, addMarkerCallback)   
    rospy.spin()
    print 'go finished' 

但是当我运行代码时,问题是循环总是停留在第一次迭代,所以机器人无法去扫描列表中的其他位置。我猜这可能是rospy.spin()的问题。有人能告诉我该怎么解决这个问题吗...非常感谢!

1 个回答

0

使用rospy.spin()意味着程序会在这个地方停下来,不会继续往下执行。它是被ROS故意放在一个循环里。

短期内,最简单的解决办法是把rospy.spin()移出你的循环,像这样:

for item in scanlist:    
    moveit_cmd.go(item, wait=True)
    sub1 = rospy.Subscriber('sensor/right', SensorData, addMarkerCallback)   

print 'go finished'
rospy.spin() 

从长远来看,想想你到底想要做什么。在大多数情况下,结合发布和订阅的方式是最好的选择。可以再看看ROS的Python教程,特别是发布者的例子。

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber(python)

撰写回答