2009-07-15 26 views
114

मैं जीपीएस डेटा के साथ काम कर रहा हूं, हर दूसरे मूल्य प्राप्त कर रहा हूं और मानचित्र पर वर्तमान स्थिति प्रदर्शित कर रहा हूं। समस्या यह है कि कभी-कभी (विशेष रूप से जब सटीकता कम होती है) मान अलग-अलग होते हैं, जिससे वर्तमान स्थिति मानचित्र में दूरस्थ बिंदुओं के बीच "कूद" करने के लिए होती है।चिकना जीपीएस डेटा

मैं इससे बचने के लिए कुछ आसान पर्याप्त विधि के बारे में सोच रहा था। एक पहले विचार के रूप में, मैंने कुछ थ्रेसहोल्ड से परे सटीकता वाले मूल्यों को हटाने के बारे में सोचा, लेकिन मुझे लगता है कि ऐसा करने के कुछ और बेहतर तरीके हैं। कार्यक्रमों का यह सामान्य तरीका क्या है?

+0

मैं "जीपीएस शोर 'के बुरे प्रभावों को लगता है जब जुड़े (व्युत्पन्न) जो (के बाद से समय पूर्णांक है विशेष रूप से उच्च नमूना दर tracklogs के लिए बहुत असंतत हैं की गति और ढाल की तरह मान, गणना करने के लिए कोशिश कर रहा है [एक सेकंड] संकल्प)। – heltonbiker

+2

(यदि आप मुख्य सड़कों के माध्यम से नेविगेट कर रहे हैं, तो भी आप "सड़कों पर स्नैप" एल्गोरिदम का उपयोग कर सकते हैं बशर्ते आपके पास एक अच्छा [सही, सटीक] रोडमैप डेटासेट हो। बस एक विचार) – heltonbiker

+0

मुझे सर्वश्रेष्ठ सटीकता के लिए भी इस समस्या का सामना करना पड़ रहा है। – ViruMax

उत्तर

63

जो आप खोज रहे हैं उसे Kalman Filter कहा जाता है। यह अक्सर smooth navigational data पर प्रयोग किया जाता है। यह जरूरी नहीं है, और आप बहुत सी ट्यूनिंग कर सकते हैं, लेकिन यह एक बहुत ही मानक दृष्टिकोण है और अच्छी तरह से काम करता है। एक KFilter library उपलब्ध है जो एक सी ++ कार्यान्वयन है।

मेरा अगला फ़ॉलबैक least squares fit होगा। एक काल्मैन फ़िल्टर डेटा को वेग में ले जाने वाले डेटा को सुचारू बनाएगा, जबकि कम से कम वर्ग फिट दृष्टिकोण केवल स्थितित्मक जानकारी का उपयोग करेगा। फिर भी, इसे लागू करने और समझने के लिए निश्चित रूप से सरल है। ऐसा लगता है कि जीएनयू वैज्ञानिक पुस्तकालय में implementation of this.

+1

धन्यवाद क्रिस। हां, मैंने कुछ खोज करते समय कलमान के बारे में पढ़ा, लेकिन यह निश्चित रूप से मेरे गणित के ज्ञान से थोड़ा सा है। क्या आप किसी भी नमूना कोड को पढ़ने (और समझने में आसान) के बारे में जानते हैं, या बेहतर अभी तक कुछ कार्यान्वयन उपलब्ध हैं? (सी/सी ++/जावा) –

+1

@ अल दुर्भाग्य से कलमन फ़िल्टर के साथ मेरा एकमात्र एक्सपोजर काम के माध्यम से है, इसलिए मेरे पास कुछ अद्भुत सुरुचिपूर्ण कोड है जो मैं आपको नहीं दिखा सकता। –

+0

कोई समस्या नहीं :-) मैंने कोशिश करने की कोशिश की लेकिन किसी कारण से ऐसा लगता है कि यह कलामन चीज काला जादू है। सिद्धांत सिद्धांतों के बहुत सारे लेकिन किसी भी कोड के लिए बहुत कम .. धन्यवाद, अन्य तरीकों का प्रयास करेंगे। –

3

