본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/임베디드

IMU MEMS 센서 MPU6050 살펴보기 1 - 자이로 센서

by 베니스상인 2019. 10. 27.

IMU(Inertial Measurement Unit: 관성측정장치)는 각속도와 가속도를 이용하여 물체의 자세를 측정해주는 센서이다. 요즘 스마트폰이나 드론에 IMU 센서를 많이 사용하고 있다. 

 

보통 IMU 센서는 3축 자이로와 3축 가속도 센서가 있다. 가속도 센서는 직선운동에 대한 가속도값을 측정하고, 자이로는 회전운동에 대한 각도 변화율을 계산하여 자세를 측정하는 용도로 사용된다.

 

IMU MEMS 센서에 대한 내용과 가속도, 각속도 계산 방법은 아래 티스토리를 참고하기 바란다.

 

 

 

https://swiftcam.tistory.com/95

 

IMU MEMS 센서(Gyroscope + Accelerometer)

MEMS 란? MEMS(Micro Electro Mechanical Systems) 라고 한다. 센서의 기술이 발달함에 따라 기계식 센서를 실리콘다이와 같은 반도체 안에 구현한 초소형 센서들을 말한다. MEMS 중 주변에서 쉽게 사용할 수 있는..

swiftcam.tistory.com

 

 

 

MPU6050은 드론에서 많이 사용하는 invensense사의 대표적인 MEMS(Micro-ElectroMechanical System) 센서이다.

 

요즘에는 성능이 좋은 센서들이 많이 등장하고 있지만, 임베디드 이용자들이 MPU6050 센서를 이용한 예제들이 많으니 IMU센서를 처음 사용하는 사람들은 이 모델을 참고하로 하는 것이 좋다.

 

 

아래 자료는 MPU6050 센서를 아두이노에 연결하여 각도 값을 계산하는 방법을 설명한 자료이다. 

 

https://www.youtube.com/watch?v=4BoIE8YQwM8&feature=youtu.be

 

https://www.youtube.com/watch?v=j-kE0AMEWy4

 

 

아래부터는 유투브 설명을 참고하여 MPU6050 센서의 내용을 다루고자 한다.

 

 

1. 좌표계

 

먼저 센서의 각축의 정의가 필요하다. X, Y, Z는 주로 3차원 관성좌표계에서 사용하지만 회전좌표계에서 사용하기 위새서는 Roll, Pitch, Yaw의 개념과 연결지어 생각해야 한다.

 

 

 

회전좌표계는아래와 같이 정의할 수 있다.

 

- X축(Roll): 전진방향이며 기체가 오른쪽으로 기울어지면 +이다. 오른손 법칙의 검지

- Y축(Pitch): 수평방향이며, 기수가 상승하면 +이다. 오른손 법칙의 중지 

- Z축(Yaw): 수직방향이며 기체가 오른쪽으로 회전하면 +이다. 오른손 법칙의 엄지

 

 

 

 

 

MPU-60XX의 센서의 방향은 아래와 같다. 동일하게 오른손 법칙이 적용되며 앞서 설명한 회전좌표계를 X축 방향으로 180도 돌리면 동일한 좌표계가 된다.

 

 

 

 

 

 

2. 자이로 센서(Gyroscope)

 

MPU6050 자이로 센서의 특징은 다음과 같다.

- 3축 각도변화율 측정(±250, ±500, ±1000, ±2000˚/sec)

- 16bit ADC 

- digital LPF(Low Pass Filter)

- I2C 인터페이스(최대 400KHz)

- 노이즈: 0.05˚/sec-rms@98Hz(FS_SEL=0, DLPF_CFG=2)

 

 

FS_SEL은 자이로 센서의 Full-Scale 범위를 지정한다.

±250에서 최대 ±2000˚/sec까지 가능하다. 

 

ADC Resolution은 16bit로 정해져있고, Full-Scale 범위를 ADC resolution으로 나누는 것이므로 Full-Scale 값이 작으면 좀 각도변화를 좀더 섬세하게 측정하는 것이고, Full-Scale을 크게 가져가면 큰 각도변화를 감지하기 유리하다.

 

FS_SEL = 3으로 설정하였다. 이때 Full-Scale은 ±2000˚/sec이다.

 

FS_SEL = 3일때 Sensitivity는 16.4 LSB/(˚/sec)이다. 

 

Sensitivity는 ADC Resolution을 Full-Scale로 나눈 것이다.  65536/4000 = 16.4LSB/(˚/sec)이므로 1˚/sec는 ADC의 16.4LSB에 해당된다는 의미이다.

 

LSB값은 자이로 센서에서 출력되는 값이다. ADC Resolution이 16 bit 이므로 센서 출력은 0~65535 범위를 가지는데 예를 들어 가속도 센서 출력이 8192가 출력되었다면 각도값은 아래와 같이 계산할 수 있다.

 

