मैं विभिन्न इष्टतम नियंत्रण विधियों का अध्ययन कर रहा हूं (और उन्हें माटलब में लागू करता है), और परीक्षण के मामले के रूप में मैं (अब के लिए) एक साधारण पेंडुलम (जमीन पर तय) चुनता हूं, जिसे मैं ऊपरी स्थिति पर नियंत्रण करना चाहता हूं।
मैंने इसे "सरल" फीडबैक विधि (ऊपरी स्थिति के लिए ऊर्जा नियंत्रण + 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
पेंडुलम पर कुछ जानकारी: मेरे सिस्टम की उत्पत्ति वह जगह है जहां पेंडुलम को जमीन पर तय किया गया है। कोण थीटा स्थिर स्थिति में शून्य है (और अस्थिर / लक्ष्य की स्थिति में पाई)।
m
बॉब मास है, l
रॉड की लंबाई है, d
एक भिगोने का कारक है (सादगी के लिए m=1
, जो मैंने डाला l=1
, d=0.3
)
मेरी लागत सरल है: नियंत्रण + अंतिम त्रुटि को दंडित करें।
इसे मैं इल्कर फ़ंक्शन कहता हूं
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
Iterative LQR नियंत्रण का उपयोग करना
Iterations = 5; लागत = 88230673.8003
नाममात्र प्रक्षेपवक्र (जो इष्टतम प्रक्षेपवक्र नियंत्रण पाता है) है
नियंत्रण "बंद" है ... यह लक्ष्य तक पहुंचने की कोशिश भी नहीं करता है ... मैं क्या गलत कर रहा हूं? (टोडोरोव से एल्गोरिदम काम करने लगता है .. कम से कम उसके उदाहरणों के साथ)