Robotika · pelajaran 12
Menghindari rintangan dengan Python
Sense → think → act
Penghindar rintangan paling sederhana tidak butuh peta. Setiap 0,1 detik ia:
- melihat: dari
/scan, ambil jarak terdekat di beberapa sektor (depan, kiri, kanan); - memutuskan: kalau depan terlalu dekat, putar; kalau tidak, maju;
- bertindak: kirim
Twistke/cmd_vel.
def terdekat(ranges, dari, sampai):
nilai = [ranges[i % 360] for i in range(dari, sampai + 1) if ranges[i % 360] > 0]
return min(nilai) if nilai else 3.5
i % 360 membuat sektor “depan” −30°…30° berjalan melewati 0: ranges[330] … ranges[359], lalu ranges[0] … ranges[30]. Angka 0 dibuang karena berarti “tidak ada pantulan”, bukan “dekat”.
Hal-hal yang membuat penghindar gagal
Jalankan skrip Hindari rintangan, lalu coba ubah-ubah:
- Sektor terlalu sempit (misalnya hanya −5…5°): robot tidak melihat pilar di serong depan dan menabrak dengan sisi badannya. Lebar badan robot 14 cm, bukan 1°.
- Ambang terlalu kecil: robot butuh jarak untuk berbelok. Pada 0,16 m/s dan pindaian 5 Hz, ia sudah maju 3 cm sebelum melihat pindaian berikutnya.
- Bimbang: di depan dinding datar, kiri dan kanan hampir sama jauh, sehingga keputusan bisa berganti setiap pindaian. Skrip menyimpan arah putar (
putar[0]) sampai jalan bebas. Inilah histeresis.
Lihat di Graf ROS: node /penghindar berlangganan /scan dan menerbitkan /cmd_vel, persis seperti node buatan ROBOTIS.
Misi
Dengan skrip Python, jelajahi 4 m tanpa satu pun tabrakan. Kalau terlanjur menabrak, tekan ↺ Dunia baru untuk mengulang hitungan.
Selanjutnya: Membuat peta: SLAM · Semua pelajaran