2012-05-07 31 views
14

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

धन्यवाद!

+0

एक्सेलेरोमीटर के बारे में कुछ पोस्ट: http://www.anddev.org/advanced-tutorials-f21/accessing-the-accelerometer-t499.html#p1987 http://developer.android.com/reference/android/hardware /SensorEvent.html#values ​​ – Niko

उत्तर

23

हां।

SensorEventListener.onSensorChanged(SensorEvent event) का उपयोग करके आप एक्स & वाई अक्ष के साथ प्रदान किए गए मान निर्धारित कर सकते हैं। आपको इन मानों को रिकॉर्ड करने की आवश्यकता होगी और फिर उन्हें डेल्टा मान प्राप्त करने के लिए onSensorChanged विधि पर आने वाली कॉल पर प्राप्त होने वाले किसी भी नए मान से तुलना करें। यदि एक धुरी पर डेल्टा मान सकारात्मक है तो डिवाइस एक तरफ बढ़ रहा है, अगर इसका नकारात्मक विपरीत विपरीत चल रहा है।

आपको शायद उस दर को ठीक करने की आवश्यकता होगी जिस पर आपको एक्सेलेरोमीटर घटनाएं मिलती हैं और थ्रेसहोल्ड जिस पर आप दिशा में परिवर्तन को इंगित करने के लिए डेल्टा मान मानते हैं।

यहाँ की एक त्वरित कोड उदाहरण है कि मैं क्या बारे में बात कर रहा हूँ:।

public class AccelerometerExample extends Activity implements SensorEventListener { 
    TextView textView; 
    StringBuilder builder = new StringBuilder(); 

    float [] history = new float[2]; 
    String [] direction = {"NONE","NONE"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     textView = new TextView(this); 
     setContentView(textView); 

     SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0); 
     manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 

     float xChange = history[0] - event.values[0]; 
     float yChange = history[1] - event.values[1]; 

     history[0] = event.values[0]; 
     history[1] = event.values[1]; 

     if (xChange > 2){ 
      direction[0] = "LEFT"; 
     } 
     else if (xChange < -2){ 
      direction[0] = "RIGHT"; 
     } 

     if (yChange > 2){ 
      direction[1] = "DOWN"; 
     } 
     else if (yChange < -2){ 
      direction[1] = "UP"; 
     } 

     builder.setLength(0); 
     builder.append("x: "); 
     builder.append(direction[0]); 
     builder.append(" y: "); 
     builder.append(direction[1]); 

     textView.setText(builder.toString()); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // nothing to do here 
    } 
} 

इस कोड को केवल एक्स और वाई अक्ष कि फोन में ले जाया गया है पर सामान्य दिशा प्रदान करेगा एक प्रदान करने के लिए दिशा का अधिक बढ़िया दृढ़ संकल्प (उदाहरण के लिए कंप्यूटर माउस के आंदोलन की नकल करने का प्रयास करने के लिए) आप पाते हैं कि एक फोन का एक्सेलेरोमीटर उद्देश्य के लिए उपयुक्त नहीं है।

इसका प्रयास करने के लिए, मैं पहले सेंसर विलंब को SensorManager.SENSOR_DELAY_FAST पर सेट कर दूंगा और कई इतिहास घटनाओं की एक सूची तैयार करूंगा ताकि मैं समय के साथ आंदोलन का पता लगा सकूं और विपरीत दिशा में थोड़ी सी गति से प्रभावित न हो जो एक्सेलेरोमीटर लेते समय अक्सर होता है इस तरह के एक अच्छे स्तर पर माप। आपको अपनी टिप्पणियों में सुझाए गए आंदोलन के सटीक माप की गणना करने में मदद करने के लिए पारित समय की मात्रा को मापने की भी आवश्यकता होगी।

+0

हैलो लाउथ! आपके जवाब के लिए धन्यवाद। मैंने पहले से ही एक समान कोड का परीक्षण किया है, फोन बदल रहा है जब समस्या बदल रही है। जैसा कि मुझे सटीकता की आवश्यकता है, मैं 0.3 के बारे में "xChange" के साथ काम करता हूं। यहां तक ​​कि आंदोलन बाएं से दाएं "निरंतर" होने के बावजूद, मूल्य कई बार बदलता है। एक्सेलेरोमीटर मूल्यों का विश्लेषण करते हुए, मुझे एहसास हुआ है कि कभी-कभी एक आंदोलन के बाद, एक्सीलरोमीटर समकक्ष मूल्यों को विपरीत दिशा में उत्पन्न करता है और इससे परिवर्तन होता है। मुझे कम से कम पुराने शैली के मकान (गोलाकारों के साथ) की तरह सटीकता के साथ दिशा प्राप्त करने की आवश्यकता है। क्या आपके पास कुछ टिप है? –

+0

आपका स्वागत है मार्कोस। आपको अपना प्रश्न अपडेट करना चाहिए क्योंकि माउस के रूप में अपना फोन व्यवहार करने की कोशिश करना दिशा का पता लगाने जैसा नहीं है। मुझे यकीन नहीं है कि एक्सेलेरोमीटर को उस तरह की चीज़ के लिए डिज़ाइन किया गया था जिसे आप करना चाहते हैं। चूंकि यह त्वरण को मापता है, हो सकता है कि आप ठीक अनाज वाले आंदोलन का पता लगाने में सक्षम न हों। – Louth

+0

मैंने आपकी टिप्पणियों पर विचार करने के लिए अपना उत्तर अपडेट कर दिया है। कृपया अपना प्रश्न अपडेट करें और इस उत्तर को स्वीकार करने पर विचार करें। – Louth

0

जो मैंने पढ़ा है, से सेंसर के साथ कोई केवल त्वरण और फोन अभिविन्यास का पता लगा सकता है। तो आप आसानी से आंदोलन (और किस दिशा में) और आंदोलन के बंद होने की शुरुआत का पता लगा सकते हैं, क्योंकि वेग बदल रहा है इसलिए त्वरण होता है (त्वरण को रोकते समय गति दिशा के खिलाफ होता है)।

यदि फोन लगातार वेग के साथ आगे बढ़ रहा है, तो एक्सेलेरोमीटर शून्य मान (रैखिक त्वरण जो गुरुत्वाकर्षण को घटाता है) देगा। तो क्रम में जानना चाहते हैं कि फोन है, जिसमें

V(t)=V(t0)+a*dt 

से, आप प्रत्येक पल में वेग की गणना करना चाहिए बढ़ रहा है:

  • V(t0) पिछले पल में जाना जाता वेग है,
  • V(t) है वर्तमान तत्काल,
  • a त्वरण (पिछले तत्काल या पिछले और वर्तमान तत्काल के बीच औसत त्वरण पर त्वरण पर विचार करें) पर वेग।

समस्या यह है कि सेंसर मूल्यों की अनिश्चितता की वजह से, आप प्रत्येक पल, जो गलत वेग मूल्यों को बढ़ावा मिलेगा पर छोटी त्रुटियों संक्षेप खत्म हो सकता है। शायद आपको मूल्यों पर कम पास फ़िल्टर समायोजित करना होगा।