Как использовать акселерометр для определения вибрации выше или равной 2 Гс? - PullRequest
0 голосов
/ 23 мая 2011

Я делаю приложение для Android, которое напоминает автомобильный «черный ящик», в котором записывается процесс движения автомобиля.

Но я столкнулся с проблемой того, как я собираюсь интегрировать акселерометркоторый способен обнаруживать движение (вероятно,> = 2Gs), когда происходит авария, тогда он должен инициировать остановку видеозаписи и сохранить ее в файле архива, таким образом, не теряя файл в результате аварии. Любой знает, каквыполнить вышеупомянутую задачу, мне скорее нужна срочная помощь, пожалуйста!Я читал Android-разработчик на акселерометре, и это не помогает в моей ситуации здесь, во-первых, я довольно плохо физики, во-вторых, я новичок в Android / Java и моя первая попытка работы с акселерометром?Любое простое решение?Заранее спасибо :)

Это часть раздела видеозаписи, но как теперь я собираюсь использовать акселерометр для целей "Автоархивации"?

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Пара баллов: Bosch BMA150 используется во многих смартфонах с 2g, установленным в качестве максимального значения ускорения (поэтому вы никогда не увидите> 2g). С SENSOR_DELAY_FASTEST вы можете снимать показания примерно каждые 20 миллисекунд на HTC Desire. Однако, поскольку у вас есть многозадачная операционная система на телефоне, вы не можете гарантировать это время (может быть задержка на пару секунд, когда операционная система занята).

Следовательно, смартфон в настоящее время не очень подходит для этого приложения. Если Android позволит более разумно использовать акселерометры в будущем, это может измениться. Если для параметра onSensorChanged был разрешен пороговый параметр, то ускорения, превышающие этот порог, могут быть сохранены в памяти чипа акселерометра и считаны, когда это необходимо.

0 голосов
/ 23 мая 2011

Поместите ваш метод startRecording () в действие ниже, он вызывается, когда ускорение превышает 2G, вы можете изменить это, изменив значение CRASH_G_MULTIPLIER

public class YourActivity extends Activity {
    private double G = 9.81;
    private double CRASH_G_MULTIPLIER = 2;
    @Override public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startDropListening();
    }
    private void startRecording(){
        // your code that does the recording here
    }
    private void startDropListening(){
        SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
        sm.registerListener(
            new SensorEventListener(){
                @Override public void onAccuracyChanged(Sensor arg0, int arg1) {}
                @Override public void onSensorChanged(SensorEvent arg0) {
                    double accel = Math.sqrt(
                            Math.pow(arg0.values[0], 2) +   
                            Math.pow(arg0.values[1], 2) + 
                            Math.pow(arg0.values[2], 2));
                    if (accel > G * CRASH_G_MULTIPLIER){
                        startRecording();
                    }
                }
            }, 
            sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
            SensorManager.SENSOR_DELAY_NORMAL);
    }
}

Есть некоторые вещи, о которых вы должны знать:

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

  2. Вы захотите приобрести замок для пробуждения.Чтобы создать активную блокировку, сделайте следующее:

    PowerManager pm = (PowerManager) getSystemService (Context.POWER_SERVICE);wl = pm.newWakeLock (PowerManager.FULL_WAKE_LOCK, "ATag");wl.acquire ();

И следующее, когда вы закончите:

wl.release();

(вы можете изменить FULL_WAKE_LOCK на блокировку пробуждения с более низким приоритетом).(Вам также необходимо добавить соответствующее разрешение в файл манифеста для блокировки пробуждения)

  1. Вы можете увеличить частоту дискретизации.Это значительно разряжает батарею.Существуют различные значения, которые вы можете присвоить ему, в приведенном выше коде замените:

    SensorManager.SENSOR_DELAY_NORMAL

на любое из этих:

SensorManager.SENSOR_DELAY_UI
SensorManager.SENSOR_DELAY_GAME
SensorManager.SENSOR_DELAY_FASTEST
...