首页 > 解决方案 > 在 Drake 的上下文中理解状态组

问题描述

我创建了一个带有 LQR 控制器、MultiBodyPlant、场景图和 PlanarSceneGraphVisualizer 的图表。

在尝试运行此模拟时,我使用以下函数设置随机初始条件:context.SetDiscreteState(randInitState). 但是,有了这个,我收到以下错误:

RuntimeError: Context::SetDiscreteState(): expected exactly 1 discrete state group but there were 2 groups. Use the other signature if you have multiple groups.

实际上,当我使用 来检查组数时context.num_discrete_state_groups(),它返回 2。因此,我必须在使用命令设置状态时指定组索引context.SetDiscreteState(0, randInitState)。这有效,但我不知道为什么。我知道我必须选择一个正确的组来设置状态,但是这里的组到底是什么?在此处给出的 cartpole 示例中,使用context.SetContinuousState(UprightState() + 0.1 * np.random.randn(4,))未指定任何组来设置上下文。

组仅对离散系统有效吗?上下文文档讨论了组,但没有定义它们。

在一个图表中设置多个系统的德雷克模拟以及如何检查系统的组索引时,是否有地方可以找到组的定义?

标签: drake

解决方案


我们通常会建议您使用使用子系统接口设置上下文的工作流。例如

plant_context = plant.GetMyMutableContextFromRoot(context)
plant_context.SetContinuousState(...)

为 a 找出状态组的离散索引DiagramContext可能是可能的,但它肯定不是典型的。

您可能会发现打印上下文很有帮助。在 pydrake 中,您实际上只需调用print(context),您将看到不同的元素以及它们的来源。


推荐阅读