CAFE

자유 강좌

로보코드 11강 (마지막 강좌) 프로 전투 로봇으로 업그레이드 하기

작성자SES|작성시간07.09.12|조회수2,006 목록 댓글 0
 

프로 전투 로봇으로 업그레이드

  지난 호까지는 로봇을 만드는 데 필요한 기본적인 요소들과 대표적으로 널리 알려져 있는 전술에 대해서 살펴보았습니다. 이런 내용들을 바탕으로 나름대로 로봇을 조금씩 만들어 가는 독자도 있겠지만, 이런 내용들을 어떻게 합쳐서 하나의 로봇으로 만들어 낼 것인지 막막한 분도 있을 겁니다. 어떤 상황에 있더라도 다른 사람들이 만든 로봇의 소스를 분석해 보는 일은 필수라고 감히 말해 드리고 싶네요. 특히 대회에서 우승한 로봇이라면 충분히 분석해 볼 만한 가치가 있고도 남겠죠? 따라서 이번에는 지난해 해외 로보코드 대회에서 우승을 차지한 Yngwie라는 로봇의 코드를 기초로 로봇을 만드는 데 있어 간단하게나마 가이드라인을 제시해 보고자 합니다.


Yngwie의 기본 정보

  Yngwie는 ‘잉위’라고 읽습니다. 제작자가 인터뷰에서 밝혔듯이, 이 이름은 기타리스트 ‘잉위 맘스틴’의 리므에서 따 온 것입니다.(잉위 맘스틴을 모른다구요? 좀 오래됐지만, 그룹 ‘임펠러테리’ 음반을 한번 구해 들어 보세요. 굉장한 기타 리스트 랍니다.) 이 로봇의 소스 코드는 참고자료에 나와 있는 로보코드 대회 우승자 인터뷰 사이트에서 다운받을 수 있습니다. Yngwie는 총 13개의 파일로 구성되어 있고, 각 파일들이 대강 어떤 기능으로 사용되는지를 살펴보자면 다음과 같이 나타낼 수 있습니다.


◆ Bulletitem.java      : 총알 자체의 정보를 구성하는 클래스

◆ BulletTracker.java   : 발사한 총알에 대한 정보를 가지고 있는 클래스

◆ Consts.java          : 코드 안에서 사용하는 여러 가지 상수들

◆ Control.java         : 로봇의 움직임을 제어하는 클래스

◆ Enemy.java          : 적 로봇에 대한 여러 가지 정보들을 저장하는 클래스

◆ EnemyCollection.java: 여러 로봇에 대한 정보를 가지며 이를 적절하게 처리하는 기능

◆ Gunner.java         : 총에 대한 정보를 가지고 총알을 발사함

◆ Motor.java          : 움직임의 기초를 위한 여러 가지 분석함

◆ my.java             : 내부적으로 사용하기 위해 만든 여러 가지 메쏘드들

◆ Predictor.java       : 여러 가지 상황에 따라 선택할 수 있는 전략 모음

◆ Scanner.java         : 레이더의 정보 저장과 움직임 제어

◆ Strategy.java         : 선택한 전략에 대한 정보 저장

◆ Yngwie.java         : 로봇의 메인 클래스


메인 메쏘드

  Yngwie의 메인 메쏘드는 아주 간단하게 되어 있습니다.


motor.update();

gunner.update();

scanner.update();

control.update();


  로봇의 움직임에 영향을 주는 요소들을 분석하고 총과 레이더 움직임을 설정한 다음 자신이 어떻게 움직일지를 설정합니다. 이 순서대로만 움직이지는 않는다는 것을 알죠? execute() 메쏘드가 호출되면 설정해 놓은 움직임들이 실제 행동으로 나타납니다. 메인 메쏘드만 보면 아주 간단해 보이는데, 문제는 이것을 둘러싸고 있는 기능들이 복잡하다는 것이지요. 어째뜬 여러분들도 메인이 되는 부분은 이렇게 간단하게 구성할 수 있도록 하는 것이 좋습니다. 그래야 부분적인 수정이 코드 전체에 영향을 주지 않기 때문이지요.


