Остановить serve_forever, когда rospy.is_shutdown

У меня есть следующая программа Python для запуска HTTP-сервера и узла ROS.

httpd = ThreadingHttpServer()

rospy.init_node('server')
rospy.on_shutdown(httpd.shutdown)

try:
    httpd.serve_forever()
except KeyboardInterrupt:
    pass

httpd.server_close()

Я хочу, чтобы программа прекратила

  • когда я звоню httpd.shutdown() (например, после получения /kill команда),
  • когда ROS выключается (т.е. если rospy.is_shutdown()) а также
  • когда я нажимаю Ctrl + C (это наименее важно).

Каким-то образом я борюсь с распознаванием выключения ROS, хотя я пытался rospy.on_shutdown() и, альтернативно, собственный while вызов цикла httpd.handle_request(),

С текущей версией, узел (начался с rosrun) не останавливается при выключении roscore,

Как я могу разумно объединить эти два модуля?

1 ответ

Решение

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

   def shutdown_hook():
       print "Trying to shut down server"
       httpd.shutdown()

   rospy.on_shutdown(shutdown_hook)

Если shutdown() не работает, попробуйте httpd.socket.close()

Другие вопросы по тегам