본문 바로가기
C++ 200제/코딩 IT 정보

칼만필터, 가속도센서로 아두이노 센서 소프트웨어 만들기 (코딩 팁)

by vicddory 2017. 1. 21.

칼만필터, 가속도센서로 아두이노 센서 소프트웨어 만들기 (코딩 팁)


칼만필터로 아두이노 소프트웨어 만들기 전에 칼만필터에 대한 이해는 이 포스트를 참조하자. 칼만필터를 잘 알고 있다면 소개한 링크는 생략해도 무방하다.


먼저 시스템 방정식과 관측방정식을 살펴보자


칼만필터를 도입하여 가속도센서로 아두이노 센서 소프트웨어를 만들기 위해서는 기본적으로 위와 같은 두 선형방정식이 필요하다.


비선형 방정식에 대한 "확장형 칼만필터 (Extended Kalman Filter)"는 비선형 방정식을 테일러 급수전개 등을 이용하여 가속도센서의 선형화한 후 적용한 형태일 뿐이다. (다만 비선형의 선형화에 따른 변환계수 -그림에서 A 또는 H와 같은- 의 형태가 달라질 뿐이다. 이에 대해서는 "확장형 칼만필터"에서 다시 자세히 설명하겠다)


시스템 방정식에서 x는 우리의 관심, 즉 최적화를 하고자 하는 상태변수를 의미하고 계수A 는 한 단계에서의 상태변수와 다음 단계의 상태변수를 연 결하는 변환계수를 표현한다. B 와 u 는 한 덩어리로 인식할 수 있으며 이들은 시스템에 무관한 추가 입력값이다.

마지막으로 w 는 k 단계에서 상태변수 x 의 참값과의 차이값 또는 "시스템 오차(system error or system noise)" 이다. (우리가 알고 있는 x 는 참값에 근접한 계산 값일 뿐이다.) 


w는 개별적으로 값을 구하거나 지정할 수 없으며, 단지 오랜 관측 및 시스템의 제작 시부터 알고 있는 참값에 대한 표준편차로써 -칼만필터 안에서는 분산의 형태로써- "Q" 라는 변수로 적용된다.


관측방정식(가속도센서에 필요)에서 z는 관측값이고 이는 상태변수 x와 변환계수 H 에 의해 표현되며 v는 관측값 z와 관측 참값과의 오차(measurement error or measurement noise)이다. v는 w와 마찬가지로 개개의 값을 알 수는 없고 관측 참값에 대한 분산인 "R" 라는 변수로써 칼만필터 안에서 사용된다.


칼만필터 가속도센서[아두이노 프로그램, 소프트웨어 코딩 팁]


여기에서 칼만필터의 기본가정을 소개하자면, 이는 [오차 w 및 관측방정식에서의 v는 각각의 참값에 대해 정규분포하며 그 평균은 0이고 분산은 각각 Q와 R이다.] 이다. 이 가정은 칼만필터의 가장 큰 장점이지만 또한 가장 큰 단점으로 작용하기도 한다.


시스템 연산 값 및 관측값이 참값에 대해 정규분포하는 일반적으로는 위와 같이 간단한 칼만필터 알고리즘을 통해 최적화할 수 있는 강력한 도구가 되지만, 그렇지 않으면 -오차가 참값에 대해 정규분포하지 않는 경우 또는 그렇다 하더라도 그 분산을 알 수 없는 경우- 에는 그 적용에 있어 문제와 어려움이 크다.


아두이노소프트웨어[아두이노 프로그램, 소프트웨어 코딩 팁]


그러나 오차의 확률분포가 정규분포가 아닌 경우라 하더라도 이를 정규분포로 간주하면서 그리 큰 무리가 없는 경우에는 칼만 필터는 아직까지 유용하고 강력한 도구로 사용된다.


위에 설명한 시스템 방정식과 관측방정식의 이해를 위해 간단한 예를 들어 본다면, 등속운동을 하고 있으며 때때로 추가적인 가속 또는 감속을 하는 자동차를 생각해보자. 이는 기본적으로 등속운동을 하고 있으니 k-1 단계에서의 속도와 k에서의 속도는 같으므로 A는 "1" 이다.


또한 추가적인 가감속에 따른 속도변화는 그것이 이루어진 단계에서 Bu 에 그 값을 적용할 수 있다. 그리고 그 가속도센서가 장착된 자동차를 외부에서 스피드건을 이용해 관측한다면 이는 그 속도를 직접 관측하는 것이므로 H 역시 "1" 이다.


칼만필터 예측 수식[아두이노 프로그램, 소프트웨어 코딩 팁] 칼만필터 예측 수식

아두이노 소프트웨어 소스 + 칼만필터 + 가속도센서


칼만필터 아두이노 소스 1[Arduino 프로그래밍 예제, 코딩 팁]


칼만필터 아두이노 소스 2[Arduino 프로그래밍 예제, 코딩 팁]


칼만필터 아두이노 소스 3[Arduino 프로그래밍 예제, 코딩 팁]


출처 - Realsys


칼만필터 소프트웨어 예제


링크 1 - Topic: Kalman Filtered Nunchuck & Wii Motion Plus에서 duckhead의 소스 좀 살펴보니 마음에 드네요. [클릭]


Duckhead씨는 눈척과 모션플러스를 아래 사진과 같이 꾸며서 실험했다 하는데, 2개의 연결을 아래 오른쪽 그림과 같이 연결해서 했다네요. 이 방법은 2개의 트랜지스터를 사용하여 눈척과 모션플러스를 선택 액세스하는데, 꾸며서 동작시켜보니 나름 괜찮습니다.


링크 2 - Kalman filtering of IMU data [클릭]



아두이노 소프트웨어 만들기 (+ 가속도센서)


하드웨어 연결 링크 - Motion Plus and Nunchuck together on the Arduino [클릭]


칼만필터와 아두이노 소프트웨어[Arduino 프로그래밍 예제, 코딩 팁]


아두이노 가속도 센서[Arduino 프로그래밍 예제, 코딩 팁]


칼만필터, 가속도센서로 아두이노 센서 소프트웨어 만들기 (코딩 팁)

댓글