You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drake中多离散状态组设置问题:无法访问第二组状态

解决Drake LeafSystem多离散状态组的访问与设置问题

问题原因

你遇到的情况是因为默认的DeclarePeriodicDiscreteUpdateEvent如果不指定目标状态组,会自动绑定到第一个声明的离散状态组,所以Update2回调里传入的始终是第一组的状态。要操作第二组状态,有两种可行方案:


方案一:声明事件时指定目标状态组

在初始化时保存每个离散状态组的索引,然后在声明更新事件时通过state_index参数指定要更新的组,这样回调函数传入的discrete_state就是对应组的状态。

修改后的完整代码:

import numpy as np
from pydrake.systems.framework import LeafSystem

class DGEx(LeafSystem):
    def __init__(self):
        super().__init__()
        # 保存两个离散状态组的索引
        self.state_idx1 = self.DeclareDiscreteState(5)
        self.DeclareStateOutputPort("group1", self.state_idx1)

        self.state_idx2 = self.DeclareDiscreteState(9)
        self.DeclareStateOutputPort("group2", self.state_idx2)

        # 声明第一组的更新事件,指定state_index
        self.DeclarePeriodicDiscreteUpdateEvent(
            period_sec=1e-2,
            offset_sec=0.0,
            update=self.Update,
            state_index=self.state_idx1
        )

        # 声明第二组的更新事件,指定state_index
        self.DeclarePeriodicDiscreteUpdateEvent(
            period_sec=1e-2,
            offset_sec=0.0,
            update=self.Update2,
            state_index=self.state_idx2
        )

    def Update(self, context, discrete_state):
        discrete_state.get_mutable_vector().SetFromVector(np.zeros(5))

    def Update2(self, context, discrete_state):
        # 此时discrete_state就是第二组的状态
        discrete_state.get_mutable_vector().SetFromVector(np.zeros(9))

方案二:从Context中直接获取目标状态组

如果不想修改事件声明,也可以在回调函数中忽略传入的discrete_state,直接从context获取完整的离散状态集合,再索引到目标组:

修改后的Update2方法:

def Update2(self, context, discrete_state):
    # 获取完整的离散状态集合
    discrete_states = context.get_mutable_discrete_state()
    # 索引1对应第二组(第一组索引为0)
    second_group = discrete_states.get_mutable_vector(1)
    second_group.SetFromVector(np.zeros(9))

内容的提问来源于stack exchange,提问作者HoliInn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:22:38