zoukankan      html  css  js  c++  java
  • 无损卡尔曼滤波UKF(4)-预测-预测Sigma点

    无损卡尔曼滤波UKF(4)-预测Sigma点

    1. 每次迭代,需要k时刻的Sigma点带入过程函数
    2. 输入是 7维向量 扩充状态
    3. 输出是 5维向量 预测状态

    void UKF::SigmaPointPrediction(MatrixXd* Xsig_out) {
    
      // 状态维数
      int n_x = 5;
    
      // 扩充状态维数
      int n_aug = 7;
    
      // 给定扩充状态的Sigma矩阵
      MatrixXd Xsig_aug = MatrixXd(n_aug, 2 * n_aug + 1);
      Xsig_aug <<
        5.7441,  5.85768,   5.7441,   5.7441,   5.7441,   5.7441,   5.7441,   5.7441,   5.63052,   5.7441,   5.7441,   5.7441,   5.7441,   5.7441,   5.7441,
          1.38,  1.34566,  1.52806,     1.38,     1.38,     1.38,     1.38,     1.38,   1.41434,  1.23194,     1.38,     1.38,     1.38,     1.38,     1.38,
        2.2049,  2.28414,  2.24557,  2.29582,   2.2049,   2.2049,   2.2049,   2.2049,   2.12566,  2.16423,  2.11398,   2.2049,   2.2049,   2.2049,   2.2049,
        0.5015,  0.44339, 0.631886, 0.516923, 0.595227,   0.5015,   0.5015,   0.5015,   0.55961, 0.371114, 0.486077, 0.407773,   0.5015,   0.5015,   0.5015,
        0.3528, 0.299973, 0.462123, 0.376339,  0.48417, 0.418721,   0.3528,   0.3528,  0.405627, 0.243477, 0.329261,  0.22143, 0.286879,   0.3528,   0.3528,
             0,        0,        0,        0,        0,        0,  0.34641,        0,         0,        0,        0,        0,        0, -0.34641,        0,
             0,        0,        0,        0,        0,        0,        0,  0.34641,         0,        0,        0,        0,        0,        0, -0.34641;
    
      // 创建预测Sigma矩阵
      MatrixXd Xsig_pred = MatrixXd(n_x, 2 * n_aug + 1);
    
      double delta_t = 0.1; // time diff in sec
    
      // 枚举每一列,预测Sigma点
      for(int i = 0; i < 2*n_aug + 1 ; i ++)
      {   
        double p_x = Xsig_aug(0,i);
        double p_y = Xsig_aug(1,i);
        double v = Xsig_aug(2,i);
        double yaw = Xsig_aug(3,i);
        double yawd = Xsig_aug(4,i);
        double nu_a = Xsig_aug(5,i);
        double nu_yawdd = Xsig_aug(6,i);
    
        // 根据公式计算
        double px_p, py_p;
        double v_p = v;
        double yaw_p = yaw + yawd*delta_t;
        double yawd_p = yawd;
        // 避免角速度为0
        if (fabs(yawd) > 0.001) {
            px_p = p_x + v/yawd * ( sin (yaw + yawd*delta_t) - sin(yaw));
            py_p = p_y + v/yawd * ( cos(yaw) - cos(yaw+yawd*delta_t) );
        } else {
            px_p = p_x + v*delta_t*cos(yaw);
            py_p = p_y + v*delta_t*sin(yaw);
        }
    
        // 把噪声加进去,更新5项的值
        px_p = px_p + 0.5*nu_a*delta_t*delta_t * cos(yaw);
        py_p = py_p + 0.5*nu_a*delta_t*delta_t * sin(yaw);
        v_p = v_p + nu_a*delta_t;
        yaw_p = yaw_p + 0.5*nu_yawdd*delta_t*delta_t;
        yawd_p = yawd_p + nu_yawdd*delta_t;
    
        // 把结果填入准备好的预测矩阵
        Xsig_pred(0,i) = px_p;
        Xsig_pred(1,i) = py_p;
        Xsig_pred(2,i) = v_p;
        Xsig_pred(3,i) = yaw_p;
        Xsig_pred(4,i) = yawd_p;
      }
    
      std::cout << "Xsig_pred = " << std::endl << Xsig_pred << std::endl;
    
      *Xsig_out = Xsig_pred;
    }
    
    干啥啥不行,吃饭第一名
  • 相关阅读:
    maven插件安装与使用
    java面试题
    关于java的GC
    技术人员要树立自己的品牌
    为什么IT公司都应该鼓励开源
    你应该坚持写博客 即使没有读者
    计算机基础
    收藏 | 产品经理不可不知的 7 种技术思维
    我讨厌你公事公办的样子
    子序列问题【LIS、LCS、LCIS】
  • 原文地址:https://www.cnblogs.com/jiangxinyu1/p/12462538.html
Copyright © 2011-2022 走看看