Akurasi akselerometer Android (Navigasi inersia)

109

Saya sedang mempertimbangkan untuk menerapkan Sistem Navigasi Inersia untuk ponsel Android, yang menurut saya sulit mengingat akurasi akselerometer, dan fluktuasi pembacaan yang konstan.

Untuk memulainya, saya meletakkan ponsel pada permukaan yang datar dan mengambil sampel 1000 bacaan akselerometer dalam arah X dan Y (sejajar dengan tabel, jadi tidak ada gravitasi yang bekerja di arah ini). Saya kemudian menghitung rata-rata pembacaan ini dan menggunakan nilai ini untuk mengkalibrasi telepon (mengurangkan nilai ini dari setiap pembacaan berikutnya).

Saya kemudian menguji sistem dengan meletakkannya lagi di atas meja dan mengambil sampel bacaan akselerometer 5.000 dalam arah X dan Y. Saya berharap, mengingat kalibrasi, bahwa percepatan ini harus berjumlah 0 (kira-kira) di setiap arah. Namun, ini tidak terjadi, dan percepatan total selama 5000 iterasi tidak mendekati 0 (rata-rata sekitar 10 pada setiap sumbu).

Saya menyadari tanpa melihat kode saya ini mungkin sulit untuk dijawab tetapi dalam pengertian yang lebih umum ...

Apakah ini hanya contoh betapa tidak akuratnya pembacaan akselerometer pada ponsel (HTC Desire S), atau apakah lebih mungkin saya membuat beberapa kesalahan dalam pengkodean saya?

kayu bakar 365
sumber
1
webvr-polyfill adalah sumber inspirasi yang bagus: github.com/borismus/webvr-polyfill/tree/master/src lihat bagaimana mereka mem-polyfill sensor VR menggunakan data akselerometer: github.com/borismus/webvr-polyfill/blob/master / src /…
SC
Pertanyaan yang juga mempertimbangkan giroskop: stackoverflow.com/questions/8264518/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

128

Anda mendapatkan posisi dengan mengintegrasikan percepatan linier dua kali tetapi kesalahannya sangat buruk. Itu tidak berguna dalam prakteknya.

Berikut penjelasan kenapa (Google Tech Talk) di 23:20 . Saya sangat merekomendasikan video ini.

Bukan derau akselerometer yang menyebabkan masalah, melainkan derau putih giro , lihat sub-bagian 6.2.3 Penyebaran Kesalahan. (Ngomong-ngomong, Anda juga membutuhkan giroskop.)

Mengenai pemosisian dalam ruangan, menurut saya ini berguna:

Pelokalan dan Pelacakan Indoor Berbasis RSSI Menggunakan Sigma-Point Kalman Smoothers

Pelacakan Pejalan Kaki dengan Sensor Inersia yang Dipasang di Sepatu

Meningkatkan Kinerja Pedometer Menggunakan Akselerometer Tunggal

Saya tidak tahu bagaimana metode ini akan bekerja dalam aplikasi kehidupan nyata atau bagaimana mengubahnya menjadi aplikasi Android yang bagus.

Pertanyaan serupa adalah ini .

MEMPERBARUI:

Ternyata ada versi yang lebih baru dari Oliver J. Woodman di atas, "Pengantar navigasi inersia", tesis PhD-nya:

Lokalisasi Pejalan Kaki untuk Lingkungan Dalam Ruangan

