칼만 필터-구현, 매개 변수 및 조정


10

우선, 이것은 내가 칼만 필터를 만들려고 처음입니다.

나는 이전에 다음 게시물을 게시했습니다.이 게시물의 배경을 설명하는 StackOverflow의 속도 값에서 잡음과 변화를 필터링 하십시오. 이것은 필터링하려는 일반적인 값 샘플입니다. 여기에서 반드시 감소시킬 필요는 없습니다. 그러나 변화율은 일반적으로

X ------- Y
16 --- 233.75
24 --- 234.01
26 --- 234.33
32 --- 234.12
36 --- 233.85
39 --- 233.42
47 --- 233.69
52 --- 233.68
55 --- 233.76
60 --- 232.97
66 --- 233.31
72 --- 233.99

이 튜토리얼에 따라 Kalman Filter를 구현했습니다 : Kalman Filter for Dummies .

내 구현은 다음과 같습니다 (의사 코드).

//Standard deviation is 0.05. Used in calculation of Kalman gain

void updateAngle(double lastAngle){
  if(firsTimeRunning==true)
     priorEstimate = 0;               //estimate is the old one here
     priorErrorVariance = 1.2;        //errorCovariance is the old one
  else
     priorEstimate = estimate;              //estimate is the old one here
     priorErrorVariance = errorCovariance;  //errorCovariance is the old one
  rawValue = lastAngle;          //lastAngle is the newest Y-value recieved
  kalmanGain = priorErrorVariance / (priorErrVariance + 0.05);
  estimate = priorEstimate + (kalmanGain * (rawValue - priorEstimate));
  errorCovariance = (1 - kalmanGain) * priorErrVariance;
  angle = estimate;              //angle is the variable I want to update
}                                //which will be lastAngle next time

나는 사전 평가 0으로 시작합니다. 이것은 잘 작동하는 것 같습니다. 그러나 내가 주목하는 것은이 업데이트가 실행될 때마다 kalmanGain이 감소한다는 것입니다. 즉, 필터가 실행되는 시간이 길수록 새 값을 신뢰한다는 것을 의미합니다 (?). 나는 그것을 원하지 않습니다.

나는 이동 평균 (단순 및 지수 가중)을 사용하는 것에서 이것을 사용하는 것으로 이동했습니다. 지금은 그다지 좋은 결과를 얻을 수 없습니다.

내 질문은 이것이 올바른 구현인지 여부와 내가 게시 한 샘플 값에 따라 이전 오류 분산 및 표준 편차가 좋아 보이는지 여부입니다. 내 매개 변수는 실제로 무작위로 선택되어 좋은 결과를 얻을 수 있는지 확인합니다. 여러 범위를 시도했지만 결과가 좋지 않습니다. 내가 할 수있는 변경 사항에 대한 제안 사항이 있으면 정말 감사하겠습니다. 명백한 것들이 빠진 것이 유감입니다. 여기에 처음으로 게시 할 수도 있습니다.

답변:


5

칼만 필터는 입력 신호가 선형 동적 시스템 상태의 노이즈 관측으로 구성된 경우에 유용합니다. Kalman 필터는 시스템 상태에 대한 일련의 관찰을 통해 기본 시스템 상태에 대한 더 나은 추정을 재귀 적으로 제공하는 것을 목표로합니다. 성공적으로 적용하려면 상태를 추정 할 시스템의 역학에 대한 모델이 있어야합니다. Wikipedia에 자세히 설명 된 바와 같이 ,이 모델은 이전 상태, 시스템에 대한 입력 및 프로세스 노이즈라는 가우시안 분산 확률 적 구성 요소를 고려할 때 상태 기본 시스템이 한 번에 걸쳐 어떻게 변경 될지 설명합니다.

그렇게 말하면, 당신이 그런 기본 모델을 가지고 있는지 여부는 분명하지 않습니다. 연결된 게시물에 센서에서 속도 값을 사용하고 있음이 표시되었습니다. 이것들은 시스템 상태 (상태가 속도 인 곳)를 직접 관찰하거나 상태 (예를 들어 상태가 위치 인 곳)를 간접적으로 관찰하는 것으로 모델링 할 수 있습니다. 그러나 Kalman 프레임 워크를 사용하려면 시간이 지남에 따라 해당 상태가 어떻게 발전 할 것인지에 대한 모델을 선택해야합니다. 이 추가 정보는 최적의 추정치를 생성하기 위해 사용됩니다. 칼만 필터는 적용되는 신호를 "정리"하는 마법의 블랙 박스가 아닙니다.

