[45호]색종이로 작곡하는 춤추고 노래하는 자동차로봇
2017 ICT 융합 프로젝트 공모전 입선작
색종이로 작곡하는 춤추고 노래하는 자동차로봇
글 | 숭실대학교 김세현
1. 심사평
칩센 작품명을 보았을 때 작곡을 어떻게 하는지, 그 작곡에 대해 어떻게 로봇이 동작하는지가 매우 궁금하였습니다. 첨부한 동영상 및 보고서 내용을 보았을때, 작곡이라기 보다는 어떠한 형태이든지 간에 입력이 이루어 지는 수동적인 (흔히 보는 형태의) 입력과, 입력된 악보에 대해 어떤 방식과 패턴으로 로봇이 움직이는 등에 대한 내용이 매우 부족한 것으로 보입니다. 보고서에서 말한 영유아 및 어린이를 대상으로 한다고 보더라도 음계와 색상을 매칭하는 것 자체가 쉽지 않은 과정으로 보입니다. 작품의 이름 대비 많은 부분이 아쉬운 결과물로 느껴집니다.
뉴티씨 색상 인식이 인상적인 작품입니다. 실제로 기술을 적용하려면 새로운 암호인증 시스템으로 만들거나, 공장의 불량감지 같은 분야에서 사용이 가능해 보입니다.
위드로봇 컬러 센서를 음악과 연결한 부분이 참신합니다. 전체적으로 완성도가 높은 작품으로 평가합니다.
2. 작품 개요
개발자가 생각하는 주요 고객 타겟 층은 다음과 같은 세 부류이다.
첫째, 한국의 현대사회는 고령화 시대와 1인 가족 시대로 점점 가게 되면서, 사회적, 경제적, 개인적인 여러 방면에서 다양한 문제들이 함께 발생하고 있다. 개인적인 정서적 문제 중 하나가 바로 ‘외로움’이다. 이에 따라 독거노인들이나 1인 가족들의 적막한 삶에 활력소가 되어주고 외로움을 채워줄 존재가 점점 필요해지고 있다. 그 빈자리를 채우기 위해 주인의 명령에 재롱을 떨며 춤추고 노래하는 손자, 손녀 같은 또는 친구 같은 로봇을 개발하였다.
두 번째 주요 고객층은 영유아 및 어린이들이다. 어린이들에게 색감으로 계이름을 시각적으로 받아들이게 해주고, 로봇이 아이가 직접 만든 색종이 계이름판으로 음악을 만들어 그에 맞춰 춤까지 추는 모습을 보며, 자연스럽게 음악과 로봇에 친숙해질 수 있다. 이는 결과적으로 아이들의 정서 발달 및 로봇과 관련된 가치관 발달에도 큰 도움을 줄 수 있다.
마지막으로, 아직 전자공학이나 로봇공학과 친숙하지 않은 일반인들에게도 그들의 가치관에 대한 긍정적인 효과를 기대할 수 있다. 현실적으로 로봇공학의 발전에 대해 다소 거부감이 있는 일반인들이 많다. 이들에게 로봇이 ‘재롱’을 부리는 모습은 그들의 감성을 자극하여 로봇과 더욱 친숙해질 수 있고 로봇에 대한 호감 이미지를 만드는 데에 기여한다.
이와 같은 세 가지 효과를 기대하며 색상 인식으로 춤추고 노래하는 자동차로봇을 개발하였다.
3. 작품 설명
3.1. 주요 동작 및 특징
3.1.1. 주요 동작
Ⅰ. 악보 생성 기능
(1) 컬러센서를 이용한 색상 감별로 악보 생성
TYPE 29의 컬러센서를 컬러 인식 모드인 MODE 2로 설정하여 컬러센서 자체에서 인식 가능한 검정, 파랑, 초록, 노랑, 빨강, 흰색, 갈색을 인식하여 각 색에 음계를 매치하여 라즈베리파이 내의 buffer에 저장하였다가, 사용자가 색 악보에 따라 작곡한 음악을 듣고자 하면 한 음계 당 500ms 동안 스피커로 각 음계를 출력하며 ‘노래’를 하도록 하였다. 아래 표는 각 색상마다 매치한 계이름과 주파수를 정리한 표이다.
1-2) 계이름과 1:1 매치되는 숫자로 악보 생성
컬러센서로 인식할 수 있는 색상의 수는 위의 표에서 볼 수 있듯이 7가지로 한정되어있기 때문에, 다양한 음을 사용하는 악보를 만들기에는 부적합하다. 따라서 사용자가 각 계이름에 맞게 미리 매치시켜놓은 숫자들의 나열을 buffer에 입력함으로서 악보를 생성할 수도 있다. Linux의 C 언어에서는 getchar()이나 scan() 종류의 함수와 같은 문자를 입력받는 함수가 따로 없다. 따라서 사용자가 직접 이 기능을 하는 함수를 만들어야 한다. 아래 소스는 getchar() 함수를 구현한 getch 함수 소스코드이다.
악보 생성은 위와 같이 두 가지 방법으로 가능하지만, 앞으로는 주로 색상 악보를 만들어서 작곡하는 모드를 주로 다룰 것이다.
Ⅱ. 저장된 악보에 맞춰 춤추는 기능
EV3 자동차로봇에 달려있는 4개의 포트에는 자동차 좌측 앞바퀴, 우측 앞바퀴 2개를 연결하는 Large motor 2개와 Medium motor 1개를 연결시켜 직진, 후진, 좌회전 직진, 우회전 직진, 좌회전 후진, 우회전 후진, 팔 올리기, 팔 내리기 등 EV3와 연결된 모터가 할 수 있는 8가지 기능은 각 음계와 매치되어 로봇이 춤을 추게 된다. 각 음계와 연결된 motor 모션은 다음 표와 같다.
Ⅲ. 터치 센서를 이용한 간단한 on-off 기능 탑재
터치 센서란, 단순하게 누르면 1의 값을, 누르지 않으면 0의 값을 유지하는 스위치와 같은 원리의 센서이다. 이 센서를 이용해, 처음 프로그램을 실행하고 한 번 센서를 눌렀을 때 자동차가 직진을 하면서 바닥에 깔린 색종이의 조합인 악보를 컬러센서로 센싱을 하도록 했고, 센싱해야 하는 색종이의 모임이 끝나면 다시 한 번 터치 센서를 눌러야만 저장한 악보대로 노래를 하고 춤을 추도록 제어하였다.
3.1.2. 특징
Ⅰ. 마인드스톰 EV3
마인드스톰 EV3란, LEGO사와 MIT 미디어랩의 합작품으로, 로봇을 만들고 프로그래밍을 할 수 있는 블록이다. labVIEW의 블록 코딩을 사용하면 아주 쉽게 코딩이 가능하다. 하지만, 이번 프로젝트에서는 당연히 블록코딩을 사용하지 않았다. EV3의 VM(Virtual machine)에서 실행되는 bytecode라는 것이 있는데, USB, Bluetooth, WiFi를 통해 VM으로 전송이 가능하다. 바이트코드의 목록과 형식은 LEGO MINDSTORMS EV3 Firmware Develop kit를 참고하였다. 바이트 코드는 OP code, parameter, return valude로 구성된다. 각 값들을 정의에 따라 바꾸며 섬세한 EV3 제어가 가능하다.
Ⅱ. 라즈베리파이3로 EV3를 WiFi로 제어
EV3를 제어하는 MCU로는 라즈베리파이3를 채택하였다. 라즈베리 파이2와는 다르게 3에서는 와이파이 기능이 자체적으로 들어가 있기 때문에 근거리에서 무선으로 EV3 자동차로봇을 제어하는 데에 적합하였다. 이 때, 라즈베리파이라는 외부의 MCU로부터 EV3를 제어하므로 Direct Command 형식으로 명령코드를 작성하였다. Direct Command는 외부에서 EV3로 byte code를 전송할 때 사용하는 형식으로, USB, Bluetooth, WiFi로 전송 가능하며 이 또한 LEGO MINDSTORMS EV3 Communication Developer kit를 참고하였다. 응답으로 Direct reply를 받을 수 있다.
Ⅲ. 컬러 센서 사용하는 악보 제작
컬러 센서로 색종이의 색깔을 구분하여 악보를 제작할 수 있다. 이 때 프로젝트 환경이었던 실내 장판은 갈색이 아닌 무색(색 없음, value 값 0)으로 컬러 센서가 인식을 하였다. 실제로, 컬러 센서로 색을 인식시킬 때 가장 까다로웠던 색이 바로 갈색인데, 조금 밝은 갈색이면 노란색으로, 조금 어두운 갈색은 검은색으로, 또 약간 붉은 기가 있는 갈색은 빨간색으로 인식하여 컬러센서를 위한 갈색을 찾는 데에 조금 애를 먹었다. 하지만 시중에서 판매되는 색종이로 갈색 값을 어렵지 않게 인식시킬 수 있으므로, 사용자가 사용하는 데에는 큰 무리가 없을 것으로 예상된다. 컬러센서로 인식시킬 색상 악보의 예시는 다음 사진과 같다. 아래 ‘악보’는 조지 윈스턴의 ‘캐논 변주곡’의 앞부분이다. 화살표 방향으로 자동차로봇이 전진하면서 컬러센서로 색상을 인식하고 각 색에 1:1 매칭이 되어있는 숫자로 변환시켜 색종이의 순서대로 저장하게 된다.
Ⅳ. 소프트웨어적 발전 : Direct Command를 자동으로 전송하는 함수 및 Direct Reply를 자동으로 수신하는 함수의 알고리즘 개발
Direct Command는 위에서 언급하였듯이 EV3로 bytecode를 전송할 때 사용하는 형식으로, Little Endian을 사용하며 리턴 값으로 사용하는 Global variable의 offset은 align되어야 하며, 커맨드를 보내는 형식 또한 다소 복잡하다. 아래는 Direct Command의 형식을 정리한 그림이다.
bytecode를 보낼 때마다 이 형식을 지키며 일일이 보내게 되면 굉장히 시간이 많이 걸리고, 복잡하다. 따라서 이번 프로젝트에서 Direct Command를 구조체로 미리 만들어서 함수의 매개변수로 보내면 byte code로 해석하여 EV3로 전송해주는 send_command() 함수를 개발하였다. 또한, Direct Reply 또한 해석하여 shell에 print해주는 read_reply() 함수 또한 개발하였다. 함수의 작성 코드는 다음과 같다.
① send_command 함수
② read_reply 함수
이 두 함수는 이 프로젝트뿐만 아니라 byte code를 작성하여 마인드 스톰 EV3를 제어하는 모든 프로젝트에서 아주 유용하게 쓰이게 될 것이다.
3.2. 전체 시스템 구성
Ⅰ. 소프트웨어적 구성
라즈베리파이와 EV3를 연결하여 명령을 송수신한다. 라즈베리파이와 EV3는 USB 포트로 연결되며, 라즈베리파이의 전원 공급은 EV3의 USB 단자로부터 공급받게 된다. 리눅스 환경에서 와이파이로 라즈베리파이와 ssh로 통신하여 C 프로그래밍으로 춤추고 노래하는 자동차로봇의 알고리즘을 짜고 실행시키게 되면, USB 드라이버는 USB 컨트롤러를 통해 프로그래밍 명령을 전달하게 된다.
이 때 EV3의 특성상, 외부에서 오는 명령은 EV3 전용 Byte code로 작성이 되어있어야 하며, 이 byte code는 EV3의 USB controller를 통해 USB 드라이버로 인식되어 EV3 내부의 가상 머신에 전달된다. USB로 연결된 라즈베리파이와 EV3는 일단 라즈베리파이에서 USB 장치 디바이스 파일을 찾는데, 다른 USB 장치가 없이 EV3만 연결되어있을 때는 절대경로로 /dev/hidraw0 파일을 찾으면 된다. 라즈베리파이에서 해당 디바이스 파일을 읽고 쓰기 위해 open을 할 때도 이 위치의 디바이스 파일을 이용하면 된다. 이 가상머신 위에서 EV3는 라즈베리파이 알고리즘의 명령대로 각 Output 드라이버들에게 명령을 전달하고, 모터 컨트롤러와 스피커에 전기적 신호가 전달되어 명령을 수행하게 된다. EV3와 라즈베리파이를 연동하는 일련의 과정을 도표로 요약하여 작성하면 다음과 같다.
Ⅱ. 하드웨어적 구성
절차적인 하드웨어 구성 도표는 다음과 같다.
조립 및 연결이 완료된 라즈베리파이와 EV3의 전체 조감도는 다음과 같다.
3.3. 개발 환경
Ⅰ. 개발 언어
라즈베리파이는 기본적으로 Linux 환경에서 동작한다. 리눅스 환경에서 주로 쓰이는 언어는 C언어와 Python인데, 본 프로젝트에서는 C언어를 사용하였다.
Ⅱ. 사용 시스템
MCU로 라즈베리파이 3를 채택하였다. ssh 통신으로 근거리에 있는 자동차 로봇과 호스트 컴퓨터 사이의 무선 통신을 하는데에 WiFi 기능이 기본적으로 탑재되어있는 라즈베리파이 3가 적합하다고 판단했다.
Ⅲ. 사용 툴
Linux Ubuntu OS 기반에서 vim 편집기를 사용하여 개발하였다.
4. 단계별 제작 과정
Ⅰ. 전체적인 제작 과정
위 프로젝트를 진행하는데 소요된 전체 제작 기간은 2017년 1월 29일부터 2017년 2월 26일까지이다. 1월 말 며칠 동안은 리눅스 및 라즈베리파이에 대해 이론적으로 공부하는 시간을 가졌으며, 실질적으로 춤추고 노래하는 자동차 로봇 프로젝트를 진행하는 데에 소요된 기간은 2월 한 달이다. 따라서 단계별 제작 과정을 2월 한 달 간의 시간의 흐름을 따라 도식적으로 도표로 정리하면 다음과 같다.
Ⅱ. EV3 로봇 조립
마인드스톰 EV3 키트에 포함되어있는 설명서대로 조립을 진행한다. 그 후 전원을 키고, 데모 프로그램을 실행해보며 제대로 조립을 했는지 확인한다. EV3는 사용자의 목적에 따라 다양한 형태로 조립이 가능한데, 나는 4개의 바퀴가 달린 포크레일 형태로 조립하였다.
그 결과 4개의 바퀴를 위한 large motor 2개, 포크레일의 팔을 제어하기 위한 medium motor 한 개가 조립 시 필요하였다. 특히, 라즈베리파이를 EV3 로봇에 고정시켜야했는데, 이 때 LEGO의 장점이 십분 발휘되었다. 위의 그림 4-1.1에서 확인할 수 있듯이, 라즈베리파이를 EV3 본체의 우측에 고정시키기 위해 여분의 레고 조각들을 이용해 개발자가 라즈베리파이가 고정될 수 있도록 라즈베리파이 둥지를 만들었다.
Ⅲ. 라즈베리파이와의 연동
본 프로젝트에서 사용한 MCU는 라즈베리파이3로, 호스트 컴퓨터와 라즈베리파이 사이의 WiFi를 이용한 ssh 통신이 기본적으로 가능하다. 아래 그림 4-2.1은 호스트 컴퓨터에서 라즈베리파이로 ssh를 이용해 접속한 모습이다. 개발자가 사용한 라즈베리파이의 ip 주소가 192.168.0.10이며 성공적으로 라즈베리파이와 통신이 연결된 것을 확인할 수 있다.
Ⅳ. 핵심 알고리즘 개발
알고리즘의 흐름도는 아래 그림 4-3.1과 같다.
Ⅴ. 테스트 및 디버깅
컬러 센서가 감지하는 색상은 정확한 편이었지만, 다양한 색상 인식이 필요하고 고정적인 크기의 색상 인식 물체가 필요한 이유로 색종이를 색상 인식 물체로 선정했다. 그런데, 색종이의 밝은 분홍색은 컬러센서가 하얀색으로 인식하고, 색종이의 주황색은 컬러센서가 노란색으로 인식하는 등 조금의 오차가 있었다. 따라서 이러한 부분들을 컬러 센서를 테스트하는 과정에서 컬러 센서가 인식하는 대로 다시 분류하는 작업이 필요했다. 특히 색상 인식이 까다로웠던 색은 갈색이었는데, 밝은 갈색은 노란색, 붉은 갈색은 빨간색, 어두운 갈색은 검정색으로 인식하였다. 다행스럽게도 색종이의 갈색은 한 번의 오류 없이 항상 갈색으로 인식하여 갈색 색종이를 악보로 쓸 수 있었다.
라즈베리파이와 EV3를 연결시켜 고정시키는 과정에서 여러 종류의 커넥팅 라인들 또한 많을 수 밖에 없었는데, 이 선들의 무게중심이 EV3 자동차 로봇의 한 쪽으로 극단적으로 쏠리게 되면 자동차가 직진할 때 조금 회전하는 경향이 보였다. 따라서 선들을 묶어서 EV3 본체 중간에 움직이지 않도록 고정시켰다. 그 뒤로는 직진을 할 때 문제가 일어나지 않았다.
색상을 인식한 후 buffer에 저장하는 과정에서 더 빠르고 단순한 방법으로 알고리즘을 개발하기 위해 여러 방법으로 알고리즘을 변형하고 테스트해보았다. 다음 그림 4-1.1은 알고리즘 테스트 과정 중인 모습이다.
가장 많은 방법으로 테스트를 해본 것 중 하나는 바로 무음 처리이다. 프로젝트를 진행하면서 한 가지 해결하지 못한 것은, 첨부 2 또는 첨부 3의 동작 동영상에서 볼 수 있듯이 박자가 쉬는 부분에서는 스피커의 출력 주파수를 0Hz로 설정하고 스피커의 출력 시간 또한 0초로 설정하였음에도 그 타이밍에 ‘툭’하는 소리가 나는 현상이 일어난다. 스피커를 출력하는 동안 무음으로 처리되어야 할 부분에 마치 잡음처럼 들리기도 하여, 이 부분을 해결하지 못한 점이 아쉽다.
5. 작동 이미지
6. 참고문헌
· NCS(임베디드SW구현)기반의 스마트로봇EV3, 남상엽, 2014, 이지테크
· 산딸기 http://www.rasplay.org