MultibodyPlant 的动力学作为 MathematicalProgram 中 Python function/lambda 约束的一部分,用于从头开始直接搭配

MultibodyPlant’s dynamics as part of a Python function/lambda constraint in a MathematicalProgram for direct collocation from scratch

我试图在 MathematicalProgram 中从头开始实现直接搭配,这样每个约束都是一个 Python 函数,这意味着我可以获得每个约束的梯度和与其输入相关的成本。我的目标是将这些梯度用于下游任务。

我正在将此笔记本的“钟摆的直接搭配”部分:https://github.com/RussTedrake/underactuated/blob/master/trajopt.ipynb 转换为 MathematicalProgram。我已经能够将成本和约束转换为 lambda 而不是公式。例如:

torque_limit = 3.0  # N*m.
u = dircol.input()
dircol.AddConstraintToAllKnotPoints(-torque_limit <= u[0])
dircol.AddConstraintToAllKnotPoints(u[0] <= torque_limit)

变成

torque_limit = 3.0  # N*m.
for n in range(N-1):
    constraint = prog.AddConstraint(lambda u: u, [-torque_limit], [torque_limit], [u[n][0]])

这意味着我可以在该约束下使用 ExtractGradient:

ExtractGradient(constraint.evaluator().Eval(InitializeAutoDiff(arbitrary_u_vector)))

我未能将其转化为 Python lambda/function 的一个约束是 Pendulum 动力学的约束,因为它是在 DirectCollocation 的黑盒中实现的。我已经阅读了 DirectCollocation 的 C++,但我一直无法弄明白。

将 Python 中的轨迹优化动力学约束重新实现为 function/lambda 或以其他方式访问 Python 中的动力学约束梯度需要什么?我希望能够为任意 MultibodyPlant 执行此操作,例如 Quadrotor 或 Acrobot,而不仅仅是 Pendulum。

在python中实现DirectCollocation约束应该是绝对可以的。 This notebook 有一堆使用 python 函数作为约束的相关例子;它可以帮助。但它应该是您在 C++ 中找到的 DirectCollocationConstraint::Eval 的一个相当简单的端口。

但您也始终可以从 DirectCollocation 添加的约束中获取梯度。 class 只是一个帮手 class,可以让您更轻松地设置 MathematicalProgram。如果愿意,您仍然可以退出该程序并单独评估任何约束。我不相信你自己重新实现它会得到任何东西,并且肯定会在 python.

中有更差的表现