그렇기 때문에 칼만 필터가 입력 관측 값이 점진적으로 무시되는 지점까지 자체 출력에 대해 더 자신감을 갖게되는 현상은 실제로 발생합니다. 프로세스 노이즈 공분산 행렬의 값을 수동으로 늘려서이를 완화 할 수 있습니다. 그런 다음, 질적으로 시스템의 상태 전이 모델에는 확률 적 구성 요소가 더 커져 추정기가 현재 상태에서 다음 상태를 정확하게 예측할 수있는 능력이 줄어 듭니다. 이렇게하면 현재 시스템 상태 추정값에 대한 의존도가 줄어들고 후속 관측에 대한 의존도가 높아져 "입력 무시"효과가 방지됩니다.


+1 : 특히 마지막 단락. KF 설계의 잡음 공분산을 비틀기 "손잡이"로 생각하십시오.
Peter K.

4

올바르게 이해하면 움직이는 물체가 있고 속도를 관찰 할 수 있으며이 속도는 시끄 럽습니다. 측정 결과 두 종류의 변형이 관찰됩니다. \

  1. 노이즈로 인한 변화
  2. 물체가 진정으로 속도를 변화시키기 때문에 변형 (예 : 회전)

칼만 게인이 0이되는 이유는 물체의 속도가 일정하고 내재적으로 가정하기 때문에이 실제 속도를 추정하기 때문입니다.

" 저는 일정한 속도로 움직이는 물체가 있는데이 일정한 속도를 추정하고 싶습니다. "

귀하의 모델은 다음과 같습니다. xk 시간의 속도 kyk 해당 측정입니다.

xk=xk1
yk=xk+qk

그러나 물체는 그렇게 움직이지 않습니다. 속도가 변하고 있으며 언제 어떻게 변할 것인지 모릅니다.

당신이 대신 말해야 할 것은 :

" 저는 속도로 움직이는 물체가 있지만 속도가 어떻게 변하는 지 잘 모르겠습니다. "

이를 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 상태의 불확실성을 추가하는 것입니다.

xk=xk1+vk1you add uncertainty
yk=xk+qk
어디 qkvk 백색 잡음으로 가정합니다.

칼만 필터 방정식은 다음과 같습니다.

y^k|k1=x^k|k1
Kk=Pk|k1Pk|k1+Qo
x^k|k=x^k|k1+Kk(yky^k|k1)
Pk|k=Pk|k1KkPk|k1
Pk+1|k=Pk|k+Qs

귀하의 경우 0.05값은 관측 노이즈 공분산입니다.Qo. 이 변경을 수행하기 위해서는Qs, 상태 노이즈 코 바리 나스 (상태의 비인증)를 일정한 값으로 설정합니다.

코드에서 약간의 수정은 다음과 같습니다.

stateVariance = 0.5

errorCovariance = (1 - kalmanGain) * priorErrVariance + stateVariance;

를 추가하지 않음으로써 stateVariance또는Qs 코드에서 0이라고 가정했습니다.

stateVariance값은 원하는 것이 될 수 있습니다. 속도가 실제로 얼마나 변할 것인지에 대한 귀하의 확신에 근거합니다. 속도가 일정하게 유지 될 것으로 생각되면이를 작은 숫자로 설정하십시오.

이렇게하면 칼만 게인이 0이되지 않습니다.


3

칼만 필터를 사용하려면 동적 시스템이 필요합니다.

내가 제안 할게

y=i=0naixi

a[k+1]=a[k]+w
cov(w)=Q
측정:
z=i=0naixi=y

그래서 대신에 x 상태로서, 계수를 도입 (a) 상태로


1

PID 제어 와 같은 고전적인 제어 이론의 아이디어를 사용할 수 있다고 생각합니다 .

신호 Y는 제어기 u (t)의 설정 점일 수 있습니다. 공정 플랜트는 1이고 y (t)는 출력을 필터링합니다. 원하는 것을 얻기 위해 파라미터 (조정) P, I 및 D를 설정하기 만하면됩니다.

출력 y (t)는 입력 u (t)를 "추종"하려고 시도하지만 매개 변수는이 추적 방법을 제어합니다.

미분 게인 D는 빠른 오류 변화에 민감하게 반응합니다. 귀하의 경우에는 D가 작아야한다고 생각합니다. u (t)가 갑자기 변경되면 y (t)를 변경하지 않으려 고합니다.

적분 게인 'I'는 누적 오차에 대한 응답을 민감하게 만듭니다. 거기에 높은 가치를 두어야합니다. u (t)가 레벨을 변경하고 유지하면 오류가 발생하고 y (t)가 동일하게 수행하기를 원합니다.

P 게인은 미세 조정될 수 있습니다. 어쨌든, 매개 변수를 가지고 놀고 당신이 얻는 것을보십시오.

그러나 복잡한 튜닝 방법이 있지만 필요하다고는 생각하지 않습니다.

행운을 빕니다.


실제로 더 나은 접근 방식이 있습니다. 이 게시물을 참조하십시오 .
Daniel R. Pipa


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.