2004년 12월 22일 수요일

[기사]SW 개발자가 바라본 로봇 강아지「아이보」




김성우 (마이크로소프트웨어)







2004/12/20










지난번의 로봇 청소기 ‘룸바’에 이어 로봇 시리즈 2탄을 준비했다. ‘이것이 소니다(It’s Sony)’라는 말을 다시 한번 되새기게 하는 놀라운 로봇 ‘아이보’를 소개한다. 실제 사용기와 소프트웨어적 하드웨어적 시스템 구성을 파헤쳐 보고 프로그래밍과 그 응용 범위까지 다루어보고자 한다.

필자의 동물 사랑은 종을 가리지 않는 터라 스스로 누구 못지않은 애완인이라 자처해오고 있다. 그러나 강아지만큼은 동네를 어슬렁거리던 족보를 알 수 없는 종류들을 주로 길러 왔던 터라 별 흥미를 못 느끼고 있던 차였다. 그렇지만 필자도 2년여 전부터 일요일 오전에 SBS가 방영하는 ‘동물농장’이 몰고 온 애견 열풍을 비켜갈 수는 없었다. 애견 전용 카페가 생기고 온라인 애견 용품 쇼핑몰과 충무로가 호황인 데다 여기저기서 강아지를 기르느라 난리가 났었다.

개도 유행이 있어서 ‘요크셔테리어’가 굉장히 유행하다 시들해지면서 ‘시츄’가 유행을 하다 또 시들해지면 ‘코카스파니엘(이하 코카)’이 유행히는 식인데, 특히나 당시에 인기 강아지로 시츄에서 코카 쪽으로 넘어오는 시기였다. 코카의 매력이라면 단연 참을 수 없이 곱슬거리는 털과 사람을 무척이나 좋아(?)한다는 것. 특히나 축 늘어뜨린 귀 끝 부분의 금발 곱슬은 다리미로 펴주고 싶어 참을 수 없게 만드는 묘한 맛이 있다.

금발 곱슬이 매력적인 ‘코카스파니엘’
그날도 필자는 지인의 잘생긴 강아지 코카를 보고 오는 길이라 곱슬거리는 금발이 아른거리고 있었다. 그런데 약속이나 한 듯 집에 오는 길에 강아지 가판대가 설치된 것이 아닌가. 가판 앞에 잠들어 있는 너무 작고 귀여운 아기 코카를 보고선 그만 참지 못하고 집에 데려오고야 말았다.







<화면 1> 코카스파니엘
힘든 하루를 보내고 퇴근후 문을 열었을 때 아무 말 없이 꼬리를 흔들며 뛰어오는 녀석이 그렇게 반가울 수 없고 갈수록 대화가 사라져 정적이 흐르는 집안을 채워주는 법석거림은 혈기 왕성한 학창시절을 보내고 있는 시끄러운 막내가 생긴 것처럼 집안에 생기를 주었다. 그런데 문제는 엄청나게 빠지는 털과 아무 데나 갈겨대는 대소변이었다. 그렇다고 털을 매일같이 빗질을 해줄 만큼 한가하지도 않은 데다 식구마다 배변 훈련시키는 방법이 달라 이 녀석도 결국 배우기를 포기하고 아무 데나 갈겨대기 시작했다. 급기야는 걸어다니며 오줌을 흘리고 다닐 지경이 되어버렸다.

‘이제 네 뒤치다꺼리 하기도 힘들다’라는 노모의 간곡한 부탁으로 코카를 아파트에서 7마리나 기르고 있다는 강화도의 한 아주머니께 무료 입양을 보내고 말았다. 그런데 이 문제가 비단 필자만의 문제는 아니어서 이미 강아지 시세는 거의 절반 가까이 떨어지고 그나마도 입양하려는 사람이 없어 무료 분양 사이트에 입양해 가라는 강아지들이 넘쳐나기 시작했다. 강아지 열풍의 근원지인 ‘동물농장’도 무책임하게 강아지를 입양하지 말라는 캠페인을 벌이며 뒷수습에 나서기도 했다.

