एक सरल पेंडुलम के लिए इष्टतम नियंत्रण


15

मैं विभिन्न इष्टतम नियंत्रण विधियों का अध्ययन कर रहा हूं (और उन्हें माटलब में लागू करता है), और परीक्षण के मामले के रूप में मैं (अब के लिए) एक साधारण पेंडुलम (जमीन पर तय) चुनता हूं, जिसे मैं ऊपरी स्थिति पर नियंत्रण करना चाहता हूं।

मैंने इसे "सरल" फीडबैक विधि (ऊपरी स्थिति के लिए ऊर्जा नियंत्रण + 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

नाममात्र प्रक्षेपवक्र (जो इष्टतम प्रक्षेपवक्र नियंत्रण पाता है) है

ILQR इष्टतम प्रक्षेपवक्र

नियंत्रण "बंद" है ... यह लक्ष्य तक पहुंचने की कोशिश भी नहीं करता है ... मैं क्या गलत कर रहा हूं? (टोडोरोव से एल्गोरिदम काम करने लगता है .. कम से कम उसके उदाहरणों के साथ)

जवाबों:


2

आपके सभी कोड के माध्यम से जाने के बिना (जो कि वास्तविक काम की तरह बहुत अधिक होगा), मेरी आंत महसूस करती है कि आपने अपने नियंत्रण प्रयास को बहुत अधिक भारित किया है कि कम से कम लागत वाली चीज कुछ भी नहीं करना है और त्रुटि के साथ जीना है।

हां, मुझे पता है - आपके सभी स्पष्ट वजन एकता हैं। लेकिन फिर भी - नियंत्रण के प्रयास को कम वजन देने की कोशिश करें, या स्थिति में त्रुटि अधिक है।

आपके कोड में गहराई से आए बिना, आपका ilrq फ़ंक्शन आपके द्वारा नियंत्रित की जाने वाली चीज़ के अशुद्ध स्वरूप को "समझ" नहीं सकता है। इस प्रकार, यह पेंडुलम को सीधी स्थिति में लाने का एक रास्ता नहीं देख सकता है, और फिर से, यह विफल हो सकता है।

जिस दृष्टिकोण को आपने पहली बार आज़माया था, वह ऊर्जा की सही मात्रा को पेंडुलम में डालने के लिए, फिर एक बार पेंडुलम को सीधा करने के लिए बेहतर तरीके से विनियमित करें, शायद यह सबसे अच्छा तरीका है: आप जानते हैं कि घर्षण की अनुपस्थिति में, एक प्रणाली पूरी तरह से सही है ऊर्जा की मात्रा अभी भी शीर्ष पर (हालांकि संक्षेप में) समाप्त होने जा रही है, इसलिए यह शुरू करने के लिए एक समझदार जगह होगी।


आपकी टिप्पणी के लिये धन्यवाद। जैसा कि मैंने कहा कि अन्य उत्तर पर टिप्पणी करना यह प्रश्न काफी पुराना है और शायद मुझे इसे हटा देना चाहिए। समस्या यह है कि मैंने इसे कभी हल नहीं किया, यहां तक ​​कि क्योंकि मैं अन्य एल्गोरिदम में चला गया। ऊर्जा के बारे में आपकी टिप्पणी के बारे में .. असली लक्ष्य एक उल्टे पेंडुलम को नियंत्रित करना नहीं है, बल्कि इसे ऑस्पेट एल्गोरिदम के लिए परीक्षण बिस्तर के रूप में उपयोग करना है। (कम आयाम लेकिन गैर-रैखिक और अस्थिर प्रणाली)
फ्रांसेस्को

1

iLQR एक पुनरावृत्त विधि है लेकिन आप वास्तव में पुनरावृत्ति करते नहीं दिखाई देते हैं। टोडोरोव एक परीक्षण स्क्रिप्ट की आपूर्ति करता है जिसे दृष्टिकोण को स्पष्ट करना चाहिए हालांकि इसे आपके सिस्टम के लिए अनुकूलित करने की आवश्यकता हो सकती है।


जब मैंने iLQG मेथड को लागू किया तो पहली चीज मैंने टॉडोरोव परीक्षण की थी और यह काम किया। अब .. यह प्रश्न जनवरी के अंत का है .. शायद मुझे इसे बंद कर देना चाहिए .. मैं इस विधि से और matlab से NLP विधियों में चला गया
फ्रांसेस्को

मुझे खेद है कि मैंने इसे जल्द नहीं देखा। पुन: इसे बंद करना, मैं ऐसा करने के खिलाफ सिफारिश करूंगा क्योंकि अन्य अभी भी इसे मददगार मिल सकते हैं।
डेमनमेकर

1
@DeamonMaker हाँ .. यही कारण है कि मैंने इसे खुला छोड़ दिया ... :)
फ्रांसेस्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.