考虑一个现有的Drake System
(例如MultibodyPlant
)。有没有办法将System
封装在Diagram
中,从而将内部System
的一些状态转换为输入,即直接从外部Diagram
的输入端口设置
其动机本质上是在模型决策上做出改变。例如,四旋翼的sometimes considered是将其角速率和集体推力作为输入,而不是集体推力和身体力矩(或类似地,单个转子命令)。
在更复杂的系统中,也许我可以假设我能够瞬时控制某些速度(例如,内部的、具有快速动力学特性的全驱动关节),但仍然希望对整个多体系统的动力学进行建模,以科里奥利项等形式说明当前速度的选择。
我所得到的实际上非常类似于Flat-Plate Glider Model中电梯的建模选择-但我希望避免手动实现LeafSystem,因为我的系统具有非平凡的多体动力学。
我的感觉是,这可能是不可能的,因为我不知道Diagram
有任何方法来干扰System
的内部动态,所以“删除”状态并将其提升为输入似乎是不可能的。但我想可能会有一些聪明的方法来做到这一点。
提前感谢!
发布于 2021-08-22 10:53:17
我同意你的分析。最简单的答案是“否”--声明状态的系统不能被后期分解,以使该状态来自输入端口。但是对于你提到的具体例子,有一些可能性/相关的想法。
第一个是规定的运动约束的概念--例如,可以直接在MultibodyPlant
中设置关节的位置/速度。不幸的是,我们还没有实现它,但这是一个合理的请求,我们偶尔会讨论一下(这里有一个例子:https://github.com/RobotLocomotion/drake/issues/14694)。
正如您所说,您可以在系统外部实现PD控制器,以达到所需的效果。这与我们在内部实现规定的运动约束的方式之间唯一的真正区别是,我们可以很好地选择增益,并直接通知求解器有关该约束的信息。
另一种可能性是实现一个“在”工厂内部工作并接受输入端口的force元素。这将允许您应用力来实现您的建模思想,即使是以通过actuation_input_port
不可能实现的方式(例如,无法通过声明的执行器实现)。
你链接的滑翔机例子是一个很好的例子。在这种情况下,我非常担心有一个模型可以避免将电梯的速度声明为状态(因为我们的验证方法的复杂性与状态空间的维度成比例)。目前,这仍然需要编写一个定制的LeafSystem
实现。
https://stackoverflow.com/questions/68824034
复制相似问题