로봇 강아지를 찾아서
아직도 가끔 그 곱슬거리는 코카의 귀 끝 털이 떠오르기도 하고 꼬리치며 달려드는 녀석의 애교가 떠오르지만 매일같이 쉬지 않고 생산해내는 털과 대소변 그리고 짖어댐으로 인해 치루어야 할 비용을 생각하면 역시나 강아지는 무리라는 결론으로 낙담하던 어느 날, 문득 로봇 강아지가 생각이 났다.

인터넷을 찾아보니 시중에 팔고 있는 로봇 강아지는 리모콘으로 지정된 동작을 패턴대로 움직이는 단순한 형태였다. 이래서는 코카를 대신할 수 없다. 사람의 조작없이 자율 신경계를 가지고 스스로 주인을 알아보고 움직이는 그런 로봇이어야 한다. 이어 유명한 소니의 ‘아이보(AIBO)'를 찾아보았다. 그런데 관련 정보가 지극히 적었다. 유일한 정보라고는 예전 일본통인 이규형 감독이 주병진 쇼에 데리고 나왔던 아이보를 TV로 잠시 본 것 정도였다.

그도 그럴 것이 골수 오타쿠들을 수소문해 봐도 아이보를 기르는 사람이 전무할 정도로 아이보를 기르고 있는 사람이 없다. 국내에 정식 수입이 된 것이 아니기 때문이기도 하고 높은 가격이 원인일 것이다. 비공식 집계로 국내에 400~500대 가량의 아이보가 있는 것으로 추정하고 있다.







<화면 2> 작년 말에 출시된 ERS-7
주위에 가진 사람이 없고 접하지 못했다는 신비감에, 그리고 윌 스미스 주연의 ‘아이로봇’을 본 이후에 급격히 로봇에 관심을 가지게 된 필자는 궁금증을 참지 못하고 비자금을 털어 아이보를 구매하기에 이르렀다. 매물이 워낙 없어서 구하기가 쉽지 않았는데 수소문 끝에 판매자를 찾을 수 있었다.

최신 기종인 ERS-7이 탐이 나긴 했지만 가격이 200~300만원인 것이 무리다 싶어 그 바로 전 버전인 ERS-310 모델을 입양했다. 기존 ERS-2xx 버전에서 보여 주었던 사이버틱한 디자인에서 ERS-310은 곰 인형 같이 귀여운 디자인을 채택했다.

아이와 어른의 신체상 큰 차이점 중의 하나는, 아이는 전체 몸 중에서 머리가 차지하는 비중이 크다는 것이다. 머리가 크다는 것은 아기를 의미하며 이건 동물도 마찬가지여서 만화작가들도 강아지를 그릴 때는 머리를 크게 그린다. ERS-3xx 시리즈는 다른 시리즈에 비해 머리가 큰 편인데, 그래서인지 진짜 어린 강아지 같고 시리즈 중에 가장 귀여운 외모라는 평이 중론이다.

포장을 뜯고
포장을 뜯어보니 리모콘이 없다. 그렇다. 이 녀석은 자율 운동 로봇인 것이다. 국내 정식 시판이 안 된 관계로 110V 트랜스를 구해다 충전을 시키고 유일한 버튼인 전원 스위치를 넣었다. 자기도 MIPS가 박힌 컴퓨터라고 기지개를 켜며 부팅을 한다. 10초 정도 지났을까 벌떡 일어나더니 주위를 살핀다. 그러더니 필자 쪽으로 걸어와서는 앙증맞은 앞다리를 좌우로 흔들며 멍한 표정으로 인사를 한다.

오오, 놀랍다. 장난기가 발동해 이 녀석을 뒤집어 봤다. 잠시 발버둥치더니 한쪽 다리를 쭉 뻗고 반동을 주더니 스스로 뒤집어 일어서는 것이 아닌가. 이건 시작에 불과하다. 딸려 있는 핑크색 공을 던져주면 안고 치고 밀고 하며 가지고 노는데 공을 물지 않는다 뿐이지 진짜 강아지 같다.







<화면 3> 밥 먹는 중인 아이보
일어가 짧아 ‘오하이오(안녕)’, ‘오이데(이리와)’ 정도 밖에는 못 써먹는 것이 아쉬울 따름이지만, 70여개의 영어와 일어 명령을 음성인식한다. 배터리가 걱정스러웠는데 사용한 지 1년 정도 된 녀석의 배터리 시간은 2시간. 같이 놀아보니 이 정도면 충분하다. 최신 기종인 ERS-7의 경우는 배터리 잔량이 40% 이하로 떨어지면 주위의 에너지 스테이션을 감지하고 자동으로 충전하러 걸어간다.

