उन्नत जियोलोकेशन
ट्रैसलेट केवल एक पृष्ठभूमि स्थान रैपर से कहीं अधिक है। इसमें उन्नत एल्गोरिदम का एक सूट शामिल है जो विशेष रूप से मोबाइल जियोलोकेशन में सबसे कठिन समस्याओं से निपटने के लिए डिज़ाइन किया गया है: जीपीएस जिटर, टनल ब्लैकआउट और उच्च गति पर बैटरी ड्रेन।
1. कलमन फ़िल्टर (प्रक्षेपवक्र स्मूथिंग)
कच्चा जीपीएस डेटा स्वाभाविक रूप से शोर वाला होता है। यदि कोई उपयोगकर्ता सीधी सड़क पर चल रहा है, तो कच्चे निर्देशांक बाएं और दाएं बेतरतीब ढंग से कूदेंगे, जिससे एक “जड़ी-बूटी” रेखा बनेगी। यदि आप इस टेढ़ी-मेढ़ी रेखा की दूरी की गणना करते हैं, तो यह कृत्रिम रूप से उपयोगकर्ता की कुल दूरी को 20% तक बढ़ा देगी।
यह काम किस प्रकार करता है
useKalmanFilter: true सेट करके, ट्रैसलेट एक उन्नत गणितीय एल्गोरिदम लागू करता है जो मूल रूप से अंतरिक्ष यान नेविगेशन के लिए विकसित किया गया है। यह वर्तमान जीपीएस स्थिति को डिवाइस के वेग (गति और दिशा) के साथ जोड़कर भविष्यवाणी करता है कि उपयोगकर्ता वास्तव में कहां है, प्रभावी ढंग से शोर को कम करता है और एक सही, घुमावदार रेखा उत्पन्न करता है।
final config = Config.highAccuracy(
geo: tl.GeoConfig(
filter: tl.LocationFilter(
useKalmanFilter: true, // Enable trajectory smoothing
trackingAccuracyThreshold: 50,
),
),
);2. डेड रेकनिंग (सुरंगें और जीपीएस अस्वीकृत)
जब कोई उपयोगकर्ता लंबी सुरंग या भूमिगत पार्किंग गैरेज में गाड़ी चलाता है, तो उनका जीपीएस उपग्रहों से कनेक्शन टूट जाता है। पारंपरिक ट्रैकर वास्तविक भूमिगत मार्ग को छोड़कर, सुरंग के प्रवेश द्वार से निकास तक एक सीधी रेखा खींचेंगे।
यह काम किस प्रकार करता है
enableDeadReckoning: true सेट करके, जीपीएस खो जाने पर ट्रैसलेट पता लगाता है और तुरंत डिवाइस के आंतरिक IMU (जड़त्व मापन इकाई) पर स्विच हो जाता है। यह पूरी तरह से भूमिगत रहते हुए भी जीपीएस अपडेट का अनुकरण करते हुए, अपने अंतिम ज्ञात वेग के आधार पर उपयोगकर्ता के प्रक्षेप पथ की गणना जारी रखने के लिए एक्सेलेरोमीटर और जाइरोस्कोप का उपयोग करता है।
final config = Config.balanced(
geo: tl.GeoConfig(
enableDeadReckoning: true,
deadReckoningActivationDelay: 10, // Wait 10 seconds of no GPS before activating
deadReckoningMaxDuration: 300, // Stop dead reckoning after 5 minutes to prevent drift
),
);3. लोच (उच्च गति अनुकूलन)
यदि आपका distanceFilter 20 मीटर पर सेट है, तो ट्रेसलेट हर 20 मीटर पर सक्रिय हो जाता है। यदि उपयोगकर्ता सीधे राजमार्ग पर 120 किमी/घंटा की गति से गाड़ी चला रहा है, तो वे एक सेकंड से भी कम समय में 20 मीटर की दूरी तय करते हैं। इससे डेटाबेस बिल्कुल सीधी रेखा में सैकड़ों बेकार बिंदुओं से भर जाता है, जिससे बैटरी खत्म हो जाती है।
यह काम किस प्रकार करता है
ट्रैसलेट का इलास्टिसिटी इंजन उच्च गति का पता लगाता है और गतिशील रूप से आपके दूरी फ़िल्टर को फैलाता है। एक 20 मीटर फ़िल्टर स्वचालित रूप से राजमार्ग पर 200 मीटर तक फैल सकता है, और जब उपयोगकर्ता किसी शहर में ऑफ-रैंप लेता है तो वापस 20 मीटर तक सिकुड़ सकता है।
final config = Config.balanced(
geo: tl.GeoConfig(
disableElasticity: false, // Ensure elasticity is on
elasticityMultiplier: 2.0, // Make the dynamic stretching 2x more aggressive
),
);4. अनुकूली मोड (बैटरी संरक्षण)
यदि किसी कर्मचारी के फोन की बैटरी ख़त्म हो रही है, तो आपकी प्राथमिकता उच्च-आवृत्ति 5-मीटर ट्रैकिंग नहीं होनी चाहिए। यह सुनिश्चित करना चाहिए कि फ़ोन शिफ्ट के अंत तक जीवित रहे।
यह काम किस प्रकार करता है
enableAdaptiveMode: true सेट करके, ट्रैसलेट ऑपरेटिंग सिस्टम की बैटरी एपीआई की लगातार निगरानी करता है। जैसे ही बैटरी महत्वपूर्ण सीमा (उदाहरण के लिए, 20%, 10%) से नीचे गिरती है, ट्रैसलेट स्वचालित रूप से desiredAccuracy को जीपीएस से वाई-फाई/सेलुलर में डाउनग्रेड कर देता है, और distanceFilter का विस्तार करता है, जिससे फोन को चालू रखने के लिए पर्याप्त शक्ति संरक्षित होती है।
final config = Config.balanced(
geo: tl.GeoConfig(
enableAdaptiveMode: true,
),
);5. विरल अद्यतन (केवल सेल-टावर)
कभी-कभी आपको बारी-बारी नेविगेशन सटीकता की आवश्यकता नहीं होती है; आपको बस मोटे तौर पर यह जानना होगा कि उपयोगकर्ता किस शहर या पड़ोस में है (उदाहरण के लिए, एक सोशल नेटवर्किंग ऐप या मौसम ऐप)।
यह काम किस प्रकार करता है
enableSparseUpdates को सक्षम करके, ट्रैसलेट बिजली की खपत करने वाली जीपीएस चिप को पूरी तरह से बायपास कर देता है। यह स्थान को अपडेट करने के लिए विशेष रूप से सेल-टावर हैंडऑफ़ और वाई-फाई ट्राइंगुलेशन का उपयोग करता है। बैटरी ड्रेन लगभग शून्य हो जाती है।
final config = Config.lowPower(
geo: tl.GeoConfig(
enableSparseUpdates: true,
sparseDistanceThreshold: 500.0, // Only trigger if they move 500m
sparseMaxIdleSeconds: 3600, // Or trigger once an hour even if they haven't moved
),
);6. लाइव प्रदाता विकल्प (रनटाइम ओवरराइड्स)
कभी-कभी आपका ऐप कुछ ऐसा जानता है जो SDK नहीं कर सकता: एक डिलीवरी ड्राइवर ने अभी-अभी 30 मिनट का ब्रेक लिया है, एक राइडर किसी स्थान के अंदर इंतज़ार कर रहा है, या आपका अपना स्थिर अनुमान निकाल दिया गया है। आप जीपीएस को अभी बंद करना चाहते हैं - और चीजें बदलते ही पूरी सटीकता से वापस आ जाना चाहते हैं।
अब तक एकमात्र नॉब setConfig() था। लेकिन desiredAccuracy और distanceFilter ट्रैकिंग-प्रासंगिक कुंजियाँ हैं, इसलिए उन्हें कॉन्फ़िगरेशन के माध्यम से बदलने से नए मान बने रहते हैं और एक साफ़ पूर्ण-पाइपलाइन पुनरारंभ होता है - स्थायी कॉन्फ़िगरेशन के लिए सही है, लेकिन यह एक टालने योग्य ट्रैकिंग अंतर बनाता है और केवल एक अस्थायी पावर नीति लागू करने के लिए प्रोसेसर स्थिति का पुनर्निर्माण करता है। इससे भी बदतर, क्योंकि परिवर्तन जारी रहता है, “कम पावर” चरण के दौरान एक ऐप बंद हो जाता है और फिर से लॉन्च किया जाता है, जो कम सटीकता पर ट्रैकिंग को स्थायी रूप से सक्रिय कर देगा।
यह काम किस प्रकार करता है
Tracelet.updateLocationProviderOptions() चल रहे OS स्थान प्रदाता को अद्यतन करता है - कोई stop() नहीं, कोई start() नहीं, फिक्स स्ट्रीम में कोई अंतर नहीं:
- iOS सीधे लाइव
CLLocationManagerको नए मान निर्दिष्ट करता है (desiredAccuracy/distanceFilterएक सक्रिय प्रबंधक पर परिवर्तनशील होते हैं)। - एंड्रॉइड एक नए
LocationRequestके साथ मौजूदा फ़्यूज्ड-प्रदाता कॉलबैक को फिर से सब्सक्राइब करता है। उसी कॉलबैक को दोबारा पंजीकृत करने से अनुरोध उसी स्थान पर प्रतिस्थापित हो जाता है, इसलिए सदस्यता कभी नहीं गिरती। - वेब में कोई लाइव प्रदाता नियंत्रण नहीं है और यह हमेशा
falseलौटाता है।
ओवरराइड जानबूझकर अल्पकालिक और केवल प्रदाता है:
- निरंतर
ConfigऔरTracelet.activeConfigको कभी भी छुआ नहीं जाता है - भंडारण के लिए कुछ भी नहीं लिखा जाता है, इसलिए प्रक्रिया पुनरारंभ हमेशा आपके वास्तविक कॉन्फ़िगरेशन पर वापस आती है। - रस्ट स्वीकृत-बिंदु फ़िल्टर और प्रोसेसर स्थिति अपरिवर्तित हैं: ट्रैक निरंतरता, ओडोमीटर, और कौन से वितरित बिंदु स्वीकार किए जाते हैं, सभी बिल्कुल कॉन्फ़िगर किए गए अनुसार काम करते रहते हैं।
stop()को कॉल करने से ओवरराइड स्वचालित रूप से साफ़ हो जाता है।
// Device confirmed stationary — drop Core Location to ~100m accuracy
// and only deliver a fix every 25 meters:
await Tracelet.updateLocationProviderOptions(
desiredAccuracy: DesiredAccuracy.medium,
distanceFilter: 25,
);
// Movement detected — restore the configured provider options.
// No arguments = clear the override:
await Tracelet.updateLocationProviderOptions();वापसी मूल्य और सत्यापन
जब लाइव अपडेट लागू किया गया था तो कॉल true लौटाती है, और जब ऐसा नहीं हो सका तो false लौटाती है - यह फ़ॉलबैक के रूप में पाइपलाइन को कभी भी पुनरारंभ नहीं करती है:
| स्थिति | परिणाम |
|---|---|
| सतत ट्रैकिंग सक्रिय (आईओएस/एंड्रॉइड) | true — विकल्प लाइव लागू |
ट्रैकिंग प्रारंभ नहीं हुई, या stop() को कॉल किया गया | false |
| आवधिक ट्रैकिंग मोड सक्रिय | false - आवधिक सुधार अपने स्वयं के अधिग्रहण का प्रबंधन करते हैं |
| वेब | false - कोई लाइव प्रदाता अपडेट नहीं |
distanceFilter परिमित और गैर-नकारात्मक होना चाहिए (एक RangeError को अन्यथा फेंक दिया जाता है)। प्रदाता द्वारा उत्पादित हर फिक्स 0 अनुरोध का एक मान (iOS पर kCLDistanceFilterNone)।
रनटाइम ओवरराइड बनाम एडेप्टिव मोड - enableAdaptiveMode (सेक्शन 4) इसका स्वचालित संस्करण है: एसडीके बैटरी को देखता है और आपके लिए डाउनग्रेड करता है। जब पॉलिसी आपकी हो तो updateLocationProviderOptions() का उपयोग करें - स्थिर पहचान, शिफ्ट ब्रेक, जियोफेंस डवेल, कस्टम बैटरी थ्रेशोल्ड - और आपको बिना किसी चीज को बनाए रखने या ट्रैक को बाधित किए बिना इसे तुरंत लागू करने की आवश्यकता है।