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
相关产品推荐
相关产品推荐

