2016-04-04 8 views
2

Привет, я работаю с приложением, которое подсчитывает, сколько прыжков вы делаете, im используя гироскоп для этого приложения, чтобы рассчитать скачки, которые вы делаете. Но проблема в том, что, когда я перемещаю устройство немного, он считается прыжком, и это не то, как я хочу. Я хочу, чтобы когда-либо он достиг высоты, он считается прыжком.Рассчитать время перелета по вертикали

int count = 0; 
public void onSensorChanged(SensorEvent event) { 
    double d = Math.round(Math.sqrt(Math.pow(2, event.values[0]) + Math.pow(2, event.values[1]) + Math.pow(2, event.values[2])) - 2); 
    String result =""; 

    if(d != 0){ 
     count++; 
     result = String.valueOf(d/100.0); 
    } 
    text.setText("jump counts" + " " + count); 
    text.invalidate(); 
    Log.i("Gyro", result); 
} 
+0

1. Не используйте для этого гироскоп. Гироскопы предназначены для измерения вращения. Используйте акселерометр. 2. Если вы проверите, есть ли какие-либо изменения ('d! = 0'), он поймает любое движение, большее, чем точность датчика. – StenSoft

+0

@StenSoft я попробовал его с помощью ускорителя и использовал только Y, и каждый раз, когда он дрожал, он будет считаться прыжком, но иногда ему потребовалось больше очков прыжка. – Gildarian

+0

Акселерометры измеряют ускорение ('TYPE_LINEAR_ACCELERATION' linear, что вы хотите, и' TYPE_ACCELEROMETER' в целом, включая гравитацию, которую вы, возможно, захотите использовать для более старых устройств в качестве резервного). Вам также нужно время, чтобы дистанцироваться от него. И вам нужно сравнить его с порогом, чтобы исключить небольшие (без прыжка) изменения. – StenSoft

ответ

1

Вы можете ввести пороговое значение, при котором скачок засчитывается, если гироскоп возвращается на расстояние, большее или равное этому пороговому значению.

int count = 0; 

    public void onSensorChanged(SensorEvent event) { 
     double d = Math.round(Math.sqrt(Math.pow(2, event.values[0]) + Math.pow(2, event.values[1]) + Math.pow(2, event.values[2])) - 2); 
     String result =""; 
     SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(context); 

     float threshold=preferences.getFloat(KEY,defaulttValue) 
     if(d != 0 && d>=threshold){ 
      count++; 
      result = String.valueOf(d/100.0); 
     } 
     text.setText("jump counts" + " " + count); 
     text.invalidate(); 
     Log.i("Gyro", result); 
    } 

это пороговое значение может быть откалибровано пользователем, сохранено в общих предпочтениях, чтобы его можно было изменить позже.

+0

Я тестировал ваш код, и он отлично работает, но теперь проблема заключается в том, что когда я встряхиваю телефонный пример, как вы что-то виняете или как балансировка (слева и справа), он считается прыжком, не знаю, могу ли я его отключить или понизить смысл этого. – Gildarian

+0

Возможно, вы можете проверить линейное ускорение и измерить изменения только по оси Y, отбросить значения оси X, которые считаются движущимися влево или вправо. проверьте эту ссылку для получения дополнительной информации http://developer.android.com/guide/topics/sensors/sensors_motion.html#sensors-motion-linear –