본문 바로가기
Control system engineering

[제어시스템공학-12] Unscented Kalman Filter(UKF,무향칼만필터) 개념

by 노마드공학자 2021. 2. 3.

[제어시스템공학-1] Average Filter(평균필터) https://limitsinx.tistory.com/69

[제어시스템공학-2] Moving Average Filter(이동평균필터) https://limitsinx.tistory.com/70

[제어시스템공학-3] Low Pass Filter(저주파  통과필터) https://limitsinx.tistory.com/71

[제어시스템공학-4] Kalman Filter(칼만필터) 개념정리(1) https://limitsinx.tistory.com/72

[제어시스템공학-5] Kalman Filter(칼만필터) 개념정리(2) https://limitsinx.tistory.com/73

[제어시스템공학-6] Kalman Filter(칼만필터) 구현 - 쉬운예제 https://limitsinx.tistory.com/74

[제어시스템공학-7] Kalman Filter(칼만필터) 구현 - 중간예제 https://limitsinx.tistory.com/75

[제어시스템공학-8] Kalman Filter(칼만필터) 구현 - 어려운예제 https://limitsinx.tistory.com/76

[제어시스템공학-9] Kalman Filter(칼만필터) 구현 - 실전예제 https://limitsinx.tistory.com/77

[제어시스템공학-10] Extended Kalman Filter(확장칼만필터) 개념 https://limitsinx.tistory.com/78

[제어시스템공학-11] Extended Kalman Filter(확장칼만필터) 구현 https://limitsinx.tistory.com/79

 

※이 전글에서 정리한 코드/개념은 재설명하지 않으므로, 참고부탁드립니다

※해당 글은 PC에서 보기에 최적화 되어있습니다.


이제까지 칼만필터를 통해 선형시스템을 제어하는 방법에 대해 개념정리 및 구현을 해보았고,

 

비선형시스템에서는 적용이 안되는 일반적인 칼만필터의 단점을 극복하기위해 비선형칼만필터의 종류 중 하나인, EKF(확장칼만필터,Extended Kalman Filter)를 정리해보았습니다.

 

EKF의 방법론으로는, 매 순간 jacobian(편미분)을 통해 선형근사화를 해가며 칼만필터와 동일한 알고리즘으로 비선형시스템을 제어하는것이였습니다.

 

이번에는 비선형시스템을 칼만필터링 하는 방법론 중, 두번째로 Unscented Kalman Filter(UKF, 무향칼만필터)를 정리해보도록 하겠습니다.

 

일단, UKF는 간단한 임베디드 시스템에 집어넣기는 쉽지않습니다. state-space가 2차원이라던가.. 몇몇 낮은 dimension과 complexity일때는 어찌어찌 넣을수 있겠지만, 근본적으로 KF, EKF보다 연산량이 압도적으로 많은 알고리즘입니다.

 

 

하기식은, 수학적으로 정의된 UKF 알고리즘입니다.

Unscented Kalman Filter, 출처 : https://www.researchgate.net/figure/Schematic-diagram-of-the-Unscented-Kalman-Filter-loop_fig1_224242381

 


위의 수식을 보면, 또 어지러움이 유발되지만 EKF/KF에서도 저와함께 정리하셨다시피 저런 수학적으로 복잡해보이는것은 모두 지적허영심을 위한 고지식한자들의 표현한계일뿐입니다.

 

저와함께 UKF도 쉽게 정리해보시겠습니다.

 

칼만필터는 어렵지않아(2019,김성필)

 

KF, EKF에서도 같이 정리해보셨다시피 이 사진은 이제 너무 익숙해지셨을것 같습니다.

 

칼만필터는 저와함께 엄청나게 많은분량의 글로 정리해오셨기에, 모두 이해하셨으리라 믿고 UKF를 한줄요약 해보겠습니다.(상기링크)

 

 

"비선형함수를 선형화시켜 매순간 계산하는 EKF와 달리, 비선형함수f(x) 그 자체를 알아내는것이 UKF"

 

 

이것이 무슨말이냐면,

 

기존에 x_k = A * x_k-1이라는 선형칼만필터의 수식이 있었다면,

 

EKF에서는 x_k = f(x_k-1)이라는 비선형함수로 표현하여, 매순간 f(x)를 미분(jacobian)하여 기울기를 얻어내어 선형근사화해서 문제들을 해결해나갔죠

 

근데, 이렇게 한 근본적인 이유는, k라는 현재 시간에서의 f(x)의 순간값을 알수 없기때문에 이런식으로 해결한것인데요

 

만약, f(x)라는 함수의 생김새를 모두 알 수 있다면, 굳이 미분(jacobian)을 안해도 현재시간 k에서의 f(x)값을 구할 수 있습니다.

 


그럼 결국, f(x)가 어떻게 생겨먹었는지 알아내어서, Kalman Filter처럼 똑같이 구현하는것이 UKF인데,

 

"f(x)를 도대체 어떻게 알아낼까요??"

 

UKF, 출처 : http://jinyongjeong.github.io/2017/02/17/lec06_UKF/

 

 

f(x)를 알아내는 법에대해 정리해보겠습니다.

 

일단, 아주 간단한 예시를 들어보겠습니다.

 

