在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)。这似乎可以可靠地工作,但可能不是最干净的解决方案。
如果我想的是错误的方式,并且有更好的方法来运行这样的示例,请告诉我。谢谢!
答案 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开发人员会正式“支持”它。