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

Improve the way of killing a node after an specific amount of time

我正在向特定主题发布消息,我需要它在一定数量后停止 time.The 发布过程包括不断向主题发送信息的循环。

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

  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 的变量,每次循环发布时它都会将 +0.05 添加到 counter variable.Then countertime 进行比较,如果两者具有相同的值,我将使用以下方式结束循环:

if counter >= time:
        break

有没有办法通过使用任何其他函数来改进它?

你可以试试rospy Timer class 在某个话题上发表一段时间。它允许在特定时间触发事件。

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 class 的更多信息