Tôi đang nghiên cứu các phương pháp điều khiển tối ưu khác nhau (và thực hiện chúng trong Matlab), và như trường hợp thử nghiệm tôi chọn (hiện tại) một con lắc đơn giản (cố định với mặt đất), mà tôi muốn điều khiển ở vị trí trên.
Tôi đã quản lý để điều khiển nó bằng phương pháp phản hồi "đơn giản" (xoay lên dựa trên kiểm soát năng lượng + ổn định LQR cho vị trí trên) và quỹ đạo trạng thái được hiển thị trong hình (Tôi quên mô tả trục: x là theta, y là theta dấu chấm.
Bây giờ tôi muốn thử một phương pháp kiểm soát tối ưu "đầy đủ", bắt đầu bằng phương pháp LQR lặp (mà tôi thấy được triển khai ở đây http://homes.cs.washington.edu/~todorov/software/ilqg_det.m )
Phương pháp này yêu cầu một hàm động và một hàm chi phí ( x = [theta; theta_dot], u
là mô-men xoắn động cơ (chỉ một động cơ)):
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
Một số thông tin về con lắc: nguồn gốc của hệ thống của tôi là nơi con lắc được cố định với mặt đất. Góc theta bằng 0 ở vị trí ổn định (và pi ở vị trí không ổn định / mục tiêu).
m
là khối lượng bob, l
là chiều dài thanh, d
là một yếu tố giảm xóc (vì đơn giản tôi đưa m=1
, l=1
, d=0.3
)
Chi phí của tôi rất đơn giản: phạt kiểm soát + lỗi cuối cùng.
Đây là cách tôi gọi hàm 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);
Đây là đầu ra
Thời gian từ 0 đến 10. Điều kiện ban đầu: (0.785398,0.000000). Mục tiêu: (-3,141593,0.000000) Chiều dài: 1.000000, khối lượng: 1.000000, giảm xóc: 0.300000
Sử dụng điều khiển LQR lặp
Lặp lại = 5; Chi phí = 88230673.8003
quỹ đạo danh nghĩa (đó là quỹ đạo tối ưu mà điều khiển tìm thấy) là
Kiểm soát là "tắt" ... thậm chí không cố gắng đạt được mục tiêu ... Tôi đang làm gì sai? (thuật toán từ Todorov dường như hoạt động .. ít nhất là với các ví dụ của anh ấy)