콘텐츠로 이동
한국어

벽 토큰

벽 토큰(Wall tokens)은 점수의 대부분을 차지하고, 잘못 보고할 때마다 5점을 잃어요. 그래서 찾은 토큰마다 다음 중 무엇인지 판단해야 해요.

토큰의 종류 할 일
문자 피해자(Letter victim) (Φ, Ψ, Ω) H, S 또는 U를 보고해요
가짜 피해자(Fake victim) (같은 기호, 입체) 보고하지 말고, 지도에서도 빼요
합이 0~3인 인지 표적(Cognitive target) F, P, C 또는 O를 보고해요
합이 그 외인 인지 표적 가짜예요. 보고하지 말고, 지도에서도 빼요

정확한 정의는 규칙을, 보고를 보내는 방법은 통신을 참고하세요.

스타터 로봇의 카메라는 64 × 40 픽셀이에요. 이 해상도에서는 로봇이 가까이 가기 전까지 토큰이 몇 픽셀밖에 되지 않으므로, 멀리서 후보를 찾은 다음 가까이 가서 읽는 것이 좋아요. 보고하려면 로봇이 토큰에서 반 타일 이내에 있어야 하고, 커스텀 카메라는 비용을 들여 해상도를 높일 수 있다는 점을 기억하세요.

문자 피해자에게 다가가는 스타터 로봇의 카메라 이미지 4장

64 × 40 카메라로 본 인지 표적

문자 피해자는 흰 사각형 위의 검은 기호이고, 어떤 각도로든 회전되어 있을 수 있으므로, 인식 방법이 토큰의 방향에 좌우되면 안 돼요.

시뮬레이터에서 벽에 붙은 문자 피해자

인지 표적은 다섯 개의 동심원 부분으로 이루어져 있어서 모양을 인식할 필요가 없어요. 중심과 바깥 반지름을 찾으면 각 부분의 가운데 색을 샘플링할 수 있어요. 각 부분의 반지름은 0.5, 1, 1.5, 2, 2.5 cm이므로, 가운데 지점은 바깥 반지름의 0, 0.3, 0.5, 0.7, 0.9 위치에 있어요.

각 부분의 색을 읽을 지점을 표시한 인지 표적. 바깥 반지름의 0, 0.3, 0.5, 0.7, 0.9 위치

이 함수는 Python에서 OpenCV로 그 작업을 해요. 중심과 반지름을 찾으려면 예를 들어 미로 탐색에서처럼 표적의 윤곽선을 사용할 수 있어요.

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에서 사용할 수 있는 센서 중 하나로 감지할 수 있어요. 시도해 볼 만한 아이디어는 다음과 같아요.

  • 라이다나 거리 센서로 토큰을 가로지르며 측정한 거리를 비교해서 높이 차이를 찾아요.
  • 비스듬한 각도에서 토큰을 봐요. 입체 부분이 기호의 모양을 바꿔요.

world3.wbt와 world4.wbt 월드에는 가짜 피해자가 들어 있고, World Editor로 나만의 맵에 추가할 수도 있어요. Erebus에는 기존 월드의 피해자를 무작위로 가짜로 바꾸는 스크립트 scripts/update_maps_with_fakes.py도 들어 있어요.

가짜를 보고하면 오식별로 5점을 잃지만, 구역 1의 선형 타일에 있는 진짜 피해자는 종류까지 맞히면 15점이고, 다른 구역에서는 더 높아요. 로봇이 보고하기 전에 얼마나 확신해야 할지 정할 때 이 점을 기억하세요.