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?
sumber
Jawaban:
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
sumber
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 hanyalah
historically, 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 ini
divide and conquer
untuk 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.
sumber
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.
sumber
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.
sumber
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.sumber
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.
sumber