2017-05-25 7 views
6

एंड्रॉइड में कंपास अभिविन्यास प्राप्त करने के सभी मार्गदर्शिकाओं में मुझे एक बग मिला है: जब आप पोर्ट्रेट मोड में फोन रखते हैं और क्षितिज के ऊपर "देखो" रखते हैं, तो कंपास तीर सही दिशा से 180 डिग्री बदल जाता है।उच्च गुणवत्ता वाले कंपास अभिविन्यास को कैसे पुनर्प्राप्त करें (जैसे Google मानचित्र में)?

Google मानचित्र अभिविन्यास सूचक को यह समस्या नहीं है।

Google मानचित्र की एक और अच्छी बात यह है कि वे किसी भी तरह कंपास सटीकता का अनुमान लगाते हैं। कोई विचार है कि वे यह कैसे करते हैं?

+0

मुझे लगता है कि इस पुस्तकालय आप एक कम्पास और अपने आप से उन्मुखीकरण की गणना लागू करने के लिए एक बहुत अच्छा विचार दे सकते हैं के बारे में पता कर सकते हैं। इसका उपयोग करते समय मुझे आपकी समस्या नहीं थी। यह हमेशा मुझे सही दिशा दिखा रहा है। https://github.com/artemiygrn/Compass- देखें कंपास सटीकता के लिए, मुझे नहीं पता कि इसे कैसे प्राप्त किया जाए। माफ़ कर दो भाई। –

उत्तर

2

कम्पास आपको जो चाहिए वो देगा, लेकिन यह बहुत शोर है। यह 2 कारणों से शोर है, कारण यह है कि यह उठा रहा है, असली शोर, असली संकेत। तो, हम ऐसे माहौल में रहते हैं जो चुंबकीय रूप से बहुत शोर है। तो, यह चुंबकीय है कि सब कुछ उठाता है। दूसरा कारण यह है कि, यह एकीकृत नहीं है, इसलिए आवृत्ति घटक को छोड़ने का लाभ नहीं है। तो, अपने कंपास को जीरोस्कोप डेटा के साथ संयोजित करने का प्रयास करें। This वीडियो इन सेंसर का उपयोग करने के लिए आपको बहुत मदद करेगा।

कुछ और विवरण, आप accelerometers भी जोड़ सकते हैं। तो संक्षेप में, Gyroscopes अभिविन्यास प्रदान करते हैं, एक्सेलेरोमीटर गुरुत्वाकर्षण के कारण एक सुधार प्रदान करते हैं, और कंपास चुंबकीय उत्तर के कारण एक सुधार प्रदान करते हैं।

+0

अरे, धन्यवाद, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है (1. क्षितिज 2. सटीकता से ऊपर देखते समय बग)। – fhucho

3
  1. क्षितिज से ऊपर देखते समय बग।

जब आप कंपास के साथ काम करते हैं तो कुछ मुश्किल भाग होते हैं। कंपास अभिविन्यास चुंबकीय क्षेत्रों और फोन अभिविन्यास पर निर्भर करता है, इसलिए, विचलन को सही करने के लिए आपको कुछ मैट्रिक्स संचालन करने की आवश्यकता है। "डिवाइस फ्लैट धारण नहीं कर रहा है तो अगर (∓45 ° विचलन) यदि आप एक उपयोगी तरीके से remapCoordinateSystem() का उपयोग करने के लिए है:>https://www.journal.deviantdev.com/android-compass-azimuth-calculating/

लेख Paraphrasing -

इस लेख की जाँच करें, यह एक आसान उदाहरण सही परिणाम प्राप्त करने के लिए। "

  1. सटीकता।

सबसे पहले, सटीकता डिवाइस में मौजूद भौतिक घटकों पर भरोसा करती है। Fragmentation यहाँ एक आम समस्या है। सैमसंग मैग्नेटोमीटर एलजी से अलग हैं, और एंड्रॉइड सिस्टम इस से आपको अमूर्त नहीं करेगा।

दूसरी ओर, डिवाइस विभिन्न प्रकार के सेंसर पर भरोसा कर सकते हैं: हार्वर्ड या सेंसर संलयन। तो आप एक डिवाइस और दूसरे के बीच अंतर का प्रयोग करने जा रहे हैं।

तो यह एक गड़बड़ है। लेकिन यह उन तकनीकों में मौजूद है जो आप सेंसर से सटीकता और वर्दीबद्ध डेटा प्राप्त करने के लिए आवेदन कर सकते हैं (न केवल कंपास के लिए, शायद जीपीएस भी)।

  1. कुछ लोग सेंसर डेटा के पहले कुछ सेकंड को त्याग देते हैं। सिग्नल को कैलिब्रेट करने के लिए कुछ समय की आवश्यकता होती है, इसलिए पहले डेटा को कुछ विचलन के लिए उपयोग किया जाता है। जिस समय आपको त्यागने की आवश्यकता है वह निर्माता पर निर्भर करता है, खरीद लें कि मैं 5 सेकंड या उससे भी अधिक समय तक प्रयास करूंगा।

  2. इंटरपोलेटर और एक्स्ट्रापोलेटर का उपयोग करें। एंड्रॉइड में कई सेंसर आपको प्रत्येक निश्चित मिलीसेकंड डेटा पुनर्प्राप्त करने का एक तरीका प्रदान करते हैं। लेकिन यह एंड्रॉइड द्वारा प्रदान किया गया अमूर्त है। हावर्ड सेंसर का अपना समय होता है और वे सिग्नल को अपडेट करते हैं जब उन्हें लगता है कि यह आवश्यक है।शेष समय, जब एंड्रॉइड सिग्नल डेटा के लिए सेंसर से पूछता है तो सेंसर आखिरी मूल्य देता है या शायद निर्माता द्वारा प्रदान किए गए अंतिम सिग्नल डेटा के किसी प्रकार का ऑपरेशन (फिर से)।

