Lewati ke konten
Bahasa Indonesia

Komunikasi

Programmu berkomunikasi dengan permainan melalui dua perangkat yang dimiliki setiap robot:

  • Emitter mengirim pesan ke permainan. Perangkat ini tidak perlu diaktifkan.
  • Receiver menerima pesan dari permainan. Aktifkan receiver seperti mengaktifkan sensor.

Setiap bagian di bawah ini adalah program lengkap untuk robot pemula. Semua pesan tercantum di Referensi pesan.

Untuk mencetak poin dari korban huruf (letter victim) atau target kognitif (cognitive target), robot harus:

  1. Berhenti lebih dari 1 detik di dekat penanda. Erebus mengabaikan laporan jika robot bergerak dalam satu detik terakhir.
  2. Mengirim posisi dan jenis penanda: X dan Z dalam sentimeter, dan jenisnya sebagai satu huruf.
Penanda dinding Jenis
Korban huruf Φ (terluka) H
Korban huruf Ψ (stabil) S
Korban huruf Ω (tidak terluka) U
Target kognitif, jumlah 0 (Gas Mudah Terbakar) F
Target kognitif, jumlah 1 (Racun) P
Target kognitif, jumlah 2 (Korosif) C
Target kognitif, jumlah 3 (Peroksida Organik) O

Jenisnya berupa huruf, meskipun sejak 2026 korban menampilkan simbol. GPS memberikan nilai dalam meter, jadi kalikan dengan 100.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter") # Always on the robot. It does not need to be enabled.
gps = robot.getDevice("gps")
gps.enable(timeStep)
leftWheel = robot.getDevice("left wheel motor")
rightWheel = robot.getDevice("right wheel motor")
leftWheel.setPosition(float("inf"))
rightWheel.setPosition(float("inf"))
def wait(seconds):
start = robot.getTime()
while robot.step(timeStep) != -1:
if robot.getTime() - start >= seconds:
break
def report(tokenType):
# 1. Stop for more than 1 second
leftWheel.setVelocity(0)
rightWheel.setVelocity(0)
wait(1.2)
# 2. Send the position in centimeters, and the type as one letter
x, _, z = gps.getValues()
message = struct.pack("i i c", int(x * 100), int(z * 100), tokenType.encode())
emitter.send(message)
robot.step(timeStep)
report("H") # Reports a harmed victim (Φ) where the robot is
print("Reported")

Robot harus berada di sisi dinding yang sama dengan penanda, dan baik robot maupun posisi yang kamu kirim harus dekat dengan penanda itu. Aturan mensyaratkan jarak paling jauh setengah ubin, jadi usahakan agar tidak lebih dari itu. Erebus v26.1 memeriksa jarak 9 cm.

Jalankan program ini di awal world1.wbt: tidak ada penanda di sana, jadi riwayat jendela kontrol menampilkan Misidentification of Victim -5. Laporan yang salah, termasuk laporan penanda palsu, mengurangi 5 poin, dan setiap penanda hanya bisa dihitung sekali.

Riwayat jendela kontrol setelah laporan yang salah dan pengiriman peta

Saat robot terjebak, kurangnya kemajuan (lack of progress) memindahkannya kembali ke checkpoint terakhir dan mengurangi 5 poin. Ini terjadi otomatis setelah robot tidak bergerak selama 20 detik, dan programmu juga bisa memicunya dengan mengirim L. Setiap kali terjadi, permainan mengirim L ke robot, agar programmu tahu posisinya sudah berubah.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter")
receiver = robot.getDevice("receiver")
receiver.enable(timeStep) # The receiver must be enabled
askedAt = None
while robot.step(timeStep) != -1:
# Call a lack of progress once, after 2 seconds
if askedAt is None and robot.getTime() > 2:
emitter.send(struct.pack("c", b"L"))
askedAt = robot.getTime()
# Listen for messages from the game
while receiver.getQueueLength() > 0:
data = receiver.getBytes()
if len(data) == 1 and data == b"L":
print("Lack of progress! The robot is back at the last checkpoint.")
receiver.nextPacket()

Receiver bisa menerima pesan yang berbeda-beda, jadi periksa panjang setiap pesan sebelum membacanya, seperti pada contoh.

Kirim G untuk mendapatkan skor dan sisa waktu. Permainan membalas dengan pesan 16 byte: huruf G, skor, sisa waktu permainan, dan sisa waktu nyata, dalam detik.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter")
receiver = robot.getDevice("receiver")
receiver.enable(timeStep)
lastAsked = 0
while robot.step(timeStep) != -1:
# Ask for the game information once a second
if robot.getTime() - lastAsked > 1:
emitter.send(struct.pack("c", b"G"))
lastAsked = robot.getTime()
while receiver.getQueueLength() > 0:
data = receiver.getBytes()
if len(data) == 16: # The game information is 16 bytes long
_, score, timeLeft, realTimeLeft = struct.unpack("c f i i", data)
print("Score:", round(score, 2), "Time left:", timeLeft, "s", "Real time left:", realTimeLeft, "s")
receiver.nextPacket()

Waktu permainan berjalan lebih cepat di rawa, dan permainan berakhir saat salah satu waktu habis. Gunakan keduanya untuk menentukan kapan robot harus kembali ke titik awal.

Kirim E untuk mengakhiri permainan. Jika robot berada di ubin awal dan sudah mengidentifikasi minimal satu penanda dinding, robot mendapat bonus keluar (exit bonus) 10%.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter")
robot.step(timeStep)
print("Ending the game")
# Ends the game. Send it on the starting tile, after identifying a token, to get the exit bonus.
# The game stops your program right after this message.
emitter.send(struct.pack("c", b"E"))
robot.step(timeStep)

Selanjutnya, pelajari cara membedakan jenis-jenis penanda di Penanda dinding.