Bagaimana cara meningkatkan peta di Robot Otonomi Seluler saya menggunakan KINECT

9

Sedikit latar belakang tujuan saya

Saya sedang dalam proses membangun robot otonom seluler yang harus menavigasi di sekitar area yang tidak diketahui, harus menghindari rintangan dan menerima input ucapan untuk melakukan berbagai tugas. Ia juga harus mengenali wajah, benda, dll. Saya menggunakan Kinect Sensor dan data roda odometri sebagai sensornya. Saya memilih C # sebagai bahasa utama saya karena driver dan sdk resmi sudah tersedia. Saya telah menyelesaikan modul Visi dan NLP dan sedang mengerjakan bagian Navigasi.

Robot saya saat ini menggunakan Arduino sebagai modul untuk komunikasi dan prosesor Intel i7 x64 bit pada laptop sebagai CPU.

Ini adalah gambaran umum robot dan elektroniknya:

gambaran umum robot elektronik robot


Masalah

Saya menerapkan algoritma SLAM sederhana yang mendapatkan posisi robot dari encoders dan menambahkan apa pun yang dilihatnya menggunakan kinect (sebagai irisan 2D awan titik 3D) ke peta.

Seperti inilah tampilan peta kamar saya saat ini:

seperti apa peta dari kamar saya Peta lain kamar saya

Ini adalah gambaran kasar dari kamar saya yang sebenarnya:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, mereka sangat berbeda dan peta yang sangat buruk.

  • Apakah ini diharapkan dari menggunakan perhitungan mati?
  • Saya menyadari adanya filter partikel yang memperbaikinya dan siap untuk diimplementasikan, tetapi bagaimana cara saya dapat meningkatkan hasil ini?

Memperbarui

Saya lupa menyebutkan pendekatan saya saat ini (yang sebelumnya saya harus tetapi lupa). Program saya kira-kira melakukan ini: (Saya menggunakan hashtable untuk menyimpan peta dinamis)

  • Ambil cloud point dari Kinect
  • Tunggu data odometri seri yang masuk
  • Sinkronisasi menggunakan metode berbasis-waktu
  • Perkirakan pose robot (x, y, theta) menggunakan persamaan di Wikipedia dan data enkoder
  • Dapatkan "irisan" titik cloud
  • Irisan saya pada dasarnya adalah array dari parameter X dan Z
  • Kemudian plot titik-titik ini berdasarkan pose robot dan X dan Z params
  • Ulang
Shreyas Kapur
sumber

Jawaban:

1

Apakah ini yang diharapkan: pada prinsipnya ya. Meskipun Anda mungkin dapat meningkatkan model odometri Anda, secara umum itu tidak cukup untuk mendapatkan peta yang baik. Tanpa deskripsi sistem Anda, sulit untuk mengatakan bagaimana memperbaikinya. Pada kebanyakan sistem, estimasi terjemahan lebih baik daripada rotasi. Anda bisa menambahkan lang dan mengukur rotasi. Ini akan meningkatkan hasil Anda secara signifikan.

Alih-alih menerapkan filter partikel sendiri, Anda bisa menggunakan implementasi SLAM misalnya dari openslam . Ini akan menghemat banyak waktu, dan kemungkinan besar akan memberikan hasil yang lebih baik.

Jakob
sumber
Anda membuat saya merasa lebih baik dengan mengatakan bahwa itu diharapkan: D, tetapi saya benar-benar yakin bahwa odometri saya sangat baik, ( khususnya rotasi saya : D). Saya telah menambahkan pembaruan yang secara singkat menjelaskan sistem, (jika itu tidak cukup, saya dapat memberi Anda kode atau informasi lainnya). Saya akan mencoba menggunakan gyro besok dan kemudian memperbarui hasilnya. Saya ingin menggunakan algoritma openslam, tetapi saya menggunakan C # (sehingga saya dapat menggunakan SDK resmi), dan sebagian besar pustaka untuk tugas-tugas tersebut baik dalam C ++ atau disediakan dalam ROS (hanya linux). Saya pasti akan senang menggunakannya tetapi saya tidak melihat tajam!
Shreyas Kapur
tinyslam mengklaim menggunakan 200 baris kode c. Saya kira porting ke c # seharusnya tidak terlalu sulit.
Jakob
Wow! Tapi saya kira itu tidak menggunakan filter partikel dan melakukan hal yang sama yang saya lakukan. Tetapi saya pasti akan mencoba menerapkannya. Terima kasih banyak :-)
Shreyas Kapur
1

Saya sarankan Anda mencoba filter partikel / EKF.

Apa yang Anda lakukan saat ini:

-> Dead Reckoning: Anda melihat posisi Anda saat ini tanpa referensi.

