当前位置: 首页 > news >正文

gps卡尔曼滤波 matlab,opencv – 如何使用卡尔曼滤波器来预测介于两者之间的gps位置...

我研究了OpenCV卡尔曼滤波器实现并完成了一些基本的鼠标指针仿真并理解了基本知识.我似乎错过了在我的应用程序中使用它的一些关键点,并希望这里有人可以提供一个小例子.

使用具有速度和位置的简单模型:

KF.statePre.at(0) = mouse_info.x;

KF.statePre.at(1) = mouse_info.y;

KF.statePre.at(2) = 0;

KF.statePre.at(3) = 0;

KF.transitionMatrix = (Mat_(4, 4) << 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1);

setIdentity(KF.measurementMatrix);

setIdentity(KF.processNoiseCov, Scalar::all(1e-2));

setIdentity(KF.measurementNoiseCov, Scalar::all(1e-1));

setIdentity(KF.errorCovPost, Scalar::all(.1));

我可以做一个预测

Mat prediction = KF.predict();

我可以做一个纠正

Mat estimated = KF.correct(measurement);

在循环中这样做我不完全理解预测,估计和测量的含义.

因为衡量是一个“真实”的价值,可以用一些公平来衡量.让我们说GPS纬度和经度.

我认为这个视频展示了一些有趣的想法. https://www.youtube.com/watch?v=EQD0PH09Jvo.它使用GPS测量单位,以1hz更新,然后使用卡尔曼滤波器以10赫兹的速率预测值.

这样的设置怎么样?以下示例是如何做到的?

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat estimated = KF.correct(measurement);

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat prediction = KF.predict();

Mat estimated = KF.correct(measurement);

我不确定是否可以预测9个值,然后第10个提供测量值.

我是一些我想测试的记录数据.

记录的数据是文件中1hz的gps数据,其中每行是:timestamp:lat:lng并且在一个单独的文件中以15hz记录一系列事件:timestamp:eventdata.

我想使用卡尔曼滤波器模拟数据收集并根据1hz测量结果预测所有eventdata时间戳的位置.因为用opencv这样做的一个完整的例子会很好,但只有上面的问题的起始指针有预测和正确也是可以接受的.

更新

我试了一下.

int main()

{

char * log = "C:/dev/sinnovations/opencv_examples/kalman_tracking/data/geosamples.txt";

char * log1 = "C:/dev/sinnovations/opencv_examples/kalman_tracking/data/geosamples1.txt";

ifstream myReadFile(log);

ofstream myfile(log1);

myfile.precision(15);

KalmanFilter KF(4, 2, 0,CV_64F);

Mat_ state(4, 1);

Mat_ processNoise(4, 1, CV_64F);

Mat_ measurement(2, 1); measurement.setTo(Scalar(0));

KF.statePre.at(0) = 0;

KF.statePre.at(1) = 0;

KF.statePre.at(2) = 0;

KF.statePre.at(3) = 0;

KF.transitionMatrix = (Mat_(4, 4) << 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1); // Including velocity

KF.processNoiseCov = (cv::Mat_(4, 4) << 0.2, 0, 0.2, 0, 0, 0.2, 0, 0.2, 0, 0, 0.3, 0, 0, 0, 0, 0.3);

setIdentity(KF.measurementMatrix);

setIdentity(KF.processNoiseCov, Scalar::all(1e-4));

setIdentity(KF.measurementNoiseCov, Scalar::all(1e-1));

setIdentity(KF.errorCovPost, Scalar::all(.1));

std::vector < cv::Point3d > data;

while (!myReadFile.eof())

{

double ms;

double lat, lng, speed;

myReadFile >> ms;

myReadFile >> lat;

myReadFile >> lng;

myReadFile >> speed;

data.push_back(cv::Point3d(ms, lat, lng));

}

std::cout << data.size() << std::endl;

for (int i = 1, ii = data.size(); i < ii; ++i)

{

const cv::Point3d & last = data[i-1];

const cv::Point3d & current = data[i];

double steps = current.x - last.x;

std::cout << "Time between Points:" << current.x - last.x << endl;

std::cout << "Measurement:" << current << endl;

measurement(0) = last.y;

measurement(1) = last.z;

Mat estimated = KF.correct(measurement);

std::cout << "Estimated: " << estimated.t() << endl;

Mat prediction = KF.predict();

for (int j = 0; j < steps; j+=100){

prediction = KF.predict();

myfile << (long)((last.x - data[0].x) + j) << " " << prediction.at(0) << " " << prediction.at(1) << endl;

}

std::cout << "Prediction: " << prediction.t() << endl << endl;

}

return 0;

}

但是缺少了一些东西,因为结果可以在图片中看到.红色圆圈是记录值,蓝色线是lat lng值的第一个坐标的预测值:

我不认为我处理观察时间值和预测值的方式是正确的.

相关文章:

  • matlab计算最大特征向量,MATLAB求最大特征值和特征向量
  • “赞助开源项目跟踪”无奈的外包——CSDN外包实践(63)
  • matlab home选项卡 tu,在使用MATLAB“绘图”选项卡中的命令按钮绘图之前,需要( )。...
  • 下一代 Windows 需要哪些改进
  • python温度传感器,基于python经过树莓派获取温度传感器的温湿度
  • 微软最走运、最倒霉的十个瞬间
  • php九大函数,PHP函数整理(一)
  • OSPF路由协议在CISCO路由器上的应用
  • wpcomments post.php,垃圾评论带来的流量流失
  • H3C基本命令学习
  • Linux下oracle em安装,手动安装em(redhat 5/oracle 11g)
  • 马宁的Windows Mobile开发培训概述
  • oracle非归档恢复,非归档模式恢复数据库__oracle_ORA_DISK_channel_dbf_PROD__169IT.COM
  • 错误:文件被数字签名策略拒绝(File was rejected by digital signature policy)
  • Oracle数据所属表分区,oracle数据库表分区
  • Brief introduction of how to 'Call, Apply and Bind'
  • gops —— Go 程序诊断分析工具
  • maya建模与骨骼动画快速实现人工鱼
  • nginx 配置多 域名 + 多 https
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python - 闭包Closure
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 驱动程序原理
  • 使用API自动生成工具优化前端工作流
  • 写给高年级小学生看的《Bash 指南》
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 由插件封装引出的一丢丢思考
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Linux权限管理(week1_day5)--技术流ken
  • 阿里云ACE认证之理解CDN技术
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 数据结构
  • #pragma预处理命令
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (20050108)又读《平凡的世界》
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十一)手动添加用户和文件的特殊权限
  • (转)iOS字体
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET Core 项目指定SDK版本
  • .NET MVC 验证码
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net(C#)常用转换byte转uint32、byte转float等
  • /etc/motd and /etc/issue
  • [04] Android逐帧动画(一)
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BT]BUUCTF刷题第4天(3.22)
  • [BT]BUUCTF刷题第9天(3.27)
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [CSS3备忘] transform animation 等
  • [Java]快速入门优先队列(堆)手撕相关面试题