能否将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
相关产品推荐
相关产品推荐

