Robotika · pelajaran 29
Keluar dari labirin
Labirin sempurna
Labirin ini dibuat program: 6 × 6 sel berukuran 60 cm, digali dengan recursive backtracker dari sebuah angka acak (seed):
- Mulai dari sel kiri bawah.
- Pilih tetangga yang belum dikunjungi secara acak, robohkan dinding di antaranya, pindah ke sana.
- Kalau buntu, mundur ke sel sebelumnya dan ulangi dari sana.
Hasilnya labirin sempurna: antara dua sel mana pun ada tepat satu jalan, tanpa putaran. Pintu keluarnya celah di dinding kanan, menuju halaman hijau.
Robot mulai di sel kiri bawah. Tombol 🔀 Labirin acak membuat labirin lain. Misinya memakai labirin bawaan.
Aturan tangan
Di labirin sempurna, jalan keluar selalu ketemu kalau kamu terus menempelkan satu tangan ke dinding. Semua dinding tersambung ke dinding luar, jadi berjalan sambil memegang dinding sama dengan mengelilingi seluruh “pohon” lorong, sampai melewati pintu. Di setiap sel:
| Tangan kanan | Tangan kiri |
|---|---|
| kanan terbuka → belok kanan | kiri terbuka → belok kiri |
| kalau tidak, depan → lurus | kalau tidak, depan → lurus |
| kalau tidak, kiri → belok kiri | kalau tidak, kanan → belok kanan |
| buntu → putar balik | buntu → putar balik |
Keduanya pasti keluar, tapi panjangnya berbeda. Satu tangan mungkin langsung menuju pintu, tangan lainnya mengelilingi hampir seluruh labirin dulu. Panjang kedua jalan itu selalu berjumlah 2 × 36 = 72 sel, karena bersama-sama keduanya menyusuri setiap lorong dua kali.
Kenapa pengikut dinding rumah gagal
Coba preset Ikuti dinding (rumah) dari pelajaran peta. Robot mondar-mandir di lorong pertama. Pengikut itu menganggap “dinding kanan hilang” kalau jarak ke kanan lebih dari 1 m. Itu cocok untuk rumah yang ruangannya besar. Di labirin, celah ke kanan hanya selebar satu sel, dan dinding di seberangnya cuma 0,9 m jauhnya, jadi celah itu tidak pernah dianggap terbuka. Angka yang disetel untuk satu tempat jarang cocok di tempat lain.
Sel demi sel
Skrip Keluar labirin bekerja seperti robot micromouse, dengan mesin keadaan tiga langkah:
- putuskan, di tengah sel: ukur jarak kanan (255°–285°), depan (±12°), kiri (75°–105°). Lebih dari 0,45 m berarti tidak ada dinding, karena dinding sel ada di 0,3 m. Pilih arah menurut aturan tangan.
- putar sampai arah odometri sama dengan arah tujuan (±2°).
- maju satu sel (0,6 m menurut
/odom), atau berhenti lebih awal kalau dinding depan sudah 0,3 m. Sambil maju, robot menjaga diri di tengah lorong.
Odometri yang melenceng, dibetulkan dinding
Roda TurtleBot di simulator ini sedikit berbeda dari angka di driver (lihat pelajaran odometri). Setiap belokan 90° menurut odometri sebenarnya sedikit kurang. Setelah 20 belokan, arah menurut /odom bisa meleset puluhan derajat. Robot yang hanya percaya odometri akan miring menabrak dinding.
Karena itu, setiap kali berhenti di tengah sel, skrip melihat dinding di kiri, kanan, atau depan:
- titik-titik LiDAR di sekitar arah itu (±30°) dipasangi garis lurus dengan regresi kuadrat terkecil;
- kalau robot miring ε, dinding itu tampak miring dengan kemiringan tan ε, jadi ε = atan(kemiringan);
- arah tujuan diganti menjadi
yaw_odometri − ε, yaitu arah yang benar-benar sejajar lorong.
Garis yang tidak lurus (misalnya ujung dinding lain ikut terlihat) ditolak: sisa regresinya terlalu besar. Lihat tab Peta dan jejaknya di 3D: jejak oranye (odometri) makin miring, tetapi jejak hijau (sebenarnya) tetap lurus di tengah lorong.
Misi
Keluar dari labirin bawaan dalam 150 detik sejak meninggalkan sel awal, dengan skrip Python. Tangan kanan butuh lebih dari itu di labirin ini. Ubah satu baris di skrip supaya robot memakai tangan yang lain, atau buat sendiri cara yang lebih cepat.
Selanjutnya: Di mana aku? Lokalisasi Monte Carlo · Semua pelajaran