Расчет длительности и контроль в ROS - кроме того, почему этот скрипт продолжает работать даже после нажатия Ctrl- C? - PullRequest
0 голосов
/ 01 августа 2020

Я написал код, чтобы черепаха развернулась. Код рабочий. Я хочу знать, насколько быстро работает turtlebot и как я могу его контролировать. Например, как я могу обеспечить поворот turtlebot на 5 градусов за одну минуту? Последняя часть вопроса. После нажатия Ctrl- C turtlebot останавливается, но скрипт продолжает работать. Зачем? и как я могу это остановить?

этот пост действительно не помогает.

прошел через этот пост . Означает ли это, что в то время как l oop ниже запускается 5 раз в секунду независимо от значений, которые я ввел в для циклов? Или это означает, что ROS изо всех сил старается, чтобы l oop работал 5 раз в секунду в меру своих возможностей? Большое спасибо.

# 5 HZ
angle = 5
r = rospy.Rate(5);
while not rospy.is_shutdown():
    # code to turn
    for x in range(0,100):
        rospy.loginfo("turn")
        turn_cmd.angular.z = radians(angle) 
        new_angle = (angle + new_angle) % 360
        self.cmd_vel.publish(turn_cmd)
        r.sleep()
     # code to pause  
    for x in range(0,100):
        rospy.loginfo("stop")
        turn_cmd.angular.z = radians(0)
        self.cmd_vel.publish(turn_cmd)

        r.sleep()

def shutdown(self):
    # stop turtlebot
    rospy.loginfo("Stop turning")
    self.cmd_vel.publish(Twist())
    rospy.sleep(1)

1 Ответ

0 голосов
/ 08 августа 2020

Согласно ROS Wiki , класс удобства rospy.Rate делает все возможное для поддержания работы l oop с указанной частотой, учитывая время выполнения l oop с момента последнего успешно r.sleep(). В вашем случае это означает: до тех пор, пока время выполнения кода в l oop не превышает 1/5 секунды, rospy.Rate гарантирует, что l oop работает с частотой 5 Гц.

Что касается скрипт не останавливается при нажатии Ctrl- C: KeyboardInterrupt будет обрабатываться иначе, чем в обычных Python скриптах при использовании rospy. rospy перехватывает сигнал KeyboardInterrupt, чтобы установить флаг rospy.is_shutdown() в значение true. Этот флаг проверяется только в конце каждого l oop, поэтому при нажатии Ctrl- C во время выполнения for-l oop сценарий не может быть остановлен, потому что флаг не проверяется немедленно.

Ручной способ сигнализировать о завершении работы узла - использовать rospy.signal_shutdown(). Для этого параметр disable_signals должен быть установлен в значение true при инициализации узла ROS (см. Раздел 2.3 здесь ). Обратите внимание, что вам дополнительно потребуется вручную вызвать правильные процедуры завершения работы, чтобы обеспечить надлежащую очистку.

...