कम गणित/सिद्धांत का उपयोग करने वाली एक विधि एक समय में 2, 5, 7, या 10 डेटा बिंदुओं का नमूना देना और आउटलेटर्स निर्धारित करना है। कलमैन फ़िल्टर की तुलना में बाहरी का एक कम सटीक उपाय निम्नलिखित algorithm का उपयोग बिंदुओं के बीच सभी जोड़ी दूरी को लेने और दूसरों से दूर रहने वाले को बाहर निकालने के लिए करना है। आमतौर पर उन मूल्यों को दूरस्थ मूल्य आप

स्थान ले रही हैं उदाहरण

पाँच नमूना बिंदुओं पर कोमल ए, बी, सी, डी, ई

ATOTAL = दूरी की एबी राशि के लिए के लिए निकटतम मान से बदल रहे हैं एसी ई एई

BTOTAL = दूरी के योग एबी ई.पू. BD BE

CTOTAL = दूरी के योग एसी ई.पू. सीडी सीई

DTOTAL = दूरी के योग डीए डीबी डीसी डे

ETOTAL = दूरी के योग ईए ईबी चुनाव आयोग डे

तो BTOTAL सबसे बड़ा है आप डी के साथ बिंदु बी की जगह लेंगे अगर BD = मिनट {एबी, बीसी, बीडी, BE }

यह चिकनाई आउटलाइन को निर्धारित करता है और स्थिति रेखा को सुचारु बनाने के लिए बिंदु डी के बजाय बीडी के मध्य बिंदु का उपयोग करके बढ़ाया जा सकता है। आपका लाभ भिन्न हो सकता है और अधिक गणितीय कठोर समाधान मौजूद हैं।

+0

धन्यवाद, मैं इसे एक शॉट भी दूंगा। ध्यान दें कि मैं वर्तमान स्थिति को सुगम बनाना चाहता हूं, क्योंकि यह प्रदर्शित किया जा रहा है और कोई भी कुछ डेटा पुनर्प्राप्त करने के लिए उपयोग किया जाता है। मुझे पिछले अंक में दिलचस्पी नहीं है। मेरा मूल विचार भारित साधनों का उपयोग कर रहा था, लेकिन मुझे अभी भी देखना है कि सबसे अच्छा क्या है। –

+1

अल, यह भारित साधनों का एक रूप प्रतीत होता है। यदि आप किसी भी चिकनाई करना चाहते हैं, तो आपको "अतीत" बिंदुओं का उपयोग करने की आवश्यकता होगी, क्योंकि यह जानने के लिए सिस्टम को वर्तमान स्थिति से अधिक होना चाहिए ताकि यह पता चल सके कि कहां चिकनी है। यदि आपका जीपीएस प्रति सेकंड एक बार डेटापॉइंट ले रहा है और आपका उपयोगकर्ता प्रति सेकंड एक बार स्क्रीन पर देखता है, तो आप उसके बिना 5 डेटापॉइंट्स का उपयोग कर सकते हैं! एक चलती औसत केवल एक डीपी द्वारा देरी होगी। – Karl

2

के रूप में कम से कम वर्गों के लिए फिट है, यहाँ कुछ अन्य चीजों के साथ प्रयोग करने के लिए कर रहे हैं: यह है

  1. सिर्फ इसलिए कि कम से कम वर्गों फिट मतलब यह नहीं है कि यह रेखीय हो गया है। आप कम से कम वर्ग-डेटा को एक वर्गबद्ध वक्र फिट कर सकते हैं, फिर यह उस परिदृश्य में फिट होगा जिसमें उपयोगकर्ता तेज हो रहा है। (ध्यान दें कि कम से कम वर्ग फिट है, मेरा मतलब है कि स्वतंत्र चर के रूप में निर्देशांक और समय के रूप में निर्देशांक का उपयोग करना।)

  2. आप रिपोर्ट की गई सटीकता के आधार पर डेटा बिंदुओं को वज़न देने का भी प्रयास कर सकते हैं। जब सटीकता कम वजन कम होती है तो वे डेटा कम होते हैं।

  3. एक और चीज जिसे आप कोशिश करना चाहते हैं, एक बिंदु को प्रदर्शित करने के बजाय, यदि सटीकता कम होती है तो एक सर्कल या कुछ उस सीमा को इंगित करता है जिसमें उपयोगकर्ता रिपोर्ट की गई सटीकता के आधार पर हो सकता है। (यह आईफोन का अंतर्निहित Google मानचित्र एप्लिकेशन करता है।)

