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

Drake中DiagramBuilder与ManipulationStation的Python绑定运行时错误咨询

解决方案:Drake Python绑定中ManipulationStation端口连接错误

错误原因

你推测的核心问题完全正确:ManipulationStation内部维护了专属的DiagramBuilder实例。当调用station.Finalize()时,该内部builder会完成MultibodyPlant的注册与Diagram构建。而你在外部创建的独立DiagramBuilder并未注册该plant,因此尝试连接plant的端口时会触发Cannot operate on ports of System plant until it has been registered using AddSystem错误。

同时你代码的时序逻辑存在问题:在station.Finalize()之后才进行端口连接,此时ManipulationStation的内部结构已经冻结,无法再修改。

修正步骤与代码示例

解决思路是复用ManipulationStation内部的DiagramBuilder,并在Finalize()完成前完成所有模型添加与端口连接操作,与你C++版本的逻辑对齐:

# 1. 从station获取plant并添加模型
plant = station.get_multibody_plant()
manipuland_path = get_manipuland_resource_path()
bolt_with_nut = Parser(plant=plant).AddModelFromFile(manipuland_path)
X_WC = RigidTransform(RotationMatrix.Identity(), [0.0, -0.3, 0.1])
plant.WeldFrames(plant.world_frame(), plant.GetFrameByName('bolt', bolt_with_nut), X_WC)

# 2. 获取ManipulationStation内部的builder(关键:不要自行新建外部builder)
builder = station.builder

# 3. 根据模型自由度创建对应长度的零扭矩源,避免固定长度向量的适配问题
num_vels = plant.num_velocities(bolt_with_nut)
zero_torque = builder.AddSystem(ConstantVectorSource(np.zeros(num_vels)))

# 4. 用内部builder完成端口连接
builder.Connect(zero_torque.get_output_port(), plant.get_actuation_input_port(bolt_with_nut))

# 5. 最后执行Finalize冻结结构
station.Finalize()

关键说明

  • 复用内部builder:station.builder直接引用了ManipulationStation维护的专属builder,该builder已提前注册了plant,因此可以合法操作plant的端口。
  • 时序正确:所有模型修改、系统添加、端口连接都必须在station.Finalize()之前完成,因为Finalize会触发Diagram的构建,之后无法再修改内部结构。
  • 适配自由度:用plant.num_velocities(bolt_with_nut)获取模型的自由度数量,生成对应长度的零向量,避免固定长度向量与模型自由度不匹配的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:50:26