Robotika · pelajaran 8
Skrip perilaku: robot yang memutuskan sendiri
Node buatanmu sendiri
Di tab skrip.py kamu menulis node ROS 2 dalam Python dengan pustaka minros. API-nya meniru rclpy, pustaka Python resmi ROS 2:
import minros
from minros.msg import Twist, Point
node = minros.create_node('robotku')
pub = node.create_publisher(Twist, '/cmd_vel')
def lihat(msg): # dipanggil setiap ada pesan /ball
print(msg.x, msg.y)
node.create_subscription(Point, '/ball', lihat)
node.create_timer(0.1, lambda: pub.publish(Twist(linear={'x': 0.1})))
minros.spin(node) # jalankan callback terus-menerus
Saat skrip berjalan, node-mu muncul di Graf ROS (warna kuning). Skrip berjalan di Python (Web Worker), terpisah dari simulator. Keduanya terhubung lewat jembatan seperti rosbridge: setiap publish dikirim sebagai JSON {"op": "publish", "topic": …}.
Loop terbuka vs loop tertutup
- Jalan kotak: perintah dijalankan berdasarkan waktu saja (maju 4 detik, belok 90°…), tanpa melihat hasilnya. Ini loop terbuka. Hasilnya tidak pernah persis persegi: percepatan, perlambatan, dan langkah yang tidak sempurna menumpuk menjadi kesalahan.
- Ikuti bola: perintah dihitung dari sensor (posisi bola) setiap 0,1 detik. Ini loop tertutup: kesalahan terus dikoreksi.
Mesin keadaan
Perilaku yang lebih rumit dipecah menjadi keadaan (state). Tiap keadaan punya aksi dan syarat pindahnya sendiri:
| keadaan | aksi | pindah kalau |
|---|---|---|
| cari | berputar, kepala menengadah | bola terlihat → ancang |
| ancang | jalan ke titik 45 cm di belakang bola | sudah dekat → sejajar |
| sejajar | geser pelan, luruskan ke arah gawang | posisi pas → tunggu |
| tunggu | diam | status “berdiri” → kirim kick_right |
| tendang | menunggu tendangan selesai | 2 detik → cari |
Bagian penting yang sering terlupa:
- Ingatan: saat bola sangat dekat, kamera tidak bisa melihatnya. Simpan posisi bola terakhir dalam koordinat lapangan.
- Kepala: tunduk saat bola dekat, tengadah saat mencari.
- Arah tendang: titik siap tendang ada di garis bola → gawang, digeser supaya kaki kanan yang tepat di belakang bola.
Misi
Cetak gol dengan skrip Python: perintah terakhir sebelum gol harus datang dari node skripmu, bukan dari keyboard. Mulai dari Kerangka node atau Ikuti bola. Kalau buntu, ada contoh lengkap di tombol Penendang (contoh lengkap).
Tantangan lanjutan:
- Kalau bola dekat garis samping, robot menendang miring. Bisakah robot memilih tendangan kaki kiri atau kanan sesuai posisi bola?
- Pakai
minros.mqtt.Clientuntuk mengirim skor kerobot/op3/skor, lalu lihat dimosquitto_sub.
Selanjutnya: TurtleBot3 dan LiDAR: melihat dengan sinar · Semua pelajaran