2016-04-13 9 views
6

मुझे एक्सेलेरोमीटर से कच्चे त्वरण डेटा मिल रहा है और स्थिति प्राप्त करने के लिए इसे एकीकृत करने की कोशिश कर रहा हूं।MATLAB जब त्वरण से वेग तक स्थिति में एकीकृत हो रहा है तो मुझे बहुत उच्च मूल्य मिल रहा है

डेटा प्राप्त करने के लिए उपयोग किया जाने वाला एंड्रॉइड फोन 3 सेकंड के लिए एक सपाट सतह पर सेट होता है ताकि बहाव कम हो सके। मैं आराम की अवधि में त्वरण का मतलब शुरुआत से शून्य करने के लिए लेता हूं। यह ठीक काम करता है, लेकिन जब हम वेग और स्थिति (cumtrapz का उपयोग करके) को एकीकृत करते हैं, तो हम अवास्तविक रूप से उच्च वाई मान (वेग के लिए मीटर/मीटर और स्थिति के लिए मीटर) प्राप्त कर रहे हैं।

कच्चा डेटा फ़ोन पर एक निश्चित रूप से लहरा रहा है गति।

क्या किसी के पास विचार है कि स्थिति इतनी उच्च मूल्य क्यों प्राप्त करती है? नीचे दिए गए ग्राफ दिखाए गए हैं जो मैंने वर्णित किए हैं और साथ ही मेरे कोड।

संपादित करें: यहां तक ​​कि जब फोन घुमाया नहीं जाता है, तो मूल्य अवास्तविक होते हैं और यह संकेत नहीं देते कि फ़ोन कैसे स्थानांतरित हो जाता है। संलग्न चित्रों में, फोन को एक सपाट सतह पर एक बॉक्स के आकार में स्थानांतरित किया गया था जिसमें कोई रोटेशन शामिल नहीं था।

%VarName2 = accelerometer values in X direction 
    %VarName3 = accelerometer values in Y direction 
    %VarName4 = accelerometer values in Z direction 
    %elapsedArray = time values for each sample of accelerometer data 

    ddx = VarName2 - mean(VarName2(1:limit)); 
    ddx = ddx(1:length(ddx)-200); 
    elapsedArray = elapsedArray(1:length(elapsedArray)-200); 
    ddy = VarName3 - mean(VarName3(1:limit)); 
    ddy = ddy(1:length(ddy)-200); 
    ddz = VarName4 - mean(VarName4(1:limit)); 
    ddz = ddz(1:length(ddz)-200); 

    velX = cumtrapz(ddx .* elapsedArray); 
    velY = cumtrapz(ddy .* elapsedArray); 
    velZ = cumtrapz(ddz .* elapsedArray); 

    dx = velX - mean(velX(1:limit)); 
    dy = velY - mean(velY(1:limit)); 
    dz = velZ - mean(velZ(1:limit)); 

    posX = cumtrapz(dx .* elapsedArray); 
    posY = cumtrapz(dy .* elapsedArray); 
    posZ = cumtrapz(dz .* elapsedArray); 

    x = posX - mean(posX(1:limit)); 
    y = posY - mean(posY(1:limit)); 
    z = posZ - mean(posZ(1:limit)); 

    figure; 
    plot(ddx); 
    title('Acceleration in X') 
    xlabel('Time (sec)') 
    ylabel('Acc (meters squared'); 

    figure; 
    plot(dx); 
    title('Velocity in X') 
    xlabel('Time (sec)') 
    ylabel('Velocity (meters)'); 

    figure; 
    plot(x); 
    title('Position X') 
    xlabel('Time (sec)') 
    ylabel('Position (meters)'); 

    figure; 
    plot(y); 
    title('Position Y') 
    xlabel('Time (sec)') 
    ylabel('Position (meters)'); 

    figure; 
    plot(z); 
    title('Position Z') 
    xlabel('Time (sec)') 
    ylabel('Position (meters)'); 

एक्स दिशा

Acceleration in X direction

वेग और एक्स दिशा में स्थिति में त्वरण

Velocity and Position in X direction

Acceleration of Box test in X direction

Velocity of Box test in X direction

Position of Box test in X direction

+0