Ali
sumber
2
Saya menyadari ini sudah lama sekali, tetapi saya punya pertanyaan lanjutan. Kamera di Android JB memiliki fitur 'panorama', yang memungkinkan Anda mengambil gambar panorama dengan menggerakkan ponsel, baik memutarnya atau menggerakkannya secara linier di sepanjang satu sumbu. Untuk melakukan ini, ia harus melacak posisi telepon secara relatif akurat - setidaknya lebih baik daripada kesalahan 20cm / s yang disebutkan dalam video tautan jawaban ini. Bagaimana cara melakukannya? Apakah ada cara untuk meningkatkan kualitas pelacakan inersia? Atau apakah itu menggunakan pemrosesan gambar yang cerdas untuk melakukannya hanya dengan menggunakan kamera?
Tom
1
@Tom Saya percaya yang terakhir, telepon menggabungkan gambar-gambar murni dengan algoritma pemrosesan gambar. Apa yang membuat Anda berpikir bahwa ponsel harus melacak posisinya untuk menghasilkan gambar panorama? Hal ini dimungkinkan untuk melakukannya dengan kamera biasa di tahun 90-an dan jelas, kami tidak memiliki akselerometer di kamera saat itu :) Tentu saja, gambar-gambar tersebut digabungkan pada PC biasa. Tetapi Anda tidak membutuhkan posisi untuk ini, algoritma pemrosesan gambar sudah cukup. Semoga ini membantu.
Ali
Ini sangat berbeda dengan pekerjaan lama-mengambil-beberapa-gambar-lalu-menjahit-nanti-nanti. Itu melacak posisinya secara real time entah bagaimana. Agak sulit untuk menjelaskan tanpa mendemonstrasikannya. Anda tidak perlu mengambil gambar secara manual - telepon memutuskan kapan Anda telah bergerak cukup jauh untuk mengambil gambar lainnya. Saat Anda mengambil gambar, ini menunjukkan kepada Anda bilah kecil di bagian bawah dengan pratinjau panorama. Jika Anda mengarahkan kamera terlalu jauh ke bawah (misalnya), kamera akan mulai berbunyi bip dan menampilkan panah ke atas untuk memberi tahu Anda perlu memindahkannya kembali.
Tom
2
Sebenarnya itu tampaknya menggunakan pemrosesan gambar - memulai panorama dan kemudian melambaikan tangan Anda di depan kamera akan sangat membingungkan sistem pelacakan posisinya!
Tom
@Tidak masalah. Saya pikir ini terutama menggunakan pemrosesan gambar (seperti yang disarankan oleh komentar terakhir Anda juga) tetapi kemungkinan akan digabungkan dengan pelacakan orientasi (tetapi bukan posisi).
Ali
19

Saya hanya berpikir keras, dan saya belum bermain dengan API akselerometer android, jadi bersabarlah.

Pertama-tama, secara tradisional, untuk mendapatkan navigasi dari akselerometer, Anda memerlukan akselerometer 6 sumbu. Anda membutuhkan percepatan di X, Y, dan Z, tetapi juga rotasi Xr, Yr, dan Zr. Tanpa data rotasi, Anda tidak memiliki cukup data untuk membuat vektor kecuali Anda menganggap perangkat tidak pernah mengubah sikapnya, yang akan sangat membatasi. Tidak ada yang membaca TOS.

Oh, tahukah Anda bahwa INS mengikuti rotasi bumi, bukan? Jadi ada itu juga. Satu jam kemudian dan Anda secara misterius mendaki di lereng 15 ° ke luar angkasa. Itu dengan asumsi Anda memiliki INS yang mampu mempertahankan lokasi selama itu, yang belum dapat dilakukan telepon.

Cara yang lebih baik untuk menggunakan akselerometer - bahkan dengan akselerometer 3 sumbu - untuk navigasi adalah dengan menghubungkan ke GPS untuk mengkalibrasi INS jika memungkinkan. Jika GPS gagal, INS memuji dengan baik. GPS tiba-tiba dapat menembak Anda sejauh 3 blok karena Anda terlalu dekat dengan pohon. INS tidak bagus, tapi setidaknya ia tahu Anda tidak terkena meteor.

