ROS에서 Android 스마트폰을 GPS, IMU(9축 센서)로 활용하기
참고자료 : wiki.ros.org/android_sensors_driver
서론
기존의 지자기센서를 이용하여 Compass 역할을 한다면 주변 환경에 영향을 아주 민감하게 받는 것을 확인할 수 있었다.
그로 인해 스마트폰의 나침반은 주변 환경에 영향을 받지 않는 다는 점을 참조하여 스마트폰을 이용하여 지자기센서를 이용하고 그로 인해 Heading Angle을 구한다면 주변환경에 영향을 받지 않는 좋은 센서를 가질 수 있지 않을까에서 착안하고 알아보게 되었다.
ros 위키의 자료를 참고하여 안드로이드 스마트폰의 내장되어있는 여러 센서들을 활용할 수 있는 것을 알게 되었다.
스마트폰의 축은 위의 그림과 같이 생겨있는 것을 먼저 확인하고 가자.
설치와 연결
먼저 구글 플레이 스토어에서 ROS android sensors driver라는 감사한 어플을 설치하도록 하자.
이를 설치한 후 ubuntu 환경에서 아이피를 확인하고 pc와 연결할 수 있도록 한다.
ifconfig
안드로이드 폰을 ROS 환경에서 사용하기 위해 이기종 통신을 위해 ROS MASTER URI를 현대 ubuntu pc의 ip로 할당해주어야 한다.
bashrc를 수정해주자.
export ROS_MASTER_URI=http://"ifconfig로 확인한 ip주소":11311/
모든 환경 설정이 끝났다면 ros를 실행 시킨 후 rosnode와 rostopic들을 확인해보자.
rosnode list
rostopic list
위와 같이 node를 확인하고 topic에는 fix, imu, magnetic_field등이 확인된다.
센서값 확인
rostopic echo /android/fix
rostopic echo /android/imu
rostopic echo /android/magnetic_field
필요한 센서들의 값을 확인해보기 위해 echo를 해보면
이제 가속도계, 자이로스코프, 지자기센서의 역할을 하는 IMU(9축센서)와 추가적으로 GPS가 스마트폰에 내장되어있고 이를 ROS에서도 활용할 수 있는 것을 확인했다.
단순 궁금증으로 GPS의 정확도가 어느정도인지 확인하기 위해 구글지도에 입력해본 결과 실제 위치는 파란색 X표시이지만 가르키는 위치와 오차가 꽤나 컸는데 실내에서 측정한 것과 주변의 건물 환경 때문에 큰 오차를 보이는 것으로 예상하고 추후 넓은 실외에서 실험을 해볼 필요도 있을 것 같다.
Compass
본래의 목적이였던 나침반의 역할을 하는 Compass는 magnetic_field의 값을 raw data를 가지고는 알 수 없다는 것을 확인했고 결국 IMU(9축센서)를 활용하여 북쪽을 향하는 각도인 bearing 값을 출력할 수 있도록 처리 과정이 필요하다.
developer.android.com/reference/android/hardware/SensorManager#getRotationMatrix(float[],%20float[],%20float[],%20float[])
developer.android.com/reference/android/hardware/SensorManager#getOrientation(float[],%20float[])
구글에서 함수를 만들어 제공하고 있는 getRotationMatrix()와 getOrientation()을 활용하여 Z축을 기준으로 회전하는 각도 Azimuth값을 얻을 수 있다.
결론
python Android_SenosorManager.py
rostopic echo /true_bearing
나침반이 북쪽을 향하도록 0도로 맞추고 스마트폰도 일치시킨 결과 0도에 근접한 값을 출력하고 있다.
여기서 기대했던 주변환경에 강건한 센서로 활용할 수 있는가는 쇠붙이를 주변에 갖다댄 결과 기존 지자기센서와 동일하게 영향을 아주 크게 받는 것을 확인했다.
스마트폰의 나침반 어플과 같은 것들은 많은 보정작업이 거쳐졌을 것으로 생각되고, 결국에 이를 로봇에 활용하기 위해서는 적절한 위치에 마운트를 시켜야 할 것으로 생각된다.