Самый чистый способ убить симуляцию Дрейка из другого процесса - PullRequest
1 голос
/ 26 мая 2020

В примере, таком как examples / allegro_hand, где основной поток продвигает симулятор, а другой отправляет ему команды через LCM, какой самый чистый способ для каждого процесса убить другое?

Я изо всех сил пытаюсь убить побочный процесс, когда умирает основной процесс. Я обернул AdvanceTo попыткой и поймал ошибку, возникающую, когда

решатель дискретных обновлений MultibodyPlant не смог сойтись

Я могу вручную publi sh логическое значение с drake :: lcm :: Publi sh внутри блока catch. В побочном процессе я подписываюсь и использую что-то вроде this HandleStatus для обработки входящих сообщений. Соответствующий HandleStatus не вызывается, если я не добавлю a while (0 == lcm_.handleTimeout (10)) как это . Когда я это делаю, побочный процесс застревает в ожидании сообщения, которое не приходит, если симуляция не сработает. Есть какие-нибудь советы, как поступить в этом случае?

Я могу убить основной процесс (allegro_single_object_simulation), отправив логическое значение через LCM из другого (run_twisting_mug), AdvanceTo-ing на меньший временной шаг в основном процессе и проверка полученного логического значения после каждого меньшего AdvanceTos. Кажется, это работает надежно, но, возможно, не самое чистое решение.

Если я думаю об этом неправильно и есть лучший способ запустить такой пример, пожалуйста, дайте мне знать. Спасибо!

1 Ответ

1 голос
/ 26 мая 2020

Мы часто используем диспетчер процессов, например https://github.com/RobotLocomotion/libbot/tree/master/bot2-procman, для запуска и управления всеми нашими процессами. В экосистеме ROS есть аналогичные инструменты. procman открыт и доступен для использования, но мы не считаем, что он официально «поддерживается» разработчиками Drake.

...