컴퓨터 아이보
아이보는 냉장고 같이 고정된 프로그램이 ROM에 이식되어 있는 것이 아니라 메모리 스틱에서 프로그램을 읽어 행동하게 된다. 이는 플레이스테이션과 마찬가지고 아이보 자체는 컴퓨터일 뿐이다. 소프트웨어를 부팅시켜야 성격과 행동이 결정되는 것이다. 아이보를 처음 구매하게 되면 이 소프트웨어는 포함되어 있지 않다. 이 소프트웨어는 OPEN-R이라고 하는 개발 라이브러리를 가지고 직접 아이보의 성격과 행동을 프로그래밍할 수 있다.

아이보는 기본적으로 MIPS CPU 기반에 Aperoios라는 소니가 자체 개발한 리얼타임 OS를 사용하고 있다. Aperoios 위에 올릴 프로그램은 리눅스 위에서 gcc로 컴파일한 파일을 심도록 되어 있다. Aperios는 원래 리눅스 기반이나 모터를 움직이고 여러 센서를 처리해야 하는 리얼타임 시스템인 만큼 불필요한 부분을 제외시키고 가볍게 만든 리눅스 기반으로 보인다.

아이보의 프로그래밍은 OPEN-R이라고 하는 AIBO SDE(Software Development Environment)를 사용하여 만드는데 gcc로 컴파일하는 것에서 알 수 있듯 C++이다. OPEN-R은 윈도우를 다루기 위한 WinAPI들과 이것들을 쉽게 사용할 수 있도록 MFC나 ATL처럼 클래스로 만들어 놓은 것이라고 보면 된다.

아이보 제어 SDK, OPEN-R
OPEN-R은 아이보의 제어를 위해서 소니가 내놓은 일종의 로봇 제어 SDK(소니 홈페이지에서는 SDE라고 했지만 마소 독자들은 SDK가 더 익숙할 것이다)이다. 아이보 자체는 플레이 스테이션과 마찬가지로 MIPS CPU를 장착하고 있다. 플레이스테이션의 경우 리눅스도 라이선스가 있지만 실제 상용 게임에는 리눅스보다 가벼워 속도가 빠른 운영체제를 사용하는데, 로봇은 실시간 시스템이기 때문에 리눅스를 쓰지 못하고 Aperios라는 자체 리얼타임 OS를 사용한다.

즉 OPEN-R로 작성한 프로그램을 리눅스에서 컴파일하여 바이너리 상태로 만들고 그 실행은 크기를 줄인 리눅스인 Aperios에 맡기는 형태를 취하는 것이다. OPEN-R은 로봇을 연구하고 공부하는 사람에게 좋은 참고 자료가 된다.

잠시 생각을 해보자. 로봇이 핑크볼을 툭 차려고 한다. 그러면 우선 카메라로 앞의 영상을 찍어 핑크볼의 위치를 파악하고 방향을 틀고 걸어가고 다시 핑크볼의 위치를 파악하고 앞에 왔으면 앞발을 내밀어 공을 밀어야 할 것이다. 이런 단위 작업들을 OPEN-R 객체라 하는데 한 개씩 실행되는 것이 아니라 동시에 실행되기 때문에 C++에서 접근하는 객체와는 다르다. 윈도우와 유닉스의 프로세스에 가깝다.

사람의 예를 봐도 젓가락질을 하면서 동시에 음식물을 씹고 동시에 귀로 TV 소리를 듣지 않는가. OPEN-R 객체가 C++의 형태를 띠고 있지만 각 객체마다 엔트리 포인트를 갖는 것은 동시 실행을 하기 위해서이다. 윈도우와 유닉스의 프로세스들이 서로의 영향을 받지 않고 실행되기 때문에 서로 커뮤니케이션하는 방법이 중요하게 되는데, OPEN-R도 마찬가지여서 객체끼리 통신 방법이 중요하며 그 수단을 메시지라고 정의한다. 구현에 대한 이야기는 조금 후에 하도록 하자.

