Optimization 模型预测控制框架下轨迹优化输入值切换能力的约束

Optimization 模型预测控制框架下轨迹优化输入值切换能力的约束,optimization,input,constraints,drake,Optimization,Input,Constraints,Drake,我试图添加一个约束,该约束指定,在优化过程中,解算器必须在设定的持续时间内选择u值,并且只能在设定的持续时间后切换。例如,假设我有一个机械装置,它只能每10秒切换一次输入值。然后,我希望优化器对此进行解释。我将在此处附上代码: for it_i in range(0, N-1, equivalence_samples): print("N: {}".format(N)) for it_j in range(0

我试图添加一个约束,该约束指定,在优化过程中,解算器必须在设定的持续时间内选择u值,并且只能在设定的持续时间后切换。例如,假设我有一个机械装置,它只能每10秒切换一次输入值。然后,我希望优化器对此进行解释。我将在此处附上代码:

        for it_i in range(0, N-1, equivalence_samples):

            print("N: {}".format(N))

            for it_j in range(0, equivalence_samples - 1):

                if (it_i + it_j + 1) > N-1:
                    print("Breaking")
                    break
                else:
                    constraint_u0 = prog.AddConstraint(u[0, it_i + it_j] == u[0, it_i + it_j + 1]) # add equivalence constraints
                    constraint_u1 = prog.AddConstraint(u[1, it_i + it_j] == u[1, it_i + it_j + 1]) # add equivalence constraints
                    print('Constraint_u_PE: {}'.format(constraint_u0))
                    print('Constraint_u_NI: {}'.format(constraint_u1))
我已经在中实现了这一点,我希望这是一个有效的解决方案。有时,它似乎是工作,而其他时候,它不

我将展示一些输出约束的照片,然后是一个不起作用的示例

然后,这里的曲线图清楚地显示了切换时间之间的关系,但数值并不相等。我附加的代码生成这个绘图以及


本例中使用的特定解算器是OSQP解算器。虽然在理想的解算器世界中,我在上述代码中指定了正确的约束(即输入1==输入2,输入2==输入3,等等),但我没有考虑解算器在维护约束时具有一定的准确性这一事实

我可以通过更新解算器的精度(按照建议)或输入更明确的约束来解决此问题。我用第二个选项解决了这个问题。现在,我不仅指定了以下模式中的约束:

输入1==输入2,输入2==输入3,等等

但我也包括以下模式的约束:

输入1==输入3,输入1==输入4,输入1==输入5

输入2==输入4,输入2==输入5等

通过更加明确,我的解算器现在正在执行我要求的操作,但与约束存在微小偏差。然而,对于我的应用来说,这些小偏差是可以接受的!它有点慢,但这不是我目前使用它的问题。这是我的更新代码:


        for it_i in range(0, N-1, equivalence_samples):
            
            for it_j in range(0, equivalence_samples - 1):

                for it_f in range(1, equivalence_samples - it_j):

                    if (it_i + it_j + it_f) > N-1:
                        print("Breaking")
                        break
                    else:
                        con_0 = eq(u[:, it_i + it_j], u[:, it_i + it_j + it_f])
                        constraint_u = prog.AddConstraint(con_0) # add equivalence constraints
                        print('Constraint_u: {}'.format(constraint_u))

不是世界上最漂亮的代码,但它可以工作。

从绘图中可以看出,u\u PE满足您的约束,但u\u NI不满足?你能检查一下你的问题是否成功解决了吗?您可以调用
print(result.is_success())
来检查优化问题是否得到解决。是的,我已经检查过了,并且每次打印时它都成功地解决了问题。即使输出了如上所示的绘图,一个可能有用的问题是,是否有一个值低于该值时,程序会识别为零?我甚至看了看解决方案,看起来他们正在正确地解决它,两个输入之间的差异应该是相同的不是0。精度取决于解算器。通常,精度应为1E-6左右。您可以通过打印(result.get\u solver\u id().name())获得解算器好的,这很有意义!这正是问题所在。考虑到解算器的精度,我的约束似乎不够明确,无法产生我想要的结果。非常感谢。这很有帮助!我想知道如果你在一个循环中施加等式约束,比如input1==input2,input2==input3,…,inputN=input1,那么之前你有N-1等式约束,现在只需在最后和第一个输入之间再加一个等式约束,会发生什么。

        for it_i in range(0, N-1, equivalence_samples):
            
            for it_j in range(0, equivalence_samples - 1):

                for it_f in range(1, equivalence_samples - it_j):

                    if (it_i + it_j + it_f) > N-1:
                        print("Breaking")
                        break
                    else:
                        con_0 = eq(u[:, it_i + it_j], u[:, it_i + it_j + it_f])
                        constraint_u = prog.AddConstraint(con_0) # add equivalence constraints
                        print('Constraint_u: {}'.format(constraint_u))