Điều khiển tối ưu cho một con lắc đơn giản


15

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.

Xoay lên + quỹ đạo kiểm soát trạng thái LQR

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], ulà 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). mlà khối lượng bob, llà chiều dài thanh, dlà 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à

Quỹ đạo tối ưu ILQR

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)

Câu trả lời:


2

Không xem qua tất cả mã của bạn (điều đó sẽ quá giống với công việc thực tế), tôi cảm thấy rằng bạn đã cân nhắc nỗ lực kiểm soát của mình đủ lớn để điều ít tốn kém nhất là không làm gì và sống với lỗi.

Vâng, tôi biết - tất cả các trọng lượng rõ ràng của bạn là sự thống nhất. Nhưng vẫn vậy - hãy thử cho nỗ lực kiểm soát có trọng lượng thấp hơn hoặc lỗi vị trí cao hơn.

Một lần nữa mà không đi sâu vào mã của bạn, hàm ilrq của bạn có thể không "hiểu" bản chất phi tuyến của thứ bạn đang kiểm soát. Như vậy, nó có thể không thấy cách nào để đến vị trí con lắc thẳng đứng, và một lần nữa, nó có thể thất bại.

Cách tiếp cận mà bạn đã thử trước tiên, để đưa một lượng năng lượng vừa phải vào con lắc, sau đó điều chỉnh tối ưu một khi con lắc được dựng lên, có lẽ là cách tốt nhất: bạn biết rằng trong trường hợp không có ma sát, một hệ thống hoàn toàn đúng lượng năng lượng cuối cùng sẽ đứng yên trên đỉnh (tuy nhiên ngắn gọn), vì vậy đó dường như là một nơi hợp lý để bắt đầu.


Cảm ơn bình luận của bạn. Như tôi đã nói bình luận câu trả lời khác câu hỏi này khá cũ và có lẽ tôi nên loại bỏ nó .. Vấn đề là tôi không bao giờ giải quyết nó, ngay cả khi tôi chuyển sang các thuật toán khác. Về nhận xét của bạn về năng lượng .. Mục tiêu thực sự không phải là điều khiển một con lắc ngược, mà là sử dụng nó làm giường thử nghiệm cho các thuật toán ocp. (kích thước thấp nhưng hệ thống phi tuyến tính và không ổn định)
Francesco

1

iLQR là một phương pháp lặp nhưng trên thực tế bạn dường như không lặp lại. Todorov cung cấp một kịch bản thử nghiệm sẽ làm sáng tỏ cách tiếp cận mặc dù nó có thể cần được tùy chỉnh cho hệ thống của bạn.


Điều đầu tiên tôi đã thử khi tôi thực hiện phương pháp iLQG là thử nghiệm todorov và nó đã hoạt động. Bây giờ .. câu hỏi này là vào cuối tháng 1 .. có lẽ tôi nên đóng nó lại .. Tôi đã chuyển từ phương pháp này và từ phương pháp matlab sang phương pháp NLP
Francesco

Tôi xin lỗi tôi đã không nhìn thấy nó sớm hơn. Re: đóng nó, tôi khuyên bạn không nên làm như vậy vì những người khác vẫn có thể thấy nó hữu ích.
DaemonMaker

1
@DeamonMaker yeah .. đây là lý do tại sao tôi để nó mở ... :)
Francesco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.