कलमन फ़िल्टर - कार्यान्वयन, पैरामीटर और ट्यूनिंग


10

सबसे पहले, यह पहली बार है जब मैं कलमन फ़िल्टर बनाने की कोशिश करता हूं।

मैंने पहले follwoing सवाल पोस्ट किया था StackOverflow पर गति मानों से शोर और विविधताओं को फ़िल्टर करें जो इस पोस्ट के लिए पृष्ठभूमि का वर्णन करता है। यह उन मूल्यों का एक विशिष्ट नमूना है जिसे मैं फ़िल्टर करने का प्रयास कर रहा हूं। जरूरी नहीं कि वे घटें जो कि यहां है। लेकिन बदलाव की दर आम तौर पर इस तरह होती है

X ------- Y
16 --- 233.75
24 --- 234.01
26 --- 234.33
32 --- 234.12
36 --- 233.85
39 --- 233.42
47 --- 233.69
52 --- 233.68
55 --- 233.76
60 --- 232.97
66 --- 233.31
72 --- 233.99

मैंने इस ट्यूटोरियल के अनुसार अपना कलमन फ़िल्टर लागू किया है: डम्मीज़ के लिए कलमन फ़िल्टर

मेरा कार्यान्वयन इस तरह दिखता है (स्यूडोकोड)।

//Standard deviation is 0.05. Used in calculation of Kalman gain

void updateAngle(double lastAngle){
  if(firsTimeRunning==true)
     priorEstimate = 0;               //estimate is the old one here
     priorErrorVariance = 1.2;        //errorCovariance is the old one
  else
     priorEstimate = estimate;              //estimate is the old one here
     priorErrorVariance = errorCovariance;  //errorCovariance is the old one
  rawValue = lastAngle;          //lastAngle is the newest Y-value recieved
  kalmanGain = priorErrorVariance / (priorErrVariance + 0.05);
  estimate = priorEstimate + (kalmanGain * (rawValue - priorEstimate));
  errorCovariance = (1 - kalmanGain) * priorErrVariance;
  angle = estimate;              //angle is the variable I want to update
}                                //which will be lastAngle next time

मैं 0. के पूर्व अनुमान से शुरू करता हूं। यह ठीक काम करता है। लेकिन मुझे क्या ध्यान है कि कलमनगैन हर बार इस अपडेट के चलने पर कम हो जाएगा, जिसका अर्थ है कि मैं अपने नए मूल्यों पर भरोसा करता हूं जब तक मेरा फ़िल्टर चल रहा है (?)। मैं ऐसा नहीं चाहता।

मैं सिर्फ एक चलती औसत (सरल और घातीय भार) का उपयोग करके इस का उपयोग करने से गया था। अभी मैं भी उतने अच्छे परिणाम प्राप्त नहीं कर पाया जितना कि किया।

मेरा प्रश्न यह है कि क्या यह सही क्रियान्वयन है और यदि मेरे द्वारा पोस्ट किए गए नमूना मूल्यों के अनुसार मेरी पूर्व त्रुटि विचलन और मानक विचलन अच्छा है? मेरे मापदंडों को वास्तव में सिर्फ यादृच्छिक रूप से देखने के लिए चुना जाता है कि क्या मुझे कुछ अच्छे परिणाम मिल सकते हैं। मैंने कई अलग-अलग श्रेणियों की कोशिश की है लेकिन खराब परिणामों के साथ। यदि आपके पास मेरे द्वारा किए जाने वाले परिवर्तनों के बारे में कोई सुझाव है, तो यह वास्तव में सराहना होगी। अगर कुछ स्पष्ट चीजें गायब हैं तो मुझे खेद है। पहली बार यहां पोस्टिंग भी।

जवाबों:


5

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

