1

我有一个包含 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() 的问题。谁能告诉我如何解决这个问题...非常感谢!

4

1 回答 1

0

使用 rospy.spin() 意味着 python 不会超过那个点,它会(故意)被 ROS 捕获在一个循环中。

最简单的短期解决方案是将 rospy.spin() 移出 for 循环,如下所示:

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)

于 2014-08-27T15:49:26.993 回答