지난시간에 IMU MEMS 센서에 대해 살펴보았다. 대표적인 예로 MPU6050이 있는데 MPU6050에 있는 자이로 센서와 가속도 센서의 특징도 함께 살펴보았다.
자이로 센서 살펴보기
https://swiftcam.tistory.com/96
가속도 센서 살펴보기
https://swiftcam.tistory.com/159
MPU6050의 센서의 특징을 정리해보면 아래와 같다.
MPU6050 센서의 특징
3축 자이로(Gyroscope) 센서의 특징
- ADC 샘플링된 각속도의 분산 벡터를 출력해준다.
- 각속도를 누적하여 현재의 각도를 계산할 수 있다.
- 정지해 있을 때는 0값을 가지지만, 해당 축이 이동하면 속도의 크기에 따라 ADC Resolution 범위의 값을 가진다.
- 회전운동을 할 때는 각도 변화가 잘 반영되어 나타나지만 저속 또는 정지상태에서는 Drift 현상이 발생한다.
3축 가속도(Accelerometer) 센서의 특징
- 가속도의 분산 벡터를 출력해준다.
- 가속도가 없는 곳에서는 각 축의 출력이 0으로 나오겠지만, 지구에서는 중력이 작용하고 있으니 그냥 두어도 센서 Z값은 1g에 해당하는 값을 가진다.
- 충격에 과하게 반응하기도 하고 외부 진동이나 환경에 민감하게 반응한다(필터링 필요함)
이 센서들은 각속도와 가속도를 출력해주는 센서이다. 하지만 이 센서들을 가지고 드론이나 휴대폰에 사용한다면 각속도와 가속도를 그대로 사용하지 않는다. Roll, Pitch, Yaw의 물체의 자세정보를 얻어야 한다. 각속도와 가속도를 이용하여 물체의 자세정보(Roll, Pitch)를 추정하는 시스템을 ARS(Attitude Reference System)이라고 한다. 여기에 지자계(Compass) 센서를 추가하여 물체의 자세정보(Roll, Pitch, Yaw)를 획득하는 시스템을 AHRS(Attitude Heading Reference System)이라고 한다.
시중에는 AHRS 센서로 판매되는 제품들이 많이 이는데 이 센서는 각속도, 가속도를 출력해주는 것이 아니라 Roll, Pitch, Yaw값을 계산하여 출력해준다.
물론 이러한 센서를 구입하여 사용하면 편리하고 좋지만 AHRS가 어떻게 구현되었는지 원리를 이해하기 위해 IMU가 뽑아주는 정보를 이용하여 AHRS를 구현해보고자 한다.
AHRS 구현
앞서 살펴보았듯이 자이로 센서를 이용하여 Roll, Pitch, Yaw를 구할 수 있으나 시간이 지남에 따라 Drift되는 현상이 발생하기 때문에 자이로 센서만으로 자세을 추정할 수 없다. 반면, 가속도 센서는 비교적 정확한 자세 정보를 얻을 수 있으나 노이즈에 취약하기 때문에 오차가 많이 발생한다. 따라서 안정적이고 정확한 자세 정보를 획득하기 위해서는 두 센서의 정보를 융합한 데이터 처리 방법이 필요하다.
MPU6050 센서의 데이터 처리법은 주로 아래와 같은 방법을 사용한다.
- 상보필터(Complementary Filer)
- 칼만필터(Kalman Filter)
- Madgwick Algorithm
오늘은 상보필터에 대해 알아보고 MPU6050에 상보필터를 적용하여 자세를 추정해보도록 한다.
1. 상보필터(Complementary Filter)
물체의 자세정보를 획득하는데 있어서 자이로 센서는 훌륭하지만 앞에서 보았듯이 각도변화가 없는 상황에서 Drift 현상이 생긴다. 즉, 저주파 특성이 나쁘다는 이야기다. 반면, 가속도 센서는 Drift 현상은 없으나 진동이나 고주파 노이즈에 굉장히 취약하므로 고주파 특성이 나쁘다. 따라서 두 센서의 장단점을 보완해주기 위한 상보필터를 사용한다.
상보필터 구현하는 방법에는 여러가지가 있으나 IMU에 사용하기에 적합한 자료를 인터넷에서 찾아 참고하여 구현해 볼 것이다.
링크는 아래이다.
http://www.bluecomtech.com/Web%20Sites/Tistory%20PinkWink/pinkwink.kr/338.html
아래는 상보필터의 블럭도이다.
- Accelerometer는 고주파 노이즈에 취약하고, Gyro는 저주파 영역에서 drift 현상이 발생하므로 두 센서의 장단점을 서로 보완하는 것
- n번째 Gyro 값은 n-1 번째 값과 더하여 순간 각도로 구한다.
- Gyro값에 a값의 가중치를 주고, Accelerometer에는 (1-a) 만큼의 가중치를 줘서 현재를 각도를 계산한다.
- 단, a=tau/(tau+ts)로 구하는데 tau는 노이즈 시간 스케이보다 월등히 큰 값, ts는 샘플링 시간이다.
- 각도 변화가 빠를때는 a값이 커져 Gyro값의 가중치가 높으나 속도가 느려지기 시작하면 a값이 작아지고 상대적으로 Accelerometer의 가중치가 올라간다.
'엔지니어링 > 임베디드' 카테고리의 다른 글
Frsky i-Bus 방식 (0) | 2020.04.14 |
---|---|
STM32CubeIDE에서 C++ 프로젝트 개발하기 (0) | 2020.04.11 |
IMU MEMS 센서 MPU6050 살펴보기 2 - 가속도 센서 (7) | 2020.03.22 |
[STM32] printf 함수의 수행시간 측정 (0) | 2020.03.18 |
[STM32] sysTick 을 이용한 usDelay 함수 만들기 (4) | 2020.03.09 |
댓글