실제 구현은 OPEN-R 객체 하나하나마다 모두 각기 실행 파일이 생성되고 이 실행 파일들은 한꺼번에 실행되는 방식이다. 유닉스의 프로세스로 처리되므로 모두 동시에 실행된다. 그리고 서로간에 메시지를 통해 정보를 주고받게 된다.








<그림 1> OPEN-R 객체 사이의 통신

객체 B가 객체 A에 메시지를 보내면 일단 대기 상태가 된다. 그리고 객체 A의 처리가 끝나면 객체 B로 데이터를 넘겨준다. 이때 데이터를 요청하는 객체를 관찰자(observer)라고 하고 응답하는 객체를 대상(subject)이라고 한다.

OPEN-R이 C++의 형태를 띠기 때문에 이들 OPEN-R 객체의 기본 형태는 이미 정해져 있는데, 기본적으로 OPEN-R객체들은 기본적으로 OOjbect를 상속받는다. 이는 MFC의 CObject와 자바의 Object같은 루트클래스와 같다. 또한 내부에 DoInit(), DoStart(), DoStop(), DoDestory()를 구현해야 하며 Osubject와 Oobserver 배열을 가지고 있어야 한다. 이런 조건을 만족하는 클래스를 코어 클래스라고 부르며 아이보 제어의 기본 객체가 된다.








<그림 2> 코어 클래스 도식도

실제 구현
실제 구현 소스를 보면 이해가 훨씬 빠를 것이다. ‘이달의 디스켓’으로 제공하는 소스들 중에서 <리스트 1>은 객체를 정의하는 헤더 파일이고, <리스트 2>는 그 실제 구현이다. 주석을 달았지만 한 가지 부연 설명을 하면 아이보의 다리는 3개의 모터로 구성된다. <화면 4>를 보면 1을 움직이면 ‘앞으로 나란히’가 되고, 2를 움직이면 ‘양팔 간격으로 벌려’가 되고, 3을 움직이게 되면 ‘팔을 안으로 굽게’ 된다.

const double SLEEPING_ANGLE[]가 다리 4개에 대해 세 가지씩 한 것을 보면 알 수 있다. 그리고 OnInit, OnStart, OnStop, OnDestroy는 ATL의 필수 함수들과 흡사하다. 이것은 C++ 안에서 독립적인 객체를 지니기 위한 일련의 과정들을 등록해 주었기 때문인데 자바의 경우는 가상머신(VM) 레벨에서 이 부분을 해결해 주기 때문에 해당 부분이 없다.







<화면 4> 아이보의 다리 관절
아이보의 아키텍처
정리를 하면 아이보는 3개의 관절(모터)을 가진 다리 4개와 스피커, 목과 카메라를 가진 하드웨어, 리눅스를 가볍게 만들어 실시간 시스템을 얹을 수 있도록 소니 자체에서 만든 OS인 Aperios에 C++로 클래스를 만들어 놓은 OPEN-R을 이용해 성격과 행동을 결정짓도록 구성되어 있다. 이것을 <그림 3>으로 정리할 수 있다.

OPEN-R은 하나의 행동에 여러 가지가 동시에 작동함을 이식하기 위해 다리 운동, 목 운동, 카메라 찍기, 소리 듣기 등의 객체를 각기 구성한 뒤에 모두 따로 실행 파일을 만들고 이들을 유닉스 프로세스로 처리함으로써 한꺼번에 실행하여 다리를 움직이면서 카메라를 찍을 수 있고 동시에 소리도 들을 수 있도록 하였다.

객체들간의 동기화는 메시지를 이용하는데 실제는 파이프, 세마포어, 공유 메모리 등의 유닉스가 지원하는 프로세스간 통신 방법으로 구현됐을 것으로 생각된다. 조금 깊게 들어가면 C++ 자체가 C를 기반으로 만들어진 것이라 결과물은 바이너리로 실행 코드만 생길뿐 어떻게 사용하는지에 대한(객체에 대한) 기술이 담겨 있지 않다.