총알에 대한 정보

  로봇을 만들면서 맨 먼저 생각해야 할 것들이 바로 각종 정보들을 저장하기 위한 공간을 만드는 것입니다. 기본적으로 적 로봇들의 정보와 총알과 총, 레이더, 자기 로봇의 정보 정도는 항상 간직하고 있어야 겠죠? Yngwie에서도 이런 부분들이 보입니다. 대부분 간단한 코드로 구성되어 있는데, 경우에 따라서는 다양한 기능을 수행하는 메쏘드들을 추가해서 복잡해진 부분도 있습니다. 각각에 해당하는 파일은 앞서 간략히 소개한 내용들을 바탕으로 찾아보기 바랍니다. 여기서는 기본적으로 유지해야 할 정보들을 체크해 보겠습니다.

  우선 자신이 발사한 총알에 대한 정보를 유지해야 합니다. 여기에는 총알이 발사되기 전의 각종 상황들도 저장될 수 있습니다. Yngwie의 소스 코드를 기초로 한 기본적으로 유지해야 할 총알에 대한 정보들은 다음과 같습니다.


◆ 총알의 강도(파워)

◆ 적과의 거리

◆ 적의 속도

◆ 적이 향하고 있는 곳

◆ 발사될 방향


  그리고 총알 자체에 대한 정보 혹은 총알이 발사되기 전에 저장한 정보 외에 총알의 추적 결과를 저장해 두는 것도 필수적입니다. 총알 추적 결과라는 것은 총알이 발사되고 나서 얻는 정보들을 말한다고 생각하면 됩니다.


◆ 목표한 적에 대한 정보

◆ 어떤 전술로 발사하였는 지에 대한 정보

◆ 실제로 발사 될 때의 상황

◆ 명중했는지 아닌지에 대한 정보

◆ 적 로봇에 명중했다면 그 때의 상황에 대한 정보


  대충 이런 것들이 있습니다. 이 내용들은 Yngwie를 바탕으로 작성해 본 것으로, 여러분들이 로봇을 만들 때는 꼭 이렇게 하지 않아도 됩니다. 사실 필자도 총알 자체에 정보와 총알 추적 정보를 따로 저장하기보다는 하나로 뭉쳐서 저장하는 것을 선호합니다. 즉, 총알 클래스 안에 총알에 관련된 정보를 저장하도록 만든다는 것이지요. 이렇게 하면 클래스가 커진다는 단점이 있지만 궂이 잘게 더 쪼개서 정보들을 중복 저장할 필요는 없다는 생각에 그렇게 하고 있습니다.


적 로봇에 대한 정보

  Yngwie는 적 로봇 1대에 대한 정보는 Enemy라는 클래스에서 처리하고, 이것들을 다시 EnemyCollection이라는 클래스 안에 모아놓고 처리하고 있습니다. 간단히 말해 Enemy라는 클래스에 각각의 적 로봇에 대한 정보를 처리하도록 해놓고, EnemyCollection에서는 Enemy 클래스를 배열에다 집어넣고 전체적인 적 로봇들에 대한 처리를 하도록 해놓았습니다. 각각의 적들에 대한 정보를 저장하면서도 전체적으로 어떤 적이 약하고 어떤 적이 강한지 등을 알아볼 때는 전체적으로 모아놓은 정보가 있어야 하므로, 이런 방법은 여러 로봇들이 즐겨 사용하는 방법입니다. Yngwie는 적 로봇에 대해 다음과 같은 정보들을 유지하고 있습니다.


◆ 이름

◆ 총알에 맞은 위치

◆ 총알에 맞은 시간들

◆ 대응 전략의 종류

◆ 죽었는지 살았는지에 대한 정보

◆ 점수


 일반적인 로봇들이 적에 대해 유지하는 정보들과는 다소 차이가 있습니다. Yngwie는 EnemyCollection에서 Enemy를 Vector에 넣어 저장하는 것을 기본으로 하고 있지만, 여기서도 예제 로봇을 비롯한 일반적으로 볼 수 있는 로봇들과는 약간 다르게 구현해 놓았습니다. 즉, 주로 해당 로봇에 대한 공격이 성공했는지, 그리고 그에 따른 각각의 로봇에 대한 점수매기기 등의 구현에 중점을 두고 있습니다.

  이렇듯 Yngwie는 총알의 정보를 다루는 부분에서 타켓이 되는 적 로봇에 대한 정보를 모두 알아내서 저장하고, 적 로봇의 정보를 다루는 부분에서는 해당 로봇이 총알에 언제 어디서 어떻게 맞았는지에 대한 정보를 중요하게 간직하고 있습니다. 적 로봇에게 입힌 데미지 등을 통대로 매긴 점수로 싸우기 쉽거나 힘든 상대를 찾아내기도 하고, 적당한 전략을 고르는 데 활용하기도 합니다. 따라서 Yngwie는 적 로봇에 대한 대응 전략, 대응 전략 중 에서도 공격을 아주 중요시하고 있다는 것이 밝혀집니다.

  앞의 연재에서 소개한 적이 있지만, 일반적으로 저장해 두는 적 로봇에 대한 정보들은 다음과 같습니다. 물론 어떤 방법을 사용할지 결정하는 것은 여러분들의 몫이지만, Yngwie가 적 로봇에 대한 적극적인 공격 전략들을 중요시하고 이를 효과적으로 구현해 냈다는 데에서 많은 아이디어를 얻을 수 있을 것입니다.


