微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GetInfeasibleConstraints运行时错误:输出必须为标量类型float

如何解决GetInfeasibleConstraints运行时错误:输出必须为标量类型float

我正在尝试使用以下内容调试我的MP

solver = IpoptSolver()
result = solver.solve(prog)
result.GetInfeasibleConstraints(prog)

但是,出现以下错误

PyFunctionConstraint: Output must be of scalar type float. Got autodiffXd instead.

添加了与compass gait example中类似的autodiff约束。

例如

plant_autodiff = plant.ToautodiffXd()
def eq7h(q_v_r):
    q,v,r = np.split(q_v_r,[
        plant.num_positions(),plant.num_positions() + plant.num_veLocities()])
    context = plant_autodiff.CreateDefaultContext()
    plant_autodiff.SetPositions(context,q)
    plant_autodiff.SetVeLocities(context,v)
    return plant_autodiff.CalcCenterOfMassposition(context) - r
prog.AddConstraint(eq7h,lb=[0]*3,ub=[0]*3,vars=np.concatenate([q[k],v[k],r[k]]))

如何正确使用GetInfeasibleConstraints

解决方法

GetInfeasibleConstraints要求使用双精度向量对约束进行评估。所以我将您的约束重写为

def eq7h(q_v_r):
    q,v,r = np.split(q_v_r,[
        plant.num_positions(),plant.num_positions() + plant.num_velocities()])
    # Select plant based on the data type of q_v_r. If the data type is autodiff (np.object in this case),then use plant_autodiff,otherwise use plant
    plant_eval = plant_autodiff if q_v_r.dtype == np.object else plant
    context = plant_eval.CreateDefaultContext()
    plant_eval.SetPositions(context,q)
    plant_eval.SetVelocities(context,v)
    return plant_eval.CalcCenterOfMassPosition(context) - r

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。