Halo, Habr!
Dalam publikasi ini, saya ingin berbicara tentang bagaimana saya membangun peta lintas negara untuk robot. Tugas ini diperlukan baik untuk meningkatkan keterampilan dalam pemrograman dan menguasai sensor, dan untuk implementasi selanjutnya dari algoritma kami sendiri dalam pengoperasian robot nyata pada tes robot seperti Robocross dan Robofest.
Artikel ini ditujukan bagi mereka yang baru saja memasuki dunia robotika atau mencoba mencari cara untuk membangun peta lintas negara. Saya mencoba menjelaskan semuanya dalam bahasa yang paling sederhana dan paling dapat dimengerti yang dapat dimengerti oleh kebanyakan orang.
Apa itu peta lintas negara lokal
Jadi,
peta lintas negara lokal adalah apa yang dilihat robot pada saat tertentu.
Ini adalah informasi yang berasal dari "mata" robot dan selanjutnya diproses dan ditampilkan dalam bentuk yang nyaman bagi kami.
Jika robot diam, maka peta lokalnya dalam kondisi lingkungan yang konstan tetap konstan.
Jika robot bergerak, maka pada setiap saat lingkungannya berbeda, masing-masing, peta lokal juga berubah.
Peta lokal biasanya memiliki ukuran konstan. Ukurannya dihitung berdasarkan panjang maksimum sinar yang dipancarkan oleh range finder. Dalam kasus saya, panjangnya 6 meter.
Untuk menyederhanakan tugas, diputuskan untuk membuat bujur sangkar peta dan diputuskan bahwa pencari jarak akan secara tepat berada di tengah peta (tempat ini akan menjadi titik di mana x = y = 0). Pusat ini dipilih dengan cara ini karena range finder yang saya gunakan memancarkan sinar di pesawat lebih dari 180 ° (memancarkan sinar pada 240 °, tetapi lebih pada itu nanti), yaitu, beberapa sinar pasti akan pergi di belakang pemindai dan jika Anda memilih pusat yang salah, Anda bisa kehilangan mereka. Dengan pilihan pusat yang tepat, semua sinar akan ditampilkan dengan benar. Berdasarkan ini, saya membuat ukuran peta 2 kali lebih besar dari panjang maksimum sinar yang dipancarkan.
Ukuran kartu saya adalah 12 * 12 meter.