◆ 위치

◆ 방향

◆ 속도

◆ 에너지

◆ 적에게 입힌 데미지

◆ 적에게 받은 데미지

◆ 적이 얼마나 자주 죽었고, 언제 죽었는가

◆ 적이 언제(어떤 때에) 총알을 발사했나


전략에 대한 정보

  앞서 말했다시피 Yngwie는 적극적인 공격을 하는 전략을 아주 중요시 여기고 있습니다. 이 전략들에 대해 구현한 것이 Predictor.java인데, 모든 파일 중에서 가장 라인 수가 많다는 것만 봐도 이것이 Yngwie의 핵심이라고 할 수 있습니다.

  이 파일의 구조를 대강 설명하면 우선 하나의 전략을 설정해 놓습니다. 그리고 매번 해당 적 로봇에 대해 현재 상황에 그 전략을 사용하는 것이 옳은지를 판단합니다. Predictor.java에 있는 수많은 메쏘드들은 해당 전략을 행동으로 옮기기 위한 메쏘드가 아니라 해당 전략을 현재 상황에 사용하는 것이 적합한지를 알아보는 메쏘드들입니다. 물론 적합하다고 판단되면 총알이나 모터 클래스 등의 해당 변수들의 값을 조정해서 전략에 맞는 움직임을 보이도록 조정합니다. Yngiwe의 전략은 다음과 같은 것들이 있습니다.


◆ FinisherPredictor : 적 로봇의 에너지가 바닥일 때 적극적인 공세를 편다.

◆ CurPosPrecictor : Sitting Duck 사냥용

◆ XYPredictor : 한 지점을 목표로 공격

◆ CloseRangePredictor : 근거리 공격

◆ TurnDisPredictor : 적이 회전하고 있을때 공격

◆ SprayPredictor : 원호를 그리며 도는 등의 움직임을 보일 때

                        (총알을 스프레이처럼 뿌린다.)

◆ VelocityPredictor : 속도에 기반을 둔 공격

◆ LinearPredictor : 적이 직선 운동 펴탠을 보일 때

◆ DodgePredictor : 총알 피하기


  지난 달 기사를 봤다면 이름만 보아도 대충 어떤 상황일 때 어떤 움직임을 보일지 상상할 수 있을 것입니다. 그도 그럴 것이 어떤 로봇이든 눈에 확 띄는 특별한 전략(혹은 전술)을 사용하는 로봇은 아직 없습니다.(지금 이 시간에 새롭게 나왔을 수도 있겠지만.) 대부분이 이미 소개해 드렸던, ‘Secrets from the Robocode masters'라는 문서에 나오는 전략들을 그대로 사용하고 있기 때문입니다. 따라서 여러분들도 일단은 기본적으로 이 문서에 소개되어 있는 전략들을 자신의 로봇에 맞게 고쳐서 구현하는 것을 기본으로 삼는 것이 좋을 것이라 생각됩니다.

  Yngwie의 각 전략들을 세부적으로 구현한 메쏘드들을 좀 더 자세히 분석하려고 하면 여러 요소들로 뒤죽박죽되어 있는 소스코드를 정말 열심히 들여다봐야 합니다. 솔직히 말하면 필자 역시도 전략을 구현해 놓은 각 메쏘드들의 세부 사항까지 일일이 뜯어보지는 않았습니다. 대강 어떤 기능을 하는 메쏘드인지 알기 때문에 굳이 그런 고생을 할 필요는 없다는 생각에서이지요. 다만 그런 전략을 내 로봇에도 구현하고자 하는데, 어떻게 코딩을 해야 할 지 막막하다면 세부적인 구현 사항도 살펴 볼 필요가 있습니다. 그러나 그렇지 않다면 괜히 자신을 학대할 필요는 없지 않을까요. 어째뜬 Yngwie의 핵심 키워드는 전략 부분이기 때문에 이 부분이 이렇게 기능한다는 것만 염두해 두고 차근 차근 분석해 본다면 대강 큰 틀을 이해하기는 어렵지 않을 것입니다.


