경진대회 프로그램 제출하기
VS Code에서 코드를 작성하고 웹사이트에 올린 뒤 이메일로 점수를 받으세요. 서버가 프로그램과 로봇 시뮬레이션을 실행하므로 제출 후 웹사이트를 닫아도 됩니다.
1. 계정과 VS Code 준비하기
- www-posim.vercel.app에서 계정을 만드세요.
- 인증 이메일의 버튼을 누르고 인증한 계정으로 로그인하세요.
- 서버 이용 권한이 필요합니다. 제출 화면에 권한이 필요하다고 나오면 수업 담당자에게 문의하세요.
- VS Code를 설치하세요. 확장 메뉴에서 Microsoft의 Python을 설치하세요.
- 문서 폴더에
posim-competition폴더를 만드세요. VS Code의 파일 → 폴더 열기로 이 폴더를 여세요.
웹사이트 제출에는 ROS나 Docker를 설치할 필요가 없습니다. 서버가 Python과 시뮬레이션 연결을 준비합니다. 코드에 비밀번호를 넣지 마세요.
2. main.py 만들기
VS Code에서 main.py 파일을 만들고 아래 코드를 붙여 넣어 저장하세요. 예제 파일을 다운로드해도 됩니다.
이 예제는 WAM-V 위치를 읽고 목표로 이동한 뒤 요구된 방향으로 회전합니다. surface_station 전용입니다. 처음에는 그대로 제출해 실제 점수를 받으세요. 기록된 경로와 오차를 비교하며 개선할 수 있습니다.
예제의 리더보드 기록에서 다섯 번의 실제 이동 경로와 점수 46.73, 9.35, 4.02, 0.00, 3.92를 볼 수 있습니다. 평균은 12.81 / 100입니다. 대회 점수는 최저 점수도 반영하므로 10.24 / 100입니다. 내려받을 수 있는 코드와 현재 채점 규칙으로 네이티브 시뮬레이터에서 측정했습니다. 컴퓨터 성능에 따라 실행 결과는 조금 달라질 수 있습니다.
# WWW-POSIM station starter · IOES-Lab · MIT
import math
from www_posim_ros import Session
def angle(value):
return (value + math.pi) % (2 * math.pi) - math.pi
with Session.local(control=True) as sim:
mission = sim.profile.get("mission")
if not mission or mission["task"] != "surface_station":
raise ValueError("Choose the surface_station competition task")
goal = mission["targets"][0]
topic = next(name for name, kind in sim.topics.items()
if kind == "nav_msgs/msg/Odometry")
print("Moving toward the station target:", goal, flush=True)
holding = False
while True:
message = sim.latest(topic, max_age=0.5)
pose = message["pose"]["pose"]
p, q = pose["position"], pose["orientation"]
yaw = math.atan2(2 * (q["w"] * q["z"] + q["x"] * q["y"]),
1 - 2 * (q["y"] ** 2 + q["z"] ** 2))
dx, dy = goal["x"] - p["x"], goal["y"] - p["y"]
distance = math.hypot(dx, dy)
if distance < 0.25:
holding = True
elif distance > 0.6:
holding = False
wanted_yaw = goal["yaw"]
if goal.get("yaw_current_follow"):
stamp = message["header"]["stamp"]
elapsed = stamp["sec"] + stamp["nanosec"] * 1e-9 - mission["current_epoch_sim_time"]
wanted_yaw += math.radians(mission["current_swing"]) * math.sin(
2 * math.pi * elapsed / mission["current_period"] + mission["current_phase"])
desired = wanted_yaw if holding else math.atan2(dy, dx)
error = angle(desired - yaw)
forward = min(0.4, 0.15 * distance) if not holding and abs(error) < 0.6 else 0.0
turn = max(-0.5, min(0.5, 0.6 * error))
sim.set_velocity(forward=forward, yaw_rate=turn, duration=0.25)
Session은 내 실행에 배정된 로봇에 연결합니다. 각 평가는 다른 목표 조건을 제공합니다. 이 프로그램은 좌표를 고정하지 않고 현재 목표를 읽습니다.
3. 코드 업로드하기
- 경진대회 제출 페이지를 여세요.
- 예제는 surface_station을 선택하세요.
MyTeam처럼 공개할 팀 이름을 입력하세요.- 저장한
main.py파일을 선택하세요. - 제출하고 평가하기를 누르고 제출 번호와 대기 중이 표시될 때까지 기다리세요.
여러 파일로 나눈 프로그램은 main.py와 보조 Python 파일을 ZIP으로 묶어 올리세요. main.py는 프로젝트 최상위에 있어야 합니다. 소스 파일만 압축하고 .venv, 다운로드한 패키지와 결과 폴더는 제외하세요. 업로드 제한은 1 MiB입니다.
제출한 버전마다 번호와 결과를 따로 보관합니다. 연결 오류 뒤 업로드를 다시 시도하면 같은 제출 번호를 사용합니다. 수정한 코드를 새 버전으로 제출하려면 저장한 파일을 다시 선택하세요.
4. 서버 실행과 이메일 기다리기
제출이 접수되면 페이지를 닫거나 로그아웃해도 됩니다. 내 컴퓨터의 인터넷 연결을 계속 유지할 필요가 없습니다.
서버 이용 인원이 제한되어 평가는 대기열에서 기다립니다. 한 제출은 같은 과제를 목표·바람·해류 조건을 바꿔 5회 평가합니다. 모든 참가자에게 같은 다섯 조건을 사용하며 실행 사이에는 다른 제출과 차례를 나눕니다. 웹사이트는 설치형 앱보다 그래픽 품질이 낮지만 점수는 측정한 시뮬레이션 상태로 계산합니다.
제출 페이지에 대기 순서와 2 / 5처럼 완료한 평가 횟수가 표시됩니다. 다섯 평가 실행에는 수 분이 걸릴 수 있으며 대기·준비 시간도 필요합니다. 평가가 끝나면 점수와 결과 링크가 이메일로 옵니다. 인증한 계정으로 로그인해 링크를 여세요. 이메일이 보이지 않으면 스팸함을 확인하세요. 웹사이트에 저장된 결과도 확인할 수 있습니다.
5. 결과 읽고 개선하기
- 내 제출 목록에서 결과 보기를 누르세요.
- 평가 실행을 선택하고 기록 재생과 시간 슬라이더로 이동 경로를 보세요. 목표 완료 수·이동 거리·시간·오차를 비교하세요. 5회 평가 점수와 상태도 확인하세요. 프로그램 출력을 열면 Python의
print()메시지나 오류가 나옵니다. - 결과 내려받기로 상세 JSON 기록을 저장하고 VS Code에서 여세요.
- 각 평가의
report의completion,position_rms_m,heading_rms_rad,collision_proxies를 확인하세요. - 프로그램의 한 부분을 수정하고 저장한 뒤 새 버전을 올리세요.
5회 평가를 완료한 제출은 순위표에 참여할 수 있습니다. 실패하거나 취소된 제출은 문제 분석용 정보를 남깁니다. 미완료 실행이 완료된 제출의 순위를 바꾸지는 않습니다. 실행을 멈추려면 대기·평가 중인 제출 옆의 취소를 누르세요.
문제가 생겼을 때
- 이메일 미인증: 로그인 창에서 인증 이메일을 다시 보내고 버튼으로 인증하세요.
- 서버 이용 권한 필요: 수업 담당자에게 문의하세요.
- ZIP 거부: 최상위에
main.py를 두고 Python 소스만 넣으세요..venv는 제외하세요. - 과제 선택 오류: 예제는
surface_station전용입니다. 다른 과제는 해당 제어 프로그램을 작성한 뒤 선택하세요. - 프로그램 실패: 프로그램 출력의 오류를 VS Code에서 수정하고 새 파일을 제출하세요.
- 내 세션 때문에 대기: 개인 웹 작업 공간의 세션을 끝내면 같은 계정으로 평가를 시작할 수 있습니다.
- 이미 다섯 건 대기: 하나가 끝날 때까지 기다리거나 취소한 뒤 더 올리세요.
- 이메일 미수신: 웹사이트 결과를 먼저 확인하세요. 메일 서버에 문제가 있으면 전송을 재시도합니다.
설치형 앱에서 같은 과제 연습하기
- WWW-POSIM을 설치하고 실행한 뒤 인증된 계정으로 로그인하세요.
- 작업 공간 → 위치에서 경기장 준비하기를 누르세요. 맵 다운로드 없이 공통 경기장을 만듭니다.
- 기체 → 경진대회 과제 · 선택 사항에서 과제와 평가 조건 1~5를 고르세요. 해당 조건의 배치 seed는 자동으로 정합니다.
- ROS 2 직접 제어를 선택한 상태에서 확인 → 생성한 월드 실행을 누르고 로봇 준비가 끝날 때까지 기다리세요.
- 앱에서 Python 프로젝트를 만들고 준비된 Python 안내에 따라 VS Code에서 여세요. 제어 프로그램을
main.py로 저장하세요. - 작업 공간에서 채점 시작을 먼저 누르세요. 해류와 채점 시간이 함께 시작됩니다.
- VS Code의 준비된 터미널에 다음 명령을 붙여 넣으세요.
python main.py
Ctrl+C로 코드를 멈추세요. 작업 공간에서 점수와 이동 기록을 내보내세요. 다음 연습 전에 월드를 다시 시작하세요. 다섯 조건을 각각 연습하고 코드를 개선한 뒤 웹사이트에 main.py 또는 ZIP을 올리면 공식 결과를 받습니다.
경기장·출발점·배치·바람·해류·채점 규칙은 웹사이트의 같은 번호 평가와 같습니다. 로컬 점수는 연습 기록입니다. 실제 실행 속도와 소수점 계산 결과는 컴퓨터에 따라 달라질 수 있습니다. 물리 설정은 목표 배속 1×, 간격 10 ms입니다.
고급: 프로그램 인터페이스와 제한
여러 파일, 의존성과 제한
ZIP에는 Python 패키지와 상대 import를 포함할 수 있습니다. 압축을 푼 소스는 4 MiB, 100개 파일 이내여야 하며 UTF-8 인코딩을 사용합니다. 서버는 Session SDK, 기본 Python, NumPy, SciPy, PyYAML과 ROS 라이브러리를 준비합니다. 업로드한 requirements 파일로 임의 패키지를 설치하지 않습니다. 외부 네트워크 연결과 소스 폴더 쓰기는 제한됩니다. 임시 파일은 /tmp를 사용하세요.
대기 가능한 제출은 최대 다섯 건이며 시간당 최대 열 건을 접수합니다. 계정별 코드 저장 용량은 50 MiB입니다. 서버 시뮬레이션 시간에는 계정의 웹 일일 이용 한도가 적용됩니다. 개인 웹 세션을 종료해도 접수한 코드 제출은 취소되지 않습니다. 해당 제출의 취소 버튼을 사용하세요.
센서와 제어 인터페이스
sim.profile["mission"]에는 현재 task, targets, home과 시간 정보가 있습니다. sim.topics는 배정된 로봇의 센서 토픽 목록입니다. sim.latest(topic)은 오래된 정보를 조용히 반환하지 않고 오류를 알립니다.
WAM-V의 전진 속도 범위는 ±1.5 m/s, 회전 속도는 ±0.5 rad/s입니다. 추력은 WAM-V 값 두 개를 ±200 N, BlueROV2 값 여섯 개를 ±50 N 범위로 받습니다. 수중 과제에는 수심 제어가 필요합니다. ROS 노드에는 임시 코스 JSON 경로인 WWW_POSIM_PROFILE과 도메인 76의 로컬 ROS relay가 제공됩니다.
서버는 main.py 실행 전에 채점을 시작합니다. 주장하는 점수를 출력해 점수를 받을 수는 없습니다. 수식, 허용 입력과 공정성 범위는 과제·점수·순위표를 참고하세요. 공개 자율운항 템플릿은 MIT 라이선스로 추가 ROS 제어 예제를 제공합니다.