반응형
visual studio 2005  단축키 포스터 입니다.
반응형

로보코드에서는 게임의 재미를 위해서 적 로봇의 좌표나 현재 방향각(Heading) 을 손쉽게 알 수 있게 하지 않았다. 만일 레이더로 스캔한 로봇이 좌표를 즉각 알 수 있다면 내 로봇의 좌표를 고려해서 손쉽게 적의 위치를 알 수 있으므로 게임의 재미가 떨어질 것이다. 여기서는 레이더로 스캔한 로봇의 정보를 제공하는 ScannedRobotEvent 를 통해서 상대 로봇의 위치와 방향각 등을 알아내는 방법을 정리하겠다.




1. 기본적인 방향각 설명


우선 로보코드에서 각도를 다루는 방식에 대한 기본적인 설명을 하겠다.

사용자 삽입 이미지

로보코드에서는 게임필드의 맨 위쪽을 0도로부터 시계방향으로 각도를 부여하고 있다. 각도를 규정해 놓은 것은 아니지만, 이러한 기준하에서 모든 메소드가 구현되었으므로 이 기사에서도 위의 각도를 기준으로 설명을 할 것이다.



- getHeading() -


이 메소드가 읽어오는 각도가 바로 나의 방향각 Dm(Degree of mine) 이 되고 단위는 도(degree) 이다. Dm 의 범위는  0 ≤ Dm<360 이다.


- getGurnHeading() -


이 메소드가 읽어오는 각도가 바로 포신(Gun)의 방향각 Dg(Degree of Gun) 이 되고 단위는 도(degree) 이다. Dg 의 범위는  0 ≤ Dg<360 이다. 위 그림에서는 포신의 각도가 로봇 본체의 각도와 같게 되어있지만 실전에서는 포신의 각도가 다양하게 변한다.


- getRadarHeading() -


이 메소드가 읽어오는 각도가 바로 레이더의 방향각 Dr(Degree of Radar) 이 되고 단위는 도(degree) 이다. Dr 의 범위는  0 ≤ Dr<360 이다. 그림 왼쪽 상단에 확대된 그림을 보면 레이더가 0도 부근을 향하고 있는 모습이 보인다. 실전에서 레이더는 주변을 scan 하기 위해서 분주히 움직이도록 프로그램 되는게 일반적이다.



여기서 설명한 각도는 모두 Heading 이라는 점을 꼭 기억해야 한다. 아래에서 Bearing 이라는(이것 역시 각도이다.) 각도에 대한 설명이 나오는데, Heading 은 0도를 기준으로 한 절대각도라는 것과 0도에서 360도 사이에서 변화한다는 것을 꼭 알아둬야 밑에서 헷갈리지 않을 것이다.


* 위 그림에서 확대된 로봇을 보면 작은 사각형 두개가 로봇 본체에 붙어있는데, 저 표시가 있는 쪽이 로봇의 앞부분이다. 앞으로 설명을 위해서 로봇의 앞쪽에 대해서는 실선을, 로봇의 뒤쪽에 대해서는 점선을 이용할 것이다.




2. ScannedRobotEvent


내 로봇의 레이더가 적을 스캔하면 이벤트가 발생되어서 onScannedRobot(); 메소드가 실행된다. 이 메소드에 argument 로 전달되는 것이 바로 ScannedRobotEvent 인데 이 이벤트에는 다음과 같은 정보를 담고 있다.


Constructor Summary
ScannedRobotEvent(String name, double energy, double bearing, double distance, double heading, double velocity)
          Called by the game to create a new ScannedRobotEvent.


        String name      : 스캔한 로봇의 이름

        double energy   :  스캔한 로봇의 잔여 에너지

        double bearing   : 내 로봇을 기준으로 스캔한 로봇의 방향각

        double distance : 내 로봇과의 거리

        double heading  : 스캔한 로봇이 향하고 있는 방향각

        double velocity   : 스캔한 로봇의 속도


section 1 에서 본 내용을 토대로 이벤트 객체가 가지고 있는 Heading 이라는 정보는 스캔된 적 로봇이 향하고 있는 각도를 나타낸다. (0 도를 기준으로 한 각이다.)


그런데 Bearing 이라는 상대각도 가 등장하는데 이것은 내 로봇의 Heading 을 0 도로 했을때 스캔된 로봇의 방향각을 -180 도에서 +180 도로 나타낸 상대각도이다. 여기서 우리의 궁극적인 목표는 내 로봇을 기준으로 했을때 상대 로봇의 절대각도를 알아내는 것인데 이를 계산하기 위해서 Bearing 에 대한 이해가 필요하다.



3. bearing 에 대한 설명


"bear" 라는 단어는 "곰", "참다", "낳다, 출산하다" 라는 뜻의 의미 외에도 "<방향을>취하다, 향하다, 기울다" 라는 뜻도 있다는 것을 이번에 알게 됐다. -_-;; 영어에 무지한 나같은 사람으로서는 "Heading" 라는 단어와의 차이점을 느낄 수 없어서 처음에 이해하는데 어려움이 많았었다.


