늘 갖고싶었던 장난감이 있었다. MIT와 합작으로 개발 중이라는 소문에 가슴이 설레고, LEGO에서 출시되었다는 소문을 듣고 업무핑계로 사놓고서도 당장의 일에 바빠서 손대지 못하고, 경제적/시간적인 여유가 없다는 핑계로 미뤄온 게 어느새 10년이 넘었다. 그러던 장난감을 드디어 이번에 대대적으로 -_- 질러 버렸다.
레고 마인드스톰 LEGO Mindstorms... 덴마크가 코앞(?)인 이 동네까지 와서 이걸 안 산다면 도대체 무슨 핑계를 더 대야 하는 건가 싶었는데, 마침 회사에서 로봇 스모 경기(그냥 '경기장 밖으로 밀어내기' 게임; 원래는 로봇의 면적 규정이 있는데, 회사에서 하는 친선놀이에는 그런 거 없다. ㅎㅎ )를 하는 친구들이 있어서 동참하기로 하고 질렀다. ... 그리고 이어진 잠 못 이루는 주말 3연타. ㅠ_ㅠ
처음 목표는, 그래도 로봇 좀 구경해본 입장인데 센서나 액츄에이터 특성을 잘 활용한 물건을 만들자! 라는 야심찬 계획이었으나, 결국 현실과 타협하다보니 그만그만한 놈이 나와 버렸다. 지난 몇주간 짬짬이 작업하면서 겪은 수많은 변화 중에서 그 세가지 (주요) 버전의 로봇 디자인은 다음과 같다.
... 사실 뭐가 달라졌는지는 잘 보지 않으면 안 보인다. OTL... 첫 버전에서는 터치센서(라고는 하지만 사실은 그냥 soft dome switch)을 앞에 달아서 상대방을 명확히 감지하려고 한 건데, 사진을 본 동료들이 "... Boy 구나.*-_-* " 라고 하는 바람에 디자인 상의 결격사유로 탈락. 때마침 추가주문 -,.-;;; 한 가속도 센서와 광센서가 도착한 덕택에 두번째 버전을 만들었으나, 광센서를 좌우로 배치하는 게 '밀어내기' 경기에서는 그닥 도움이 되지 않는 관계로 전면적인 재설계. 결국 세번째처럼 광센서를 앞뒤로 배치하고 가속도 센서를 등에 짊어진 형태가 됐다.
최종적으로 정해진, 아무도 궁금해하지 않는 하드웨어의 설계 스펙은 이렇다.
초음파 거리 센서: 눈처럼 생긴 부분으로, 한 방향 밖에 보지 못하므로 몸체 자체를 회전시켜서 상대방을 찾도록 되어 있다. 미로찾기 경기에 사용되는 마이크로 로봇의 경우처럼, 센서를 경사지게 배치해서 시야를 제한시켰다. 실제로 시합장 바깥까지 보면 로봇도 정신이 없어진다. 초음파 센서는 인식면의 반사특성에 따라 거리를 다르게 인식하기 때문에 균일하게 만들어진 시합장 표면만 내려다 보도록 한 거다. 결과적으로 오인식률은 낮췄다고 생각하는데, 실제로는 어떤지 모르겠다.
광 센서: 로봇 스모 경기는 흰색 테두리가 있는 검은색 원형 경기장에서 치뤄지는데, 우선 경기장 안에서 스스로 뛰쳐나가지 않는 게 기본이다. 그러다보니 일반적인 line tracer와 같은 식으로 반사형 광센서를 바닥을 향해서 설치해서 경기장 안을 향하고 있는지 밖을 향하고 있는지 알 수 있도록 했다. 광 센서는 주변광에 대한 영향을 많이 받아서 회사하고 집에서 동작이 너무 달라지길래, 자체 calibration 기능을 넣어 경기를 시작하기 전에 약간의 쑈를 하면서 해당 조명조건 하에서 바닥을 판단/학습하는 기능이 있다.
가속도 센서: 가장 고민이 많이 된 센서로, 로봇 자체가 움직이다 보니까 계속해서 극단값이 들어오는데 그것만으로는 자세를 판단하기가 어려웠다. 몸체 중심에 배치해서 진동을 최소화하는 것도 실패하고 나서, 결국 고민 끝에 오히려 가장 많이 흔들리는 등에 짊어지게 해 놓고 별도로 normalizing 하는 함수를 넣었다. -_-a;; 결국 센서 신호가 있는 후에 판단까지 0.1 초 정도의 지연이 있지만, 사실 자세 신호를 써먹을 수 있는 것은 상대방이 로봇을 들어올리려고 하는 경우 뿐이고, 넘어진 상태라면 뭐 팔이 있는 것도 아니니 그냥 밀려나가는 수 밖에 없다. 그다지 경우의 수가 많이 않지만 순간회피동작만 하나 넣고 말았다. (비싼 센서인데 써먹을 데가 없다니!)
스텝 모터(x2): 기본으로 제공하는 모터가 스텝모터라는 건 좀 의외였다. 로봇을 앞세우는 컨셉이라 그런가. 어쨋든 꽤 다양하게 조작할 수 있었는데, 각 센서에서 내세우는 우선권을 비교해 가면서 동작을 움직이려니까 모터가 앞뒤로 흔들리면서 고민하는 경우가 많아서 (상충되는 명령이 무한반복으로 돌아갈 경우) 의외로 다루기가 어려웠던 부분이다. 처음에는 MIT의 synthetic agent 모델을 들여다보면서 넣어보려고 하다가, 결국은 그냥 확률과 랜덤, 그리고 두어개의 우선권 flag로 대충 구현해 버렸다.
LED: 사실은 포트가 남아서 넣은 거지만, 로봇이 무슨 '생각'을 하고 있는지를 표시하는 데에 도움이 많이 되고 있다. 상대방을 발견하면 불을 켜고 달려들고, 긴가민가 할 때는 깜박이거나 하는 등 유일하게 외부로의 표현이 들어간 부분이다. <Affective Computing>에 따르면 로봇의 이런 상태들이 인간의 감정에 해당하는 부분이라고 했으니, 이런 깜박임이 이 로봇의 표정이라고 해도 되겠다. 이 포트에는 모터를 달 수도 있는데, 좋은 아이디어가 떠오르기만 하면 표정이고 나발이고 집게 팔을 하나 달아서 공격용으로 쓸까 생각 중이다. ㅎㅎㅎ
화면 및 음성: 중앙의 정보처리 및 통신 모듈인 RCX 상자에는 작은 LCD 화면과 스피커가 있는데, 이 안에도 몇가지 표시가 들어오도록 했다. 그래봐야 각 센서의 상태와 입력값, 그리고 그에 따른 판단결과를 두 가지 모드(실전 및 debug)로 표시하고, 특정 상황이 인식되면 적당한 대사를 - "Hello", "Ooops!", "Watch Out!", "Game Over" 따위의 - 말하도록 해 두었다.
광 센서: 로봇 스모 경기는 흰색 테두리가 있는 검은색 원형 경기장에서 치뤄지는데, 우선 경기장 안에서 스스로 뛰쳐나가지 않는 게 기본이다. 그러다보니 일반적인 line tracer와 같은 식으로 반사형 광센서를 바닥을 향해서 설치해서 경기장 안을 향하고 있는지 밖을 향하고 있는지 알 수 있도록 했다. 광 센서는 주변광에 대한 영향을 많이 받아서 회사하고 집에서 동작이 너무 달라지길래, 자체 calibration 기능을 넣어 경기를 시작하기 전에 약간의 쑈를 하면서 해당 조명조건 하에서 바닥을 판단/학습하는 기능이 있다.
가속도 센서: 가장 고민이 많이 된 센서로, 로봇 자체가 움직이다 보니까 계속해서 극단값이 들어오는데 그것만으로는 자세를 판단하기가 어려웠다. 몸체 중심에 배치해서 진동을 최소화하는 것도 실패하고 나서, 결국 고민 끝에 오히려 가장 많이 흔들리는 등에 짊어지게 해 놓고 별도로 normalizing 하는 함수를 넣었다. -_-a;; 결국 센서 신호가 있는 후에 판단까지 0.1 초 정도의 지연이 있지만, 사실 자세 신호를 써먹을 수 있는 것은 상대방이 로봇을 들어올리려고 하는 경우 뿐이고, 넘어진 상태라면 뭐 팔이 있는 것도 아니니 그냥 밀려나가는 수 밖에 없다. 그다지 경우의 수가 많이 않지만 순간회피동작만 하나 넣고 말았다. (비싼 센서인데 써먹을 데가 없다니!)
스텝 모터(x2): 기본으로 제공하는 모터가 스텝모터라는 건 좀 의외였다. 로봇을 앞세우는 컨셉이라 그런가. 어쨋든 꽤 다양하게 조작할 수 있었는데, 각 센서에서 내세우는 우선권을 비교해 가면서 동작을 움직이려니까 모터가 앞뒤로 흔들리면서 고민하는 경우가 많아서 (상충되는 명령이 무한반복으로 돌아갈 경우) 의외로 다루기가 어려웠던 부분이다. 처음에는 MIT의 synthetic agent 모델을 들여다보면서 넣어보려고 하다가, 결국은 그냥 확률과 랜덤, 그리고 두어개의 우선권 flag로 대충 구현해 버렸다.
LED: 사실은 포트가 남아서 넣은 거지만, 로봇이 무슨 '생각'을 하고 있는지를 표시하는 데에 도움이 많이 되고 있다. 상대방을 발견하면 불을 켜고 달려들고, 긴가민가 할 때는 깜박이거나 하는 등 유일하게 외부로의 표현이 들어간 부분이다. <Affective Computing>에 따르면 로봇의 이런 상태들이 인간의 감정에 해당하는 부분이라고 했으니, 이런 깜박임이 이 로봇의 표정이라고 해도 되겠다. 이 포트에는 모터를 달 수도 있는데, 좋은 아이디어가 떠오르기만 하면 표정이고 나발이고 집게 팔을 하나 달아서 공격용으로 쓸까 생각 중이다. ㅎㅎㅎ
화면 및 음성: 중앙의 정보처리 및 통신 모듈인 RCX 상자에는 작은 LCD 화면과 스피커가 있는데, 이 안에도 몇가지 표시가 들어오도록 했다. 그래봐야 각 센서의 상태와 입력값, 그리고 그에 따른 판단결과를 두 가지 모드(실전 및 debug)로 표시하고, 특정 상황이 인식되면 적당한 대사를 - "Hello", "Ooops!", "Watch Out!", "Game Over" 따위의 - 말하도록 해 두었다.
위와 같은 내용을 구현한 소프트웨어는 NXT-G라는, 그냥 기본으로 포함되어 있는 그래픽 방식의 프로그램을 이용해서 개발했다.
이 프로그램은 레고하고 똑같이 각 모듈의 블록을 연결해서 시각적으로 프로그래밍을 할 수 있게 해주는데, 'Pure Data' 같은 그래픽 프로그래밍 도구의 좀 과하게 화려한 버전이라고 생각하면 된다. 굳이 "과하게"라고 한 이유는, 이게 워낙 다운이 잘 되어서, 마치 10년전의 포토샵 교본에 나와있는 것처럼 "수시로, 자주, 여러 파일로 저장해 놓을 것!" 이라는 게 첫번째 사용지침이었다. (실제로도 얼마나 날려먹었는지. -_ㅠ )
이런저런 고생 끝에 이제 완성(했기로)하고, 이제 이번 주에 대망의(?) 첫번째 경기를 하기로 했다. 상대방이야 마이크로 로봇 키트로 만들어진 로봇이라 사실 기동력 면에서 영 불리하지만, 뭐 선무당이 사람 잡는 경우도 있으니까. (아, 이게 아닌가 -_-;; )
이 글은 그동안 왜 블로그가 한적했는지에 대한 핑계를 겸하고 있다. ^-^a
반응형