나머지 클래스

  앞에서도 언급했지만 Yngwie에서는 전략 부분이 핵심이고 나머지는 전략을 둘러싼 바깥 요소들이라 볼 수 있습니다. Motor라는 클래스가 Yngwie 자체를 둘러싼 여러 가지 환경들을 분석하고 그 결과로 어떤 움직이믕ㄹ 취하도록 하는 역할을 하지만 결국엔 이것도 전략과 맞물려 돌아갑니다. Yngwie의 모든 부분이 그런 형태인 것입니다. 따라서 앞서 설명한 기본적인 정보처리를 위한 클래스와 전략을 위한 클래스를 중심으로 살펴본다면 나머지도 크게 어렵진 않습니다.

  다만 여기서 레이더 부분은 조금 언급하자면 레이더 역시 특별히 광장한 알고리즘은 소개되지 않은 상태입니다. 따라서 어느 로봇이나 사용하는 알고리즘이 비슷합니다. 지난 달에 소개해 드렸던 최적화된 레이더 움직임이 바로 그것이지요. 이 부분도 역시 ‘Secrets from Robocode masters'에 소개되어 있는 것을 중 하나입니다. 단지 이것을 여러분들의 로봇에 맞게 구현만 잘 하면 되는 것입니다.


좀더 멋진 로봇을 위해

  로보코드에서 로봇을 만든다는 것의 매력은 이미 여러분들도 알다시피 여러 가지 알고리즘을 이용해서 나만의 로봇을 만들 수 있다는 점입니다. 여기서 ‘나만의 로봇을 만들 수 있다’라는 사실보다 ‘여러 가지 알고리즘을 사용할 수 있다’라는 것에 초점을 맞추면 좀더 멋진 로봇이 탄생할 수도 있다고 생각됩니다.

  사실은 필자가 이번 호를 위해 신경망 이론, 그 중에서도 구현하기 간단한 퍼셉트론을 기초로 한 로봇을 준비하고 있었습니다. 그런데 생각보다 저조한 성적을 보이는 바람에 차마 소개할 수 없었습니다. 지금은 유전자 알고리즘을 적용한 실험적인 로봇을 만들어 보려고 하는데, 이것도 성능은 크게 기대하지 않고 있습니다. 알고리즘 자체가 이런 곳에 사용하기엔 그리 적절하지 못하다고 이미 판단하고 있기 때문입니다. 하지만 그게 뭐 어떤가요. 로보코드이 로봇에 이런 것들을 구현해서 실제로 움직이는 것을 지켜본다는 것 자체만으로도 큰 매력이 아닐까요. 이것은 즉, 학교에서 배운 것을 모조리 집어넣어 볼 수 있다는 의미입니다. 허황되게 들릴지는 모르겠지만, 컴파일러 제작기술도 로봇에 넣어 볼 수도 있을 것입니다. 그래서 간략한 스크립트 언어를 분석해서 이것을 명령어로 인식하여 로봇이 동작하도록 만들어 볼 수도 있겠지요. 즉, 우승을 목표로 좋은 로봇 만들기에 전념을 다하는 것도 좋지만, 실험적인 로봇을 만드는 것도 재미있는 일이라 할 수 있다는 것입니다. 다양한 시도 속에서 괜찮은 로봇이 탄생할지도 모르는 일이구요.


로보코드 대회서 볼 수 있기를

  어느덧 시간이 흘러 로보코드에 대한 짧지 않았던 연재를 끝마치게 되었습니다. 팔자 역시도 흔히 말하는 고수라 불릴 정보가 아닌 상태에서 처음 시작했고 지금도 그런 상태이기 때문에 항상 기사를 쓸 때는 많은 고민을 해야만 했습니다. 결국엔 같이 배운다는 생각으로 연재를 끌어 나갔는데, 여러분들게 도움이 되었는지는는 모르겠네요. 어째뜬 지금까지 연재기사를 잘 따라온 독자라면 이제 혼자서도 훌륭한 로봇을 만들 수 있으리라 생각됩니다. 남은 것은 자바라는 언어 자체에 대한 학습과 각종 알고리즘에 대한 학습이지 로보코드에 대한 학습이 아닙니다. 사실은 지금까지 배운 것보다 앞으로 배워야 할 것들이 훨씬 더 많지요. 말 그대로 혼자만의 고독한 싸움만이 남아 있습니다. 부디 남은 여정 잘 진행하고 기회가 된다면 로보코드 대회 같은 데서 뵐 수 있었으면 좋겠네요. 그 동안 읽어 주신 독자 여러분들게 진심으로 감사드립니다.


저자 : 조규형(jokyu@korea.cnet.com)

옮긴이 : 심은섭(ses840105@hanmail.net)


다음검색
현재 게시글 추가 기능 열기
  • 북마크
  • 신고 센터로 신고

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