Yang dapat Anda lakukan adalah mencatat data akselerometer ponsel, dan banyak lagi. Seperti layaknya berminggu-minggu. Bandingkan dengan data GPS yang bagus (maksud saya sangat bagus) dan gunakan datamining untuk menetapkan korelasi tren antara data akselerometer dan data GPS yang diketahui. (Kiat pro: Anda akan ingin memeriksa almanak GPS untuk hari-hari dengan geometri yang baik dan banyak satelit. Kadang-kadang Anda mungkin hanya memiliki 4 satelit dan itu tidak cukup) Apa yang mungkin dapat Anda lakukan adalah menemukannya ketika seseorang berjalan dengan ponsel di saku, data akselerometer mencatat pola yang sangat spesifik. Berdasarkan datamining, Anda membuat profil untuk perangkat itu, dengan pengguna itu, dan kecepatan seperti apa yang diwakili oleh pola itu ketika memiliki data GPS untuk menyertainya. Anda harus dapat mendeteksi belokan, menaiki tangga, duduk (kalibrasi ke waktu kecepatan 0! ) dan berbagai tugas lainnya. Bagaimana ponsel dipegang perlu diperlakukan sebagai input data yang terpisah sepenuhnya. Saya mencium jaringan saraf yang digunakan untuk melakukan penambangan data. Dengan kata lain, sesuatu yang buta tentang arti masukan itu. Algoritme hanya akan mencari tren dalam pola, dan tidak terlalu memperhatikan pengukuran INS yang sebenarnya. Yang akan diketahui hanyalahhistorically, when this pattern occurs, the device is traveling and 2.72 m/s X, 0.17m/s Y, 0.01m/s Z, so the device must be doing that now.Dan itu akan menggerakkan bidak ke depan. Sangat penting bahwa itu benar-benar buta, karena hanya meletakkan telepon di saku Anda mungkin berorientasi pada salah satu dari 4 orientasi yang berbeda, dan 8 jika Anda mengganti kantong. Dan ada banyak cara untuk memegang ponsel Anda juga. Kami membicarakan banyak data di sini.

Anda jelas masih memiliki banyak penyimpangan, tetapi saya pikir Anda akan lebih beruntung dengan cara ini karena perangkat akan tahu kapan Anda berhenti berjalan, dan penyimpangan posisi tidak akan berlangsung lama. Ia tahu bahwa Anda berdiri diam berdasarkan data historis. Sistem INS tradisional tidak memiliki fitur ini. Penyimpangan tersebut mengabadikan semua pengukuran dan senyawa di masa depan secara eksponensial. Akurasi yang tidak tepat, atau memiliki navigasi sekunder untuk diperiksa secara berkala, sangat penting dengan INS tradisional.

Setiap perangkat, dan setiap orang harus memiliki profilnya sendiri. Itu banyak data dan banyak perhitungan. Setiap orang berjalan dengan kecepatan yang berbeda, dengan langkah yang berbeda, dan meletakkan ponsel mereka di kantong yang berbeda, dll. Tentunya untuk menerapkan ini di dunia nyata akan membutuhkan pengolah angka untuk ditangani di sisi server.

Jika Anda memang menggunakan GPS untuk baseline awal, bagian dari masalahnya adalah GPS cenderung memiliki migrasi sendiri dari waktu ke waktu, tetapi kesalahan tersebut tidak terus-menerus. Tempatkan penerima di satu lokasi dan catat datanya. Jika tidak ada koreksi WAAS, Anda dapat dengan mudah mendapatkan perbaikan lokasi yang melayang ke arah acak 100 kaki di sekitar Anda. Dengan WAAS, mungkin turun hingga 6 kaki. Anda mungkin sebenarnya lebih beruntung dengan sistem RTK sub-meter di ransel untuk setidaknya menurunkan algoritma ANN.

Anda masih akan memiliki penyimpangan sudut dengan INS menggunakan metode saya. Ini adalah sebuah masalah. Tapi, jika Anda melangkah lebih jauh untuk membangun JST untuk menuangkan data GPS dan INS selama berminggu-minggu di antara n pengguna, dan benar-benar berhasil hingga titik ini, Anda jelas tidak keberatan dengan data besar sejauh ini. Terus ikuti jalur itu dan gunakan lebih banyak data untuk membantu menyelesaikan penyimpangan sudut: Manusia adalah makhluk kebiasaan. Kami cukup banyak melakukan hal yang sama seperti berjalan di trotoar, melewati pintu, naik tangga, dan tidak melakukan hal-hal gila seperti berjalan melintasi jalan raya, menembus dinding, atau keluar dari balkon.

