Penanda dinding
Yang harus dilakukan robot
Section titled “Yang harus dilakukan robot”Penanda dinding (wall token) menyumbang sebagian besar poinmu, dan setiap laporan yang salah mengurangi 5 poin. Jadi, untuk setiap penanda yang kamu temukan, kamu harus menentukan jenisnya:
| Penanda itu… | Yang harus dilakukan |
|---|---|
| Korban huruf (Φ, Ψ, Ω) | Laporkan H, S, atau U |
| Korban palsu (simbol yang sama, tetapi tiga dimensi) | Jangan laporkan, dan jangan masukkan ke peta |
| Target kognitif dengan jumlah 0 sampai 3 | Laporkan F, P, C, atau O |
| Target kognitif dengan jumlah lainnya | Penanda palsu: jangan laporkan, dan jangan masukkan ke peta |
Lihat Aturan untuk definisi yang tepat, dan Komunikasi untuk cara mengirim laporan.
Apa yang dilihat kamera
Section titled “Apa yang dilihat kamera”Kamera robot pemula beresolusi 64 × 40 piksel. Pada resolusi itu, penanda hanya terdiri atas beberapa piksel sampai robot cukup dekat, jadi sebaiknya cari kandidat dari kejauhan, lalu mendekat untuk membacanya. Ingat bahwa laporan mensyaratkan robot berada dalam jarak setengah ubin dari penanda, dan bahwa kamera kustom bisa punya resolusi lebih tinggi, dengan biaya tambahan.

![]()
Korban huruf adalah simbol hitam di atas kotak putih, dan bisa diputar ke sudut mana pun, jadi metodemu tidak boleh bergantung pada orientasinya.

Membaca target kognitif
Section titled “Membaca target kognitif”Target kognitif terdiri atas lima bagian konsentris, jadi kamu tidak perlu mengenali bentuknya: setelah kamu menemukan titik tengah dan jari-jari luarnya, kamu bisa mengambil sampel warna di tengah setiap bagian. Jari-jari bagian-bagiannya adalah 0,5; 1; 1,5; 2; dan 2,5 cm, jadi titik tengahnya berada di 0; 0,3; 0,5; 0,7; dan 0,9 kali jari-jari luar.
Fungsi ini melakukannya dengan OpenCV di Python. Untuk menemukan titik tengah dan jari-jarinya, kamu bisa misalnya menggunakan kontur target, seperti di Menavigasi labirin.
import cv2 as cvimport numpy as np
# Colour of each part in BGR order, as seen by the cameraCOLORS = { 'K': (0, 0, 0), # Black 'R': (0, 0, 255), # Red 'Y': (0, 255, 255), # Yellow 'G': (0, 255, 0), # Green 'B': (255, 0, 0), # Blue}
def nearestColor(bgr): # Returns the name of the colour that is closest to a pixel distances = {name: np.linalg.norm(np.array(color) - bgr) for name, color in COLORS.items()} return min(distances, key=distances.get)
def readRings(image, centerX, centerY, radius): # image is a BGR image, as in the RGB Camera tutorial # Returns the 5 colours from the center outwards, for example ['Y', 'B', 'R', 'K', 'G'] rings = [] for position in [0, 0.3, 0.5, 0.7, 0.9]: x = int(round(centerX + position * radius)) y = int(round(centerY)) rings.append(nearestColor(image[y, x].astype(float))) return ringsDalam permainan sungguhan, target mungkin terlihat dari sudut miring sehingga tampak seperti elips. Memosisikan robot di depannya, menganggap warna yang tampak salah sebagai peringatan, atau membaca beberapa frame akan membuat hasilnya lebih andal.

Menghitung jenisnya
Section titled “Menghitung jenisnya”Setelah kamu mendapatkan kelima warna, kode yang dilaporkan berasal dari jumlahnya. Setiap bagian dari kelima bagian itu selalu dihitung, bahkan saat warna yang bersebelahan sama.
VALUES = {'K': -2, 'R': -1, 'Y': 0, 'G': 1, 'B': 2}CODES = {0: 'F', 1: 'P', 2: 'C', 3: 'O'}
def targetCode(rings): # rings is the list of the 5 colours of the target # Returns the code to report, or None if the target is fake total = sum(VALUES[color] for color in rings) return CODES.get(total)#include <map>#include <vector>
using namespace std;
// rings has the 5 colours of the target: 'K', 'R', 'Y', 'G' or 'B'// Returns the code to report, or 0 if the target is fakechar targetCode(const vector<char>& rings) { map<char, int> values = {{'K', -2}, {'R', -1}, {'Y', 0}, {'G', 1}, {'B', 2}}; int total = 0; for (char color : rings) total += values[color];
switch (total) { case 0: return 'F'; case 1: return 'P'; case 2: return 'C'; case 3: return 'O'; default: return 0; }}Misalnya, ['Y', 'B', 'R', 'K', 'G'] berjumlah 0, jadi jenisnya F, dan ['B', 'Y', 'K', 'K', 'K'] berjumlah -4, jadi penanda itu palsu.
Mendeteksi korban palsu
Section titled “Mendeteksi korban palsu”Korban palsu menampilkan simbol yang sama dengan korban asli, tetapi hurufnya tiga dimensi. Dari depan, kamera saja mungkin tidak bisa membedakannya:

Aturan menyatakan bahwa kedalamannya bisa dideteksi dengan salah satu sensor yang tersedia di Robot Customizer. Beberapa ide untuk dijelajahi:
- Bandingkan pengukuran jarak di sepanjang penanda, dengan Lidar atau sensor jarak, untuk mencari perbedaan ketinggian.
- Lihat penanda dari sudut miring, karena relief mengubah bentuk simbolnya.
World world3.wbt dan world4.wbt berisi korban palsu, dan World Editor bisa menambahkannya ke petamu sendiri. Erebus juga menyertakan skrip scripts/update_maps_with_fakes.py, yang secara acak mengubah korban di world yang sudah ada menjadi palsu.
Melaporkan penanda palsu mengurangi 5 poin sebagai salah identifikasi, sedangkan korban asli di ubin linear di Area 1 bernilai 15 poin jika jenisnya juga benar, dan lebih tinggi lagi di area lain. Ingatlah hal itu saat menentukan seberapa yakin robotmu perlu sebelum melaporkan penanda.