-> Lokalisasi Berkelanjutan: Secara kasar Anda tahu di mana Anda berada di peta.

Jika Anda tidak memiliki referensi dan tidak tahu di mana Anda berada di peta, apa pun tindakan yang Anda lakukan, Anda akan merasa sulit untuk mendapatkan peta yang sempurna.

Misalnya: Anda berada di ruangan melingkar. Anda terus bergerak maju. Anda tahu apa langkah terakhir Anda. Peta yang Anda dapatkan akan berupa kotak seperti struktur. Ini akan terjadi kecuali dan sampai Anda memiliki cara untuk melokalkan atau mengetahui di mana Anda berada di peta, terus menerus.

Pelokalan dapat dilakukan melalui Filter EKF / Partikel jika Anda memiliki titik referensi awal. Namun, titik referensi awal adalah suatu keharusan.

Naresh
sumber
Terima kasih atas jawabannya, contoh yang sangat bagus memang, saya pasti akan menggunakan EKF, tetapi masalahnya adalah saya tidak buruk dalam matematika, tetapi tidak terlalu baik juga, dan saya menggunakan C #, jadi saya tidak punya perpustakaan dan mengimplementasikannya saya sendiri akan membutuhkan waktu lama. Ada saran tentang itu?
Shreyas Kapur
Akan jauh lebih baik untuk memoles matematika Anda dan mengambil beberapa kursus daripada membuat sesuatu yang Anda tidak mengerti dan tidak bisa men-debug. Pelajari dan implementasikan. Ini pasti akan berguna di masa depan.
Naresh
Cari juga implementasi C # di github. Karya itu lebih populer daripada yang terlihat.
Naresh
Terima kasih atas sarannya, pasti akan melakukannya besok. Saya mencoba yang terbaik untuk belajar matematika, dan berharap untuk melakukannya dan saya yakin itu akan berjalan jauh. Saya berumur 13 tahun yang merupakan hambatan untuk belajar di sini, kami bahkan belum diperkenalkan ke matriks di sekolah! :-(
Shreyas Kapur
Saya tahu Anda berumur 13 tahun :) Internet tidak peduli. Anda dapat mengambil matriks dari Khan Academy. Probabilitas dan Statistik juga.
Naresh
1

Karena Anda menggunakan perhitungan mati kesalahan dalam memperkirakan pose robot menumpuk dalam waktu. Dari pengalaman saya, setelah beberapa saat, estimasi pose mati menjadi tidak berguna. Jika Anda menggunakan sensor tambahan, seperti Giroskop atau Accelerometer, estimasi pose akan meningkat tetapi karena Anda tidak memiliki umpan balik pada beberapa titik, itu akan berbeda seperti sebelumnya. Akibatnya, bahkan jika Anda memiliki data yang baik dari Kinect, membangun peta yang akurat sulit karena estimasi pose Anda tidak valid.

Anda perlu melokalkan robot Anda bersamaan dengan upaya Anda membangun peta (SLAM!). Jadi saat peta sedang dibuat, peta yang sama juga digunakan untuk melokalkan robot. Ini memastikan bahwa estimasi pose Anda tidak akan menyimpang dan kualitas peta Anda akan lebih baik. Oleh karena itu saya akan menyarankan untuk mempelajari beberapa algoritma SLAM (yaitu FastSLAM) dan mencoba mengimplementasikan versi Anda sendiri.

Demetris
sumber
Terima kasih atas jawaban anda :-). Saya menyadari bahwa perhitungan mati salah, tetapi peta yang saya buat berskala sangat kecil. Saya menggerakkan robot secara perlahan dan perlahan untuk meminimalkan kesalahan sebanyak mungkin, robot tidak banyak bergerak. Saya sebenarnya telah mempelajari banyak algoritma SLAM dari openslam, tetapi seperti yang saya katakan kepada Naresh, "Saya tidak buruk dalam matematika, tetapi tidak terlalu baik juga, dan saya menggunakan C #, jadi saya tidak memiliki perpustakaan dan mengimplementasikannya saya sendiri akan butuh waktu lama. " Ada saran tentang itu?
Shreyas Kapur
Apakah Anda melakukan pemrosesan pos dengan data Kinect? Ada kemungkinan bahwa data berisi beberapa kebisingan dan jika Anda membiarkannya tidak diolah, itu dapat membuat peta Anda tidak valid. Cobalah untuk membuat masalahnya sederhana. Biarkan robot stasioner dan petakan dinding di depannya. Bagaimana cara kerjanya sekarang? Jika peta jelas maka itu berarti masalah terjadi karena pergerakan. Jika tidak, maka masalahnya jauh lebih mendasar.
Demetris