从另一进程中杀死Drake仿真的最干净方法

时间:2020-05-26 04:44:31

标签: drake lcm

在examples / allegro_hand之类的示例中,main thread使模拟器前进,而another通过LCM向其发送命令,每个进程杀死对方的最干净方法是什么?

当主进程死亡时,我正在努力杀死副进程。我已经尝试将AdvanceTo包裹起来,并捕捉到

时抛出的错误。

MultibodyPlant的离散更新求解器无法收敛

我可以在catch块内使用drake :: lcm :: Publish手动发布布尔值。在附带过程中,我订阅并使用类似this HandleStatus的东西来处理传入消息。除非我添加a while(0 == lcm_.handleTimeout(10)) like this,否则不会调用相应的HandleStatus。当我这样做时,副进程陷入等待消息的状态,除非模拟抛出,否则消息不会出现。有关如何处理此案的任何建议?

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

如果我想的是错误的方式,并且有更好的方法来运行这样的示例,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:1)

我们经常使用流程管理器,例如https://github.com/RobotLocomotion/libbot/tree/master/bot2-procman 启动和管理我们的所有流程。 ROS生态系统具有类似的工具。 import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; class InnerShadow extends SingleChildRenderObjectWidget { const InnerShadow({ Key key, this.shadows = const <Shadow>[], Widget child, }) : super(key: key, child: child); final List<Shadow> shadows; @override RenderObject createRenderObject(BuildContext context) { final renderObject = _RenderInnerShadow(); updateRenderObject(context, renderObject); return renderObject; } @override void updateRenderObject(BuildContext context, _RenderInnerShadow renderObject) { renderObject.shadows = shadows; } } class _RenderInnerShadow extends RenderProxyBox { List<Shadow> shadows; @override void paint(PaintingContext context, Offset offset) { if (child == null) return; final bounds = offset & size; context.canvas.saveLayer(bounds, Paint()); context.canvas.paintChild(child, offset); for (final shadow in shadows) { final shadowRect = bounds.inflate(shadow.blurSigma); final shadowPaint = Paint() ..blendMode = BlendMode.srcATop ..colorFilter = ColorFilter.mode(shadow.color, BlendMode.srcOut) ..imageFilter = ImageFilter.blur(sigmaX: shadow.blurSigma, sigmaY: shadow.blurSigma); context.canvas ..saveLayer(shadowRect, shadowPaint) ..translate(shadow.offset.dx, shadow.offset.dy); context.paintChild(child, offset); context.canvas.restore(); } context.canvas.restore(); } } 是开放的,可供您使用,但是我们不认为Drake开发人员会正式“支持”它。