Controle ideal para um pêndulo simples


15

Estou estudando vários métodos ótimos de controle (e implementando-os no Matlab) e, como caso de teste, escolho (por enquanto) um pêndulo simples (fixo ao solo), que desejo controlar na posição superior.

Consegui controlá-lo usando o método de feedback "simples" (oscilação baseada no controle de energia + estabilização LQR para a posição superior), e a trajetória do estado é mostrada na figura (esqueci a descrição do eixo: x é theta, y é theta ponto.

Trajetória de estado de controle Swing-up + LQR

Agora, quero tentar um método de controle ideal "completo", começando com um método LQR iterativo (que eu encontrei implementado aqui http://homes.cs.washington.edu/~todorov/software/ilqg_det.m )

O método requer uma função dinâmica e uma função de custo ( x = [theta; theta_dot], ué o torque do motor (apenas um motor)):

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

Algumas informações sobre o pêndulo: a origem do meu sistema é onde o pêndulo é fixado no chão. O ângulo teta é zero na posição estável (e pi na posição instável / objetivo). mé a massa do prumo, lé o comprimento da haste, dé um factor de amortecimento (para simplicidade Pus m=1, l=1, d=0.3)

Meu custo é simples: penalize o controle + o erro final.

É assim que eu chamo a função ilqr

tspan = [0 10];
dt = 0.01;
steps = floor(tspan(2)/dt);
x0 = [pi/4; 0];
umin = -3; umax = 3;
[x_, u_, L, J_opt ] = ilqg_det(@ilqr_fnDyn, @ilqr_fnCost, dt, steps, x0, 0, umin, umax);

Esta é a saída

Tempo De 0 a 10. Condições iniciais: (0.785398,0.000000). Objetivo: (-3.141593,0.000000) Comprimento: 1.000000, massa: 1.000000, amortecimento: 0.300000

Usando o controle LQR iterativo

Iterações = 5; Custo = 88230673.8003

a trajetória nominal (que é a trajetória ideal que o controle encontra) é

Trajetória ideal do ILQR

O controle está "desligado" ... nem tenta alcançar a meta ... O que estou fazendo de errado? (o algoritmo de Todorov parece funcionar .. pelo menos com seus exemplos)

Respostas:


2

Sem passar por todo o seu código (isso seria muito parecido com um trabalho real), minha intuição é que você ponderou seu esforço de controle com força suficiente para que a coisa de menor custo a fazer é não fazer nada e viver com o erro.

Sim, eu sei - todos os seus pesos explícitos são unidade. Mas ainda assim - tente atribuir um menor peso ao esforço de controle ou um erro de posição maior.

Novamente, sem se aprofundar no seu código, sua função ilrq pode não "entender" a natureza não-linear da coisa que você está controlando. Como tal, pode não haver uma maneira de chegar à posição vertical do pêndulo e, novamente, pode falhar.

A abordagem que você tentou pela primeira vez, colocar a quantidade certa de energia no pêndulo e depois regular de maneira ideal quando o pêndulo estiver ereto, é provavelmente a melhor maneira: você sabe que, na ausência de atrito, um sistema com o perfeito perfeito quantidade de energia vai acabar parada no topo (ainda que brevemente), de modo que parece um bom lugar para começar.


Obrigado pelo seu comentário. Como eu disse, comentando a outra resposta, essa pergunta é bastante antiga e talvez eu deva removê-la. O problema é que nunca a resolvi, mesmo porque mudei para outros algoritmos. Com relação ao seu comentário sobre a energia .. O objetivo real não é controlar um pêndulo invertido, mas usá-lo como um banco de testes para algoritmos de ocp. (sistema de baixa dimensão, mas não linear e instável) #
Francesco

1

O iLQR é um método iterativo, mas na verdade você não parece estar iterando. Todorov fornece um script de teste que deve elucidar a abordagem, embora possa precisar ser personalizado para o seu sistema.


A primeira coisa que tentei quando implementei o método iLQG é o teste todorov e funcionou. Agora .. esta pergunta é do final de janeiro .. talvez eu deveria fechá-lo .. eu movi a partir deste método e de Matlab para métodos de PNL
Francesco

Me desculpe, eu não vi isso antes. Re: fechá-lo, eu recomendaria não fazê-lo, pois outros ainda podem achar útil.
DaemonMaker

11
@DeamonMaker sim .. esta é a razão pela qual eu deixei aberta ... :)
Francesco
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.