我有三个陀螺仪值,俯仰,横摇和偏航。我想添加卡尔曼滤波器以获得更准确的值。我找到了实现Kalman过滤器的opencv库,但是我不明白它是如何工作的。
您能给我任何可以帮助我的帮助吗?我在互联网上找不到任何相关主题。
我试图使其适用于一个轴。
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);
}
在主要
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;
当我从陀螺仪接收数据时,我每次都这样称呼它:
kalman_filter(prevr, mpe->getGyrosDegrees().roll);
我认为在kalman_filter中,第一个参数是先前的值,第二个参数是当前值。我不是,这个代码也行不通。。。我知道我有很多工作要做,但是我不知道如何继续下去,要更改什么。。。
最佳答案
似乎您给协方差矩阵的值过高。kalman->process_noise_cov
是“过程噪声covariance matrix”,在卡尔曼文献中通常将其称为Q
。较低的值将使结果更平滑。kalman->measurement_noise_cov
是“测量噪声协方差矩阵”,在卡尔曼文献中通常将其称为R
。值越高,结果越平滑。
这两个矩阵之间的关系定义了要执行的过滤的数量和形状。
如果Q
的值很高,则意味着您正在测量的信号变化很快,您需要使滤波器适应性强。如果很小,则测量值中的噪声将导致较大的变化。
如果R
的值较高(与Q
相比),则表明测量结果有噪声,因此将对其进行更多过滤。
尝试使用较低的值,例如q = 1e-5
和r = 1e-1
,而不是q = 2.0
和r = 3.0
。
关于c++ - OpenCV卡尔曼滤波器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3745348/