2010-09-19 17 views
7

Üç jiroskop değerim, pitch, roll ve yaw var. Daha doğru değerler almak için Kalman filtresi eklemek istiyorum. Bir Kalman filtresi uygulayan opencv kütüphanesini buldum, fakat bunun nasıl olduğunu gerçekten anlayamıyorum.OpenCV Kalman filtresi

bana bana yardımcı olabilecek herhangi bir yardım verebilir misiniz? İnternette herhangi bir konu bulamadım.

Ben bir eksen için çalışmasını sağlamak için çalıştı.

const float A[] = { 1, 1, 0, 1 }; 
CvKalman* kalman; 
CvMat* state = NULL; 
CvMat* measurement; 

void kalman_filter(float FoE_x, float prev_x) 
{ 
    const CvMat* prediction = cvKalmanPredict(kalman, 0); 
    printf("KALMAN: %f %f %f\n" , prev_x, prediction->data.fl[0] , prediction->data.fl[1]); 
    measurement->data.fl[0] = FoE_x; 
    cvKalmanCorrect(kalman, measurement); 
} 
ana

kalman = cvCreateKalman(2, 1, 0); 
state = cvCreateMat(2, 1, CV_32FC1); 
measurement = cvCreateMat(1, 1, CV_32FC1); 
cvSetIdentity(kalman->measurement_matrix,cvRealScalar(1)); 
memcpy(kalman->transition_matrix->data.fl, A, sizeof(A)); 
cvSetIdentity(kalman->process_noise_cov, cvRealScalar(2.0)); 
cvSetIdentity(kalman->measurement_noise_cov, cvRealScalar(3.0)); 
cvSetIdentity(kalman->error_cov_post, cvRealScalar(1222)); 
kalman->state_post->data.fl[0] = 0; 

yılında

Ve jiroskop verileri aldığınızda Ben, bu her şey aramak:

kalman_filter(prevr, mpe->getGyrosDegrees().roll); 

ben kalman_filter düşünce Birinci parametre önceki değer ve ikinci akım değeridir. Ben değilim ve bu kod çalışmıyor ... Ben onunla bir sürü iş var biliyorum, ama devam etmek nasıl bilmiyorum, değiştirmek ne ...

+0

Daha spesifik bir soru sormak isteyebilirsiniz. Kalman Filtresini veya uygulanmasını anlamakta sorun mu yaşıyorsunuz? –

+0

dürüst olmak gerekirse, henüz Kalman filtresini anlamıyorum. Bu konuda bazı makaleler buldum, ama bu çok yüksek matematik içeriyor ... Ben jiroskopun bir ekseni için bir şey uygulamaya çalıştım, ama bilmiyorum, hangi değişkenin ne için olduğunu. Soruna bazı kodları ekliyorum. moment –

+0

@Gabriel Schreiber: Sorunun bazı kodlarını ekledim. Yardım için teşekkürler! –

cevap

19

Ama sence gibi görünüyor Kovaryans matrislerine çok yüksek değerler vermek.

kalman->process_noise_cov'proses gürültü covariance matrix' ve genellikle Q olarak Kalman literatürde adlandırılır. Sonuç daha düşük değerlerle daha pürüzsüz olacaktır.

kalman->measurement_noise_cov'ölçüm gürültü kovaryans matrisi' ve genellikle R olarak Kalman literatürde adlandırılır. Sonuç daha yüksek değerlerle daha pürüzsüz olacaktır.

bu iki matrisler arasındaki ilişki, yapmakta olan filtre miktarı ve şeklini tanımlar. Q değeri yüksek ise

, bu size ölçüm sinyalinin hızla değişmektedir anlamına gelecektir ve uyarlanabilir olması filtreyi gerekir. Küçükse, büyük değişiklikler önlemdeki gürültüye atfedilecektir.

R değeri yüksekse (Q ile karşılaştırıldığında), ölçümün gürültülü olduğunu ve daha fazla filtreleneceğini belirtir.

ve r = 1e-1 yerine q = 2.0 ve r = 3.0 gibi düşük değerleri deneyin.

+0

Bu değerleri kodumda değiştirdim ve soruya bir miktar hata ekliyorum. Şimdi çalışıyor. Teşekkürler. Tüm üç ekseni Kalman filtresine eklemek için neyi değiştirmek zorundayım? –

+0

cvCreateKalman için google'da arama (6, 3, 0) –