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