给我一份kalman滤波 c++代码
时间: 2023-11-04 15:08:48 浏览: 32
以下是一个简单的Kalman滤波C++代码示例:
```c++
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
// 定义初始状态向量和状态转移矩阵
VectorXd x0(2);
x0 << 0, 0;
MatrixXd A(2, 2);
A << 1, 1, 0, 1;
// 定义观测矩阵和观测噪声协方差矩阵
MatrixXd H(1, 2);
H << 1, 0;
double R = 1;
// 定义过程噪声协方差矩阵和初始估计误差协方差矩阵
MatrixXd Q(2, 2);
Q << 0.05, 0.05, 0.05, 0.1;
MatrixXd P0(2, 2);
P0 << 1, 0, 0, 1;
// 定义初始观测向量和观测向量序列
double z = 1.0;
VectorXd y(1);
y << z;
int n = 20;
VectorXd xhat(2);
xhat = x0;
MatrixXd P(n, 2);
P.row(0) = x0.transpose();
// Kalman滤波循环
for (int k = 0; k < n; k++) {
// 预测
xhat = A * xhat;
MatrixXd P_ = A * P0 * A.transpose() + Q;
// 更新
MatrixXd K = P_ * H.transpose() * (H * P_ * H.transpose() + R).inverse();
xhat = xhat + K * (y - H * xhat);
P0 = (MatrixXd::Identity(2, 2) - K * H) * P_;
// 存储估计值和误差协方差矩阵
P.row(k) = xhat.transpose();
}
std::cout << "Final estimate:\n" << xhat << std::endl;
std::cout << "Final error covariance:\n" << P0 << std::endl;
std::cout << "Estimate sequence:\n" << P << std::endl;
return 0;
}
```
此代码演示了一个简单的Kalman滤波示例,其中估计状态的初始向量为$(0,0)$,状态转移矩阵为
$$
A =
\begin{bmatrix}
1 & 1 \\
0 & 1
\end{bmatrix}
$$
观测矩阵为$H =[1,0]$,观测噪声协方差矩阵$R=1$,过程噪声协方差矩阵为
$$
Q =
\begin{bmatrix}
0.05 & 0.05 \\
0.05 & 0.1
\end{bmatrix}
$$
初始估计误差协方差矩阵为单位矩阵。在循环中,我们使用状态转移矩阵和过程噪声协方差矩阵进行预测,然后使用观测矩阵和观测噪声协方差矩阵进行更新。最终,我们输出了估计的最终状态向量和误差协方差矩阵,以及状态向量序列。