Robotika · pelajaran 28
Mata yang mengenali: deteksi objek ala YOLO
Dari piksel ke “itu bola”
Kamera di kepala OP3 menerbitkan /camera/image_raw: 640 × 360 piksel, 10 kali per detik. Bagi komputer, gambar itu hanya 691.200 angka. Supaya robot tahu ada bola di sana, tim RoboCup memakai detektor objek, dan yang paling sering dipakai adalah keluarga YOLO (You Only Look Once): satu jaringan saraf yang sekali jalan mengeluarkan daftar kotak pembatas (bounding box), masing-masing dengan:
- kelas:
bola,gawang,robot(tim sungguhan juga punyaL,T,Xuntuk persimpangan garis lapangan); - skor keyakinan 0–1: seberapa yakin jaringan bahwa kotak itu memang kelas tersebut;
- posisi kotak di gambar: titik tengah
x, ydan ukuranw × hdalam piksel.
Kotak yang skornya di bawah ambang (di sini 0,35) dibuang.
Di simulator ini tidak ada jaringan saraf sungguhan. Node /yolo_detector memproyeksikan benda yang benar-benar ada di depan kamera dengan model kamera yang sama dengan gambar di pojok, lalu meniru kelakuan detektor:
- benda kecil di kejauhan mendapat skor rendah;
- benda yang terpotong tepi gambar juga lebih rendah skornya;
- kotak sedikit bergetar dari gambar ke gambar;
- robot di depan bola menutupinya, jadi bolanya tidak terdeteksi.
Kotaknya digambar di atas gambar kamera, dan semuanya terbit di /vision/detections.
Dari kotak ke posisi di lapangan
Kotak masih dalam piksel. /ball_detector mengubahnya menjadi meter dengan proyeksi balik:
- Titik tengah kotak (u, v) dijadikan sinar dari kamera: arah
[1, −(u−320)/fx, −(v−180)/fy]dalam kerangka kamera, dengan fx = 320 / tan 0,61 dan fy = 180 / tan 0,38. - Sinar diputar ke kerangka dunia memakai pose kepala, yang dihitung dari sudut servo leher (kinematika maju).
- Sinar dipotongkan dengan bidang datar setinggi titik tengah bola (6,5 cm). Titik potongnya adalah posisi bola, lalu dinyatakan relatif terhadap badan robot di
/ball.
Karena itu sudut leher yang salah sedikit saja membuat bola “pindah” puluhan sentimeter, terutama kalau bolanya jauh. Coba di tab Topik: buka /vision/detections dan /ball, lalu gerakkan kepala dengan kotak 🎥 Kepala.
Melacak langsung dari piksel
Skrip Pelacak YOLO tidak memakai /ball sama sekali. Ia mengendalikan kepala langsung dari kotak di gambar (visual servoing):
- kotak ada di kanan tengah gambar → kepala menoleh ke kanan;
- kotak ada di bawah tengah gambar → kepala menunduk.
Besarnya koreksi sebanding dengan selisih pikselnya, jadi ini pengendali P:
ex = m.x[i] - 320 # + berarti bola di kanan
sudut['pan'] -= K * ex * 0.61 / 320 # piksel → radian
Coba ubah K dan perhatikan seberapa cepat kotak tiba di tengah. Ingat bahwa detektor hanya melapor 10 kali per detik: setiap koreksi didasarkan pada gambar yang sudah sedikit basi, dan servo leher punya batas kecepatannya sendiri.
Misi
Jalankan skrip yang membaca /vision/detections dan menggerakkan kepala lewat /op3/head_cmd, sampai kotak bola berada di tengah gambar (±40 piksel) selama 3 detik.
Selanjutnya: Keluar dari labirin · Semua pelajaran