간단한 진자를위한 최적의 제어


15

나는 다양한 최적의 제어 방법을 연구하고 있으며 (Matlab에서 구현) 테스트 사례로 (지금은) 간단한 진자를 선택합니다 (상단에 고정). 상단 위치로 제어하려고합니다.

나는 "간단한"피드백 방법 (에너지 제어에 기초한 상승 + 상단 위치에 대한 LQR 안정화)을 사용하여 그것을 제어하고, 상태 궤적이 그림에 표시되어 있습니다 (축 설명을 잊었습니다 : x는 세타, y는 세타입니다) 점.

스윙 업 + LQR 제어 상태 궤적

이제 반복적 인 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

진자의 일부 정보 : 내 시스템의 기원은 진자가 땅에 고정 된 곳입니다. 안정 위치에서 각도 (θ)는 0이고 (불안정한 / 목표 위치에서 pi). m밥의 질량이다 l로드 길이가되는 d감쇠 인자 (간략화를 위해 I 넣어 m=1, l=1, d=0.3)

내 비용은 간단합니다 : 통제 + 최종 오류에 불이익을줍니다.

이것이 내가 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);

이것은 출력입니다

시간 0 ~ 10. 초기 조건 : (0.785398,0.000000). 목표 : (-3.141593,0.000000) 길이 : 1.000000, 질량 : 1.000000, 댐핑 : 0.300000

반복적 LQR 제어 사용

반복 = 5; 비용 = 88230673.8003

공칭 궤적 (컨트롤이 찾은 최적의 궤적)

ILQR 최적 궤적

컨트롤이 "꺼져"있습니다. 심지어 목표에 도달하지도 않습니다. 제가 뭘 잘못하고 있습니까? (Todorov의 알고리즘은 적어도 그의 예제에서 작동하는 것 같습니다.)

답변:


2

모든 코드를 거치지 않고 (실제 작업과 너무 비슷할 것입니다), 내 생각에 가장 적은 비용으로 할 일은 아무것도하지 않고 오류와 함께 사는 것입니다.

예, 알고 있습니다. 귀하의 모든 명시 적 가중치는 단일입니다. 그러나 여전히-제어 노력에 가중치를 낮추거나 위치 오류에 더 높은 가중치를 부여하십시오.

당신의 코드에 깊이 들어 가지 않고, 당신의 ilrq 함수는 당신이 제어하는 ​​것의 비선형 적 특성을 "이해하지"않을 수도 있습니다. 따라서 진자 직립 위치에 도달하는 방법을 찾지 못할 수 있으며 다시 실패 할 수 있습니다.

먼저 진자에 올바른 양의 에너지를 넣고 진자가 일단 세워지면 최적으로 조절하기 위해 시도한 접근법은 아마도 가장 좋은 방법 일 것입니다. 마찰이 없으면 완벽하게 올바른 시스템이 에너지의 양은 여전히 ​​정상적으로 (단순히) 서있을 것이므로 시작하기에 합리적인 장소처럼 보입니다.


당신의 의견에 감사드립니다. 내가 다른 답변을 주석으로 말했듯 이이 질문은 꽤 오래되었고 아마도 그것을 제거해야합니다. 문제는 다른 알고리즘으로 옮겼 기 때문에 결코 해결하지 못했다는 것입니다. 에너지에 대한 귀하의 의견과 관련하여. 실제 목표는 역진자를 제어하는 ​​것이 아니라 ocp 알고리즘을위한 테스트 베드로 사용하는 것입니다. (낮은 차원이지만 비선형적이고 불안정한 시스템)
Francesco

1

iLQR은 반복적 인 방법이지만 실제로 반복되는 것으로 보이지는 않습니다. Todorov는 시스템에 맞게 사용자 정의해야하는 접근 방식을 설명 하는 테스트 스크립트 를 제공합니다.


iLQG 방법을 구현할 때 가장 먼저 시도한 것은 todorov 테스트이며 효과가있었습니다. 이제 ..이 질문은 1 월 말입니다. 아마도 닫아야합니다 ..이 방법과 matlab에서 NLP 방법으로 이동
Francesco

빨리 보지 못해서 미안합니다. 다시 : 닫으면 다른 사람들이 여전히 도움이 될 수 있으므로 닫지 않는 것이 좋습니다.
DaemonMaker 2016 년

1
@DeamonMaker 예 .. 이것이 내가 열어 둔 이유입니다 ... :)
Francesco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.