3

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

आपके ज्ञातों के बीच मूल्यों को अलग करने में सक्षम होने से आपको एक अच्छा चिकनी संक्रमण और एक उचित/अनुमानित किया जाता है कि यदि आपके पास उच्च-निष्ठा थी तो डेटा क्या होगा। http://en.wikipedia.org/wiki/Spline_interpolation

विभिन्न splines के अलग-अलग विशेषताएं हैं। सबसे ज्यादा इस्तेमाल किया जाने वाला मैंने अकिमा और क्यूबिक स्प्लिंस हैं।

रामर-डगलस-पेकर लाइन सरलीकरण एल्गोरिदम पर विचार करने के लिए एक और एल्गोरिदम है, यह आमतौर पर जीपीएस डेटा के सरलीकरण में उपयोग किया जाता है। (http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)

3

Kalman फिल्टर करने के लिए वापस जा रहे हैं ... मैं जीपीएस डेटा यहां के लिए एक Kalman फिल्टर के लिए एक सी कार्यान्वयन पाया: http://github.com/lacker/ikalman मैं इसे अभी तक बाहर प्रयास नहीं किया है, लेकिन यह आशाजनक लगता है।

+0

दुर्भाग्य से यह बहुत अच्छी तरह से काम नहीं कर रहा है। –

57

यहां एक साधारण कलमान फ़िल्टर है जिसका उपयोग इस स्थिति के लिए किया जा सकता है। यह एंड्रॉइड उपकरणों पर किए गए कुछ कामों से आया था।

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

कोड को बेहतर किया जा सकता है, क्योंकि यह मानता है कि वर्तमान स्थान का सबसे अच्छा अनुमान अंतिम ज्ञात स्थान है, और यदि कोई आगे बढ़ रहा है तो बेहतर अनुमान लगाने के लिए एंड्रॉइड के सेंसर का उपयोग करना संभव होना चाहिए। कोड में एक सिंगल फ्री पैरामीटर क्यू है, प्रति सेकेंड मीटर में व्यक्त किया गया है, जो वर्णन करता है कि किसी भी नए स्थान अनुमानों की अनुपस्थिति में सटीकता कितनी जल्दी समाप्त होती है। एक उच्च क्यू पैरामीटर का मतलब है कि सटीकता तेजी से क्षय हो जाती है। काल्मैन फ़िल्टर आम तौर पर बेहतर काम करते हैं जब शुद्धता एक से अधिक तेज हो सकती है, इसलिए एक एंड्रॉइड फोन के साथ घूमने के लिए मुझे लगता है कि क्यू = 3 मीटर प्रति सेकेंड ठीक काम करता है, भले ही मैं आम तौर पर उससे धीमा चलता हूं। लेकिन अगर एक तेज कार में यात्रा करना बहुत अधिक संख्या का उपयोग किया जाना चाहिए।

public class KalmanLatLong { 
    private final float MinAccuracy = 1; 

    private float Q_metres_per_second;  
    private long TimeStamp_milliseconds; 
    private double lat; 
    private double lng; 
    private float variance; // P matrix. Negative means object uninitialised. NB: units irrelevant, as long as same units used throughout 

    public KalmanLatLong(float Q_metres_per_second) { this.Q_metres_per_second = Q_metres_per_second; variance = -1; } 

    public long get_TimeStamp() { return TimeStamp_milliseconds; } 
    public double get_lat() { return lat; } 
    public double get_lng() { return lng; } 
    public float get_accuracy() { return (float)Math.sqrt(variance); } 

    public void SetState(double lat, double lng, float accuracy, long TimeStamp_milliseconds) { 
     this.lat=lat; this.lng=lng; variance = accuracy * accuracy; this.TimeStamp_milliseconds=TimeStamp_milliseconds; 
    } 

