全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > MEMS传感器 >

基础卡尔曼滤波

时间:2023-05-08 10:11

人气:

作者:admin

标签: 定位算法 

导读:你可能要问为什么有传感器的数据了还要进行更新?因为在现实世界中传感器是存在很多噪声干扰的,所以也不能完全相信传感器数据。卡尔曼算法依赖于线性计算,高斯分布,我们以...

			

原理

卡尔曼滤波器是一种基础预测定位算法。原理非常简单易懂。核心过程可以用一个图说明:

e2cb75de-ed43-11ed-90ce-dac502259ad0.jpg

本质上就是这两个状态过程的迭代,来逐步的准确定位。 预测:当前状态环境下,对下一个时间段t的位置估计计算的值。 更新:更具传感器获取到比较准确的位置信息后来更新当前的预测问位置,也就是纠正预测的错误。 你可能要问为什么有传感器的数据了还要进行更新?因为在现实世界中传感器是存在很多噪声干扰的,所以也不能完全相信传感器数据。卡尔曼算法依赖于线性计算,高斯分布,我们以一维定位来介绍算法的实现。

e2df3f74-ed43-11ed-90ce-dac502259ad0.jpg

e2f9158e-ed43-11ed-90ce-dac502259ad0.png

接下来我们开更新,预测后我们获取到传感器数据,表示目前传感器发现小车的位置应该是在26这个位置,在这种情况下,我们肯定是觉得传感器的准确度比我之前的预测瞎猜要来的准确。 所以方差自然会比较小,最终我们觉得真是的小车位置应该是更靠近传感器数据的,而且方差会缩小,以至于,想想也很清楚,我猜了一个预测值,现在有个专家告诉了我相对比较靠谱的数据,那我对小车的位置的自信度肯定会上升啊。 最终小车的位置经过这个时间段t的更新就是下图红色的高斯图:

e30aeeda-ed43-11ed-90ce-dac502259ad0.jpg

就这样不停的移动更新,最终小车的位置就会越来越准确。

一维模型下的Kalman公式:

预测 e32564f4-ed43-11ed-90ce-dac502259ad0.jpg

更新e33d6978-ed43-11ed-90ce-dac502259ad0.jpg

e354c05a-ed43-11ed-90ce-dac502259ad0.jpg

参考代码:

#include 
#include 
#include 


using namespace std;


double new_mean, new_var;


tuple<double, double> measurement_update(double mean1, double var1, double mean2, double var2)
{
  new_mean = (var2 * mean1 + var1 * mean2) / (var1 + var2);
  new_var = 1 / (1 / var1 + 1 / var2);
  return make_tuple(new_mean, new_var);
}


tuple<double, double> state_prediction(double mean1, double var1, double mean2, double var2)
{
  new_mean = mean1 + mean2;
  new_var = var1 + var2;
  return make_tuple(new_mean, new_var);
}


int main()
{
  //Measurements and measurement variance
  double measurements[5] = { 5, 6, 7, 9, 10 };
  double measurement_sig = 4;
  
  //Motions and motion variance
  double motion[5] = { 1, 1, 2, 1, 1 };
  double motion_sig = 2;
  
  //Initial state
  double mu = 0;
  double sig = 1000;


  for (int i = 0; i < sizeof(measurements) / sizeof(measurements[0]); i++) {
    tie(mu, sig) = measurement_update(mu, sig, measurements[i], measurement_sig);
    printf("update: [%f, %f]
", mu, sig);
    tie(mu, sig) = state_prediction(mu, sig, motion[i], motion_sig);
    printf("predict: [%f, %f]
", mu, sig);
  }


  return 0;
}

审核编辑 :李倩


温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信