8192/16.4 = 499.512˚/sec

 

즉, 1초 동안 약 500˚ 움직이는 각속도 값을 가진다는 것이다.

 

따라서 각속도 센서의 출력값을 각도로 변환하는 것은 아래와 같이 계산할 수 있다.

 

Angle˚ = (ADC output / Sensitivity)

 

 

3. 자이로의 노이즈 측정

 

1) ±250˚/sec, DLPF 100Hz 에서의 노이즈 측정

 

 

먼저 데이터시트에 있는 것과  같은 조건에서 측정해보기로 한다. 측정조건은 아래와 같다.

- Full Scale: ±250˚/sec(FS_SEL=0)

- 디지털 필터: 98Hz BW, 2.8ms Delay(DLPF_CFG=2)

 

데이터시트를 보면 위와 같은 조건에서 노이즈는 약 0.05˚/sec RMS 라고 나와 있다. 동일조건이므로 측정 결과도 비슷한 결과를 나타내는지 확인해볼 수 있을 것 같다. 

 

* 여기서 RMS(Root Measn Square)는 실효값을 계산하기 위한 방법으로 양수의 평균이라고 보면 된다.

 

 

측정 결과는 아래와 같다.

 

 

 

 

데이터시트에 있는 값보다는 조금 높지만 그래도 0.07~0.08˚/sec RMS 정도로 양호한 편으로 측정되었다.

 

 

이 결과는 MPU6050 내부에서 디지털 LPF(Low Pass Filter)를 사용했을 때 결과인데 100Hz LPF를 사용할 경우 약 3ms의 딜레이가 발생한다.  센서값을 실시간으로 처리해야 하는 경우 3ms의 딜레이는 아주 큰 값일 수 있다.

 

 

 

 

 

 

2) ±250˚/sec, 디지털 필터 사용하지 않았을 때 노이즈 측정

 

이번에는 디지털 LPF를 사용하지 않았을 때의 측정 결과를 살펴보자.  측정조건은 아래와 같다.

- Full Scale: ±250˚/sec(FS_SEL=0)

- 디지털 필터: 256Hz BW, 0.98ms Delay(DLPF_CFG=0)

 

 

 

 

 

 

 0.09~0.11˚/sec RMS 정도로 필터를 사용했을 때보다 0.02~0.03˚/sec 정도 높은 수치이다. 이 정도의 오차 증가는 거의 미비한 수준이다.

 

필터를 사용하여 3ms이상의 딜레이가 발생하는 것보다 이정도 오차를 감안하고 실시간 응답을 받는 것이 더 이점이 많으므로 필터는 사용하지 않는 것이 좋을 것 같다.

 

 

 

 

 

 

3) ±2000˚/sec, 디지털 필터 사용하지 않았을 때 노이즈 측정

 

 

그러면 디지털 필터를 사용하지 않고 Full Scale을 변경했을 때 노이즈 값의 차이가 있는지 살펴보자. 측정조건은 아래와 같다.

- Full Scale: ±2000˚/sec(FS_SEL=3)

- 디지털 필터: 256Hz BW, 0.98ms Delay(DLPF_CFG=0)

 

 

 

 

 

 

 

Full Scale을 변경했을 때 노이즈 측정결과는 Full Scale에 상관없이 비슷하게 측정되었다. 노이즈 측정값은 약 0.1˚/sec RMS 정도이다.

 

따라서 Full Scale은 ±2000˚/sec 범위를 사용하고 디지털 필터는 사용하지 않는 것으로 하여 자이로 센서의  Roll, Pitch, Yaw의 각도값을 계산해보겠다.

 

 

 

4. 자이로 센서의 각도 계산

 

 

자이로 센서를 각도를 변환하는 것은 앞에서 다루었는데 ˚/sec을 출력해 본 것이 었고 Roll, Pitch, Yaw의 각도를 계산하기 위해서는 주기적으로 출력되는 센서값을 각도로 변환해서 누적해주어야 한다.

 

그러면 현재의 Roll, Pitch, Yaw 각도값은 아래와 같이 계산할 수 있다.

 

Angle˚ = (ADC output / Sensitivity)  * Sample rate

 

 

Sample rate = 4ms

Sensitivity = 65536 / 4000

0.000244140625 = Sample rate / Sensitivity

 


  read_mpu_6050_data();  
                            
  gyro_x -= x_cal;                                               
  gyro_y -= y_cal;                                               
  gyro_z -= z_cal;                                                
   

  PIT_ANGLE_GYRO += gyro_x * 0.000244140625;                                  
  ROL_ANGLE_GYRO += gyro_y * 0.000244140625;                                  
  YAW_ANGLE_GYRO += gyro_z * 0.000244140625;                                  
   
  PIT_ANGLE_OUT   = PIT_ANGLE_GYRO;   
  ROL_ANGLE_OUT   = ROL_ANGLE_GYRO;     
  YAW_ANGLE_OUT   = YAW_ANGLE_GYRO;    

 

 

 

 

