1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | commidi | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
안녕하세요 commidi 입니다 ...
맨날 뜨내기처럼 구경만 하고 다니다..."포인트가 없습니다" 라는 메시지를 보고 망연자실해 있다가.
글을 조금은 써야 할듯 해서..이렇게 올려봅니다.
질답란은 열심히 활동하시는 분들이 많아서 제가 껴들..자리가 없는거 같고..ㅡㅡ
어치든 간에 한번 올려봅니다...게시판의 내용에 맞지 않으면 운영자님께서 다른 곳으로 옮겨주셔도 좋습니다.
* AD(Analog to Digital)컨버팅을 위한 칼만필터의 사용 *
보통 센서류를 하다보면...AD컨버터를 사용하게 될 경우가 상당히 많습니다. 왜냐면 센서들이 일반적으로
저항, 전압, 전류 등의 형태로 아웃풋을 출력하는 경우가 많거든요..
물론 통신으로 센서값을 출력해 주는 센서들도 있지만 제가 생각하기에는 80%이상은 아날로그값으로
출력하는 합니다..(주관적인 생각임..ㅡㅡ) 이런 점에서 AD컨버터가 상대적으로 중요한 부분을 차지한다고 볼 수 있습니다.
그런데 마이컴등에서 AD값을 받다보면 이런 저런 이유에서(레퍼런스 전압의 문제, 시스템 전압의 흔들림..등등) 획득된
AD값이 상당히 많이 흔들리게 됩니다. 좀 전문용어를 사용하면 노이즈가 생긴다고 하죠..
이런 노이즈를 제거하기위해서 하드웨어적으로는 Low Pass필터를 사용하기도 하고 소프트 웨어적으로는 IIR(recursive), FIR(NonRecursive)등의 방식의 디지틀 필터를 많이 사용하기도 하죠..(함께 사용하기도 하구요)
여기에서는 디지틀 필터중에 IIR계열의 Kalman필터를 사용하는 방법을 말씀드리겠습니다.
여러분들 께서 아직 AD컨버터를 사용하시면서 필터를 사용하고 있지 않으시다면 사용하시기를 추천드립니다.
거두절미하고, Kalman 필터를 공부하려면 확률에 대한 기본적인 지식이 있으셔야 이해에 도움이 될 수 있습니다.
확률부분이나 랜덤변수등을 지면에서 설명하면 답이 나오지 않아서..ㅡㅡ 싹 줄이고..정확히 AD컨버터에 칼만
필터를 사용하는 부분만 알려드리도록 하겠습니다. 물론 칼만필터가 AD컨버팅용 필터로만 사용되는건 아니고
로봇의 위치추정이나 SLAM등 여러분야에 골고루 사용되고 있습니다.
더 자세한 내용은 아래 링크를 참고하시면 되겠습니다.
http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf
우선 그림을 보시면 칼만필터는 "Predict"(예측)부분과 "Correct"(정정) 부분으로 크게 나뉩니다.
우선 예측 부분의 1식에서 A는 시스템과 관련된 부분인데 그냥 1로 두시면 되겠습니다.
즉 예측값 x-는 이전 값과 같다고 생각하는 겁니다. 그 다음에 입력 Uk 부분은 0으로 생각하시면 되겠습니다.
단순히 여기서는 필터로 사용하려고 하기 때문에 이렇게 했다라고 생각하시면 되겠습니다.
에러에 대한 공분산값인 Pm- 는 좌측의 2식에서 구해집니다. 여기에서 Q값은 화이트 노이즈를 표현하는 내용 이라고
생각하시면 됩니다. A는 원래 행렬이지만 여기에서는 1을 사용하시면 됩니다.
즉 Pk- = P(k-1)- + Q 라고 생각하시면 되겠습니다.
이렇게 구해진 xk- 와 Pk- 값을 가지고 오른쪽 Correct 부분으로 넘어옵니다.
오른쪽 첫번째식에서 칼만게인 Kk 값이 구해지게 됩니다. Pk-는 위에서 구한 값을 사용하면 되고
H도 행렬인데 여기도 1로 사용을 하시면 되겠습니다. (HT는 H의 트랜스포즈 메트릭슨데 이것도 1이겠죠?)
다시 정리하면 Kk = Pk- / (Pk- + R ) 이 되겠습니다. 여기에서 R은 시스템 노이즈를 표현하는 값이 되겠습니다.
이렇게 Kk를 구하고 나면 드디어 필터가 적용된 값을 구할 차례 입니다.
아까도 말씀드렸다시피 H = 1 을 넣으시면 됩니다. Zk 는 측정된 값을 의미 합니다. 즉 다시말하면 여러분들이
AD컨버팅으로 획득한 값을 의미 합니다. xk- 는 predict 부분에서 구해진 값 입니다.
다시 적으면 xk = xk- + Kk(zk - xk-) => 텍스트로만 했더니 식이 좀 이상하게 보이네요..(zk 다음의 - 는 마이너스고
xk- 는 한문자로 생각하시면 됩니다. ㅡㅡ) => 그림의 식을 잘 보세요.;
그럼 필터링된 x값을 구했구요..다음3번식은 "predict"식에서 사용한 Pk값을 구하는 부분입니다. I 는 단위행렬이므로
1 을 사용하시면 됩니다.
이렇게 구해진 Pk, xk를 구해서 왼쪽의 Predict식에 넣어서 계속 반복하시면 됩니다. R값과 Q값을 어떻게
셋팅하느냐에 따라서 필터의 특징이 달라지게 됩니다. 간단히 C에서 구현하는 방법을 그림의 밑에 보입니다.
뭘 잘 못했는지 그림이 잘 첨부가 안되는 군요...우선 첨부파일을 보시면 되겠습니다.
#define Q 0.00001
#define R 0.001
float g_xPredict ;
float g_x ;
float g_PPredict ;
float g_P ;
float g_K ;
float g_z ;
float calcKalman( float a_MeasuredValue )
{
float l_z ;
// predict..
g_xPredict=g_x;
g_PPredict=g_P + Q;
// predict..
// Correct..
g_K=g_PPredict/(g_PPredict + R);
l_z=a_MeasuredValue ;
g_x=g_xPredict+g_K*(l_z-g_xPredict);
g_P=(1 - g_K)*g_PPredict;
return g_x ;
// Correct..
}
테스트한 결과값은 동영상으로 보여드리겠습니다.
음 동영상은 용량 제한때문에 안될거 같습니다..ㅡㅡ 2.2MB ...
그냥 첨부파일로..올립니다.
빨간색 선은 Raw데이터구요...노란색선이 필터링된 값 입니다.
그럼 이만.
항상 행복하세요....
오 올만에 좋은 자료가 올라왔네요..ㅋㅋ 자료 감사합니다. 이건 대체 어느 카테고리로 보내야할지 난감합니다;;
제어관련 책에서 자주등장하는 칼만필터....언제나 먼 당신~ㅋㅋ