Sunday, January 31, 2016

Penghitung Langkah Kaki menggunakan Accelerometer Handphone

Pernah melihat dan menggunakan Fitbit sebelumnya? Alat kecil seperti gelang ini ketika digunakan ditangan bisa menghitung berapa banyak Anda melangkah setiap hari. Beberapa aplikasi penghitung langkah ini juga banyak tersedia di Android dan Apple. Sebenarnya bagaimanakah mekanisme penghitung langkah ini bekerja? Kali ini kita mencoba mengkaji salah satu caranya menggunakan accelerometer. Fitbit dan alat kommersial lainnya tentu saja punya teknik lainnya yang proprietary. Kita tidak membicarakan cara mereka disini, poinnya adalah untuk mengetahui kira-kira bagaimana alat tersebut bekerja.

Perhatikan cara kerja accelerometer berikut:

Jika digerakkan keatas Y akan bernilai positif dan sebaliknya. Bagaimana kalau handphone sedang dalam keadaan diam? Dia akan negatif karena ada gravitasinya bumi 9.8 m/s2. Bagaimana jika handphone tersebut ditaruh didalam saku celana?


Perhatikan kondisi ketika ketika berjalan dan handphone berapa disaku celana.
  1. Berjalan biasa, berjalan cepat, ataupun berlari akan membuat handphone berayun sesuai dengan langkah kaki. Ayunan ini mengakibatkan ada percepatan yang ditangkap oleh accelerometer pada handphone. Dengan menangkap semua angka pada frekuensi tinggi (100Hz) atau sekitar 100 data poin setiap detik kita akan mendapatkan pergerakan angka-angka ayunan kaki tersebut secara granular.
  2. Langkah kaki pada umumnya bergerak pada bidang planar (mengayun ke atas dan bergerak ke depan). Artinya secara teori hanya dua sumbu accelerometer yang mendeteksi percepatan gerakan.
  3. Pada saku yang tidak ketat, handphone kemungkinan berpindah-pindah posisi sehingga deteksi percepatan mungkin terjadi pada semua sensor axis


Bagaimana kita bisa menyatukan semua gerakan axis accelerometer hingga bisa mendeteksi gerakan? Cara yang sederhana adalah dengan menambahkan nilai kuadrat semua nilainya.

Sensor Number= X2 + Y2 + Z2

Kenapa rumus diatas?
  1. Angka accelerometer ada yang negative, kuadrat akan membuat semua nilai positif
  2. Tipikal gerakan mengayun pada bidang planar secara teori mengakibatkan hanya dua axis yang meregister ayunan
  3. Apabila handphone berputar di dalam saku, pengurangan nilai pada satu axis akan dikompensasi dari nilai axis lainnya, akibatkan jumlah ketiganya secara probabilitas masih dalam angka yang sama


PROGRAM-nya:
Testing menggunakan Samsung Galaxy S4 dengan setting sensor maksimal. Alasannya karena hardware Samsung Galaxy S4 cukup akurat (flagship Samsung) dan sensor maksimal untuk memastikan granularity data.

Set sensor Android di 100Hz:
  @Override
  protected void onResume() {
    super.onResume();
    sensorManager.registerListener(this,
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
            SensorManager.SENSOR_DELAY_FASTEST);
  }


Ambil nilainya:
  @Override
  public void onSensorChanged(SensorEvent event) {
    if ((event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)&&(Running)) {
      getAccelerometer(event);
    }
    if ((event.sensor.getType() == Sensor.TYPE_GYROSCOPE)&&(Running)) {
        getGyroscope(event);
      }
  }

  private void getAccelerometer(SensorEvent event) {
    float[] values = event.values;
    long actualTime = System.nanoTime();
    float x = values[0];
    float y = values[1];
    float z = values[2];
    try {
        result= result+ "ACC\t"+actualTime+"\t"+x+"\t"+y+"\t"+z+"\n";
        counter++;
        if (counter%15==0){
            out.append(result);
            counter=0;
            result="";
        }
    } catch (Exception e){
        e.printStackTrace();
    }

  }


Selain itu, perhatikan hal-hal teknis berikut:
  1. Rekam ke dalam sdcard data hasil sensor minal untuk setiap 20 record. Kecepatan penulisan SDCard berbeda-beda dan kita berusaha menghindari masalah I/O
  2. Prevent Sleeping pada Andorid. Ini supaya sensor terus bekerja meskipun didalam celana
  3. Time series ubah ke dalam System.nanoTime();  untuk memastikan granularity

 Perhatikan plot hasil rekaman accelerometer diatas dalam chart berikut:


Anda lihat? terdapat pola pada setiap langkah kita? Hmm silahkan explore lebih lanjut ya, dengan menquantifisir chart tersebut ke dalam algoritma SAX dan PLA, kita bisa membedakan mana yang jalan biasa, jalan cepat, dan berlari. 

No comments:

Post a Comment