उस के साथ कहा, यह आपके प्रश्न से स्पष्ट नहीं है कि क्या आपके पास ऐसा कोई अंतर्निहित मॉडल है। लिंक किए गए पोस्ट ने संकेत दिया कि आप सेंसर से गति मान का उपभोग कर रहे हैं। इन्हें सिस्टम के राज्य (जहां राज्य इसकी गति है) की प्रत्यक्ष टिप्पणियों के रूप में देखा जा सकता है, या अपने राज्य की अप्रत्यक्ष टिप्पणियों (जहां राज्य इसकी स्थिति है, उदाहरण के लिए)। लेकिन, कलमन फ्रेमवर्क का उपयोग करने के लिए, आपको एक मॉडल चुनने की आवश्यकता है कि समय बीतने के साथ-साथ उस स्थिति को कैसे विकसित होने की उम्मीद है; इष्टतम अनुमान उत्पन्न करने के लिए इस अतिरिक्त जानकारी का उपयोग किया जाता है। एक कलमन फ़िल्टर एक जादुई ब्लैक बॉक्स नहीं है जो कि केवल एक सिग्नल को "क्लीन अप" करेगा जो उस पर लागू होता है।

इसके साथ ही, उस घटना से, जिसे आपने माना था, जहां कलामन फ़िल्टर अपने स्वयं के आउटपुट में उस बिंदु तक तेजी से आश्वस्त हो जाएगा जहां इनपुट टिप्पणियों को उत्तरोत्तर अनदेखा किया जाता है, व्यवहार में होता है। इस प्रक्रिया शोर covariance मैट्रिक्स में मूल्यों को मैन्युअल रूप से बढ़ाकर इसे कम किया जा सकता है। फिर, गुणात्मक रूप से, सिस्टम के राज्य संक्रमण के लिए मॉडल में एक बड़ा स्टोकेस्टिक घटक होता है, इसलिए अनुमानक के लिए वर्तमान राज्य को दिए गए अगले राज्य की सटीक भविष्यवाणी करने की क्षमता कम हो जाती है। यह सिस्टम स्थिति के अपने वर्तमान अनुमान पर निर्भरता को कम करेगा और बाद के अवलोकनों पर अपनी निर्भरता को बढ़ाएगा, जिससे "इनपुट" प्रभाव को अनदेखा किया जा सके।


+1: विशेष रूप से अंतिम पैराग्राफ। केएफ डिजाइन में शोर कोविरियन को "घुंडी" के रूप में ट्विस्ट करने के बारे में सोचें।
पीटर के.एच.

4

अगर मैंने इसे सही ढंग से समझा, तो आपके पास कुछ है जो गतिमान है और आप गति का निरीक्षण कर सकते हैं और यह गति शोर है। अपने माप से, आप 2 प्रकार की विविधताएँ देखते हैं। \ _

  1. शोर के कारण भिन्नता
  2. विविधताएं क्योंकि वस्तु वास्तव में गति को बदल रही है (जैसे मोड़)

आपके कलमैन का लाभ शून्य होने का कारण यह है कि आपने अनुमान लगाया है कि वस्तु की गति स्थिर है और आपको इस वास्तविक गति का अनुमान लगाने की आवश्यकता है।

" अरे, मेरे पास एक ऐसी वस्तु है जो निरंतर गति से घूम रही है और मैं इस निरंतर गति का अनुमान लगाना चाहता हूं "

आपका मॉडल ऐसा है, जहां एक्स समय पर गति है तथा y इसी माप है।

एक्स=एक्स-1
y=एक्स+क्ष

लेकिन आपकी वस्तु इस तरह नहीं बढ़ रही है। यह गति बदल रही है और आपको नहीं पता कि यह कब और कैसे बदलने वाला है।

इसके बजाय आपको क्या कहना है:

" अरे, मेरे पास एक ऐसी वस्तु है जो गति से आगे बढ़ रही है लेकिन मुझे यकीन नहीं है कि इसकी गति कैसे बदल रही है "

ऐसे कई तरीके हैं जिनसे आप यह कर सकते हैं: सबसे सरल तरीका यह है कि आप अपने राज्य को अनिश्चितता से जोड़ सकते हैं।

एक्स=एक्स-1+v-1आप अनिश्चितता जोड़ें
y=एक्स+क्ष
कहाँ पे क्ष तथा v सफेद शोर माना जाता है।

