我正在研究各种最佳控制方法(并在Matlab中实现它们),作为测试用例,我现在选择一个简单的摆锤(固定在地面上)作为测试用例,将其控制在较高位置。

我设法使用“简单”的反馈方法(基于能量控制的摆动+上部位置的LQR稳定)对其进行控制,并且状态轨迹如图所示(我忘记了轴的描述:x为theta ,y是theta点。

现在,我想尝试一种“完全”的最佳控制方法,从迭代LQR方法开始(我在这里找到了实现方法,网址为http: //homes.cs.washington.edu/~todorov/software/ilqg_det.m)

该方法需要一个动态函数和一个成本函数(x = [theta; theta_dot], u是电动机转矩(仅一个电动机)):

function [xdot, xdot_x, xdot_u] = ilqr_fnDyn(x, u)
    xdot = [x(2);
        -g/l * sin(x(1)) - d/(m*l^2)* x(2) + 1/(m*l^2) * u];
    if nargout > 1
        xdot_x = [ 0, 1;
            -g/l*cos(x(1)), -d/(m*l^2)];
        xdot_u = [0; 1/(m*l^2)];
    end
end

function [l, l_x, l_xx, l_u, l_uu, l_ux] = ilqr_fnCost(x, u, t)
    %trying J = x_f' Qf x_f + int(dt*[ u^2 ])
    Qf = 10000000 * eye(2);
    R = 1;
    wt = 1;
    x_diff = [wrapToPi(x(1) - reference(1)); x(2)-reference(2)];

    if isnan(t)
        l = x_diff'* Qf * x_diff;
    else
        l = u'*R*u;
    end

    if nargout > 1
        l_x = zeros(2,1);
        l_xx = zeros(2,2);
        l_u = 2*R*u;
        l_uu = 2 * R;
        l_ux = zeros(1,2);

        if isnan(t)
            l_x = Qf * x_diff;
            l_xx = Qf;
        end
    end
end


关于摆锤的一些信息:我的系统的原点是摆锤固定在地面上的位置。在稳定位置(和pi,角度θ为零)在不稳定/目标p中
m是摆锤质量,l是杆长,d是阻尼因子(为简单起见,我将m=1l=1d=0.3

我的成本很简单:对控制+最终错误。

这就是我调用ilqr函数的方式。

>
时间从0到10。初始条件:(0.785398,0.000000)。目标:(-3.141593,0.000000)
长度:1.000000,质量:1.000000,阻尼:0.300000

使用迭代LQR控制

迭代次数= 5;成本= 88230673.8003


标称轨迹(即控件找到的最佳轨迹)为


控件为“关闭” ...它甚至都没有尝试达到目标...
我在做什么错? (Todorov的算法似乎可以正常工作。至少在他的示例中有效)

#1 楼

无需遍历所有代码(这太像真实的工作了),我的直觉是您已经对控制工作进行了足够的加权,以至于成本最低的事情是什么也不做,并忍受错误。 />
是的,我知道-您所有明确的权重都是统一的。但是,仍然-尝试降低控制权重,或者提高位置误差。

同样,如果不深入代码,ilrq函数可能不会“理解”控件的非线性性质。您正在控制的事情。因此,它可能无法找到直立摆的方法,而且可能会失败。

您首次尝试的方法是将适量的能量投入摆中,然后在摆锤竖起后进行最佳调节,这可能是最好的方法:您知道,在没有摩擦的情况下,能量恰到好处的系统最终将停留在顶部(但是短暂地),因此这似乎是一个明智的起点。

评论


$ \ begingroup $
感谢您的评论。正如我在评论其他答案时所说的那样,这个问题已经很久了,也许我应该删除它。问题是我从未解决过这个问题,即使我改用其他算法也是如此。关于您对能量的评论。真正的目标不是控制倒立摆,而是将其用作ocp算法的测试平台。 (低尺寸但非线性和不稳定的系统)
$ \ endgroup $
– Francesco
2013年6月27日14:26

#2 楼

iLQR是一种迭代方法,但实际上您似乎并没有在迭代。 Todorov提供了一个测试脚本,该脚本应阐明该方法,尽管可能需要针对您的系统进行自定义。

评论


$ \ begingroup $
实现iLQG方法时,我尝试的第一件事是todorov测试,它可以正常工作。现在..这个问题是在一月底..也许我应该关闭它..我从这种方法,从matlab转移到了NLP方法
$ \ endgroup $
– Francesco
2013年6月27日14:23



$ \ begingroup $
对不起,我没有尽快看到它。回复:关闭它,我建议不要这样做,因为其他人可能仍然认为它很有帮助。
$ \ endgroup $
– DaemonMaker
2013年6月27日15:38

$ \ begingroup $
@DeamonMaker是..这就是我将其保持打开状态的原因... :)
$ \ endgroup $
– Francesco
13年6月28日在8:03