이건 말보다 그림이 이해하는데 훨씬 낫다.(말은 헷갈릴 뿐이다.)




 

사용자 삽입 이미지

Bearing 에서 사용하는 좌표는 파란색 으로 나타난 좌표인데 이 좌표의 0 도는 내 로봇의 정면이 향하고 있는 방향이다. 내 로봇을 기준으로 해서 스캔된 로봇의 좌표를 읽어오는 메소드가 바로 getBearing() 이다.


event.getBearing() 으로 읽어오는 값은


        -180 < Bearing < +180


의 범위를 갖는다. 0도에서 +180도는 내 로봇의 시계방향(오른편)에 위치한 로봇의 좌표이고 0도에서 -180도는 내 로봇의 반시계방향(왼편)에 위치한 로봇이다. 앞으로 이 두가지를 표현하는데에 +Be(Bearing of enemy) 와 -Be 를 사용하겠다.


Heading 처럼 0 도부터 360도가 아니라서 처음에 많이 헷갈릴 수 있다. Heading 을 구할때는 0 에서 360 의 범위를 갖는데 Bearing 에 대해서는 -180 에서 180으로 한 것은 쉽게 납득이 되지 않지만 꽤 유용한 점이 있다. 이것은 차차 알게 될 것이다.


위 그림에서 보이듯이 Bearing 에는 음수값과 양수값이 존재한다.(+Be, -Be). 적 로봇이 내 Bearing 좌표를 기준으로 나의 오른쪽(시계방향으로 최단거리)에 있을때 Bearing = +Be 가 되고 나의 왼쪽(반시계방향으로 최단거리)에 있을때는 Bearing = -Be 가 된다.


이제 내 로봇이 시계 방향에 있는 오른쪽 로봇을 향하고 싶다면 현재 상태에서 오른쪽으로 Be 만큼 틀어줘야 한다. 오른쪽으로 +Be 만큼 틀어준다는 것은


        turnRight(+Be);


를 의미한다.


그러면 내 로봇을 LeftRobot 쪽으로 틀어주고 싶다면 왼쪽으로 -Be 만큼 틀어줘야 한다.


        turnLeft(-Be)


그런데 왼쪽으로 -Be 만큼 틀어주는 것은 오른쪽으로 +Be 만큼 틀어주는 것과 같다. 결국 오른쪽으로 +Be 만큼 틀어주는 것이나 왼쪽으로 -Be 만큼 틀어주는 것 모두


        turnRight(Bearing)


으로 표현할 수 있다. 따라서 우리는 ScannedRobotEvent 를 전달받았을 때 이벤트 객체로부터 적 로보트의 Bearing 각도를 얻을 수 있고 [ event.getBearing() ] 단순히 이 각도만큼 오른쪽 시계방향으로 틀어주면 Bearing 의 +,- 에 상관없이 상대 로보트를 정면으로 바라볼 수 있다.




4. 포신을 상대 로봇으로 향하기


위에서는 Bearing 을 이용해서 내 로봇이 상대 로봇을 정면으로 바라보도록 하는 방법을 설명했다. 그런데 포신을 상대 로봇에게 향하도록 하려면 위의 정보만으로는 부족하다. 위의 그림의 로봇은 포신과 로봇의 동체가 일직선상에 놓여있기 때문에 bearing 을 더하는 것만으로 포신을 상대 로봇으로 향하게 할 수 있지만 포신이 항상 로봇의 동체와 같은 곳을 바라보지는 않는다.


아래의 그림 3에서는 로봇의 정면과 포신이 서로 다른 방향을 하고 있다. 위에서 상대 로봇의 Bearing 각도는 구했지만 포신을 상대 로봇으로 돌려서 사격을 하려면 또다른 각도를 구해야 하는데 이 각도가 바로 포신의 각도인 GunBearing 이다.


GunBearing 은 위에서 살펴본 Bearing 과 같은 방식으로 설명될 수 있다. 내 로봇의 정면으로부터 포신이 좌측에 있으면 -Bg, 우측에 있으면 +Bg 로 표현한다. 아래 그림에 나와 있듯이 포신을 상대 로봇에게 향하게 하려면 Bearing 만큼 포신을 오른쪽으로 회전시키고 다시 왼쪽으로 GunBearing 만큼 돌려주어야 한다.


사용자 삽입 이미지

이를 간단하게 표현하면 다음과 같다.


        turnGunRight( Bearing - GunBearing )


이렇게 하면 이제 포탄을 상대 로봇에게 발사할 준비가 된 것이다.

반응형
http://www-128.ibm.com/developerworks/kr/robocode/
사용자 삽입 이미지


로보코드 강좌 자료입니다.

좀 더 자료가 필요하신 분은 아래 링크를 클릭하여주세요.


ROBOCODE:

http://www-128.ibm.com/developerworks/kr/robocode/


developerworks:

http://ibm.com/developerworks/kr

+ Recent posts