IMU(Inertial Measurement Unit-관성측정장치)
■ 가속도 센서 (Accelerometer Sensor)
가속도 센서는 Accelerometer 로 말 그대로 가속도를 측정하는 센서입니다. 가속도 센서가 3축이라 함은 센서가 3차원에서 움직일 때 x축, y축, z축 방향의 가속도를 측정할 수 있다는 의미입니다. 기본적으로 가속도 센서는 가만히 정지한 상태에서 중력 가속도를 감지하기 때문에 z축 방향으로 -g 만큼의 값을 출력합니다. 그러면 이러한 가속도 센서를 이용해서 어떻게 자세, 즉 기울어진 각도를 측정할 수 있을까요?
먼저 움직이는 물체와 견고하게 센서가 장착되어 있는 상태에서 시작합니다. 센서의 초기 출력은 모두 0이라고 합시다. 이 상태에서 물체를 y축 방향으로 45도 기울여 보면, 기울어진 상태에서 z축 방향과 x축 방향으로 동일한 값의 가속도가 측정됩니다. 아래 그림 보시면 쉽게 이해가 되실텐데 중력방향으로 g 가 측정되어야 하므로 0.707g 만큼 z축과 x축 방향으로 값이 출력됩니다. 결과적으로는 z축과 x축 값의 비율을 atan 에 넣으면 그 결과값이 45도, 즉 기울어진 값을 알수 있습니다.
간단히 가속도 센서를 이용해서 각도를 측정하는 방법은 위와 같습니다. 하지만 간단한 만큼 문제점이 있습니다. 정지된 상태에서 물체가 움직이기 시작하면 그때 측정되는 값은 기울기를 나타내지 않을 수 있습니다. 예를 들어 45도 기울어진 위와 같은 상태에서 오른쪽으로 가속을 해본다고 가정해 보죠. 그러면 x축과 z축에서 측정되는 가속도는 변하게 됩니다. 한쪽값이 더 커지겠죠? 그러면 이 상태에서 atan 에 대입한다고 하더라도 45도 값은 나오지 않게 됩니다. 즉 움직임이 생겨서 어느 한쪽 방향으로 가속도가 생기게 되면 결과적으로 이 값이 중력에 의해 측정되는 가속도값과 구분이 안되게 됩니다.
* 정지하지 않은 움직임 상태에서는 가속도 센서만으로 기울기 값을 측정할 수가 없습니다.
■ 자이로 센서 (Gyro Sensor)
자이로 센서는 가속도를 측정하는 가속도 센서와 달리 각속도를 측정합니다. 자이로스코프가 각속도를 측정하는 기구인데 MEMS 기술을 적용한 칩형태의 자이로센서도 각속도를 측정하는 기능을 가지는 것입니다. 각속도는 시간당 회전하는 각도를 의미하죠? 다음과 같은 예를 들어서 자이로 센서값이 어떻게 측정되는지 알아보겠습니다.
1. 수평한 자세를 유지하고 있는 상태를 가정합시다. 이때는 정지 상태이니 당연히 각속도도 0도/sec를 나타낼 것입니다.
2. 이 물체가 10초 동안 50도만큼 기울어진다고 봅시다. 이 10초동안은 0이 아닌 각속도 값을 가지게 됩니다. 10초 동안의 평균 각속도는 5도/sec 가 될것입니다.
3. 기울어지는 동작을 한 후 다시 멈춰서 50도를 유지한다고 봅시다. 이때는 다시 각속도가 0도/sec 가 됩니다.
1번 2번 3번 과정을 거치면서 각속도는 0 -> 5 -> 0으로 바뀌었습니다. 그런데 각도는 어떻게 바뀌었나요? 0도에서 점차 증가해서 50도가 되었습니다. 각속도에서 각도를 구하려면 전체 시간에 해당하는 만큼 적분을 해야합니다. 자이로 센서는 이와 같이 각속도를 출력으로 내보내기 때문에 전체 시간동안 이 각속도를 적분하면 기울어진 각도를 계산할 수 있습니다. 그런데 자이로 센서에도 문제점은 존재합니다. 적분의 문제점이지요. 센서에서 측정되는 각속도는 노이즈가 생기든 어떠한 이유에 의해 측정값에 에러가 계속 생기는데, 이 오차가 적분시에는 누적이 되어서 최종 값이 드리프트 되는 현상이 생깁니다.
* 자이로 센서에서 측정되는 각속도를 이용하면 시간이 지날수록 각도는 오차가 생겨 기울기 값이 변하게 됩니다.
■ 정리
앞서 가속도 센서와 자이로 센서를 이용해서 물체가 기울어진 각도를 측정하는 방법에 대해서 알아보았습니다. 하지만 각각의 문제점이 존재하는데 정리하면 다음과 같습니다.
정지한 물체가 움직이기 시작한 후 다시 정지하는 동작을 한다면...
정지상태의 긴 시간의 관점에서 보면 가속도 센서에 의해 계산된 기울어진 각도는 올바른 값을 보여줍니다. 그러나 자이로 센서에서는 시간이 지날 수록 틀린 값을 나타냅니다.
반대로, 움직이는 짧은 시간의 관점에서 보자면 자이로 센서는 올바른 값을 보여줍니다. 하지만 가속도 센서는 기울어진 각도와는 영 다른 계산값이 나올겁니다.
결론적으로는 가속도센서와 자이로센서를 모두 사용해서 각각의 단점을 보상할 수 있는 알고리즘을 적용해서 롤 또는 피치 값을 계산하게 되는 것입니다. 많이 적용하는 보상 방법 및 필터링으로는 칼만필터를 사용하는 경우가 많이 있는데, 이 부분까지 알려면 공부를 많이 해야겠습니다.
Yaw 값 측정에 대해서는 간단히만 알아보죠. Yaw 의 회전축은 z축방향, 즉 중력방향과 같습니다. 따라서 가속도센서보다는 자이로 센서의 z축 값을 측정해서 이 값을 이용해 yaw 값을 계산하고 드리프트되는 오차를 보상하는 다른 센서를 추가적으로 사용합니다. 바로 마그네토미터, 즉 지자기센서입니다. 3축 지자기 센서를 적용해서 yaw 방향을 측정하는 것입니다.
자이로는 온도가 변하면 그 값이 같이 변하는 특성이 있다고 합니다. 그래서 정확한 출력을 계산해야 할 경우 온도센서도 함께 사용해서 오차를 보상해야 합니다. 그래서 각도측정 센서를 찾아보면 보통 가속도센서, 자이로센서, 지자기센서, 온도센서를 내장한 9축 자세 측정 센서라고 합니다.
■ 지자계 센서 (Geomagnetic Sensor)
우선 원리를 말하자면 지자기센서 내에는 자기장의 세기를 측정할 수 있는 센서가 X,Y,Z축 방향으로
3개가 붙어 있습니다. 이 3개의 센서 간의 출력 벡터 합으로 센서에 미치는 자기장 방향을 측정하는
것입니다.
그러나 이처럼 단순하지 않는 게 일상적으로 주변에 지구 자기장처럼 센서에 영향을 미치는 요소가 존재
한다는 것이지요.( 휴대폰 내부의 스피커와 같은 강자성체나 건물의 철골, 자동차의 차체 등등...)
지구 자기장은 아주 미세간 크기(약 0.4Gauss)이기 때문에 이런 간섭들과 실제 지구자기장 차이를 구별
못하는 것입니다. (나침반에 자석을 가져다 대면 그쪽을 가리키는 것과 같은 이치입니다.)
이런 간섭들을 없애주기 위해 주변에 영향을 미치는 요인을 없애주는 작업이 8자로 흔들어주는 것과 같은
보정입니다.
이 8자로 흔드는 모션이 지금부터 보정모드로서 주변에 영향을 미칠만한 요인을 제거하는 과정이지요.
(이 보정 모션과 보정 수식은 회사마다 다르나 요즘은 8자로 통일해 가는 편입니다.)
아주 간단히 그 원리를 말하자면 한 축만 놓고 봤을 때(X축을 자북을 가리키고 있을 때)
순수하게 X축에만 자기장이 검출되기 때문에 X축의 세기가 0.4G가 나와야 하지만 실제로는 주변 자기장
영향으로 0.4G+α가 나오게 됩니다.
이것을 보정 모션을 통해 X축의 +방향으로 자북을 가리킬 때, -방향으로 가리킬 때를 체크하는 것입니다.
그러면
이상적으로는
+방향일 때 : X축 세기 = 0.4G
-방향일 때 : X축 세기 = -0.4G
실제로는
+방향일 때 : X축 세기 = 0.4G + α
-방향일 때 : X축 세기 = -0.4G + α
와 같이 나오게 됩니다.
여기서 +일 때 -일 때 두 값을 더하면 2a로 a 값을 알 수 있고 이 요인 자기장 체크할 때 반영하는 것이지요.
X + (-X) = (0.4G + α) + (-0.4G + α) = 2α
간단한 예를 들면 이와 같지만 실제로는 3X3 배열로 훨씬 복잡하고 다양한 방법으로 a팩터를 제거합니다.
그러나 위의 방법은 단순히 현위치에서 고정되어 있는 요소만 제거하기 때문에 자리를 옮기거나 주변 환경이
바뀌면 아무 의미가 없습니다. (휴대폰의 자체의 요인 스피커 같은 경우는 센서로부터 거리나 세기가 거의
고정되어 있기 때문에 거의 보정할 수 있습니다.)
그래서 사용 전에 보정하라는 메시지가 나오지 않더라도 8자 모션으로 보정 후 사용하시는 것이 좋습니다.