如何从MakeManipulationStation()中获取MultibodyPlant对象
你调用的MakeManipulationStation()返回值是Diagram类型,并非ManipulationStation类实例,因此没有get_multibody_plant()成员方法,才会触发属性不存在的报错。
方法1:按子系统名称直接获取
默认创建的ManipulationStation Diagram里,MultibodyPlant的子系统名称为multibody_plant,可以直接通过GetSubsystemByName方法获取:
builder = DiagramBuilder() station = builder.AddSystem(MakeManipulationStation()) plant = station.GetSubsystemByName("multibody_plant")
如果不确定当前子系统的命名,可以执行以下代码打印所有子系统名称核对:
for sub in station.GetSystems(): print(sub.get_name())
方法2:修改MakeManipulationStation返回值(可选)
如果你可以修改MakeManipulationStation()的实现,可以调整函数逻辑,将构建好的Diagram和对应的plant同时返回:
# 修改后的MakeManipulationStation函数内部逻辑示例 def MakeManipulationStation(...): builder = DiagramBuilder() station = builder.AddSystem(ManipulationStation()) station.SetupClutterClearingStation() station.Finalize() plant = station.get_multibody_plant() diagram = builder.Build() # 同时返回diagram和plant对象 return diagram, plant
调用时直接拿到plant对象即可:
builder = DiagramBuilder() station, plant = MakeManipulationStation() builder.AddSystem(station)
注意事项
所有对MultibodyPlant的修改(加载URDF、添加碰撞属性等)都必须在Diagram Finalize之前完成,Diagram构建完成后无法再修改plant的配置。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