Sensor yang saya gunakan
Bahkan, untuk menyelesaikan masalah semacam ini, Anda bisa menggunakan range finder apa saja.
Range finder adalah alat untuk menentukan jarak ke sesuatu (dalam kasus saya, ke hambatan potensial).
Dalam robotika, terutama 2 jenis pengukur jarak yang digunakan: ultrasonik dan laser.
Pengukur jarak
ultrasonik jauh lebih murah, tetapi sinar ultrasonik cukup lebar dan tidak cocok untuk pengukuran yang akurat.
Laser rangefinders lebih mahal, tetapi lebih tepatnya, karena sinar mereka terfokus secara sempit.
Untuk mengatasi masalah saya, saya menggunakan pemindai laser Hokuyo URG-04LX-UG01. Sensor ini mampu memancarkan sinar pada 240 ° dan memberikan informasi yang cukup akurat tentang hambatan yang menghalangi sinar. Jarak maksimumnya adalah 5-6 meter. Perlu dicatat bahwa pengintai ini hanya memancarkan sinar di bidang 2D. Fakta ini mengharuskan Anda untuk meletakkan sensor pada robot di tempat tertentu, biasanya di depan bagian bawah robot, untuk mendapatkan gambar yang lebih akurat. Sekali lagi, Anda dapat menggunakan pemindai 3D, yang memberikan informasi yang lebih akurat dan lengkap tentang lingkungan, tetapi harganya juga jauh lebih mahal.
Saya percaya bahwa pemindai khusus ini sangat cocok untuk pelatihan dalam rasio kualitas harga.
Hokuyo URG-04LX-UG01Secara singkat tentang prinsip pemindai laser:Pencari jarak jauh memancarkan sinar di sepanjang pesawat. Sebuah balok yang telah mengalami hambatan di jalurnya tercermin dari itu dan kembali. Dengan perbedaan fase antara sinyal yang dikirim dan yang diterima, seseorang dapat menilai sejauh mana hambatan itu berada.
Dengan demikian, jika balok yang dipancarkan tidak kembali, maka pada 5 - 6 meter sepanjang garis lurus emisinya tidak ada hambatan atau balok tidak dapat memantulkan dengan benar.
Data berikut dapat diperoleh dari pemindai laser:Untuk setiap sinar yang dipancarkan:
- Jarak ke rintangan
- Sudut emisi
* Setiap parameter disimpan dalam array yang terpisah dan sesuai dengan data untuk salah satu sinar.Tentang pembuatan peta
Untuk membangun peta dan menggambarnya, saya menggunakan alat ROS (Robot Operating System), yaitu: program Rviz dan nav_msgs :: tipe data OccupancyGrid. Saya membuat penerbit peta lokal dengan jenis pesan nav_msgs :: OccupancyGrid di bawah topik local_map yang sesuai. Di Rviz, berlangganan topik ini, menerima data tentang peta dan menampilkannya dalam bentuk tipe Peta.
Sesuai dengan algoritma seperti itu, perlu untuk secara terprogram mengkonfigurasi pemrosesan data dari pemindai laser dan merekamnya dalam format yang diperlukan untuk transmisi. Di OccupancyGrid, peta disimpan dan dikirim dalam array satu dimensi.
Apa yang sedang terjadi di sini?Bagi mereka yang dihadapkan dengan tipe data ROS ini untuk pertama kalinya: ini tidak biasa, karena peta secara konvensional direpresentasikan sebagai array dua dimensi dengan sejumlah kolom dan baris tertentu.
Begitu juga dengan saya. Saya menyimpan peta berdasarkan data dari pemindai dalam array dua dimensi, dan ketika menulis pesan untuk dikirim ke Rviz, saya akan mengubah array dua dimensi menjadi satu dimensi yang diperlukan untuk OccupancyGrid.
Bahkan, peta di OccupancyGrid hanya disimpan dan dikirim dalam array satu dimensi. Saat mendekripsi datanya, secara otomatis akan berubah menjadi peta dua dimensi persegi.
Tetapi agar ini terjadi dengan benar, Anda perlu menulis larik satu dimensi ini dengan cara tertentu.
Yaitu: baris demi baris dari penyimpanan dua dimensi untuk menulis dalam satu baris.
Voila! Ini seluruh rahasianya.
Daya tarik untuk elemen apa pun dari array satu dimensi tersebut terjadi sebagai berikut:
mapSize - ukuran peta lokal
j adalah nomor kolom
nomor i-linePeta sel (sekali lagi sesuai dengan tipe data OccupancyGrid) harus memiliki nilai dari 0 hingga 100. Semakin rendah nilainya, semakin besar kemungkinan sel tersebut dapat dilewati dan sebaliknya.
Untuk mempermudah tugas, saya telah memilih
3 warna primer untuk mewarnai sel.- Putih - Area Lumayan = 0
- Hitam - Area yang Tidak Dapat Dilewati = 100
- Abu-abu - zona tidak diketahui = 50
Poin penting!Sebelum data dari pemindai tiba, peta benar-benar tidak diketahui (nilai semua sel = 50) dan setiap kali setelah menggambar, diperbarui lagi ke keadaan tidak dikenal. Ini dilakukan agar kartu tidak overlay dengan nilai sebelumnya yang berlebihan. Lagi pula, peta lokal mencerminkan keadaan lingkungan hanya pada saat tertentu saja.
Kartu tidak dikenalSinar dibangun menggunakan transformasi dari sistem koordinat kutub (UCS)
ke sistem koordinat Cartesian (DSC).
$$ tampilkan $$ \ kiri \ {\ mulai {kumpulkan} x = r * cos φ \\ y = r * sin φ \ end {kumpulkan} \ kanan. $$ tampilkan $$
x, y - koordinat baru di DSC
r adalah jarak ke rintangan
φ adalah sudut di mana balok dijatuhkan
r, φ - koordinat lama di UCS
Algoritma pemrosesan data sensor:
Kami sepenuhnya melintasi array jarak r dan sudut φ sinar (data UCS). Untuk setiap item, lakukan hal berikut:
- Kami mengubah koordinat dari UCS ke DSC untuk r dan φ hingga. Cat sel yang dihasilkan hitam. Ini adalah hambatan.
- Kami melewati garis lurus dari lokasi pemindai ke sel dengan penghalang dengan langkah tertentu, dalam kasus paling sederhana sama dengan ukuran sel.
- Sekali lagi, kami mengonversi data dari UCS ke DSC dan mengecat sel baru dengan warna putih. Ini adalah area pejalan kaki.
Contoh paling sederhana tentang cara membangun jalur yang dapat dilalui dengan berjalan kaki ke sebuah rintanganTetapi bagaimana jika sinar yang dipancarkan tidak kembali?Jika ini terjadi, itu bisa berarti sebagai berikut:
- Sinar itu "hilang", artinya, sinar itu tidak sepenuhnya terpantul atau terpantul ke arah lain
- Tidak ada hambatan di jalan balok dan karena ini, itu tidak punya apa-apa untuk mencerminkan
* Sinar dapat "tersesat" biasanya karena itu tidak tercermin pada sudut 180 ° (yaitu, di bawah yang tidak mencapai kembali), karena hambatan bisa berdiri tegak lurus terhadap sinar. Dan seperti yang Anda ketahui dari fisika: sudut datang sama dengan sudut refleksi.

Atau karena hambatannya terlalu hitam dan menyerap sebagian besar energi balok dan balok tidak memiliki cukup energi untuk kembali.
Dengan demikian, tidak mungkin untuk sepenuhnya yakin tentang apa yang terjadi jika balok itu tidak kembali.
Apa yang harus dilakukan dalam situasi seperti itu?Kami melakukan hal berikut:
- Kami mempertimbangkan jarak ke rintangan balok sebanyak mungkin untuk pemindai (dalam kasus kami adalah 6 meter)
- Kami menganggap semua sel dalam garis lurus ke penghalang sebagai semi-bisa dilewati dan menetapkan mereka sejumlah menengah 25. Ini adalah sel yang bisa dilewati, tetapi kami tidak sepenuhnya yakin akan hal itu.
Kami tidak kehilangan apa pun jika sinar benar-benar tidak menemui rintangan, dan jika beberapa kendala tetap lolos dari "mata" robot, maka pasti akan terdeteksi dengan sangat cepat.
Resolusi kartu
Akhirnya, sentuhan terakhir!
Setiap kartu memiliki izin. Sederhananya, ini adalah jumlah sel yang dapat ditampung dalam 1 sel.
Sebagai contohJika ada 1 sel dalam 1 sel (kasus paling sederhana), maka resolusi 1.
Jika ada 5 sel dalam 1 sel, maka resolusinya adalah 0,2.
Resolusi kartu saya adalah 0,04. Artinya, di setiap sel ada 25 sel. Jadi, langkah minimum saya adalah 4 cm dan 1 sel adalah 1 m.
Sel dan perbedaan sel di peta sayaApa hasilnya?
Contoh membangun peta lintas negara lokal
* Warna kuning menunjukkan warna selSaya percaya bahwa secara umum, pekerjaan yang saya lakukan berhasil, tetapi saya memahami bahwa algoritme tidak sempurna dan membutuhkan penyempurnaan dan penyempurnaan.