在 PyDrake 中使用 autodiff 时无法检查不可行的约束

Unable to check infeasible constraints when using autodiff in PyDrake

我正在使用 SNOPT 解决 PyDrake 中的一个问题,我得到了看起来合理的解决方案,但是当我这样做时 result.is_success() 它返回 False,所以我希望调查它为什么认为问题没有解决。我假设我在某处有一个不好的约束,所以我用下面的代码来做到这一点:

result = mp.Solve(prog)
if not result.is_success():
    print("INFEASIBLE:")
    infeasible = result.GetInfeasibleConstraints(prog)
    for c in infeasible:
        print(c)

但是,它在调用 result.GetInfeasibleConstraints(prog) 时退出并出现以下错误:

Traceback (most recent call last):
  File "test_drake_distribution.py", line 250, in <module>
    infeasible = result.GetInfeasibleConstraints(prog)
  File "/home/adam/.miniconda3/envs/drake/lib/python3.6/site-packages/pydrake/solvers/_mathematicalprogram_extra.py", line 34, in _check_array_type
    f"{var_name} must be of scalar type {expected_name}, but unable "
RuntimeError: PyFunctionConstraint: Output must be of scalar type float, but unable to infer scalar type.

它说的是真的,因为我的约束函数利用了 Drake 中的自动差异功能,所以它们返回的数组 dtype=AutoDiffXd。如果是这种情况,是否意味着我不能使用约束不可行性检查器?关于在我使用 autodiff 时能够检查不可行约束的任何建议?

我假设您使用 python 函数编写约束。我建议写这个 python 函数来处理 float 和 autodiffxd,所以像这样

def my_evaluator(x: np.ndarray):
    if x.dtype == np.object:
        # This is the autodiff case
    elif x.dtype == np.float:
        # This is the float case