आपका कलमन फ़िल्टर समीकरण इस तरह दिखेगा:

y^|-1=एक्स^|-1
=पी|-1पी|-1+क्यू
एक्स^|=एक्स^|-1+(y-y^|-1)
पी|=पी|-1-पी|-1
पी+1|=पी|+क्यूरों

आपके मामले में 0.05मान ऑब्जर्वेशन नॉइज़ कोवरियन है,क्यू। यह परिवर्तन करने के लिए आपको बस इतना करना हैक्यूरोंकुछ निरंतर मूल्य के लिए राज्य शोर कोविरेंस (आपके राज्य में असमानता)।

आपके कोड में मामूली संशोधन होगा:

stateVariance = 0.5

errorCovariance = (1 - kalmanGain) * priorErrVariance + stateVariance;

stateVarianceया जोड़कर नहींक्यूरों आपके कोड में आपने मान लिया कि यह शून्य है।

यह stateVarianceमान कुछ भी हो सकता है जो आप चाहते हैं। यह आपके आत्मविश्वास पर आधारित है कि वास्तव में गति कितनी बदल जाएगी। यदि आपको लगता है कि गति काफी स्थिर रहेगी, तो इसे कम संख्या में सेट करें।

इस तरह आपका कलमन गेन शून्य पर नहीं जाएगा।


3

कलमन फ़िल्टर का उपयोग करने के लिए आपको एक गतिशील प्रणाली की आवश्यकता होती है।

मै सुझाव दूंगा

y=Σमैं=0nमैंएक्समैं

[+1]=[]+w
सीv(w)=क्यू
माप:
z=Σमैं=0nमैंएक्समैं=y

इसलिए उपयोग करने के बजाय एक्स राज्यों के रूप में, गुणांक का परिचय () राज्यों के रूप में


1

मुझे लगता है कि आप शास्त्रीय नियंत्रण सिद्धांत, जैसे पीआईडी ​​नियंत्रक से कुछ विचारों का उपयोग कर सकते हैं ।

आपका संकेत Y ​​कंट्रोलर u (t) का सेट पॉइंट हो सकता है। प्रोसेस प्लांट सिर्फ 1 है और y (t) फ़िल्टर किया हुआ आउटपुट होगा। आपको बस इतना करना है कि आप जो चाहते हैं उसे पाने के लिए पैरामीटर (ट्यून) P, I और D सेट करना है।

आउटपुट y (t) इनपुट u (t) को "फॉलो" करने की कोशिश करेगा, लेकिन पैरामीटर नियंत्रित करता है कि यह ट्रैकिंग कैसी होगी।

अंतर लाभ डी तेजी से त्रुटि परिवर्तनों के प्रति आपकी प्रतिक्रिया को संवेदनशील बना देगा। आपके मामले में, मुझे लगता है कि डी को छोटा होना चाहिए। आप नहीं चाहते कि y (t) बदल जाए तो u (t) अचानक बदल जाए।

अभिन्न लाभ 'मैं' आपकी प्रतिक्रिया को संचित त्रुटि के प्रति संवेदनशील बना देगा। आपको वहां उच्च मूल्य रखना चाहिए। यदि u (t) स्तर बदलता है और इसे वहां रखता है, तो त्रुटि का निर्माण होगा और फिर आप y (t) को भी ऐसा करना चाहते हैं।

P लाभ एक अच्छी धुन दे सकता है। वैसे भी, मापदंडों के साथ खेलने की कोशिश करें और देखें कि आपको क्या मिलता है।

हालांकि, जटिल ट्यूनिंग विधियां हैं, लेकिन मुझे विश्वास नहीं है कि आपको इसकी आवश्यकता होगी।

सौभाग्य।


दरअसल, एक बेहतर तरीका है। इस पोस्ट को देखें ।
डैनियल आर। पीपा


1

यहाँ कलमन फ़िल्टर का एक सरल और स्वच्छ कार्यान्वयन है जो विकिपीडिया पृष्ठ की तरह नोटेशन का अनुसरण करता है। https://github.com/zziz/kalman-filter

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