EKF-SLAM अपडेट कदम, कलमन गेन एकवचन बन जाता है


16

मैं SLAM के लिए एक EKF का उपयोग कर रहा हूं और मुझे अद्यतन चरण में कुछ समस्या हो रही है। मुझे एक चेतावनी मिल रही है कि K एकवचन है, का rcondमूल्यांकन करता है near eps or NaN। मुझे लगता है कि मैंने समस्या को जेड के व्युत्क्रम में ट्रेस किया है। क्या अंतिम कार्यकाल के बिना कलमैन लाभ की गणना करने का एक तरीका है?

मैं 100% सकारात्मक नहीं हूं यह समस्या का कारण है, इसलिए मैंने अपना पूरा कोड भी यहां डाल दिया है । मुख्य प्रवेश बिंदु slam2d है।

function [ x, P ] = expectation( x, P, lmk_idx, observation)
    % expectation
    r_idx = [1;2;3];
    rl = [r_idx; lmk_idx];

    [e, E_r, E_l] = project(x(r), x(lmk_idx)); 
    E_rl = [E_r E_l];
    E = E_rl * P(rl,rl) * E_rl';

    % innovation
    z = observation - e;
    Z = E;

    % Kalman gain
    K = P(:, rl) * E_rl' * Z^-1;

    % update
    x = x + K * z;
    P = P - K * Z * K';
end


function [y, Y_r, Y_p] = project(r, p)     
    [p_r, PR_r, PR_p] = toFrame2D(r, p);
    [y, Y_pr]   = scan(p_r);
    Y_r = Y_pr * PR_r;
    Y_p = Y_pr * PR_p;    
end


function [p_r, PR_r, PR_p] = toFrame2D(r , p)
    t = r(1:2);
    a = r(3);
    R = [cos(a) -sin(a) ; sin(a) cos(a)];
    p_r = R' * (p - t);
    px = p(1);
    py = p(2);
    x = t(1);
    y = t(2);
    PR_r = [...
        [ -cos(a), -sin(a),   cos(a)*(py - y) - sin(a)*(px - x)]
        [  sin(a), -cos(a), - cos(a)*(px - x) - sin(a)*(py - y)]];
    PR_p = R';    
end


function [y, Y_x] = scan(x)
    px = x(1);
    py = x(2);
    d = sqrt(px^2 + py^2);
    a = atan2(py, px);
    y = [d;a];
    Y_x =[...
    [     px/(px^2 + py^2)^(1/2), py/(px^2 + py^2)^(1/2)]
    [ -py/(px^2*(py^2/px^2 + 1)), 1/(px*(py^2/px^2 + 1))]];
end

संपादन: project(x(r), x(lmk))होना चाहिए था project(x(r), x(lmk_idx))और अब ऊपर ठीक किया गया है।

K थोड़ी देर के बाद विलक्षण हो जाता है, लेकिन तुरंत नहीं। मुझे लगता है कि यह लगभग 20 सेकंड या तो है। मैं आज रात को घर आने पर और परिणामों को पोस्ट करने के लिए सुझाए गए @ जोश में बदलाव की कोशिश करूँगा।

अपडेट 1:

7 एक्स 2(P(rl,rl) * E_rl') * inv( Z )5 एक्स 2

K 4.82 सेकंड के बाद 50Hz (241 कदम) पर माप के साथ एकवचन बन जाता है। यहाँ सलाह के बाद , मैंने कोशिश की K = (P(:, rl) * E_rl')/Zकि K विलक्षण होने के बारे में चेतावनी देने से पहले 250 चरणों में परिणाम दिया जाए।

यह बताता है कि समस्या मैट्रिक्स के उलट होने के साथ नहीं है, लेकिन यह कहीं और है जो समस्या का कारण है।

अपडेट २

मेरा मुख्य लूप है (एक्स, पी और लैंडमार्क पॉइंटर्स को स्टोर करने के लिए एक रोबोट ऑब्जेक्ट के साथ):

for t = 0:sample_time:max_time
    P = robot.P;
    x = robot.x;
    lmks = robot.lmks;
    mapspace = robot.mapspace;

    u = robot.control(t);
    m = robot.measure(t);

    % Added to show eigenvalues at each step
    [val, vec] = eig(P);
    disp('***')
    disp(val)

    %%% Motion/Prediction
    [x, P] = predict(x, P, u, dt);

    %%% Correction
    lids = intersect(m(1,:), lmks(1,:));  % find all observed landmarks
    lids_new = setdiff(m(1,:), lmks(1,:));
    for lid = lids
        % expectation
        idx = find (lmks(1,:) == lid, 1);
        lmk = lmks(2:3, idx);
        mid = m(1,:) == lid;
        yi = m(2:3, mid);

        [x, P] = expectation(x, P, lmk, yi);
    end  %end correction

    %%% New Landmarks

    for id = 1:length(lids_new)
    % if id ~= 0
        lid = lids_new(id);
        lmk = find(lmks(1,:)==false, 1);
        s = find(mapspace, 2);
        if ~isempty(s)
            mapspace(s) = 0;
            lmks(:,lmk) = [lid; s'];
            yi = m(2:3,m(1,:) == lid);

            [x(s), L_r, L_y] = backProject(x(r), yi);

            P(s,:) = L_r * P(r,:);
            P(:,s) = [P(s,:)'; eye(2)];
            P(s,s) = L_r * P(r,r) * L_r';
        end
    end  % end new landmarks

    %%% Save State
    robot.save_state(x, P, mapspace, lmks)
    end  
end

इस लूप के अंत में, मैं x और P को रोबोट में वापस सहेजता हूं, इसलिए मुझे विश्वास है कि मैं प्रत्येक प्रवाह के माध्यम से सहसंयोजक का प्रचार कर रहा हूं।

10-2


1
क्या आप अनिश्चितता का प्रचार कर रहे हैं? क्या आपके सहसंयोजक के स्वदेशी रूप से छोटे या बड़े होते हैं?
जोश वेंडर हुक

1
आप पास्टबिन में जो डालते हैं, वह आइगेनवेक्टर है, न कि आइजनवेल्स। ऐसा करें: [v, d] = eig (P) disp (diag (घ))। या सिर्फ डिस (eig (P))। फिर, आप निम्न आवश्यक शर्तों की जांच कर सकते हैं: क्या हर कदम पर सभी प्रतिजन> 0 हैं (उन्हें अभ्यास में होना चाहिए)। क्या वे माप / सुधार के बाद प्रसार और कमी के बाद बढ़ जाते हैं ? मेरे अनुभव में, यह आमतौर पर समस्या है।
जोश वेंडर हुक

2
कुछ गलत है अगर आपके eigenvalues ​​नकारात्मक हैं। जब आप किसी लैंडमार्क को इनिशियलाइज़ करते हैं, तो पहले से अनुमानित स्थिति से जुड़ी अनिश्चितता क्या है?
जोश वैंडर हुक

अवलोकन एक जोड़ी है। जब पहले लैंडमार्क को इनिशियलाइज़ किया जाता है, तो इसमें [5.8938, 3.0941 का सहसंयोजक होता है; 3.0941, 2.9562]। दूसरे के लिए, यह सहसंयोजक है [22.6630 -14.3822; -१४.३ matrix२२, १०.५४4४] पूर्ण मैट्रिक्स यहां है
मंक

जवाबों:


5

मैं अभी आपकी पोस्ट देख रहा हूं और यह वास्तव में आपकी मदद करने के लिए बहुत देर हो चुकी है ... लेकिन अगर आप अभी भी इस में रुचि रखते हैं: मुझे लगता है कि मैंने आपकी समस्या की पहचान की है।

आप निम्न तरीके से इनोवेशन कोवरिएन मैट्रिक्स को लिखते हैं

E = jacobian measure * P * jacobian measure

यह सिद्धांत में ठीक हो सकता है लेकिन क्या होता है कि यदि आपका एल्गोरिथ्म प्रभावी है और खासकर यदि आप एक सिमुलेशन पर काम कर रहे हैं: अनिश्चितता घट जाएगी, खासकर आपके माप की दिशाओं में। तो Eचलेंगे [[0,0][0,0]]

इस समस्या से बचने के लिए आप माप में अनिश्चितताओं के अनुरूप माप शोर जोड़ सकते हैं और आपकी नवीनता कोवेरियन हो जाती है

E= Jac*P*Jac'+R

जहां Rमाप शोर के सहप्रसरण (विकर्ण मैट्रिक्स जहां विकर्ण पर मामले शोर का मानक विचलन के वर्गों रहे हैं) है। यदि आप वास्तव में शोर पर विचार नहीं करना चाहते हैं तो आप इसे जितना चाहें उतना छोटा बना सकते हैं।

मैं यह भी जोड़ता हूं कि आपका कोविरियस अपडेट मुझे अजीब लगता है क्योंकि शास्त्रीय सूत्र है:

P=P - K * jacobian measure * P

मैंने कभी भी आपके सूत्र को कहीं और लिखा हुआ नहीं देखा, मैं सही हो सकता हूं लेकिन अगर आप इसके बारे में सुनिश्चित नहीं हैं तो आपको इसकी जांच करनी चाहिए।


आह, पुराने "नमक द कोवरियन" चाल।
जोश वेंडर हुक

1

KP(एनआर+एनएल)×(एनआर+एनएल)एनआरएनएल

K = P(:, rl) * E_rl' * Z^-1

जो मुझे लगता है कि होना चाहिए

(P(rl,rl) * E_rl') * inv(Z)

(देखें: मैट्रिक्स विभाजन )। के आकार की जाँच करें K

इसके अलावा: कृपया थोड़ी और जानकारी प्रदान करें: क्या Kएकवचन तुरंत या केवल कुछ समय बाद आता है?

यह मुझे चिंतित करता है: project(x(r), x(lmk));चूंकि lmkपरिभाषित नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.