    /// <summary> 
    /// Kalman filter processing for lattitude and longitude 
    /// </summary> 
    /// <param name="lat_measurement_degrees">new measurement of lattidude</param> 
    /// <param name="lng_measurement">new measurement of longitude</param> 
    /// <param name="accuracy">measurement of 1 standard deviation error in metres</param> 
    /// <param name="TimeStamp_milliseconds">time of measurement</param> 
    /// <returns>new state</returns> 
    public void Process(double lat_measurement, double lng_measurement, float accuracy, long TimeStamp_milliseconds) { 
     if (accuracy < MinAccuracy) accuracy = MinAccuracy; 
     if (variance < 0) { 
      // if variance < 0, object is unitialised, so initialise with current values 
      this.TimeStamp_milliseconds = TimeStamp_milliseconds; 
      lat=lat_measurement; lng = lng_measurement; variance = accuracy*accuracy; 
     } else { 
      // else apply Kalman filter methodology 

      long TimeInc_milliseconds = TimeStamp_milliseconds - this.TimeStamp_milliseconds; 
      if (TimeInc_milliseconds > 0) { 
       // time has moved on, so the uncertainty in the current position increases 
       variance += TimeInc_milliseconds * Q_metres_per_second * Q_metres_per_second/1000; 
       this.TimeStamp_milliseconds = TimeStamp_milliseconds; 
       // TO DO: USE VELOCITY INFORMATION HERE TO GET A BETTER ESTIMATE OF CURRENT POSITION 
      } 

      // Kalman gain matrix K = Covarariance * Inverse(Covariance + MeasurementVariance) 
      // NB: because K is dimensionless, it doesn't matter that variance has different units to lat and lng 
      float K = variance/(variance + accuracy * accuracy); 
      // apply K 
      lat += K * (lat_measurement - lat); 
      lng += K * (lng_measurement - lng); 
      // new Covarariance matrix is (IdentityMatrix - K) * Covarariance 
      variance = (1 - K) * variance; 
     } 
    } 
} 
+0

भिन्नता गणना नहीं होनी चाहिए: भिन्नता + = TimeInc_milliseconds * TimeInc_milliseconds * Q_metres_per_second * Q_metres_per_second/1000000 – Horacio

+3

