Улучшить способ уничтожения узла через определенное время - PullRequest
1 голос
/ 27 июня 2019

Я публикую сообщение на определенную тему, и мне нужно, чтобы оно прекратилось через определенное время. Процесс публикации состоит из цикла, который непрерывно отправляет информацию в тему.

Это цикл, который мне нужно остановить после определенного времени, указанного пользователем.

  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 секунд, после чего он должен остановиться и код завершится.

Мне удалось через некоторое время остановить цикл, установив частоту публикации на 20 Гц.Это означает, что он будет публиковаться каждые 0,05 секунды, поэтому я добавил переменную с именем counter и каждый раз, когда цикл публикует, добавляет +0,05 к переменной counter . Затем counter сравнивается с время и если оба имеют одно и то же значение, я завершаю цикл с помощью:

if counter >= time:
        break

Есть ли способ улучшить это с помощью любой другой функции?

1 Ответ

2 голосов
/ 27 июня 2019

Вы можете попробовать класс 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()

Узнайте больше о том, как использовать Timer класс из здесь .

...