สัญลักษณ์บนผนัง
สิ่งที่หุ่นยนต์ต้องทำ
หัวข้อที่มีชื่อว่า “สิ่งที่หุ่นยนต์ต้องทำ”สัญลักษณ์บนผนัง (wall tokens) เป็นแหล่งคะแนนส่วนใหญ่ของคุณ และการรายงานผิดแต่ละครั้งเสีย 5 คะแนน ดังนั้นสำหรับสัญลักษณ์แต่ละอันที่พบ คุณต้องตัดสินใจระหว่าง:
| สิ่งนั้นคือ… | สิ่งที่ต้องทำ |
|---|---|
| ผู้ประสบภัยแบบตัวอักษร (Φ, Ψ, Ω) | รายงาน H, S หรือ U |
| ผู้ประสบภัยปลอม (สัญลักษณ์เดียวกัน แต่เป็นสามมิติ) | ไม่ต้องรายงาน และไม่ใส่ในแผนที่ |
| เป้าหมายเชิงรับรู้ที่มีผลรวม 0 ถึง 3 | รายงาน F, P, C หรือ O |
| เป้าหมายเชิงรับรู้ที่มีผลรวมเป็นค่าอื่น | เป็นของปลอม: ไม่ต้องรายงาน และไม่ใส่ในแผนที่ |
ดูคำนิยามที่แน่นอนได้ในกติกา และวิธีส่งรายงานในการสื่อสาร
สิ่งที่กล้องเห็น
หัวข้อที่มีชื่อว่า “สิ่งที่กล้องเห็น”กล้องของหุ่นยนต์เริ่มต้นมีขนาด 64 × 40 พิกเซล ที่ความละเอียดนี้ สัญลักษณ์จะมีขนาดเพียงไม่กี่พิกเซลจนกว่าหุ่นยนต์จะเข้าใกล้ จึงควรมองหาสิ่งที่น่าจะเป็นสัญลักษณ์จากระยะไกล แล้วค่อยเข้าใกล้เพื่ออ่าน อย่าลืมว่าการรายงานต้องให้หุ่นยนต์อยู่ห่างจากสัญลักษณ์ไม่เกินครึ่งช่อง และกล้องแบบกำหนดเองมีความละเอียดสูงกว่านี้ได้ แต่ต้องใช้งบประมาณมากขึ้น

![]()
ผู้ประสบภัยแบบตัวอักษรเป็นสัญลักษณ์สีดำบนสี่เหลี่ยมสีขาว และอาจหมุนไปทำมุมใดก็ได้ ดังนั้นวิธีของคุณต้องไม่ขึ้นกับทิศทางการวาง

การอ่านเป้าหมายเชิงรับรู้
หัวข้อที่มีชื่อว่า “การอ่านเป้าหมายเชิงรับรู้”เป้าหมายเชิงรับรู้ประกอบด้วยห้าส่วนที่ซ้อนกันเป็นวงกลมร่วมศูนย์ จึงไม่จำเป็นต้องจำแนกรูปทรงของมัน เมื่อหาจุดศูนย์กลางและรัศมีด้านนอกได้แล้ว ก็อ่านค่าสีที่ตรงกลางของแต่ละส่วนได้เลย ส่วนต่าง ๆ มีรัศมี 0.5, 1, 1.5, 2 และ 2.5 ซม. ดังนั้นจุดกึ่งกลางของแต่ละส่วนอยู่ที่ 0, 0.3, 0.5, 0.7 และ 0.9 ของรัศมีด้านนอก
ฟังก์ชันด้านล่างทำเช่นนั้นด้วย OpenCV ใน Python ในการหาจุดศูนย์กลางและรัศมี คุณอาจใช้เส้นขอบ (contour) ของเป้าหมาย เหมือนในนำทางในเขาวงกต
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 ringsในการรันจริง หุ่นยนต์อาจมองเห็นเป้าหมายจากมุมเอียง ซึ่งจะทำให้เป้าหมายดูเป็นวงรี การเข้าไปอยู่ด้านหน้าเป้าหมาย การใช้สีที่ดูผิดปกติเป็นสัญญาณเตือน หรือการอ่านหลายเฟรม จะทำให้ผลลัพธ์น่าเชื่อถือขึ้น

การคำนวณชนิด
หัวข้อที่มีชื่อว่า “การคำนวณชนิด”เมื่อได้สีครบทั้งห้าแล้ว รหัสที่ต้องรายงานมาจากผลรวมของค่าสีเหล่านั้น ต้องนับทั้งห้าส่วนเสมอ แม้ว่าสีที่อยู่ติดกันจะเป็นสีเดียวกัน
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; }}ตัวอย่างเช่น ['Y', 'B', 'R', 'K', 'G'] มีผลรวมเป็น 0 จึงเป็น F และ ['B', 'Y', 'K', 'K', 'K'] มีผลรวมเป็น -4 จึงเป็นของปลอม
การตรวจจับผู้ประสบภัยปลอม
หัวข้อที่มีชื่อว่า “การตรวจจับผู้ประสบภัยปลอม”ผู้ประสบภัยปลอมแสดงสัญลักษณ์เดียวกับของจริง แต่ตัวอักษรเป็นสามมิติ เมื่อมองจากด้านหน้า กล้องเพียงอย่างเดียวอาจแยกไม่ออก:

กติการะบุว่าความลึกตรวจจับได้ด้วยเซนเซอร์ตัวใดตัวหนึ่งที่มีใน Robot Customizer แนวทางที่น่าลอง:
- เปรียบเทียบค่าระยะที่วัดได้ตลอดแนวสัญลักษณ์ ด้วย Lidar หรือเซนเซอร์วัดระยะ เพื่อหาความแตกต่างของความสูง
- มองสัญลักษณ์จากมุมเอียง ซึ่งส่วนที่นูนขึ้นจะทำให้รูปทรงของสัญลักษณ์เปลี่ยนไป
โลก world3.wbt และ world4.wbt มีผู้ประสบภัยปลอม และ World Editor เพิ่มของปลอมลงในแผนที่ของคุณเองได้ Erebus ยังมีสคริปต์ scripts/update_maps_with_fakes.py ซึ่งสุ่มเปลี่ยนผู้ประสบภัยในโลกที่มีอยู่ให้เป็นของปลอม
การรายงานของปลอมจะเสีย 5 คะแนนเพราะนับเป็นการระบุผิด ขณะที่ผู้ประสบภัยจริงบนช่องเชิงเส้นมีค่า 15 คะแนนพร้อมชนิดในพื้นที่ 1 และมากกว่านั้นในพื้นที่อื่น ให้คำนึงถึงข้อนี้เมื่อตัดสินใจว่าหุ่นยนต์ต้องมั่นใจแค่ไหนก่อนรายงาน
