2014-10-02 5 views
8

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

  1. रैखिक त्वरण सेंसर TYPE_LINEAR_ACCELERATION द्वारा दिया जाता है कर रहे हैं और कुल्हाड़ियों फोन कुल्हाड़ियों है और इसलिए किसी विशेष कुल्हाड़ियों पर नज़र रखने के लिए एक अंतर नहीं है।

  2. मैंने घूर्णन वेक्टर के ट्रांसपोज़ या उलटा लगाने की कोशिश की (घुमावदार वेक्टर के लिए उलटा या स्थानांतरित) और फिर रैखिक त्वरण वेक्टर की जेड दिशा को ट्रैक करने का प्रयास किया। मदद करने के लिए प्रतीत नहीं होता है।

  3. मैं त्वरण की दिशा प्राप्त करने के लिए गुरुत्वाकर्षण मूल्यों (TYPE_GRAVITY) के साथ एक डॉट उत्पाद करने की कोशिश कर रहा हूं लेकिन ऐसा लगता है कि यह त्रुटि प्रवण है। यहां तक ​​कि जब मैं अपने डिवाइस को तेज़ी से ऊपर ले जाता हूं, तो यह नीचे जा रहा है।

मैं इस विधि यहाँ

dotProduct = vectorA[0]*vectorB[0]+vectorA[1]*vectorB[1] + vectorA[2]*vectorB[2];  
cosineVal = dotProduct/(|vectorA|*|vectorB|)  
if(cosineVal > 0) down else Up. 

विधि के साथ दोष क्या है की रूपरेखा तैयार करेंगे? कृपया मदद करें, मैं इस समय कुछ समय से अटक गया हूं।

उत्तर

1

जैसा कि मैंने इसे देखा, तीसरी विधि में आप दो वैक्टरों (गुरुत्वाकर्षण वेक्टर और त्वरण वेक्टर) के बीच कोण के कोस को खोजने की कोशिश कर रहे हैं। और विचार यह है कि यदि कोण 180 डिग्री के करीब है तो आपके पास आंदोलन होता है, यदि कोण 0 डिग्री के करीब है तो आपके पास आंदोलन नीचे है। कोसाइन वह कार्य होता है जिसमें कोण सकारात्मक होता है जब कोण -90 से 9 0 डिग्री तक होता है। तो जब आपका cosineVal मान सकारात्मक है तो इसका मतलब है कि फ़ोन नीचे जा रहा है और यहां तक ​​कि यदि कोसाइनवेल 1 आंदोलन के करीब है तो सीधे नीचे है। तो यह सच विपरीत है। जब कोसाइन नकारात्मक होता है (90 डिग्री से 270 तक) आपके पास आंदोलन होता है।

शायद आप Sensor.TYPE_ACCELEROMETER से https://developer.android.com/reference/android/hardware/SensorEvent.html#values से वेक्टर प्राप्त कर सकते हैं, वहां आपके पास गुरुत्वाकर्षण वेक्टर और त्वरण वेक्टर हैं।
मैंने नीचे एक कोड स्निपेट बनाया है जिसे आप आजमा सकते हैं।

public class MainActivity extends AppCompatActivity implements SensorEventListener { 
    private float[] gravity = new float[3]; 
    private float[] linear_acceleration = new float[3]; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // alpha is calculated as t/(t + dT) 
     // with t, the low-pass filter's time-constant 
     // and dT, the event delivery rate 

     final float alpha = 0.8f; 

     gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
     gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
     gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

     linear_acceleration[0] = event.values[0] - gravity[0]; 
     linear_acceleration[1] = event.values[1] - gravity[1]; 
     linear_acceleration[2] = event.values[2] - gravity[2]; 

     float scalarProduct = gravity[0] * linear_acceleration[0] + 
       gravity[1] * linear_acceleration[1] + 
       gravity[2] * linear_acceleration[2]; 
     float gravityVectorLength = (float) Math.sqrt(gravity[0] * gravity[0] + 
       gravity[1] * gravity[1] + gravity[2] * gravity[2]); 
     float lianearAccVectorLength = (float) Math.sqrt(linear_acceleration[0] * linear_acceleration[0] + 
       linear_acceleration[1] * linear_acceleration[1] + linear_acceleration[2] * linear_acceleration[2]); 

     float cosVectorAngle = scalarProduct/(gravityVectorLength * lianearAccVectorLength); 

     TextView tv = (TextView) findViewById(R.id.tv); 
     if (lianearAccVectorLength > 2) {//increase to detect only bigger accelerations, decrease to make detection more sensitive but noisy 
      if (cosVectorAngle > 0.5) { 
       tv.setText("Down"); 
      } else if (cosVectorAngle < -0.5) { 
       tv.setText("Up"); 
      } 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int i) { 

    } 
}