如何将Drake System内部的部分状态转换为外层Diagram的输入端口?
问题:Drake中能否将System内部状态通过Diagram封装转换为外部输入?
现有一个Drake System(例如MultibodyPlant),是否可以通过将该System封装到Diagram内的方式,将内部System的部分状态转换为输入,即直接通过外层Diagram的输入端口赋值?
该需求本质上是为了调整建模决策。例如部分研究将四旋翼的输入设为角速度和总推力,而非总推力和机体力矩(或类似的单个旋翼指令)。
在更复杂的系统中,我可能假设可对特定速度实现瞬时控制(例如动力学响应极快的内部全驱动关节),但仍需对整个多体系统的动力学建模,计入该速度取值对应的科里奥利力等项。
我想要实现的效果和平板滑翔机模型中升降舵的建模选择非常类似,但我不想手动实现LeafSystem,因为我的系统包含复杂的多体动力学。
我目前认为该需求可能无法实现,因为我不了解Diagram有任何可以干预System内部动力学的方式,因此“删除”一个状态并将其提升为输入似乎是不可行的,但还是想确认是否有巧妙的实现方法。
提前感谢!
解答
该需求完全可以通过Drake原生组件的组合实现,不需要手动重写包含多体动力学逻辑的LeafSystem,两种常用方案如下:
- 状态覆盖方案
直接通过Diagram的事件调度机制修改目标状态的更新逻辑即可:- 将
MultibodyPlant放入自定义Diagram中,新增外层输入端口接收你要指定的状态值(例如目标关节速度) - 为Diagram添加一个优先级高于
MultibodyPlant原生动力学更新的状态更新事件,每次事件触发时直接用输入端口的取值覆盖MultibodyPlant中对应状态变量的值 - 该方案下
MultibodyPlant的动力学计算会完全基于你指定的状态值,自动计入科里奥利力、重力、惯性力等所有相关项,完全符合你的建模需求
- 将
- 逆动力学前馈方案
如果你希望完全遵循Drake的原生System接口规范,不直接修改状态更新逻辑,可以用InverseDynamics组件组合实现:- 在Diagram中同时加入
MultibodyPlant和InverseDynamics两个系统,二者使用相同的多体模型配置 - 将你要作为输入的状态(位置、速度等)同时喂给
InverseDynamics的状态端口 InverseDynamics会自动计算出恰好让系统维持该目标状态的力矩值,将该力矩输出喂给MultibodyPlant的作动输入端口即可,效果等价于目标状态完全跟随外部输入
- 在Diagram中同时加入
如果使用离散版本的MultibodyPlant,可以搭配ZeroOrderHold组件实现输入值的步间保持,逻辑实现会更简洁。
内容的提问来源于stack exchange,提问作者jwelde
相关产品推荐
相关产品推荐

