Code Sprint 2015 Round 1 – Lazybot

안녕하세요, 2015 Code Sprint Round 1 에서 3위에 입상한 윤영우입니다.

문제 분석

이번 대회에서 기존 로보코드와 가장 큰 다른 점은 마스터 로봇의 에너지가 줄어들지 않는다는 것입니다. 따라서 마스터 로봇에 대항하여 오래 살아남고 많은 데미지를 주는 것이 목적입니다. 초반 경기 결과 영상을 보고 마스터 로봇의 움직임을 먼저 분석해 보았습니다. 공개된 영상을 보면 마스터 로봇의 회피 움직임과 공격을 위한 shooting 이 매우 뛰어남을 알 수 있습니다. 여러 영상을 보고 판단해보면 적이 발사한 총알이 존재할 확률이 가장 낮은 곳으로 회피하는 wave surfing 방법(http://robowiki.net/wiki/Wave_surfing)을 사용함을 알 수 있습니다. 또한, 회피 움직임을 할 때 자신이 쏜 총알 뒤로 숨어 상대편 총알을 상쇄 시키는 bullet shadowing 방법(http://robowiki.net/wiki/Bullet_Shadow)도 사용하고 있다고 판단하였습니다. 마스터 로봇의 공격 방법은 상대편 로봇의 움직임과 공격 명중률을 고려하여 지속적으로 공격 모델을 바꾸는 방법으로 보였습니다. 특히, 한 방향 이동이나 일정 간격 지그재그 움직임에 대해서 높은 공격 성공률을 보였습니다.

전략 수립

마스터 로봇이 wave surfing 과 bullet shadowing을 사용하는 것으로 생각하고, 마스터 로봇에 대해 적극적으로 공격하는 것은 비용 대비 효과가 낮다고 판단하였습니다. 그래서 총알 회피 움직임 개발에 집중을 하였습니다. 마스터 로봇이 상대 로봇의 움직임을 예측하고 그에 따라 공격하고 있기 때문에, 앞선 수상자 분들의 후기와 마찬가지로 저 또한 랜덤 움직임을 사용하기로 하였습니다.

Lazybot 상세 알고리즘

1) 초기 위치 선정

마스터 로봇과의 거리가 멀수록 총알 회피가 쉬우므로 Lazybot은 각 라운드가 시작되면 오른쪽 벽면의 중앙 위치로 이동합니다.

2) 랜덤 움직임

Lazybot은 오른쪽 벽면에 붙어서 위 아래 방향으로 랜덤하게 움직입니다. 활발히 움직일 수록 총알 회피에 유리하지만 연료가 소모되는 단점이 있기 대문에 최소한의 움직임으로 총알을 회피할 필요가 있습니다. 로봇의 움직임을 결정하기 위한 변수로는 어느 방향으로 얼마나 움직일지에 대한 d 값과 각 움직임 사이에 대기 하는 시간인 t 값이 있습니다. 즉, lazybot은 d 만큼 움직인 다음에 t 시간 동안 대기합니다. 로봇이 위쪽이나 아래쪽 모서리에 너무 가까울 경우에는 이동 방향을 중앙 위치로 고정 시켰습니다.

3) 연료 획득

로봇의 스캐너는 계속 회전하며 연료 아이템를 찾습니다. 아이템을 발견하게 되면 현재 에너지와 연료량, 찾은 아이템의 거리를 종합적으로 판단하여 연료 획득을 수행합니다. 연료 획득을 위한 판단 조건은 다음과 같습니다.

  • 현재 에너지가 연료량 보다 많아야 함
    • 연료를 가지러 가는 움직임을 할 경우 총알에 맞을 확률이 높아지므로 에너지가 낮을 경우는 연료를 가지러 가지 않고 회피 움직임을 계속 합니다.
  • 연료 아이템을 가지러 가기에 충분한 연료가 있어야 함
    • 연료 아이템이 너무 먼 거리에 있을 때 아이템을 가지러 가다가 멈추는 것을 방지합니다.

연료 획득에 성공하면 다시 오른쪽 벽면의 중앙 위치로 이동하여 회피 움직임을 계속합니다.

3) 총알에 맞을 경우

마스터 로봇이 같은 위치로 총알을 연달아 발사하는 경우가 많은 것을 발견하고, lazybot이 총알에 맞을 경우 즉각적으로 그 위치를 회피하도록 하였습니다. 기본 움직임과 마찬가지로 랜덤한 방향으로 랜덤한 거리만큼 움직이도록 하였습니다.

마스터 로봇에 대한 파라미터 최적화

변수 d와 t는 상대 로봇에 맞게 최적화 할 필요가 있습니다. 이를 위해서 공개된 대회 영상을 분석하여 마스터 로봇을 정체를 찾기 위해 노력하였습니다. 상당히 뛰어난 오픈소스 로봇임을 알고 있기 때문에 1-vs-1 로보코드 경기의 상위 랭킹 로봇들만 비교하였습니다.

1-vs-1 랭킹 페이지: http://literumble.appspot.com/Rankings?game=roborumble

하지만 상위 랭킹에 있는 로봇들의 움직임에는 비슷한 점들이 많아 정확히 어느 로봇인지 알기 어려웠습니다. 그래서 로봇 정체를 밝히기 위해 간단한 움직임 만을 하는 테스트 로봇을 제출하여 결과 점수를 확인하였습니다. 결과 점수를 토대로 DrussGT, Diamond, Tomcat 등 여러 후보 로봇과 경기를 다시 시켜보고 최종적으로 Diamond 로봇이 마스터 로봇으로 판단하였습니다. (결국 Diamond 로봇이 맞았습니다) 그리고 공개된 Diamond 로봇에 대해 변수 d와 t를 최적화 하였습니다.

최종 튜닝

Diamond 로봇이 마스터 로봇임을 확신하고 최종적으로 Diamond 로봇의 초기 발사 패턴을 기록하여 그에 맞는 최적화 된 움직임을 코드로 직접 넣는 작업을 하였습니다. 마스터 로봇이 이전 라운드의 결과에 따라 움직임이 달라지므로 첫 라운드에만 효과가 있는 방법입니다. 이 전략이 성공하면 꽤 높은 점수를 기록할 수 있으리라 기대하였는데, 결론적으로는 실패하였습니다. Diamond 로봇에 다양한 버전이 존재하는데 이 버전에 따라 움직임과 shooting 이 달랐습니다.

최종 결과 동영상: https://www.youtube.com/watch/?v=wzTD-qMsAXs

후기

학부 시절 동아리에서 로보코드를 접해본 기억을 되살려 참가했는데 재미도 있었고 좋은 성적을 거두게 되어 더욱 기쁩니다. 아쉬운 점은 이번 경기에 가장 쓸모가 있어 보이는 bullet shadowing을 적용해 보지 못한 점입니다. 파워가 0.1인 총알을 계속 쏘아 마스터 로봇의 총알을 상쇄 시키는 전략을 구현했다면 더 좋은 결과를 낼 수 있었을 것 같습니다. 마지막으로 재미 있는 대회를 마련해주신 관계자 여러분들께 감사 드립니다!

윤영우

한국전자통신연구원에서 컴퓨터비전, Human-Robot Interaction 관련 연구를 수행하고 있습니다

공유하기