改进特定时间后杀死节点的方式

时间:2019-06-27 17:22:31

标签: python ubuntu-16.04 ros

我正在将消息发布到特定主题,并且我需要它在设置的时间后停止。发布过程由循环组成,该循环不断向该主题发送信息。

这是我需要在用户输入指定的时间后停止的循环。

  while not rospy.is_shutdown(): 
        movement_cmd.linear.x = 0
        movement_cmd.linear.y = 0
        movement_cmd.linear.z = 0 
        movement_cmd.angular.x = 0 
        movement_cmd.angular.y = 0               
        movement_cmd.angular.z = 0 
        rospy.logdebug("Publishing")
        movement_publisher.publish(movement_cmd)
        rate.sleep()

编辑:

这是用户输入

time = float(sys.argv[2])

例如,如果 time = 2.5 ,则该循环应发布2.5秒,此后它应该停止并且代码将结束。

我设法通过将发布频率设置为20hz来停止循环。这意味着它将每0.05秒发布一次,因此我添加了一个名为 counter 的变量,并且每次循环发布时,它都会向 counter 变量添加+0.05。 与 time 进行比较,如果两者的值相同,则我使用以下命令结束循环:

if counter >= time:
        break

是否可以通过使用其他任何功能来改善此问题?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用rospy Timer类在特定时间段内发布主题。它允许在特定时间触发事件。

def stop_callback(event):
    rospy.signal_shutdown("Just stopping publishing...")

time = float(sys.argv[2]) 
rospy.Timer(rospy.Duration(time), stop_callback)

while not rospy.is_shutdown(): 
    movement_cmd.linear.x = 0
    movement_cmd.linear.y = 0
    movement_cmd.linear.z = 0 
    movement_cmd.angular.x = 0 
    movement_cmd.angular.y = 0               
    movement_cmd.angular.z = 0 
    rospy.logdebug("Publishing")
    movement_publisher.publish(movement_cmd)
    rate.sleep()

here了解有关如何使用Timer类的更多信息。