与强化学习一起使用时将 Drake 的模拟器设置为固定集成的最佳实践?

Best practice to set Drake's simulator for fixed integration when using with reinforcement learning?

我正在使用 drake 进行一些 model-free 强化学习,我注意到 Drake 在模拟更新时使用 non-fixed 步骤集成。当 body 的加速度很大时,为了在较短的时间内多次积分,这是有意义的,但在使用强化学习的情况下,这会导致一些显着的计算开销和缓慢的推出。我想知道除了我目前使用的方法(下面的代码)之外,是否有一种原则性的方法允许模拟环境以固定的时间步集成模式运行。我目前正在使用 PyDrake 绑定和 PPO 作为 RL 算法。

integrator = simulator.get_mutable_integrator()
integrator.set_fixed_step_mode(True)

更改用于连续时间动态的积分器的方法是调用 ResetIntegratorFromFlags. For example, to use the RungeKutta2Integrator 你会调用:

ResetIntegratorFromFlags(simulator=simulator, scheme="runge_kutta2", max_step_size=0.01)

要记住的另一件事是您正在模拟的系统是使用连续时间还是离散时间动态,以及在那些特定系统中是否可配置。如果没有被模拟的连续时间动态,那么积分器的选择并不重要。只有离散系统的更新周期才重要。

特别是,如果您正在模拟 MultibodyPlant,它的构造函数需要一个 time_step 参数。当为零时,它将使用连续时间动态;当大于零时,它将使用离散时间动态。

当我将 Drake 用于 RL 时,我几乎总是将 MultibodyPlant 置于离散模式。盯着 time_step=0.001 通常是一个安全的选择。根据场景中的实体和属性,您可能可以使用更大的步长。

我同意@jwnmimmer-tri——我怀疑对于你的用例,你想通过在构造函数中指定 time_step 将 MultibodyPlant 置于离散模式。

关于更高级别的问题——我 认为在 RL 中使用固定步骤集成更好。可变步长积分对于任何一个 rollout 都更准确,但是当你的算法改变参数或初始条件时,可能会引入(小的)人为非平滑度。