从另一个进程中杀死德雷克模拟的最干净的方法

Cleanest way to kill Drake simulation from another process

在 examples/allegro_hand 这样的例子中,main thread advances the simulator and another 通过 LCM 向它发送命令,每个进程杀死另一个进程的最干净的方法是什么?

当主进程结束时,我正在努力杀死副进程。我试了一下 AdvanceTo ,并捕获了

时抛出的错误

MultibodyPlant's discrete update solver failed to converge

我可以在 catch 块中手动发布带有 drake::lcm::Publish 的布尔值。在辅助过程中,我订阅并使用 this HandleStatus to process incoming messages. The corresponding HandleStatus isn't called unless I add a while(0 == lcm_.handleTimeout(10)) like this 之类的东西。当我这样做时,副进程会卡住等待消息,除非模拟抛出,否则消息不会出现。对于如何处理这种情况有什么建议吗?

我可以通过从另一个 (run_twisting_mug)、AdvanceTo-ing to a smaller timestep 在主进程中通过 LCM 发送布尔值并检查来终止主进程 (allegro_single_object_simulation)在每个较小的 AdvanceTos 之后接收到的布尔值。这似乎工作可靠,但可能不是最干净的解决方案。

如果我以错误的方式思考这个问题,并且有更好的方法来 运行 这样的示例,请告诉我。谢谢!

我们经常使用进程管理器,比如https://github.com/RobotLocomotion/libbot/tree/master/bot2-procman 启动和管理我们所有的流程。 ROS 生态系统有类似的工具。 procman 已开放供您使用,但 drake 开发人员并未正式将其视为 "supported"。