Jadi katakanlah Anda mengambil halaman dari Big Brother dan mulai menyimpan data ke mana orang pergi. Anda dapat mulai memetakan di mana orang diharapkan untuk berjalan kaki. Ini adalah taruhan yang cukup pasti bahwa jika pengguna mulai menaiki tangga, dia berada di dasar tangga yang sama dengan yang dinaiki orang sebelumnya. Setelah 1000 iterasi dan beberapa penyesuaian kuadrat terkecil, database Anda cukup mengetahui di mana tangga tersebut berada dengan sangat akurat. Sekarang Anda dapat mengoreksi penyimpangan sudut dan lokasi saat orang tersebut mulai berjalan. Ketika dia menabrak tangga itu, atau berbelok ke lorong itu, atau berjalan di trotoar, setiap penyimpangan bisa diperbaiki. Database Anda akan berisi sektor-sektor yang dibobotkan oleh kemungkinan seseorang berjalan ke sana, atau pengguna ini pernah berjalan ke sana di masa lalu. Database spasial dioptimalkan untuk penggunaan inidivide and conqueruntuk hanya mengalokasikan sektor yang berarti. Ini akan menjadi semacam proyek MIT di mana robot yang dilengkapi laser dimulai dengan gambar hitam, dan melukis labirin dalam memori dengan mengambil setiap belokan, menerangi di mana semua dinding berada.

Area dengan lalu lintas tinggi akan mendapatkan bobot lebih tinggi, dan area di mana belum pernah ada yang mendapatkan bobot 0. Area lalu lintas yang lebih tinggi memiliki resolusi yang lebih tinggi. Anda pada dasarnya akan mendapatkan peta di mana pun orang pernah berada dan menggunakannya sebagai model prediksi.

Saya tidak akan terkejut jika Anda dapat menentukan kursi apa yang diambil seseorang di teater menggunakan metode ini. Mengingat cukup banyak pengguna yang pergi ke teater, dan resolusi yang cukup, Anda akan memiliki pemetaan data setiap baris teater, dan seberapa lebar setiap baris. Semakin banyak orang mengunjungi suatu lokasi, semakin tinggi keakuratan yang dapat Anda gunakan untuk memprediksi lokasi orang tersebut.

Juga, saya sangat menyarankan Anda mendapatkan langganan (gratis) ke majalah GPS World jika Anda tertarik dengan penelitian terkini tentang hal-hal semacam ini. Setiap bulan saya kutu buku dengan itu.

RyanJMcGowan
sumber
"akan menghubungkan ke GPS untuk mengkalibrasi INS bila memungkinkan. Jika GPS gagal, INS memuji dengan baik." Untuk itulah penyaringan Kalman, seperti yang saya mengerti. Ini menggabungkan kekuatan masing-masing metode untuk menghilangkan kelemahan yang lain
endolit
8

Saya tidak yakin seberapa besar offset Anda, karena Anda lupa memasukkan unit. ("Sekitar 10 di setiap sumbu" tidak banyak bicara.: P) Meskipun demikian, kemungkinan besar masih karena ketidakakuratan pada perangkat keras.

Akselerometer baik untuk hal-hal seperti menentukan orientasi ponsel relatif terhadap gravitasi, atau mendeteksi gerakan (menggoyangkan atau membenturkan ponsel, dll.)

Namun, mencoba melakukan perhitungan mati menggunakan akselerometer akan membuat Anda mengalami banyak kesalahan gabungan. Akselerometer harus sangat akurat jika tidak, dan ini bukan kasus penggunaan umum, jadi saya ragu produsen perangkat keras mengoptimalkannya.

Trevor Johns
sumber
Terima kasih atas jawabannya. Akselerometer membaca sekitar -0,8 ms ^ -2 pada sumbu X dan Y saat tidak bergerak, jadi saya menggunakan ini sebagai offset saya. Yang saya maksud dengan bit "Sekitar 10" adalah bahwa lebih dari 5000 iterasi, menambahkan masing-masing percepatan pada satu sumbu dari sensor tidak berjumlah sekitar 0 ms ^ -2 (seperti yang akan terjadi jika berfluktuasi secara merata di atas dan di bawah offset nilai), tetapi cenderung mendaftarkan akselerasi lebih ke satu arah, yang setelah integrasi ganda untuk menemukan posisi, bekerja saat ponsel bergerak sekitar 3m dalam satu menit.
woodstock365
1 untuk penggunaan istilah navigasi penerbangan, "perhitungan mati". Meskipun perhitungan mati akan lebih tepat diterapkan pada navigasi dengan kamera daripada INS.
RyanJMcGowan
7

