오르카의 아틀리에


이번 학기 동안 거의 영상 편집이랑 요양 위주로 생활을 했기 때문에 다소 프로그래밍 감이 떨어졌다. 다시 프로그래밍 감을 살려보기 위해 평소에 만들어 보고 싶었던 DIY VR 컨트롤러를 만들기로 했다. 마침 저번 해커톤 때 사용하고 남은 아두이노와 조이스틱, HC-06이 남아있어서 활용해보기로 했다. 기울기와 위치를 측정해줄 IMU 센서가 없었기 때문에 아두이노 쇼핑몰에서 'MPU-9250'와 추가 '조이스틱'을 구매했고, 장착할 센서가 많기 때문에 편리하게 GND와 VCC를 확장할 수 있는 '아두이노 센서 확장 실드 5.0'을 구매해서 사용하였다.


문제가 발생?!


센서를 보다 쉽게 다루기 위해 MPU-9250관련 라이브러리들을 살펴보았다. 아두이노에 사용되는 센서 라이브러 중 가장 유명한 'I2Cdevlib' 레포를 살펴보았지만 위 사진처럼 6축 센서인 'MPU-6050' 이나 'MPU-9150' 라이브러리만 남겨져 있었다. 그래서 개인이 파일 형태로 배포하고있는 수정본들을 여러개 다운받아서 테스트해보았지만 하나같이 잘 작동하지 않았다. 심지어 레딧에 남겨진 글에는 지금 사용하고 있는 9250대신 6050센서를 구입해 사용하거나 직접 9150의 라이브러리를 고쳐서 사용해야 한다는 답변이 있었다. 다시 센서를 구매하기는 조금 꺼려졌기 때문에 9150 라이브러리를 수정하여 사용해보기로 했다. (3축이나 더 있는 센서를 버리고 6축을 사는게 좀...)


해결법?!

의외로 9150 라이브러리를 포팅하는 것은 간단했다. 레지스터 맵과 기타 코드들의 네이밍을 9250식으로 바꾸어주고, 데이터 필터 중 하드웨어에서 지원하는 DMP(Digital Motion Processing)를 사용하기 위해 9150을 위한 9축 DMP 라이브러리도 약간 수정을 가했다. 그것도 나름 간단하게 몇 가지만 조정하여 수정 가능했다. MPU-9250 라이브러리는 아래 링크에 있다.


MPU9250_DMP6.zip


위 파일을 다운로드 받게되면 필요한 의존성 라이브러리와 함께 패키징되어있다. (그렇다고해봐야 math helper와 기본 I2Cdev 라이브러리)



'MPU9250.cpp' 에는 raw 파일을 읽을 때 필요한 함수들이 구현되어있다. raw 값을 이용하여 자신이 원하는 필터를 사용하고 싶다면 이 파일만 사용해도 충분하다. 하지만 DMP를 사용하기 위해서는 'MPU9250_9Axis_MotionApps41.h'가 추가로 필요하다. (필요한 코드가 내부에 구현되어있다) 추가로 구현되어야 하는 메소드들이 #define문으로 구별되어있기 때문에 ino파일 안에서는 'MPU9250_9Axis_MotionApps41.h'만 include하여 사용하면 된다. 기본적인 사용 방법은 MPU9250_DMP6.ino 파일만 살펴봐도 쉽게 알 수 있다. 원하는 데이터의 함수를 관련 변수들과 함께 넘겨 데이터를 제공받는 형태이다. C++코드에 대해 어느정도 지식만 있어도 라이브러리를 쭉한번 살펴보면 어떤식으로 구성되어있는지 파악하기는 편리할 것이다.


나아가서

일단 DIY VR 컨트롤러를 제작하기 위해서 시작했다. 필요한 것은 RPY 값들과 중력가속도를 제외한 순수 가속도 값인데, DMP를 통해 어렵지 않게 값들을 얻어 사용할 수 있었다. (정확도에 대한 실험은 후에 DMP vs Madgwick 필터 성능을 비교할 예정) 얻은 값을 사용할 수 있을 만큼의 오차를 가지고 있다고 가정하고 개발을 하고 있다. 원래는 언리얼 엔진을 이용하여 만든 게임과 연동하려고 했지만.... 언리얼 Android에서 Bluetooth와 시리얼 통신을 어떻게 하는지에 대한 자료가 없다... 유니티는 블루투스 플러그인까지 에셋 스토어에 있었던 것 같은데... 조금만 더 방법을 찾아보고 언리얼을 이용하여 개발할지 유니티를 이용하고 언리얼은 나중에 방법을 강구할지 생각해봐야 할 것 같다.