私はさまざまな最適な制御方法を研究しており(Matlabでそれらを実装しています)、テストケースとして(今のところ)単純な振り子(地面に固定)を選択します。
「単純な」フィードバック法(エネルギー制御に基づくスイングアップ+上部位置のLQR安定化)を使用して制御し、状態軌跡を図に示します(軸の説明を忘れました:xはtheta、yはthetaドット。
次に、反復LQRメソッド(ここで実装されていることがわかりましたhttp://homes.cs.washington.edu/~todorov/software/ilqg_det.m)から始めて、「完全な」最適な制御方法を試したいと思います。
この方法には、1つの動的関数と1つのコスト関数x = [theta; theta_dot], u
が必要です(モータートルク(1つのモーターのみ)):
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)。
m
ボブの質量であり、l
ロッドの長さであり、d
減衰係数である(簡単にするために私が入れ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
公称軌道(つまり、コントロールが見つける最適な軌道)は
コントロールは「オフ」です...目標に到達しようとさえしません...何が間違っていますか?(トドロフのアルゴリズムは動作しているようです。少なくとも彼の例では)