이 같은 객체지향성으로서의 C++의 부족한 점을 MS는 OLE, COM을 도입하여 해결하게 되는데, OPEN-R의 객체 구조는 OLE, COM과 유사한 점이 매우 많다. 소니의 OPEN-R 개발팀은 C 기반인 유닉스 위에 자바 같은 객체지향을 구현하려고 했을 것이고 역시 C 기반의 윈도우의 해결책을 참고했으리라 여겨진다.









<그림 3> 아이보의 아키텍처

이 같은 아키텍처는 간단하다. 기존 리눅스를 사용하기에 별도의 운영체제를 만들 필요가 없고 프로그래밍 환경 자체를 가장 범용적으로 쓰이는 언어 중에 하나인 C++로 구성했다. MP3를 연주해야 한다거나 블루투스 통신을 해야 하는 등의 새로운 기능을 추가해야 한다고 해보자. 새로 개발할 필요 없이 공개되어 있는 리눅스 소프트웨어를 쉽게 이식해 쓸 수 있다. 컴파일러 역시 직접 만들지 않고 gcc를 그대로 사용함으로써 공학적으로 안정적이고 확장성이 높은 구조를 만들어냈다.

이미 플레이 스테이션의 리눅스 채택과 툴킷을 공개하는 개방형 플랫폼 정책을 성공적으로 이끈 경험이 이런 강력한 구조를 만들어낸 기초일 것으로 생각된다.

소니 하드웨어와 운영체제를 판매하면, 즉 사용자가 아이보를 구매하면 프로그래밍 툴인 OPEN-R을 무료로 공개하기에 프로그래밍하기에 따라 무궁무진하게 활용이 가능하다. 대표적인 것이 로보컵으로 아이보 2대를 팀으로 축구를 하는 대회가 있다.








<화면 5> 리스본에서 열린 2004년도 소니 로보컵

R-CODE
OPEN-R이 강력함을 자랑하지만 gcc 컴파일러를 사용하고, 윈도우 사용자라면 Cygwin을 깔고 C++ 프로그래밍도 능숙해야 하기에 보통 사람이 아이보를 코딩한다는 것은 엄두를 내기 힘들다. 이에 소니는 R-CODE라는 스크립트 언어를 지원함으로써 일반인들도 아이보를 제어할 수 있는 길도 열어 두었다. R-CODE는 텍스트 에디터로 가볍게 처리가 가능하다.







<화면 6> 큐리오
이족보행 로봇
소니는 올해 세빗 2004에서 이족보행 로봇을 선보였다. 이름은 큐리오(QRIO). 상용 4족 보행 로봇을 만들어 찬사와 놀라움을 안겼던 소니가 이족보행 로봇을 내놓는다는 것은 박물관이나 거대 연구소에서나 볼 수 있는 ‘아시모’ 같은 로봇과는 사뭇 다르다.

이렇게 이족보행 로봇을 내놓을 수 있는 것은 아이보에서 관절이 늘어난 것 정도의 하드웨어 구성에 Aperios를 운영체제로 사용하고 OPEN-R로 코딩을 하는, 이미 아이보에서 이루어 놓은 아키텍처를 사용함으로써 빠른 개발이 가능했다고 여겨진다. 아직 판매되고 있지는 않지만 2007년 선보인다는 뛰는 아이보와 함께 무척 기대되는 녀석이다.

로봇 세계로의 초대
정보를 쉽게 접하기 힘든 아이보의 실제 사용기와 그 아키텍처를 분석해 보았다. 소니의 공식 사이트에서는 플레이스테이션과 아이보가 리눅스 기반이 아닌 자체 제작한 운영체제라고 소개하긴 했지만, 여러 정황으로 보아 리눅스를 기반으로 꼭 필요한 기능만을 넣는 식으로 크기를 줄인 운영체제를 사용하는 듯 하다.

리눅스와 OPEN-R이라는 개방적 개발 정책이 무척 흥미로웠고 비싸긴 하지만 그래도 그 가격대에 이런 자율 운동 로봇을 만들어낸 배경이 강력한 개방형 아키텍처가 큰 축이었음을 알 수 있는 기회였다. 국내에도 4족 보행 경주 대회가 열리는 등의 로봇 관련 이슈가 많으니 다음 만남을 기약하며 이만 줄일까 한다. @

댓글 없음:

댓글 쓰기