卡尔曼滤波器预创新

人工智能 计算机视觉
2021-10-29 13:58:20

我正在尝试使用卡尔曼滤波器跟踪 LIDAR 对象。问题是创新的值为 0,这使得卡尔曼增益为无穷大。是卡尔曼方程的链接。下面列出了我初始化测量和过程协方差矩阵的值。更新代码也如下所示。当我调试代码时,一切都很好,直到创新变为 0。

this->lidar_R << std_laspx_, 0, 0, 0,
    0, std_laspy_, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0;

this->lidar_H << 1.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0;

P_ << 1000, 0, 0, 0, 0,
    0, 1000, 0, 0, 0,
    0, 0, 1000, 0, 0,
    0, 0, 0, 1000, 0,
    0, 0, 0, 0, 1000;

 MatrixXd PHt = this->P_ * H.transpose();
 //S becomes 0
 MatrixXd S = H * PHt + R;
 //S_inv becomes INFINITY
 MatrixXd S_inv_ = S.inverse();
 MatrixXd K = PHt * S_inv_;

VectorXd y = Z - Hx;

this->x_ = this->x_ + K*y;
MatrixXd I = MatrixXd::Identity(x_.size(), x_.size());
this->P_ = (I - K * H) * this->P_;
2个回答

从您的矩阵定义来看,问题是 S 始终是奇异的,因此它永远不会被倒置

我用 numpy 重新实现了计算,这里是数字

H = np.array([[1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0]])

P = np.identity(5) * 1000

R = np.array([[100, 0, 0, 0], [0, 100, 0, 0], [0,0,0,0], [0,0,0,0]])

S=H.dot(P.dot(np.transpose(H)))+R

并且S

array([[1100.,    0.,    0.,    0.],
       [   0., 1100.,    0.,    0.],
       [   0.,    0.,    0.,    0.],
       [   0.,    0.,    0.,    0.]])

基本上,H全零线的定义取消了部分信息(使其不可观察),并且您也没有任何观察噪声分量

在进行逆运算之前检查 S 的行列式是否为零。如果是这种情况,请使用伪逆。