자이로 센서의 출력은 정지상태에서 모두 값이 나와야 하는 것이 정상이다. 출력이 offset을 가지고 있을 경우 아래와 같은 방법으로 각 축에 캘리브레이션 로직을 넣어주면 된다. 

 

  for (int cal_int = 0; cal_int < CAL_COUNTER ; cal_int ++){                  
    if(cal_int % 125 == 0)Serial.print(".");                               
    read_mpu_6050_data();                                              
    x_cal += gyro_x;                                              
    y_cal += gyro_y;                                              
    z_cal += gyro_z;                                             
    delay(1);                                                           
  } 
  x_cal /= CAL_COUNTER;                                                  
  y_cal /= CAL_COUNTER;                                                  
  z_cal /= CAL_COUNTER;   

 

 

Roll, Pitch, Yaw의 각도값을 출력하면 아래와 같다.

 

 

 

센서는 캘리브레이션되어서 0 근처값이지만 시간이 지남에 따라 값이 조금씩 흐르는 것 볼 수 있다. 이것은 자이로 센서의 특징인데  움직임이 없는 상태에서 drift 되는 현상이 발생한다.

 

 

 

다음은 시리얼 플로터를 이용하여 센서를 움직였을 때 반응을 살펴보았다. Roll, Pitch, Yaw 순서로 +에서 -방향으로 이동하였다.

 

 

 

노이즈도 적은 편이고 각도값도 잘 계산되어지기는 하나 움직임이 없을때 조금씩 drift되는 현상이 나타난다.

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 MPU6050 센서의 특징

 

3축 각속도(Gyroscope) 센서의 특징

- ADC 샘플링된 각속도의 분산 벡터를 출력해준다. 

- 정지해 있을 때는 0값을 가지지만, 해당 축이 이동하면 속도의 크기에 따라 ADC Resolution 범위의 값을 가진다. 

- 회전운동을 할 때는 각도 변화가 잘 반영되어 나타나지만 저속또는 정지상태에서는 drift 현상이 발생한다.

 

3축 가속도(Accelerometer) 센서의 특징

- 가속도의 분산 벡터를 출력해준다.

- 가속도가 없는 곳에서는 각 축의 출력이 0으로 나오겠지만, 지구에서는 중력이 작용하고 있으니 그냥 두어도 센서 Z값은 1g에 해당하는 값을 가진다.

- 충격에 과하게 반응하기도 하고 외부 진동이나 환경에 민감하게 반응한다(필터링 필요함)

 

따라서 물체의 자세측정을 위해 센서의 단점을 보완한 데이터 처리 방법이 필요하다. 

 

 

MPU-6050 센서의 데이터 처리법은 주로 아래와 같은 방법을 사용한다.

1. 칼만필터

2. 상보필터

3. Quaternion

4. DLPF(Digital Low Pass Filtering)

 

 

상보필터(Complementary Filter)

- Accelerometer는 고주파 노이즈에 취약하고, Gyro는 저주파 영역에서 drift 현상이 발생하므로 두 센서의 장단점을 서로 보완하는 것

- n번째 Gyro 값은 n-1 번째 값과 더하여 순간 각도로 구한다. 

- Gyro값에 a값의 가중치를 주고, Accelerometer에는 (1-a) 만큼의 가중치를 줘서 현재를 각도를 계산한다.

- 단, a=tau/(tau+ts)로 구하는데 tau는 노이즈 시간 스케이보다 월등히 큰 값, ts는 샘플링 시간이다.

- 각도 변화가 빠를때는 a값이 커져 Gyro값의 가중치가 높으나 속도가 느려지기 시작하면 a값이 작아지고 상대적으로 Accelerometer의 가중치가 올라간다.

 

 

 

 

 

 

 

 

 

 

 

아래자료는 joop brokking 이라는 블로거인데 MPU6050 센서를 이용하여 여러가지 시험들을 진행하였다.  이외에도 드론등 유용한 자료가 많으니 참고하길 바란다.

 

http://www.brokking.net/YMFC-32_auto_main.html 

 

Brokking.net - Project YMFC-32 autonomous - The STM32 Arduino autonomous quadcopter - Home.

  Brokking.net - Project YMFC-32 autonomous - The STM32 Arduino autonomous quadcopter - Home. Project YMFC-32 autonomous The YMFC-32 autonomous flight controller project The YMFC-32 autonomous is an STM32 quadcopter flight controller that was programmed wi

www.brokking.net

 

 

 

728x90

댓글