ArdunityController중 MPUSeries에 관해 기술하겠습니다.
이것에 대해 이해하려면 먼저 IMU(Inertial Measurement Unit) 혹은 AHRS(Attitude and Heading Reference System) 센서를 알아야 합니다.
3차원 공간에서 물체의 위치를 표현하려면 위치와 각도 정보가 필요합니다. 위치 정보를 수집하기 위해 가장 많이 쓰이는 기술은 GPS(Global Positioning System)입니다. GPS기술은 네비게이션 등에서 활용되는 매우 유용한 기술입니다.
3차원 공간에서 각도는 오일러(Euler) 각도라 불리는 Roll, Pitch, Yaw라는 3가지 값으로 표현됩니다.
|
Euler 각도의 이해 |
이 값을 알아내기 위해 사용되는 장치가 IMU 혹은 AHRS라 불리는 센서입니다.
다른 센서와 달리 IMU는 3가지 센서를 융합해서 사용해야 하는 복잡한 시스템입니다. 그래서, 이 장치는 주로 전투기나 항공기 등의 매우 고가 시스템에서만 사용되어 왔습니다.
IMU 센서에서 사용되는 센서는 3가지가 일반적입니다.
- Gyroscope (자이로 센서)
- Accelerometer (가속도 센서)
- Magnetic Sensor (지자기 센서)
자이로 센서
자이로 센서는 자이로 효과(Gyro effect)를 측정하기 위한 센서로 회전력을 알아낼 수 있습니다. 자이로 효과란 회전하는 물체는 그 자세를 유지하기 위한 힘이 발생하는 것을 말하며 팽이가 그 효과를 보여주는 좋은 예입니다.
|
자이로 효과를 보여주는 장치 |
자이로 센서를 이용하면 물체가 기울어지는 힘을 측정할 수 있기에 이 값을 적분(Integral)하여 자세를 추출할 수 있습니다. 그러나, 적분은 오차가 누적되는 문제가 있어서 자이로 센서만으로는 정확한 각도를 알아내기 어렵습니다. 자이로 센서의 적분 오차 문제를 드리프트(Drift) 현상이라 부릅니다.
가속도 센서
가속도 센서는 정확히 말하면 중력 가속도를 측정할 수 있습니다. 이 말은 중력의 방향을 알 수 있다는 말입니다. 중력 왜곡이 일어나지 않는 한 가속도 센서는 지면에 대해 기울어짐을 정확하게 알려줍니다. 문제는 빠르게 움직이는 물체의 경우 운동 방향의 힘으로 인해 중력 왜곡이 일어나서 정확한 각도를 알 수 없게 됩니다.
지자기 센서
지자기 센서는 마치 나침반과 같이 지구의 자기장 방향을 측정할 수 있습니다. 지면에 대한 수평 회전의 경우 중력 변화가 없기때문에 이를 측정하려면 지자기 센서가 있어야 합니다. 지자기 센서는 자력에 매우 큰 영향을 받기 때문에 모터와 같이 자성이 있는 물체가 근처에 있으면 정확한 값이 추출되지 않는 문제가 있습니다.
센서 융합 기술
센서 융합 기술(Sensor Fusion)은 IMU와 같이 정보를 추출하기 위해 여러가지 센서의 정보를 종합적으로 활용해야 하는 경우 쓰는 기술입니다. IMU 센서 융합 기술의 대표적 예는 칼만 필터(Kalman's Filter)입니다. IMU센서를 쓰기 어려웠던 이유는 바로 센서 융합 기술 때문이었습니다.
|
칼만 필터의 개념 |
IMU 센서의 대중화
IMU 센서는 가격 문제와 센서 융합의 어려움으로 쉽게 사용되지 못하다가 스마트 폰 및 드론 등으로 널리 대중화되게 되었습니다.
|
스마트 폰의 기울기 인식 |
|
드론의 자세 제어 |
이렇게 된데에는 바로 IMU기술을 IC칩으로 만들고 그 가격을 매우 저렴하게 하며 사용법이 쉬워짐에 있습니다. InvenSense사의 MPU 시리즈는 대표적인 IMU 센서 장치입니다.
아두이노와 MPU-XXXX
아두이노에서 MPU 시리즈가 활용되기 시작했는데, 모듈 형태인 Breakout 보드로 보급되고 수 많은 예제들이 나오게 되었습니다.
|
MPU-6050 Breakout Board |
아두이노에서 가장 많이 사용되는 MPU시리즈는 다음과 같습니다.
- MPU-6050/6500: 지자기 센서 미 포함
- MPU-9150/9250: 지자기 센서 포함
따라서, 아두니티에서는 IMU 혹은 AHRS 기술을 유니티에서 사용하기 위해 가장 대중적으로 널리 알려진 MPU 시리즈를 선택했으며 이것을 제어하기 위한 ArdunityController를 MPUSeries라 부르는 것입니다.
MPUSeries의 설정은 다음과 같습니다.
- id: ArdunityApp이 ArdunityController를 구분하기 위한 식별자
- model: 현재 사용중인 MPU 모델 명
- secondary: 2개를 동시 사용할 경우 선택 (두번째 MPUSeries에만 체크)
- forward: MPU 보드의 전방 방향
- up: MPU 보드의 위 방향
- Enable update: 보드로부터 정보 갱신 여부
- OnStartCalibration: 캘리브레이션 시작 이벤트
- OnCalibrated: 캘리브레이션 완료 이벤트
MPUSeries를 사용하려면 유니티와 좌표계를 일치시켜야 합니다.
|
MPU보드의 좌표계 |
|
유니티의 좌표계 |
MPUSeries의 Sketch Option에서 유니티의 Forward와 Up방향을 어떻게 맞출 지에 대한 설정을 해야 합니다.
캘리브레이션(Calibration)
MPU 보드는 전원이 켜지고 초기화된 이후 센서 융합을 원활히 하기 위해 일정 시간동안 Calibration을 진행합니다. Calibration이 완료되기 전에는 값을 사용하지 않는 것이 좋기때문에 유니티에서 Calibration 완료 여부를 알 필요가 있습니다.
MPUSeries는 OnStartCalibration과 OnCalibrated 이벤트를 통해 이 시점을 알려줍니다.
MPUSeries는 보드와 연결되었을 때, Calibration 중인지를 메시지를 통해 알려줍니다.
|
MPUSeries의 Calibrating 안내문 |
MPUSeries가 Calibration 진행 중일 때에는 움직이지 않고 가만히 놔두는 것이 좋습니다. 움직이게 되면 Calibration이 빨리 끝나지 않습니다.
Calibration이 끝나게 되면 사용자 Calibration을 할 수 있는 메뉴가 나타나게 됩니다.
|
MPUSeries의 사용자 Calibration 메뉴 |
사용자 Calibration이란, MPU보드의 현재 Heading방향을 유니티의 기준 방향과 일치시켜주는 것을 의미합니다.
MPUSeries에서 이루어지는 Calibration은 2종류로써 다음과 같이 정리할 수 있습니다.
- MPU Calibration: 보드가 초기에 자동 진행하며 유니티는 이벤트로 시점을 알 수 있다.
- 사용자 Calibration: 유니티에서 필요에따라 현재 방향을 수정할 때 사용함. MPU Calibration이 완료되기 전에는 이 기능을 사용할 수 없다.
C# Script로 MPUSeries를 제어하는 예제는 다음과 같습니다.
using UnityEngine;
using System.Collections;
using Ardunity;
public class MyComponent : MonoBehaviour
{
public MPUSeries mpu;
void Awake ()
{
mpu.OnStartCalibration.AddListener(OnStartCalibration);
mpu.OnCalibrated.AddListener(OnCalibrated);
}
void Update ()
{
Quaternion rot = mpu.rotation;
}
public void MPUCalibration()
{
mpu.Calibration();
}
void OnStartCalibration ()
{
}
void OnCalibrated ()
{
}
}