请教GPS卡尔曼滤波传入测量量数值对处理结果的影响问题

[复制链接]
 楼主| yangbo18416 发表于 2020-5-11 17:08 | 显示全部楼层 |阅读模式
本帖最后由 yangbo18416 于 2020-5-11 17:58 编辑

目前我使用的卡尔曼滤波用于处理GPS定位情况,由于本人不太了解卡尔曼滤波的过程,因此很多资料是从网上查找到的。
目前系统的观测量位x,y vx vy,测量量Z为gps获取到的经纬度转成高斯坐标下的x y,状态转移矩阵A=[1,0,dt,0, 0,1,0,dt, 0,0,1,0, 0,0,0,1],测量矩阵H = [1,0,0,0 0,1,0,0];R噪声协方差位GPS提供的经纬度的方差
目前存在的情况如下:
在获取搞的高斯坐标下,设定一个人为原点后,比如,当前换算后的坐标为A:(3127409.64669,-19695075.21917),然后系统原点设定为B:(3127411.929756,-19695090.395567),则进**尔曼滤波时的测量量传入的值A-B =(−2.283066,15.176397),经过这样的处理后,得到的滤波数值感觉还行,Vx Vy观测量也还行;但是如果不减去原点,直接将获得的数据作为Z值传入计算,则得到的卡尔曼滤波结果相差很大。目前是百思不得其解!
相关程序如下:
  1.    MatrixXd X=MatrixXd(4, 1);
  2.    MatrixXd A=MatrixXd(4, 4);
  3.    MatrixXd H=MatrixXd(2, 4);
  4.    MatrixXd Q=MatrixXd(4, 4);
  5.    MatrixXd R=MatrixXd(2, 2);
  6.    MatrixXd P=MatrixXd(4, 4);
  7.    MatrixXd K=MatrixXd(4, 2);
  8.    MatrixXd Z=MatrixXd(2, 1);
  9.    A.setZero();
  10.    A(0,0) = 1;
  11.    A(0,2) = 1;
  12.    A(1,1) = 1;
  13.    A(1,3) = 1;
  14.    A(2,2) = 1;
  15.    A(3,3) = 1;
  16.    H.setZero();
  17.    H(0.0) = 1;
  18.    H(1,1) = 1;
  19.    // H<< 1,0,0,0,
  20.    //    0,1,0,0;
  21.    Q.setZero();
  22.    Q(0,0) = (double)0.5;      //系统噪声只存在位移上,速度方向没有---速度通过推测而来
  23.    Q(1,1) = (double)0.5;
  24.    // Q(2,2) = (double)0.2;
  25.    // Q(3,3) = (double)0.2;
  26.    // Q<<(double)0.2,           0,           0,             0,
  27.    //    0,           (double)0.2,           0,             0,
  28.    //    0,                      0,(double)0.2,             0,
  29.    //    0,                      0,           0,  (double)0.2;  
  30.    R.setZero();
  31.    R(0,0) = (double)0.4;
  32.    R(1,1) = (double)0.4;
  33.    // R<<(double)0.02,0,0,(double)0.02;
  34. //    R.setZero();
  35.    P.setZero();
  36.    P(0,0) = 0.8;
  37.    P(0,2) = 0.8;
  38.    P(1,1) = 0.8;
  39.    P(1,3) = 0.8;
  40.    P(2,2) = 0.8;
  41.    P(3,3) = 0.8;
  42.    // P<<1,  0,  0,  0,
  43.    //    0,  1,  0,  0,
  44.    //    0,  0,  1,  0,
  45.    //    0,  0,  0,  1;
  46.    K.setZero();  
  47.    // K<< 0,0,0,0,0,0,0,0;
卡尔曼处理部分的程序如下:
  1. for(int i=0; i< MaxNum; i++)
  2.    {

  3.       X = kalfilter->kalman_input_exe(X,Z,0,Dt,R);
  4.       // std::cout <<"OrgX: "<< x_buf[i] << " OrgY: " << y_buf[i] <<" O_Dx: "<< (x_buf[i] - x_buf[i-1])/Dt << " O_Dy: " << (y_buf[i] - y_buf[i-1])/Dt << " OtX: " << X(0,0) << " OtY: " << X(1,0) << " Dx: " << X(2,0) << " Dy: " << X(3,0) <<std::endl;
  5.       // outfile << x_buf[i] << "  " << y_buf[i] <<"  "<< (x_buf[i] - x_buf[i-1])/Dt << "  " << (y_buf[i] - y_buf[i-1])/Dt << "  " << X(0,0) << "  " << X(1,0) << "  " << X(2,0)<< "  " << X(3,0)  <<std::endl;//输出到txt文档,用于matlab绘图
  6.       std::cout <<"OrgX: "<< x_buf[i] << " OrgY: " << y_buf[i]  << " OtX: " << X(0,0) << " OtY: " << X(1,0) << " Dx: " << X(2,0) << " Dy: " << X(3,0) <<std::endl;
  7.       outfile <<setw(10)<<setiosflags(ios::fixed)<<setprecision(2)<<x_buf[i] << "  " <<setw(10)<<setiosflags(ios::fixed)<<setprecision(2)<<y_buf[i] << "  " <<setw(10)<<setiosflags(ios::fixed)<<setprecision(2)<< X(0,0) << "  " <<setw(10)<<setiosflags(ios::fixed)<<setprecision(2)<< X(1,0) << "  " << X(2,0)<< "  " << X(3,0);     
  8.       outfile << std::endl;//输出到txt文档,用于matlab绘图
  9.       Z << x_buf[i],y_buf[i];
  10.       R.setZero();
  11.       R(0,0) =pow(lat_stddev[i],2);
  12.       R(1,1) =pow(lon_stddev[i],2);
  13.    }


  14. MatrixXd kalman_input_exe(MatrixXd stata_X,MatrixXd z,double u, double time,MatrixXd R)
  15.     {
  16.         m_delta_time=time;
  17.         m_R = R;
  18.         // A<< 1,0,(double)delta_time,0,
  19.         //     0,1,0,(double)delta_time,
  20.         //     0,0,1,0,
  21.         //     0,0,0,1;
  22.         // B<<0,0,0,0;
  23.         /* Predict */
  24.         // X=A*X+B*u;
  25.         m_X=m_A*stata_X;      //无控制量--预测 先验估算值
  26.         //预测状态与真实状态的协方差矩阵,Pk'
  27.         m_P=m_A*m_P*m_A.transpose() + m_Q;   //先验协方差
  28.         // /*update*/
  29.         //计算增益
  30.         m_K = m_P*m_H.transpose()*(m_H*m_P*m_H.transpose()+m_R).inverse();
  31.         m_X = m_X+m_K*(z-m_H*m_X);  //后验估算值
  32.         m_P = m_P - m_K*m_H*m_P;    //后验协方差
  33.         return m_X;
  34.     }
再次感谢原作者提供个函数
https://blog.csdn.net/qq_27251141/article/details/95047938


结贴:原因是在第一次数据处理时忘记将 最优观测量设置为 测量量,导致测量数据很大时需要很长的时间才能稳定!!!!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

215

主题

241

帖子

2

粉丝
快速回复 返回顶部 返回列表