2010-01-03 16 views
12

के माध्यम से माप माप वेग मुझे फोन की वेग (मूल रूप से एक स्पीडोमीटर) को मापने के लिए एक मूल आईफोन ऐप को लागू करने की आवश्यकता है। मुझे पता है कि आप कोरलोकेशन एपीआई के माध्यम से काफी आसानी से ऐसा कर सकते हैं, लेकिन मुझे बैटरी खपत के बारे में चिंता है क्योंकि यह एक वास्तविक समय माप है जिसे एक समय में कुछ घंटों तक इस्तेमाल किया जा सकता है। मेरी समझ यह है कि जब आप स्थान प्रबंधक से ईवेंट के लिए सक्रिय रूप से निगरानी कर रहे हैं (भले ही मैं वास्तव में जीपीएस स्थान की परवाह नहीं करता) यह बैटरी-गहन है।आईफोन एसडीके

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

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

EDIT: मेरे पास एक कार्यरत प्रोटोटाइप है जो LocationManager API का उपयोग करता है। यह ठीक काम करता है, लेकिन अद्यतन चक्र वेग के वास्तविक समय माप के लिए आदर्श से बहुत दूर है। परिस्थितियों के आधार पर, कभी-कभी अपडेट करने में 4-5 सेकंड तक लग सकते हैं। किसी दिए गए गति पर क्रूज़िंग ठीक काम करने लगता है, लेकिन उपयोगकर्ता इंटरैक्शन दृष्टिकोण से एक्सेल/डीकल बहुत बुरी तरह से अंतराल में पड़ता है। इसके अलावा, मुझे कुछ अन्य गणनाओं में वेग को खिलाने की ज़रूरत है जो मैं कर रहा हूं और परिशुद्धता वास्तव में मुझे नहीं चाहिए।

ऐसा लगता है कि मैंने देखा है कि बहुत कम (बहुत कम) अन्य ऐप्स, विशेष रूप से gMeter जो जीपीएस का उपयोग नहीं करने का दावा करता है लेकिन वेग को सटीक रूप से गणना करता है। मैं वास्तव में हैरान हूं कि कोई संदर्भ या कोई नमूना कोड नहीं है जो इसे कहीं भी प्रदर्शित करता है जो मुझे मिल सकता है। मुझे एहसास है कि यह जटिल है, लेकिन निश्चित रूप से वहां कुछ है।

+0

अरे, मुझे इस क्षेत्र में आपके किसी भी सफलता में दिलचस्पी होगी। मैं वर्तमान में जीपीएस डेटा के बीच एक इंटरेियल नेविगेशन मार्ग प्लॉट करने के लिए जीपीएस डेटा के साथ एक आईफोन 4 से एक्सेलेरोमीटर/ग्रिओ डेटा का उपयोग कर जांच कर रहा हूं। – Jerceratops

उत्तर

10

के बाद से GPS और एक्सीलरोमीटर विभिन्न कमजोरियों है, अपने सबसे अच्छा विकल्प है शायद एक संयुक्त दृष्टिकोण - जीपीएस से कभी भी माप प्राप्त करें y मिनट या तो, फिर एक्सेलेरोमीटर से रीयलटाइम परिवर्तन जोड़ें।

+0

हाँ, यह वह दृष्टिकोण है जिसे मैंने केवल लंबी दूरी पर त्वरण का उपयोग करके त्रुटि संचय के बारे में जो पढ़ा है, उसके आधार पर मैंने विचार किया है। मैं अभी भी त्वरण प्राप्त करने के साथ संघर्ष कर रहा हूं, हालांकि शुरूआत में वेग में परिवर्तित हो गया है। –

3

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

+0

जैसा कि मैंने पुनः त्वरण को पढ़ा है -> वेग, हालांकि मेरी धारणा यह है कि आईफोन द्वारा उपग्रह/सेल संकेतों को संसाधित करने के लिए उपयोग की जाने वाली आंतरिक एंटीना एक्सेलेरोमीटर की तुलना में अधिक ऊर्जा का उपयोग करती है (क्या वे हमेशा ज्यादा नहीं हैं?) –

10

एक व्यावहारिक दृष्टिकोण से, आपको एक्सेलेरोमीटर पर कार्यरत बलों से सटीक वेग नहीं मिल रहा है।

जीपीएस का उपयोग 1 मिनट अंतराल पर किए गए रीडिंग के साथ करें और जीपीएस को बीच में सोएं।

यहाँ एक उदाहरण है:

SpeedViewController.h

CLLocationManager *locManager; 
CLLocationSpeed speed; 
NSTimer *timer; 

@property (nonantomic,retain) NSTimer *timer; 

SpeedViewController.m

#define kRequiredAccuracy 500.0 //meters 
#define kMaxAge 10.0 //seconds 

- (void)startReadingLocation { 
    [locManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

    NSTimeInterval ageInSeconds = [newLocation.timestamp timeIntervalSinceNow]; 

    //ensure you have an accurate and non-cached reading 
    if(newLocation.horizontalAccuracy > kRequiredAccuracy || fabs(ageInSeconds) > kMaxAge) 
     return; 

    //get current speed  
    currentSpeed = newLocation.speed; 

    //this puts the GPS to sleep, saving power 
    [locManager stopUpdatingLocation]; 

    //timer fires after 60 seconds, then stops 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(timeIntervalEnded:) userInfo:nil repeats:NO]; 
} 

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    [self startReadingLocation]; 
} 
+0

उदाहरण के लिए धन्यवाद। वास्तव में यह मेरे लिए एक निकट-वास्तविक समय माप होना होगा। मैं अभी भी बिजली की खपत के बारे में चिंतित हूं अगर यह दूसरे या दो अपडेट अंतराल पर अधिक किया गया था। क्या आपने इसे असली दुनिया ऐप में किया है? –

+0

मेरे पास असली दुनिया का सबूत नहीं है कि यह वास्तव में शक्ति को बचाएगा। सिद्धांत में कुछ सेकंड के लिए जीपीएस बंद बंद करने के बाद प्रत्येक पढ़ने में काफी कम शक्ति का उपयोग करना चाहिए। – bentford

+0

एक "{" गायब है - (शून्य) स्थान प्रबंधक –

4

त्वरण में त्रुटि समय के साथ जमा हो जाएगी। आपका सबसे अच्छा शर्त, जीपीएस से एक सटीक वेग प्राप्त हो सकता है एक बार के लिए है एक मिनट या उससे कम:

distanceTravelled = sqrt((position2.x-position1.x)^2 + (position2.y-position1.y)^2) 
velocity = distanceTravelled/timeBetweenGPSReadings 

(जहां ^2 मतलब है चुकता)

फिर accelerometer के लगातार माप:

newVelocity = oldVelocity + accelerometer*timeBetweenAccelerometerReadings 
2

जबकि मुझे आईफोन एपीआई नहीं पता, मुझे जीपीएस और जड़त्व नेविगेशन के बारे में कुछ पता है। यह उपयोगी हो सकता है।

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

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

वैसे भी, कुछ चीजों के बारे में सोचने के लिए।