이렇게 x=[1 2 3 2 1]이라는 변수가 있다고 가정해보겠습니다.

 

평균값은 (1+2+3+2+1)/5 = 1.8입니다.

 

이런경우, f(x) = x^2 이라는 함수의 평균값은 어떻게 구할까요?? 

 

 

f(x) = [1 4 9 4 1]로, 평균값은 3.8이네요

 

x의평균은 1.8이였는데, f(x)=x.^2의 평균값은 1.8^2=3.24가 아닌, 3.8이군요!

 

f(x)= x.^3 + 2*x.^2 + exp(x) -10 + sin(x) 는 어떻게될까요?

 

 

복잡하다고 생각되는 수식을 아무거나 적어서 한번 그려보았는데요

 

이제까지 정리해본것이 UKF의 간단한 예시입니다.

 

즉, 원래 x값을 대표할 수있다고 판단되는 몇개의 포인트들을 f(x)값에 넣어서, 새로운 차원의 평균값(mean), 분산값(Variance)을 알아내는것이 바로 UKF입니다.

 

UKF, 출처https://towardsdatascience.com/the-unscented-kalman-filter-anything-ekf-can-do-i-can-do-it-better-ce7c773cf88d

 

정리하자면,

 

x값을 대표할수있는 몇개의 포인트(x_k) -> f(x)에 대입 -> f(x_k)의 대략적인 생김새(그림)을 유추 

 

해내는것입니다.

 

이렇게되면, 확장칼만필터에서는 미분을 통해 매순간 얻어내던 근사화된 f(x_k)값을 얻어낼 수 있는것이죠

 

EKF와 UKF뿐만 아니라 모든 Kalman Filter류들은, Noise가 Gaussian distribution을 가진다는 엄청나게 중요한 전제가 있기에, 모든 분포는 Mean, Variance값을 가진다고 가정합니다.

 

그런데 여기서 중요한점!

 

x_k값을 대표할수있다고 생각되는 점들은 어떻게 구할까요??

 

몇가지 수학적 유도과정을 통해서 이 점들을 얻어내는데요, 이 점들을 "시그마포인트(sigma point)"라고 부릅니다.

 

UKF sigma point, 출처 : https://www.slideshare.net/SCU_ECE_Staff/kalman-filtering-52057995

UKF의 sigma point는 위와 같은 과정을 통해 얻습니다.

 

수식으로 보니 또 아주어렵죠??

 

간단하게 정리해보겠습니다.

 

x_k값또한, gaussian distribution이기에 mean값과 variance값을 가지는 그래프 개형입니다.

 

gaussian, 출처 : wikipedia

 

그럼 Mean값을 기준으로 standard deviation(sqrt(variance))만큼 떨어진 값들을 sigma point로 잡습니다

 

또한, Mean값에서 멀리떨어진 sigma point일수록 weighting을 낮게주고,

 

Mean값에서 가까운 sigma point일수록 Weighting값을 높게주어, 원래 x_k값에서의 gaussian distribution형태가 잘 보존되도록 포인트들을 선정합니다!

 

즉, Standard deviation과 Mean값을 통해 해당 함수를 대표할 수 있다고 믿는 점들(sigma point)을 찍고, f(x)에 넣어주는것입니다.

 

이렇게 해서 얻어진 f(x_k)값들을 통해, 새로운 f(x_k)의 Mean값과 Variance값을 구해주는 원리입니다.

 

이 sigma point는 많이 찍으면 많이 찍을수록 더욱더 정확한 f(x_k)값을 얻을 수 있을것입니다.

 

하지만, sigma point가 많아질수록, "당연히" 연산량이 엄청나게 많아지게 됩니다.


Summary

 

비선형시스템에서 칼만필터를 사용하기위해

 

EKF에서는 비선형시스템을 미분하여 선형근사화하는 방식을 택했었습니다. (현재상태 k에서의 f(x)를 알아내기위해)

 

하지만, UKF는 무식하게(?) x_k를 대표할 수 있는 값들을 직접 하나하나 f(x)에 넣어 f(x_k)라고 예상되는 Gaussian Distribution의 평균과 분산을 얻어내는 방식을 사용했습니다.

 

정말 심플하게 생각하면, 이것입니다.

 

 

"무식하게 하나하나씩 점들을 f(x)에 넣어서, 어떤 모양이 나오는지 대략적으로 확인해본다."

 

 

하지만, 진짜 하나하나씩 넣으면 너무 무식하니까!

 

원래 값을 대표할 수 있다고 생각되는 몇몇 점들(Sigma point)만 통과시켜서, 어떤모양이 나오는지 대략적으로 보고,

 

이렇게 얻어진 f(x_k)를 가지고, Kalman Filter 알고리즘 그대로 돌려주는것이 바로 UKF 입니다.

 

UKF는 이렇게 몇몇점들을 가지고 유추해나가는식이지만, 앞으로 정리할 필터중 "Particle Filter"라는것이 있는데

 

말그대로 미립자필터로, 진짜 엄청나게 많은 점들을 때려넣어서 유추해나가는 방식도 있습니다.

 

이다음글은 UKF를 코드로 구현해보도록 하겠습니다.

 

댓글