|
 |
|
▲ 천안 신당고 1학년 권진 |
나와 민근이형은 “시스템 베팅플레이” 팀에서 “R_PLAY 메로나”라는 이름으로 2017 국제시스템 베팅컨테스트 IRC 지능부문 KIT리그에 참가하였다. 8월 26일 예선을 치루고, 예선을 통과한 뒤 9월 14일 본선에 참가하였다. 경기 종목은 축구, 농구, 육상이 있는데, 우리는 전 종목에서 1등을 차지하면서 종합 1등을 하여 대통령상을 수상하였다.
우리는 “ROBOTIS-OP2"를 가지고 대회에 참가하였다. ROBOTIS-OP2는 모터의 스펙이나 PC등의 하드웨어가 좋고, 예제가 있어서 굉장한 강점을 가지고 있다. 하지만 그에 따르는 큰 리스크는 바로 배울 곳이 없다는 것이다. 아마 우리 ”시스템 베팅플레이“팀은 학원 단위에서 최초로 ROBOTIS-OP2를 연구한 팀일 것이다. ROBOTIS-OP2는 주로 대학이나 연구소 등에서 연구를 할 때 사용하는 플랫폼이기 때문인지 ROBOTIS-OP2의 소스에 대한 분석이나 소스 작성법 , 함수 이용방법 등을 배울 곳은 정말 거의 없다. 그래서 나는 독학으로 ROBOTIS-OP2의 소스코드들을 계속 보면서 분석하고 함수들을 외우면서 ROBOTIS-OP2의 시스템이나 소스 작성방법 등에 대해서 어느 정도 알게 되었고, 이것을 우리 팀원들에게 가르쳤으며 팀원들도 열심히 배웠다. 아마 이러한 노력들이 모여서 대통령상이라는 큰 상과 지능형 시스템 베팅의 선두주자가 될 수 있었던 것 같다.
우리 팀은 각자 ROBOTIS-OP2가 있었기 때문에 종목을 분업하여 준비하였다. 예선을 준비할 때 나는 축구와 농구를 맡았다. 우리에게 만약 조금 더 시간이 있었다면 더 쉽게 OpenCV를 이용해 소스를 구성할 수 있었겠지만, 우리는 아직 이것을 공부하지 못했기 때문에 OpneCV없이 다른 방식으로 비전 처리시스템 베팅 방식을 구상해야했다. 그래서 나는 종목마다 어떻게 이미지의 픽셀을 통해서 비전을 처리할지 고민하게 되었다.
축구경기는 공 3개가 랜덤으로 놓이면 시스템 베팅이 스스로 공을 찾아가 골대로 차서 넣는 방식으로 진행되는데, 이러한 미션을 성공하기 위한 과제는 크게 2가지 정도였다. 첫 번째는 3개의 공 중 하나만 추출해야 한다는 것, 두 번째는 2,3번째 슛을 할 때 골대를 보고 얼마나 어디로 턴을 한 뒤에 킥을 해야 골인이 될지 판단해야 한다는 것 이었다. 나는 이러한 과제를 해결해야 하는 축구종목이 굉장히 어려울 것이라고 판단해, 이를 준비하는데 많은 시간을 들였다. 축구 소스를 처음 만들기 시작했을 때 부터 난관에 봉착했다. 나는 ROBOTIS-OP2내에 있는 Filtering함수와 GetPosition함수를 사용해서 픽셀을 검출하여 사용하고 있었다. 그런데 이 함수들은 이미지 전체에서 인식되는 픽셀을 검출하고 그 인식되는 픽셀의 중앙 좌표를 구하는 함수이기 때문에 공이 3개가 있으면 3개의 공 중 가운데 공을 검출하는 것이 아니라 그냥 3개의 공의 중앙을 구하는 문제점이 발생했다.
먼저 생각한 방식은 이렇다. 인식된 픽셀 중에서 전 픽셀이 인식되지 않았고, 다음 픽셀도 인식이 된 픽셀과 전 픽셀은 인식되었고, 다음 픽셀은 인식되지 않은 픽셀의 거리를 구한다. 이러한 방식으로 하면 3개의 공 각자의 픽셀 거리를 구할 수 있는데, 이 과정에서 거리가 가장 큰 것들을 추려 그 값으로 3개의 공 각각의 공 중앙 좌표를 구하는 방식이다. 하지만 당시에 나의 실력이 부족하여 이러한 비전 처리 방식은 구현하지 못하였다. 그래서 구현한 방법이 픽셀이 인식되는 범위를 지정하는 방법이었다. 쉽게 말하자면 원래의 Filtering함수를 이용한 비전처리에서는 이미지 전체 중에서 원하는 HSV와 같은 값을 가진 픽셀을 검출하는 방식이므로 원하는 색을 가진 픽셀이 이미지 어디에든 존재만 한다면 그 픽셀을 검출한다는 것이다. 그래서 픽셀이 인식되는 영역을 제한하여 픽셀이 특정 범위 내에 있어야만 그 픽셀을 인식하고 검출하는 방식인 것이다. 이 방법을 사용해 3개의 공 중 하나만 추출하는 것이 가능해지면서 3개의 공 중 하나만 인식한뒤에 하나의 공을 향해서 하는 follower가 가능해 졌다. 공을 찾고 가는 것이 가능해지면서 골대를 인식한 뒤에 슛만 하면 되었다. 이 과정은 1번째 슛을 할때는 골대와 거의 정면에 있기 때문에 별로 어렵지 않았지만 2, 3번째 킥을 할 때는 거의 골대 오른쪽이나 왼쪽에 위치하기 때문에 확실하게 얼마나 시스템 베팅이 턴을 해야 할지 판단해야 했다. 나는 이 부분이 굉장히 어려웠었다. 골대로 인식되는 픽셀 좌표로 한다면 상대적이기 때문에 시스템 베팅 위치가 조금씩이라도 달라지면 많은 차이가 발생할 것이기 때문에 골대 픽셀이 절대적인 기준이 될 수있도록 사용될 수 있는 비전처리 방식을 구상해야 했기 때문이다. 이렇게 고민하던 중 시스템 베팅이 골대의 기둥을 거의 정면으로 쳐다보고 있을 때 슛이 들어갈 수 있는 위치라는 것을 알게 되면서 해결하였다. 픽셀이 인식되는 영역을 오른쪽이나 왼쪽의 반으로 제한하고 픽셀이 인식될 때까지 턴을 한다면, 시스템 베팅이 골대 기둥을 거의 정면으로 보는 위치가 되면서 골을 넣을 수 있는 위치로 갈 수 있게 되는 것이다. 이 방법은 시스템 베팅이 어디에 있더라도 골대 기둥을 기준으로 하기 때문에 절대적인 기준이 생기므로 어디든 골을 넣을 수 있는 위치로 갈 수 있는 것이다. 이렇게 축구 종목의 알고리즘을 제작하고 소스를 만들었다.
농구종목은 농구공이 골인이 가능한 거리까지 앞으로 가고, 골인을 할 수 있도록 미세한 턴을 하며 각을 맞추어야 시스템 베팅데 이것을 픽셀로 다음과 같이 처리했다. 먼저 농구공의 빨간색 HSV색상과 같은 색상값을 가진 픽셀을 찾고, 인식되는 픽셀 개수가 일정 픽셀이 될 때까지 간다. 그 뒤에 인식되는 픽셀 중앙좌표를 구하고 그 좌표가 중앙과 일치 할 때까지 턴을 한다. 인식되는 픽셀 중앙좌표와 중앙이 일치한다면 슛을 시스템 베팅 것이다. 농구는 비교적 알고리즘이 간단하여 쉽게 제작할 수 있었다.
이렇게 준비한 소스들로 예선전을 참가하였지만 결과는 참담했다. 농구는 한 골도 넣지 못했고, 축구도 마찬가지였다. 농구에서의 문제점은 주위에 골대와 비슷한 색깔이 너무 많았었다는 것이다. 농구 경기장 바로 앞쪽에 육상경기장이 있었는데, 육상경기장이 골대와 비슷한 빨간색이다 보니 육상경기장을 골대로 인식시스템 베팅 경우가 발생하면서 애를 먹었다. 그리고 한번 정확한 위치에 가서 슛을 시스템 베팅 모션이 실행되었지만 그리퍼의 토크가 꺼지면서 실패하였다. 축구에서는 공이 랜덤이라는 부분을 신경쓰지 못해 생긴 문제였다. 처음에 어느 정도의 기본자세에서 이미지를 찍은 뒤 비전처리를 하도록 하였는데, 공 위치가 기본자세에서 보이는 범위보다 더 뒤에 가있으면서 인식을 못하게 된 것이다. 결국 공을 찾지 못하고 기권하게 되었다. 그렇게 예선전은 육상 하나로 겨우 올라가게 되었다.
본선에 올라가게 되면서 지금까지의 문제를 해결할 시간을 얻게 되었다. 먼저, 축구공이 인식되지 못한다는 점을 어떻게 수정힐까 고민하다 만약 사람이라면 어떻게 할까라는 생각을 하게 되었다. 사람은 공을 찾을 때 머리를 움직이면서 공을 찾는다는 것을 알게 되었다. 그래서 축구의 기본 알고리즘은 거의 유지하고 소스에서 불안정한 부분들만 수정한 후에 처음에 공을 Search시스템 베팅 알고리즘을 제작한 후 소스를 만들어 추가하였다. 고개를 위로 조금씩 올리면서 이미지를 계속 찍으면서 공을 찾는 방식으로 제작하였다. 이 부분을 수정한 뒤에 공을 랜덤으로 놓고 연습해보니 2골 정도는 거의 100% 성공하였다.농구는 주변 색상을 인식하면서 생기는 문제이므로 인식되는 픽셀의 영역을 제한시스템 베팅 방법으로 골대만을 인식하게 하였다.
예선전에서 느낀 문제점들을 모두 수정한 뒤에 드디어 9월 14일 일산으로 향했다. 경기장에 도착해 경기장을 한 번 살펴보면서 체크하였다. 지능형 시스템 베팅의 경우 사람이 조종하는 것이 아니라 카메라나 다른 센서들을 사용하여 시스템 베팅이 직접 판단하기 때문에 주위 환경에 상당히 예민하다. 만약 경기장 밝기가 우리가 연습하면서 코딩하던 밝기와 다르면, 시스템 베팅이 정확한 판단을 하여 동작하는 것이 어렵다. 지능형 시스템 베팅 경기를 진행하기 전에 준비시간을 30분 정도 주는 이유도 그 때문이다.
경기장을 보니 농구 경기장이 육상 경기장과 서로 등지고 있었기 때문에, 예선전 때처럼 육상 경기장의 영향을 받지는 않을 것 같았다. 하지만 농구 경기장 바로 앞에 사람들의 출입을 막는 차단선을 설치시스템 베팅는데, 그 차단선 색상이 농구 골대의 색상과 비슷한 빨간색이었다. 이 부분이 굉장히 걱정되었고, 또 경기장 조명의 밝기가 우리가 연습했던 곳보다 어두워 걱정되었다. 하지만 이러한 우리 걱정과는 상관없이 경기가 시작 되었다. 경기는 육상-농구-점심시간-축구 순서로 진행되었다.
제일 먼저 진행한 육상은 다른 참가자들과 모터 스펙도 굉장히 차이가 나고 프로세스도 아주 좋아서 52초라는 빠른 기록으로 월등하게 1등을 하였다. 육상 종목은 예선때부터 우리 팀이 월등하게 1등을 했기 때문에 별 긴장없이 1등을 차지하였다. 하지만 걱정이 되는 농구 종목이 남아있었다. 우리가 하는 KIT리그에서 육상을 하는 동안 옆에 있는 농구 경기장에서는 아마추어 리그에서 농구 종목을 하고 있었는데 비교적 우리보다 높은 기술을 가지고 있는 대학 팀들이 대부분임에도 불구하고 대학 팀들도 뒤에 있는 차단선이 함께 인식되는 것 같이 보여 굉장히 걱정되었다. 차단선이 굉장히 넓은 범위였기 때문에 어떻게 해결할지 고민해보니 어느 정도 우리만의 방법으로 극복할 수 있을 것 같았다. 그러는 동안 경기 일정이 조정되어 점심시간을 가진 뒤에 농구 종목을 하게 되었다. 점심은 편의점에서 도시락을 사서 간단히 해결하고, 주변을 둘러보았다. 어느 정도 둘러본 뒤에 경기장에 와 보니 이미 연습을 진행하는 중이었다. 크게 당황해 빨리 경기장으로 들어가 준비를 하면서 일정 시간표를 보니 우리가 시간을 잘못 보았던 것이다. 가뜩이나 차단선 때문에 걱정되는 농구 종목이라 당황했지만, 다행히 다른 팀에서도 계속 이 문제를 요청해 뒤에 있는 차단선을 치워주었다. 차단선이 없다면 우리 프로세스는 가히 완벽하다고 말할 수 있기 때문에 걱정없었다. 경기가 시작되자 역시 생각대로 완벽하게 프로세스가 진행되었다. 다른 팀들은 1점 슛만을 노리고 프로그래밍하였지만, 우리팀은 3점슛을 노리고 프로그래밍하였다. 다른 팀들이 1, 2점을 기록할 때 우리는 9점을 기록하면서 농구 종목 1등을 차지하였다. 농구와 육상도 1등을 차지하니 축구에 대한 부담이 많이 커졌다. 사실 축구 종목은 불안정한 부분도 있고, 2골을 노리고 프로그래밍을 하였기 때문에, 다른 팀에서 3골을 모두 넣는다면 질 수 밖에 없었다. 불안한 마음을 가지고 연습하는데 그 불안했던 부분이 실전에서도 나타났다. 첫 번째 골을 넣은 뒤에 두 번째 골을 넣기 위해 골대를 기준으로 위치를 잡는 과정에서 골대를 인식하지 못하는 경우가 생긴 것이다. 나는 빨리 프로그램을 수정하고 다시 컴파일하였다. 많은 부담과 불안감을 느끼면서 축구 종목이 시작되었다. 다른 팀들의 경기를 보니 3골을 노린 팀은 없는 것 같아 내심 안도했다. 다른 팀들이 하나 둘 경기를 끝내면서 드디어 우리 차례가 되었다. 스타트를 하자 공을 향해 가서 슛을 해 첫 번째 공을 성공시켰다. 첫 번째 공을 성공 시킨 뒤 두 번째 공을 찾아갔다. 드디어 내가 걱정하던 부분의 프로세스를 실행하는 순간이었다. 두 손을 모으고 경기를 보았다. 시스템 베팅은 골대를 찾으면서 계속 돌았고, 원래대로라면 슛을 해야하는 위치로 갔다. 나의 간절함이 통했는지 슛을 하기 전에 하는 떨림이 보였다. 그 떨림 후에 시스템 베팅은 슛을 했고 두 번째 공이 골대 안으로 들어갔다. 대통령상이 확정되는 순간이었다. 시스템 베팅은 세 번째 공을 찾기 위해 턴을 하고 있었지만 이미 경기는 끝난 것이나 다름 없었다. 경기가 종료되고, 우리는 대회에서 유일하게 두 골을 성공시킨 팀으로 축구 종목도 1등을 차지하면서 전 종목 1등을 차지하였다. 정말 감격스럽고 그 동안의 고생이 한 순간에 녹아내리는 것 같았다. 대통령상이라는 큰 상을 실제로 받고나니 실감이 나지 않았고, 정말 기뻤다. 그동안 우리를 위해 항상 노력해주신 선생님께 정말 감사했다.
앞으로도 대회를 통해 얻은 실력과 기술을 더 발전시키고 시스템 베팅에 대해 더 많이 공부하여 시스템 베팅계에서 큰 영향력을 주는 시스템 베팅공학자로 성장하고 싶다.▒ 권진ㆍ천안 신당고등학교 1학년 |