आप प्रारंभिक साजिश है कि वाकई * वास्तव में:

यहाँ एक गूगल टेक टॉक इस मुद्दे समझा रहा है? इसके अलावा आपके एक्सेलेरोमीटर की नमूना अवधि क्या है? मुझे लगता है कि आपका एक्स अक्ष गलत है (यानी आप सीधे 13 मिनट के लिए फोन हिला नहीं रहे थे)। यदि आप थे, तो आप किस आवृत्ति पर फोन हिला रहे थे? (आप समय में undersampling रास्ता हो सकता है) – Suever

+0

हां, प्रारंभिक साजिश त्वरण है क्योंकि यह सीधे एक्सेलेरोमीटर से नमूने। नमूना अवधि एक सेकंड के लगभग 100 वें नमूने का नमूना देती है और एक्स अक्ष समय सारणी की अनुक्रमणिका है, इसलिए वे एक दूसरे के प्रत्येक 1/100 वें के अनुरूप हैं। एक्स-अक्ष लेबल अभी भी पिछले परीक्षण से कुछ सेकंड कहता है - क्षमा करें। –

+0

क्या आप वाकई फोन को घुमाने के दौरान घूर्णन नहीं कर रहे हैं?एक्सेलेरोमीटर एक निश्चित धुरी के साथ माप रहा है, और यदि आप फोन को घुमाते हैं तो इस समन्वय फ्रेम में एक्स-अक्ष आपके नमूना खिड़की के दौरान स्थिर नहीं है (पृथ्वी-निर्धारित फ्रेम के संबंध में)। – mikkola

उत्तर

1

क्या आप देख रहे हैं समय का परिवर्तन का परिणाम है। आइए मान लें कि आपके द्वारा मापने वाले एक्सेलेरोमीटर रीडिंग में हर समय बिंदु पर बहुत छोटी त्रुटि होती है, डीईआरआर। एक बार जब आप वेग प्राप्त करने के लिए इन मानों को एकीकृत कर लेते हैं, तो प्रत्येक समय बिंदु पर त्रुटि को कारक टी से गुणा किया जाएगा। स्थिति प्राप्त करने के लिए दूसरी बार एकीकृत करने से मूल त्रुटि को टी^2 के कारक से गुणा किया जाएगा। इसलिए, प्रत्येक समय बिंदु पर त्रुटि dErr (टी) * टी^2 पर प्रचारित होगी।

स्थिति के लिए एक अच्छा अनुमान प्राप्त करने के लिए, आप स्थिति के बारे में पूर्व जानकारी को शामिल करने का प्रयास कर सकते हैं, लेकिन संभवतः एक्सेलेरोमीटर और जीरोस्कोप डेटा के संयोजन का उपयोग करना होगा। आपको कलमैन फ़िल्टर में भी देखना होगा। * त्वरण https://youtu.be/C7JQ7Rpwn2k?t=23m33s

+0

हालांकि यह एक असली घटना है, यह ओपी के परिणामों के लिए स्पष्टीकरण नहीं है। जैसा कि आप देख सकते हैं, तालिका-शीर्ष प्रयोग के परिणाम काफी अच्छे लगते हैं, और बहाव की समस्या से पीड़ित नहीं होते हैं। ओपी के प्रयोग के लिए समय सीमा की तुलना में बहुत अधिक बहाव त्रुटि को जमा करने में काफी समय लगता है। – gariepy

+1

मैंने पहले से ही ऐसी समस्या पर काम किया है जहां मैंने एंड्रॉइड घड़ी पर एक्सेलेरोमीटर मानों का उपयोग करके स्थिति का अनुमान लगाने की कोशिश की थी। सेंसर स्थिति का एक अच्छा अनुमान देने के लिए पर्याप्त सटीक नहीं हैं और कम समय सीमा में बहाव त्रुटियां जोड़ती हैं। यहां इस विषय पर एक और पोस्ट है: http://electronics.stackexchange.com/questions/156192/accelerometer-double-integration-error –

+0

दिलचस्प ... इस पोस्ट में एक अच्छा बिंदु जिसे गुरुत्वाकर्षण के बारे में @ मिक्कोला द्वारा भी बनाया गया था त्वरण का घटक। – gariepy

संबंधित मुद्दे