【问题标题】:How to subsribe to a ROS topic for several seperate times?如何多次订阅 ROS 主题?
【发布时间】:2014-08-25 21:28:45
【问题描述】:

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

【问题讨论】:

  • rospy.spin() 更改为rospy.spinOnce()spin() 从 Python 手中接管控制权。

标签: python ros subscriber


【解决方案1】:

使用 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)

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 2020-09-20
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多