@ होरासियो, मुझे पता है कि आप ऐसा क्यों सोचते हैं, लेकिन नहीं! गणितीय रूप से, यहां अनिश्चितता को एक वीनर प्रक्रिया द्वारा मॉडलिंग किया जा रहा है (http://en.wikipedia.org/wiki/Wiener_process देखें) और एक वीनर प्रक्रिया के साथ भिन्नता समय के साथ रैखिक रूप से बढ़ती है। वैरिएबल 'Q_metres_per_second' उस विकिपीडिया आलेख में "संबंधित प्रक्रियाओं" खंड में परिवर्तनीय' सिग्मा' से मेल खाता है। 'Q_metres_per_second' मानक विचलन है और इसे मीटर में मापा जाता है, इसलिए मीटर और मीटर/सेकेंड इसकी इकाइयां नहीं हैं। यह 1 सेकंड के समाप्त होने के बाद वितरण के मानक विचलन से मेल खाता है। स्पष्टीकरण के लिए – Stochastically

+0

धन्यवाद। क्या आप एक बेहतर अनुमान प्राप्त करने के लिए वेग जानकारी को कैसे खाते हैं, इस बारे में विस्तार से बता सकते हैं? क्या मैं बस उपयोगकर्ता के वेग (मीटर प्रति 1 सेकेंड में) के बराबर Q_meters_per_second सेट कर सकता हूं? 1.5 कहो? – Horacio

9

आपको प्रति समय स्थिति परिवर्तन से गति की गणना नहीं करनी चाहिए। जीपीएस में गलत स्थिति हो सकती है, लेकिन इसकी सटीक गति (5 किमी/घंटा से ऊपर) है। तो जीपीएस स्थान टिकट से गति का उपयोग करें। और आगे आपको यह नहीं करना चाहिए, हालांकि यह ज्यादातर बार काम करता है।

डिलीवरी के रूप में जीपीएस की स्थिति पहले से ही कलमैन फ़िल्टर की गई है, शायद आप सुधार नहीं कर सकते हैं, पोस्टप्रोकैसिंग में आमतौर पर आपके पास जीपीएस चिप जैसी ही जानकारी नहीं होती है।

आप इसे सुचारू बना सकते हैं, लेकिन यह त्रुटियों को भी प्रस्तुत करता है।

बस यह सुनिश्चित करें कि डिवाइस अभी भी खड़े होने पर स्थितियों को हटा दें, इससे कूदने की स्थिति हटा दी जाती है, कुछ डिवाइस/कॉन्फ़िगरेशन नहीं हटाते हैं।

+4

क्या आप इसके लिए कुछ संदर्भ प्रदान कर सकते हैं? – ivyleavedtoadflax

+1

उस वाक्य में कई जानकारी और बहुत से पेशेवर अनुभव हैं, आप किस वाक्य के लिए वास्तव में एक संदर्भ चाहते हैं? गति के लिए: डोप्लर प्रभाव और जीपीएस की खोज करें। आंतरिक कलामैन? यह मूल जीपीएस ज्ञान है, प्रत्येक पेपर या पुस्तक वर्णन करता है कि एक जीपीएस चिप internaly कैसे काम करता है। smootig-त्रुटियों: कभी smoothing erros परिचय। अभी भी खड़े हो जाओ कोशिश करके देखो। – AlexWien

+2

अभी भी खड़े होने पर "चारों ओर कूदना" त्रुटि का एकमात्र स्रोत नहीं है। सिग्नल प्रतिबिंब भी हैं (उदा। पहाड़ों से) जहां स्थिति चारों ओर कूदती है। मेरे जीपीएस चिप्स (जैसे गार्मिन डकोटा 20, सोनी एरिक्सन नियो) ने इसे फ़िल्टर नहीं किया है ... और वास्तव में एक मजाक जीपीएस संकेतों का ऊंचाई मूल्य है जब बैरोमेट्रिक दबाव के साथ संयुक्त नहीं होता है। ये मान फ़िल्टर नहीं किए गए हैं या मैं unfiltered मूल्यों को नहीं देखना चाहता। – hgoebl

2

मैं आमतौर पर एक्सेलेरोमीटर का उपयोग करता हूं। एक छोटी अवधि में स्थिति का अचानक परिवर्तन उच्च त्वरण का तात्पर्य है। यदि यह एक्सेलेरोमीटर टेलीमेट्री में प्रतिबिंबित नहीं होता है तो यह लगभग निश्चित रूप से "सर्वोत्तम तीन" उपग्रहों में परिवर्तन के कारण होता है जो स्थिति गणना करने के लिए उपयोग किया जाता है (जिसके लिए मैं जीपीएस टेलीपोर्टिंग के रूप में संदर्भित करता हूं)।

जब कोई संपत्ति बाकी है और जीपीएस टेलीपोर्टिंग के कारण हो रही है, तो यदि आप प्रगतिशील रूप से सेंट्रॉइड की गणना करते हैं तो आप प्रभावी रूप से बड़े और बड़े सेट के गोले को छेड़छाड़ कर रहे हैं, सटीकता में सुधार कर रहे हैं।

ऐसा करने के लिए जब संपत्ति बाकी नहीं है, तो आपको गति, शीर्षक और रैखिक और घूर्णन (यदि आपके पास gyros) त्वरण डेटा के आधार पर इसकी संभावित स्थिति और अभिविन्यास का अनुमान लगाया जाना चाहिए। प्रसिद्ध के फिल्टर क्या करता है यह कम या ज्यादा है। आप एएचआरएस पर लगभग $ 150 के लिए हार्डवेयर में पूरी चीज प्राप्त कर सकते हैं जिसमें सब कुछ है लेकिन जीपीएस मॉड्यूल, और एक जैक के साथ कनेक्ट करने के लिए। इसका अपना सीपीयू और कलमैन बोर्ड पर फ़िल्टरिंग कर रहा है; परिणाम स्थिर और काफी अच्छे हैं। जड़ के लिए जड़ मार्गदर्शन बहुत प्रतिरोधी है लेकिन समय के साथ drifts। जीपीएस जिटर से प्रवण है लेकिन समय के साथ बहाव नहीं करता है, वे व्यावहारिक रूप से एक दूसरे को क्षतिपूर्ति करने के लिए बनाए गए थे।

9

यह एक छोटे से देर से आ सकते हैं ...

मैं Android, जो दो सबसे आम स्थान प्रदाताओं लपेटता, नेटवर्क और जीपीएस के लिए इस KalmanLocationManager लिखा था, डेटा kalman-फिल्टर, और (एक LocationListener के लिए अद्यतन उद्धार दो 'असली' प्रदाताओं की तरह)।

मैं इसे रीडिंग के बीच अधिकतर "इंटरपोलेट" करने के लिए उपयोग करता हूं - उदाहरण के लिए प्रत्येक 100 मिलीलीटर अपडेट (स्थिति पूर्वानुमान) प्राप्त करने के लिए (एक सेकंड की अधिकतम जीपीएस दर के बजाय), जो मुझे मेरी स्थिति को एनिमेट करते समय बेहतर फ्रेम दर देता है ।

असल में, यह प्रत्येक आयाम के लिए तीन कलमन फ़िल्टर का उपयोग करता है: अक्षांश, देशांतर और ऊंचाई। वे स्वतंत्र हैं, वैसे भी।

यह मैट्रिक्स गणित को अधिक आसान बनाता है: एक 6x6 राज्य संक्रमण मैट्रिक्स का उपयोग करने के बजाय, मैं 3 अलग-अलग 2x2 मैट्रिक्स का उपयोग करता हूं। असल में कोड में, मैं matrices का बिल्कुल उपयोग नहीं करता हूं। सभी समीकरणों को हल किया गया और सभी मूल्य प्राइमेटिव (डबल) हैं।

स्रोत कोड काम कर रहा है, और एक डेमो गतिविधि है। कुछ जगहों पर जावाडोक की कमी के लिए खेद है, मैं पकड़ूंगा।

+1

मैंने आपके lib कोड का उपयोग करने की कोशिश की, मुझे कुछ अवांछित परिणाम मिल गए, मुझे यकीन नहीं है कि मैं कुछ गलत कर रहा हूं ... (नीचे छवि यूआरएल है, नीले फ़िल्टर किए गए स्थान 'पथ हैं, नारंगी कच्चे स्थान हैं) https: //app.box.com/s/w3uvaz007glp2utvgznmh8vlggvaiifk – umesh

+0

स्पाइक्स आप अर्थ (नारंगी रेखा) से 'बढ़ते' देख रहे हैं नेटवर्क प्रदाता अपडेट की तरह दिखते हैं। क्या आप कच्चे नेटवर्क और जीपीएस अपडेट दोनों को साजिश करने का प्रयास कर सकते हैं? आप जो भी हासिल करने की कोशिश कर रहे हैं उसके आधार पर शायद आप नेटवर्क अपडेट के साथ बेहतर नहीं होंगे। बीटीडब्ल्यू, आप उन कच्चे नारंगी अद्यतन कहां से प्राप्त कर रहे हैं? – villoren

+1

नारंगी अंक जीपीएस प्रदाता से हैं, और नीले रंगमैन से हैं, मैंने मानचित्र पर लॉग प्लॉट किया है – umesh

0

किसी भी दिलचस्पी में कॉफीस्क्रिप्ट में मैप किया गया। ** संपादित करें -> रीढ़ की हड्डी का उपयोग करके खेद है, लेकिन आपको विचार मिलता है।

गुण

{अक्षांश के साथ एक बीकन स्वीकार करने के लिए थोड़ा संशोधित: item.lat, देशांतर: item.lng, तारीख: नई की तारीख (item.effective_at), सटीकता: आइटम।gps_accuracy}

MIN_ACCURACY = 1 

# mapped from http://stackoverflow.com/questions/1134579/smooth-gps-data 

class v.Map.BeaconFilter 

    constructor: -> 
    _.extend(this, Backbone.Events) 

    process: (decay,beacon) -> 

    accuracy  = Math.max beacon.accuracy, MIN_ACCURACY 

    unless @variance? 
     # if variance nil, inititalise some values 
     @variance  = accuracy * accuracy 
     @timestamp_ms = beacon.date.getTime(); 
     @lat   = beacon.latitude 
     @lng   = beacon.longitude 

    else 

     @timestamp_ms = beacon.date.getTime() - @timestamp_ms 

     if @timestamp_ms > 0 
     # time has moved on, so the uncertainty in the current position increases 
     @variance += @timestamp_ms * decay * decay/1000; 
     @timestamp_ms = beacon.date.getTime(); 

     # Kalman gain matrix K = Covarariance * Inverse(Covariance + MeasurementVariance) 
     # NB: because K is dimensionless, it doesn't matter that variance has different units to lat and lng 
     _k = @variance/(@variance + accuracy * accuracy) 
     @lat = _k * (beacon.latitude - @lat) 
     @lng = _k * (beacon.longitude - @lng) 

     @variance = (1 - _k) * @variance 

    [@lat,@lng]