Akselerometer Android adalah digital, ia mengambil sampel akselerasi menggunakan jumlah "keranjang" yang sama, katakanlah ada 256 keranjang dan akselerometer mampu mendeteksi dari -2g hingga + 2g. Ini berarti bahwa keluaran Anda akan dikuantisasi dalam istilah "kelompok" ini dan akan melompati beberapa kumpulan nilai.

Untuk mengkalibrasi akselerometer android, Anda perlu mengambil sampel lebih dari 1000 titik dan menemukan "mode" di mana akselerometer berfluktuasi. Kemudian temukan jumlah titik digital dengan seberapa banyak output berfluktuasi dan gunakan itu untuk pemfilteran Anda.

Saya merekomendasikan penyaringan Kalman setelah Anda mendapatkan mode dan +/- fluktuasi.

Alex Stone
sumber
1
Saya sedang mencari metode kalibrasi. Sepertinya saran Anda adalah yang saya butuhkan. Saya hanya perlu konfirmasi. Setelah saya menemukan modenya, katakan itu adalah 0,5. Saya tidak mendapatkan "Kemudian temukan jumlah titik digital dengan berapa banyak output berfluktuasi dan gunakan itu untuk penyaringan Anda." Bisakah Anda menjelaskan lebih lanjut.
Nazerke
1
Misalkan akselerometer Anda memiliki 256 titik keluaran dan berfluktuasi sebesar 0,015 m / s ^ 2 di antara pembacaan. Saat Anda meletakkan perangkat Anda di atas meja, output Anda mungkin berfluktuasi bahkan dalam kelipatan 0,015m / s ^ 2. Misalkan Anda mendapatkan pembacaan 0 +/- (X * 0,015). Anda perlu mencari X (yang merupakan bilangan genap). Misalnya X saya mungkin 3. Dalam kasus ini, saya akan mengabaikan perubahan dalam pembacaan akselerometer yang kurang dari 0,045 m / s ^ 2
Alex Stone
jadi akselerometer ponsel android belum begitu bagus .. benar?
Techsin
4

Saya menyadari ini sudah cukup lama, tetapi masalah yang dihadapi tidak dibahas dalam jawaban APA PUN yang diberikan.

Apa yang Anda lihat adalah percepatan linier perangkat termasuk efek gravitasi. Jika Anda meletakkan telepon di permukaan datar, sensor akan melaporkan percepatan gravitasi yang kira-kira 9.80665 m/s2, sehingga memberikan 10 yang Anda lihat. Sensornya tidak akurat, tapi bukannya itu tidak akurat! Lihat di sini untuk beberapa tautan dan informasi berguna tentang sensor yang mungkin Anda cari.

Simon O'Hanlon
sumber
17
Tidak - Saya pikir Anda salah membaca pertanyaan: "... pembacaan di arah X dan Y (sejajar dengan tabel, jadi tidak ada gaya gravitasi yang bekerja di arah ini)". 9.8 / s2 akan berada pada sumbu Z.
teko7
0

Anda membuat asumsi bahwa pembacaan akselerometer dalam arah X dan Y, yang dalam hal ini sepenuhnya adalah derau perangkat keras, akan membentuk distribusi normal di sekitar rata-rata Anda. Ternyata bukan itu masalahnya.

Satu hal yang dapat Anda coba adalah memplot nilai-nilai ini pada grafik dan melihat apakah ada pola yang muncul. Jika tidak, maka derau tersebut secara statistik acak dan tidak dapat dikalibrasi - setidaknya untuk perangkat keras ponsel Anda.

Sarsaparilla
sumber