ข้ามไปยังเนื้อหา
ไทย

สัญลักษณ์บนผนัง

สัญลักษณ์บนผนัง (wall tokens) เป็นแหล่งคะแนนส่วนใหญ่ของคุณ และการรายงานผิดแต่ละครั้งเสีย 5 คะแนน ดังนั้นสำหรับสัญลักษณ์แต่ละอันที่พบ คุณต้องตัดสินใจระหว่าง:

สิ่งนั้นคือ… สิ่งที่ต้องทำ
ผู้ประสบภัยแบบตัวอักษร (Φ, Ψ, Ω) รายงาน H, S หรือ U
ผู้ประสบภัยปลอม (สัญลักษณ์เดียวกัน แต่เป็นสามมิติ) ไม่ต้องรายงาน และไม่ใส่ในแผนที่
เป้าหมายเชิงรับรู้ที่มีผลรวม 0 ถึง 3 รายงาน F, P, C หรือ O
เป้าหมายเชิงรับรู้ที่มีผลรวมเป็นค่าอื่น เป็นของปลอม: ไม่ต้องรายงาน และไม่ใส่ในแผนที่

ดูคำนิยามที่แน่นอนได้ในกติกา และวิธีส่งรายงานในการสื่อสาร

กล้องของหุ่นยนต์เริ่มต้นมีขนาด 64 × 40 พิกเซล ที่ความละเอียดนี้ สัญลักษณ์จะมีขนาดเพียงไม่กี่พิกเซลจนกว่าหุ่นยนต์จะเข้าใกล้ จึงควรมองหาสิ่งที่น่าจะเป็นสัญลักษณ์จากระยะไกล แล้วค่อยเข้าใกล้เพื่ออ่าน อย่าลืมว่าการรายงานต้องให้หุ่นยนต์อยู่ห่างจากสัญลักษณ์ไม่เกินครึ่งช่อง และกล้องแบบกำหนดเองมีความละเอียดสูงกว่านี้ได้ แต่ต้องใช้งบประมาณมากขึ้น

ภาพจากกล้องของหุ่นยนต์เริ่มต้น 4 ภาพ ขณะที่เข้าใกล้ผู้ประสบภัยแบบตัวอักษร

เป้าหมายเชิงรับรู้ที่มองเห็นด้วยกล้องขนาด 64 x 40

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

ผู้ประสบภัยแบบตัวอักษรบนผนังในซิมูเลเตอร์

เป้าหมายเชิงรับรู้ประกอบด้วยห้าส่วนที่ซ้อนกันเป็นวงกลมร่วมศูนย์ จึงไม่จำเป็นต้องจำแนกรูปทรงของมัน เมื่อหาจุดศูนย์กลางและรัศมีด้านนอกได้แล้ว ก็อ่านค่าสีที่ตรงกลางของแต่ละส่วนได้เลย ส่วนต่าง ๆ มีรัศมี 0.5, 1, 1.5, 2 และ 2.5 ซม. ดังนั้นจุดกึ่งกลางของแต่ละส่วนอยู่ที่ 0, 0.3, 0.5, 0.7 และ 0.9 ของรัศมีด้านนอก

เป้าหมายเชิงรับรู้พร้อมจุดที่ใช้อ่านสีของแต่ละส่วน ที่ 0, 0.3, 0.5, 0.7 และ 0.9 ของรัศมีด้านนอก

ฟังก์ชันด้านล่างทำเช่นนั้นด้วย OpenCV ใน Python ในการหาจุดศูนย์กลางและรัศมี คุณอาจใช้เส้นขอบ (contour) ของเป้าหมาย เหมือนในนำทางในเขาวงกต

import cv2 as cv
import numpy as np
# Colour of each part in BGR order, as seen by the camera
COLORS = {
'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)

ตัวอย่างเช่น ['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 และมากกว่านั้นในพื้นที่อื่น ให้คำนึงถึงข้อนี้เมื่อตัดสินใจว่าหุ่นยนต์ต้องมั่นใจแค่ไหนก่อนรายงาน