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

能否将SDF生成的模型作为被控对象用于DirectCollocation?

核心结论

SDF完全支持创建可用于DirectCollocation的连续时间系统,不需要自行实现LeafSystem。该报错和SDF本身能力无关,是被控对象初始化配置错误导致的。

报错根因

Drake的MultibodyPlant加载SDF/URDF模型时,支持两种动力学模式:

  • 当构造函数传入的time_step参数大于0时,plant使用离散时间动力学,仅对外暴露离散状态,不满足DirectCollocation的输入要求
  • 当time_step参数显式设为0.0时,plant才会建模连续时间动力学,对外提供连续状态,可直接对接DirectCollocation
    你触发报错的直接原因就是构造plant时没有显式设置time_step=0.0,生成了离散模式的plant,系统不存在连续状态。
修正步骤
  • 初始化MultibodyPlant时显式传入连续模式参数,参考代码如下:
# 关键:time_step必须设为0.0启用连续动力学
plant = MultibodyPlant(time_step=0.0)
parser = Parser(plant)
# 加载你自建的cart-pole SDF文件
parser.AddModels("your_cartpole_path.sdf")
plant.Finalize()
  • 如果你将plant和其他模块(如传感器、控制器)封装为Diagram后再传入DirectCollocation,需要确认整个Diagram内没有引入离散状态的组件,否则同样会触发该报错。
  • 配置完成后可调用your_system.num_continuous_states()做校验,正常cart-pole系统会返回4个连续状态(小车位置、小车速度、摆杆角度、摆杆角速度),返回值大于0即满足要求。
参考建议
  • Drake内置的cart-pole、acrobot示例的连续版本均直接通过SDF/URDF加载模型,无需自定义LeafSystem即可直接调用DirectCollocation求解轨迹,可以对照核对配置。
  • 你当前查阅的drake/examples/acrobot路径下的连续版本实现,就是采用time_step=0.0初始化plant后直接接入轨迹优化模块的逻辑,可以重点参考对应示例中plant构造部分的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:12:45