Pertanyaan Pedometer (Penghitung Langkah)


Saya mengembangkan aplikasi Android Pedometer untuk menghitung jumlah langkah yang diambil dan menggunakan langkah-langkah menghitung jarak yang ditempuh dan kalori yang dibakar. Saya telah mengikuti tutorial Buat Pedometer Sederhana dan Penghitung Langkah di Android dan melakukan persis seperti itu. Ini mendeteksi jumlah langkah ketika sensor mendeteksi gerakan.

Tetapi ada beberapa masalah dengan itu:

  1. Ketika saya berdiri di tempat yang sama dengan perangkat saya di tangan saya dan hanya menggerakkan tangan saya atau memberikan sentakan ke perangkat, itu mendeteksi perubahan dan menambah jumlah langkah.
  2. Jika saya bergerak sangat lambat dengan perangkat di tangan saya itu tidak mendeteksi perubahan.
  3. Jika saya melompat, maka itu menambahkan beberapa langkah di meja.

Saya telah memeriksa beberapa aplikasi lain dari Play Store mereka tidak melakukan hal semacam ini.

Saya telah mencari tetapi tidak dapat menemukan solusi atau tutorial yang tepat untuk itu. Bantuan atau saran apa pun. Terima kasih


6
2017-10-19 06:32


asal


Jawaban:


Masalahnya di sini adalah bahwa penerapan Anda tidak cukup canggih: hanya memeriksa apakah ada lonjakan dalam data akselerometer dan mengasumsikan bahwa lonjakan itu berasal dari sebuah langkah. Itu tidak tahu di mana lonjakan akselerasi benar-benar datang dari: mungkin juga datang dari Anda melompat atau gemetar perangkat di tangan Anda.

Bagaimana membuatnya lebih akurat? Nah, itu adalah pertanyaan yang sangat sulit yang telah menjadi topik untuk karya ilmiah untuk waktu yang sangat lama. Bahkan pelacak kebugaran yang paling canggih (yang menggunakan pembelajaran mesin, pemrosesan sinyal, dan metode statistik lainnya) mengalami kesulitan untuk menentukan kapan langkah itu nyata dan kapan hanya noice atau pengguna yang bermain dengan perangkat.

Untungnya Android memang memiliki builtin sendiri penghitung langkah dan pendeteksi langkah, yang lebih canggih dari kelas di dalam contoh.

Jadi kecuali Anda benar-benar ingin mempelajari pemrosesan sinyal dan AI (yang sangat saya rekomendasikan, meskipun saya tidak tahu banyak tentang ilmu data pendeteksi langkah), saya akan menyarankan untuk menggunakan detektor dan penghitung builtin.


0
2017-10-19 07:22



Itu metode yang sangat naif untuk mencapai hitungan langkah. Anda harus menggunakan penghitung langkah bawaan Android karena juga menggunakan sensor lain jika tersedia seperti giroskop yang dapat meningkatkan deteksi langkah. Anda terutama harus menggunakan versi bawaan ini jika Anda akan membangun sesuatu di atasnya. Anda membutuhkan lapisan dasar yang andal. Anda juga dapat mencoba menggunakan sensor percepatan linear yang dihitung dengan membuang komponen gravitasi dari akselerometer. Gravitas membuat akselerometer sangat sensitif, itulah mengapa Anda melihat penghitung langkah meningkat ketika Anda baru saja berdiri.

Detailnya dapat ditemukan di sini: https://source.android.com/devices/sensors/sensor-types#step_detector

Jika Anda masih ingin mengembangkan sendiri dari awal, maka lihat kode ini: https://github.com/bagilevi/android-pedometer

Anda juga dapat mencoba pakar Google untuk makalah terbaru tentang algoritma penghitungan langkah. Terutama mencoba membaca survei terbaru tentang topik ini.


0
2017-10-19 20:03



Dengan menerapkan SensorEventListener pendengar dalam kelas dan menimpa dua metode onSensorChanged dan onAccuracyChanged Anda dapat mulai melacak langkah-langkah.

    public class StepActivity extends Activity implements SensorEventListener{
    SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    Sensor sSensor= sensorManager .getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

    ...

}

Sekarang kami telah menginisialisasi SensorManager dan Sensor dan memiliki Sensor terdaftar sebagai pendengar dalam aktivitas, sekarang kami perlu mengimplementasikan onSensorChanged fungsi yang akan dipicu oleh SensorEvent setiap kali ada perubahan pada Sensor yang kami daftarkan, dalam kasus kami TYPE_STEP_DETECTOR.

private long steps = 0;

@Override
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    float[] values = event.values;
    int value = -1;

    if (values.length > 0) {
        value = (int) values[0];
    }


    if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
        steps++;
    }
}

0
2018-01-17 10:17