इसलिए, यह कुछ अमूर्त परत (क्षेपक/extrapolator) जो एंड्रॉयड सिस्टम से डेटा प्रत्येक 20, 50, 1000 ... इस परत में कुछ कार्यों के क्रम में कुछ एकरूपता होनी चाहिए बनाने के प्राप्त करने के लिए दिलचस्प है, और उसके बाद डेटा को आपके ऐप में संचारित करता है।

यहां ऑपरेशन वर्तमान और अंतिम मूल्य, संचित औसत या शायद किसी अन्य प्रकार के सामान्यीकरण के बीच औसत हो सकता है।

3

आपकी पूछताछ में त्रुटि यूलर कोणों या जिम्बल लॉक कहलाती है।

बहुत उच्च कोण अंतर को हल करने के लिए, आपको जांचना चाहिए कि क्या आपका डिवाइस फ्लैट है या ग्रेविटी सेंसर का उपयोग करके झुकाव के बाद झुकाव की जांच नहीं कर रहा है या लोपास फ़िल्टर के साथ एक्सेलेरोमीटर से गुरुत्वाकर्षण प्राप्त कर रहा है। यदि यह फ्लैट नहीं है (एआर आवेदन या झुकाव> 25 || झुकाव < 155) एक्स, वाई से एक्स, जेड से रीमैप समन्वय प्रणाली। इससे इस मुद्दे को हल किया जाएगा।

SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values); 
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRM); 
SensorManager.getOrientation(remappedRM, orientation); 

यह गिम्बल लॉक को हल करती है, फिर भी, 3 डी परकार (सामान्य परकार सही परिणाम नहीं देता है की वजह से वे केवल, एक्स में मैप किया जाता है y और गिम्बल लॉक होता है) मैं प्ले स्टोर और हर कोड पर देखा है यहां एक भिन्नता है जब आप अपने डिवाइस को फ्लैट या स्क्रीन पर इशारा करते रहते हैं। कभी-कभी अंतर 10 डिग्री तक पहुंच जाता है। मैं इसे हल करने में सक्षम नहीं है। अधिकतर अंतर 1-5 डिग्री के बीच होता है लेकिन मुझे कभी-कभी यह 10 डिग्री तक बढ़ता है जो स्वीकार्य नहीं है।

Google आपके स्थान से azimuth को मापता है। असर खोजने के लिए एक कोड है।

currentLocation.getBearing(); 

लेट लम्बाई (आपके वर्तमान स्थान की सटीकता) की सटीकता असर की सटीकता निर्धारित करती है।

कम से कम करने के लिए सबसे सही के साथ एक कम्पास कर तरीकों की सूची क्रम में है

  1. उपयोग जीपीएस/पत्नी (गूगल के जुड़े हुए स्थान) स्थान और स्थान से असर पाने
  2. उपयोग रोटेशन वेक्टर (चुंबकीय क्षेत्र की आवश्यकता है सेंसर, आपको यह जांचना चाहिए कि यह उपलब्ध है या नहीं), यह एक फ़्यूज्ड सेंसर (चुंबकीय क्षेत्र + जीरोस्कोप + एक्सेलेरोमीटर और सॉफ़्टवेयर पार्ट्स) है और कलम फ़िल्टर का उपयोग मूल्यों को सुचारु बनाने के लिए करता है लेकिन अभिविन्यास
  3. ग्रेविटी/एक्सेलेरोमीटर + चुंबकीय फ़ील्ड सेंसर को रीमेप करने के लिए झुकाव की जांच करें। यह एक भयानक शोर इसे से जुड़ी है, यह आसान करने के लिए आप आगे बढ़ औसत या कम पास फिल्टर का उपयोग करना चाहिए
1

ठीक (गुरुत्वाकर्षण अलग करने के लिए यह नहीं है, यह एक सीमा आवृत्ति का उपयोग उच्च छलांग को रोकने के लिए के लिए है), मैं खुद को समझ लिया। सबसे पहले आपको कंपास से असर की गणना करने की आवश्यकता है। तो मानचित्र एपीआई -2 कैमरा घुमाया जा सकता है।

public void updateCamera(float bearing) { 
      CameraPosition currentPlace = new CameraPosition.Builder() 
        .target(new LatLng(centerLatitude, centerLongitude)) 
        .bearing(bearing).tilt(65.5f).zoom(18f).build(); 
      googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(currentPlace)); 

    } 

अपने कोड में सेंसर लिस्टर सेट करें और इस विधि को सेंसर चेंजेड ईवेंट में कॉल करें। मैंने एक झुकाव मूल्य जोड़ा है ताकि नक्शा 3 डी में घुमाएगा।

[संदर्भ:] [Android Maps v2 rotate mapView with compass1

आप अधिक विवरण http://www.techotopia.com/index.php/Working_with_the_Google_Maps_Android_API_in_Android_Studio

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