나는 다양한 최적의 제어 방법을 연구하고 있으며 (Matlab에서 구현) 테스트 사례로 (지금은) 간단한 진자를 선택합니다 (상단에 고정). 상단 위치로 제어하려고합니다.
나는 "간단한"피드백 방법 (에너지 제어에 기초한 상승 + 상단 위치에 대한 LQR 안정화)을 사용하여 그것을 제어하고, 상태 궤적이 그림에 표시되어 있습니다 (축 설명을 잊었습니다 : x는 세타, y는 세타입니다) 점.
이제 반복적 인 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
공칭 궤적 (컨트롤이 찾은 최적의 궤적)
컨트롤이 "꺼져"있습니다. 심지어 목표에 도달하지도 않습니다. 제가 뭘 잘못하고 있습니까? (Todorov의 알고리즘은 적어도 그의 예제에서 작동하는 것 같습니다.)