- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开展一个项目,通过数据融合来跟踪安装在移动设备上的摄像头的位置。我得到的数据是
1) 来自源 A 的相机在 x、y 和 z 方向的速度
2) 来自源 B 的当前帧和上一帧位置之间的差异(在 2D 中,Z 不应以任何方式改变)
我已经做了一个类似的项目,但没有任何数据融合,而是使用了在 OpenCV 中实现的卡尔曼滤波器。
目前,我一直对迄今为止在网上找到的所有不同实现技术感到困惑。
我如何将我获得的数据插入/组合到 KF/EKF 的不同组件中?
我有这个例子来改变 OpenCV-KF 以作为 EKF 工作。它看起来很像我需要的东西,除了我的对象实际上是相机本身并且还能够在 y 轴和 x 轴上移动,轮流,......而且我得到的不是对象的像素坐标上述数据。 https://sites.google.com/site/timecontroll/home/extended-kalman-filtering-with-opencv
不幸的是,我不确定如何定义我的转换和测量函数以及相应的矩阵。
令 x(k) 为当前状态,deltaT 为自上次更新以来耗时。
对于 1 它可能是这样的:
x(k) = x(k-1) + deltaT 乘以速度(k-1)
对于 2:
x(k) = x(k-1) + differenceBetweenFrames
所以让我们假设两个数据源的权重相同,这让我认为结合起来会是这样的:
x(k) = x(k-1) + (deltaT 乘以速度(k-1) + differenceBetweenFrames)/2
对于测量:我通过源 A 获得 X、Y 和 Z 方向的速度,并通过源 B 获得 X 和 Y 坐标中当前帧与上一帧之间的差异。
这是有道理的还是我已经错了?我将如何调整我的转换和测量矩阵并相应地更新我的当前状态?
最佳答案
您走在正确的轨道上,但您似乎对转换函数和测量函数的概念感到困惑。
首先要做的是明确定义要考虑的状态 vector 。在你的情况下,位置 [px, py, pz] 和速度 [vx, vy, vz] 就足够了:
xk = [pxk, pyk, pzk , vxk, vyk, vzk]
第二件事是选择一个转换函数来模拟系统的动态。请注意,这与传感器测量无关:它只是系统状态如何随时间演变的模型。在位置和速度的情况下,一个非常简单的模型如下(但如果需要,您可以选择使用更高级的模型):
pk = [pxk, pyk, pzk ] =pk-1 + dT 。 vk-1
vk = vk-1
这可以用矩阵形式表示如下:
[ 1 0 0 dT 0 0 ]
[ 0 1 0 0 dT 0 ]
[ 0 0 1 0 0 dT ]
x(k) = [ 0 0 0 1 0 0 ] . x(k-1)
[ 0 0 0 0 1 0 ]
[ 0 0 0 0 0 1 ]
最后,您需要导出传感器的测量函数。此测量函数表示当我们知道状态 vector 时可以推断传感器测量值的方式。
您的源 A 测量系统的速度,因此测量函数如下:
hA( xk ) = vk
或者矩阵形式:
[ 0 0 0 1 0 0 ]
hA{x(k)} = [ 0 0 0 0 1 0 ] . x(k)
[ 0 0 0 0 0 1 ]
你的源B测量的是位置差,因此测量函数如下:
hB( xk ) = pk - pk-1 = pk-1 + dT 。 vk-1 - pk-1 = dT 。 vk-1 = dT 。 vk
或者矩阵形式:
[ 0 0 0 dT 0 0 ]
hB{ x(k) } = [ 0 0 0 0 dT 0 ] . x(k)
[ 0 0 0 0 0 dT ]
如果你想对源 B 有一个更准确的测量函数,你可能想在你的状态 vector 中添加上一个时间步的位置,如下所示:
xk = [pxk, pyk, pzk , pxk-1, pyk-1, pzk-1,vxk, vy>k, vzk]
转换函数将变为:
[ 1 0 0 0 0 0 dT 0 0 ]
[ 0 1 0 0 0 0 0 dT 0 ]
[ 0 0 1 0 0 0 0 0 dT ]
x(k) = [ 0 0 0 1 0 0 0 0 0 ] . x(k-1)
[ 0 0 0 0 1 0 0 0 0 ]
[ 0 0 0 0 0 1 0 0 0 ]
[ 0 0 0 0 0 0 1 0 0 ]
[ 0 0 0 0 0 0 0 1 0 ]
[ 0 0 0 0 0 0 0 0 1 ]
源 A 的测量函数将变为:
[ 0 0 0 0 0 0 1 0 0 ]
hA{x(k)} = [ 0 0 0 0 0 0 0 1 0 ] . x(k)
[ 0 0 0 0 0 0 0 0 1 ]
源 B 的测量函数将变为:
[ 1 0 0 -1 0 0 0 0 0 ]
hB{x(k)} = [ 0 1 0 0 -1 0 0 0 0 ] . x(k)
[ 0 0 1 0 0 -1 0 0 0 ]
也就是说,测量系统的速度及其位置的差异几乎是相同的。由于您从不测量位置,因此您的状态可能无法观察到,这可能会成为一个问题。查看以下文档了解更多详细信息:
关于c++ - 在 OpenCV/C++ 中通过(扩展)卡尔曼滤波器实现数据融合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263495/
我输入了一个包含两个元素的 vector 。然后我将另一个元素 push_back 到它,并期望什么结果类型也是一个 vector 。但事实并非如此。 例子: typedef boost::fusio
首先让我先说,我以前在这里问过类似的问题,但从来没有得到解决我缺乏知识/问题的好答案。 首先,让我从一个分支策略提案开始。这就是我们的工作,我很高兴听到其他评论,以及为什么这很糟糕。但要明白它通常对我
所以我将一个带有 javascript 的字符串发送到 php 页面: if(cp.value!=''){ s+=cp.name +" LIKE '%"+ cp.value +"%'";
我有一个简单的问题,我该如何使用 which和 which.max同时。 我想选择最大值epnum为行 id == B13639J2 . 我需要检索 row number因为我需要对变量进行一些手动更
我想将带有 Groovy 脚本的文件上传到 Confluence。 As this Pythonscript example!我开始将代码翻译成 groovy, // Groovy def serve
我有一个融合 vector ,其元素具有多个不同类型的成员数据,我想创建一个新的融合 vector ,它将仅投影特定的数据成员。我已经对此进行了一段时间的研究,但没有任何进展。 #include #
我正在尝试使用 Python 的 xmlrpclib 创建一个新的页面以汇合。我已经知道如何更新现有页面的内容,但如何创建一个全新的页面? 我使用了以下脚本来更新内容: import xmlrpcli
我正在使用 Pow 在 Mac OS X 上为 Rack 应用程序提供服务。http://myapp.dev正确显示应用程序。在同一台机器上,我使用 VMware Fusion 运行 Windows
我检查了 Cassandra 和 Infinispan 的主要特性。它们似乎具有并提供非常相似的特性和功能: NoSQL 数据存储 坚持 去中心化 支持复制 可扩展性 容错 MapReduce 支持
我在Drupal 7网站中使用Search API和Elasticsearch Connector。我已经在AWS中托管了elasticsearch。搜索完美无误。但是我想像在Drupal.org搜索
我最近重新打开了几年前参与的一个项目。我写了一个小的 python 脚本来构建项目。我想将其移植到 CMake。 我遇到的问题是脚本使用了 pkg-config在 linux 上找到 fuse 头文件
我正在尝试访问 Yelp fusion API。我正在关注documentation并来到这段代码: const request = require('request'); // As you can
这是一个 vanilla Ubuntu 16.04 LTS,准确地说是基于 Xubuntu core。所以我需要自己安装包。除了 meld 之外,一切都很顺利,开始时,我会得到: (meld:4188
我正在尝试对惰性求值在 Java 流 API 中的应用形成一个简洁而连贯的理解。 这是我目前的理解: 元素仅在需要时才被消耗,即流是惰性的,中间操作也是惰性的,例如过滤器,仅在需要时进行过滤。 中间操
我使用 conluent jdbc-sink 将数据从 kafka 加载到 oracle。 但是我用数据编写了关于值(value)的模式。 我不想用数据编写模式,如何在 kafka 主题上编写模式,然
我在这里编写了一个 2D 融合套索代码。 [m n] = size(circle); cvx_begin variable theta(m, n); minimize( norm(ci
目前我正在开发一个使用 dx9 创建叠加层的应用程序。现在我遇到了一个问题,自从我将 Windows 10 升级到最新版本(Creators Update)后,它无法使用 alpha channel
我正在尝试编写类似 fiber 的代码,这样我就可以进入任务并从中退出。我试过的代码: class TaskActivity { CancellationTokenSource _m=new
我使用 NPM 在 React.js 中创建了一个前端。作为 IDE,我在这里使用 IntelliJ IDEA。该项目将使用我单独创建的 Spring Boot 编写的后端,也在 IntelliJ I
Cassandra 连接器在融合升级到 3.3.0 后失败。 Cassandra驱动的版本是3.3。堆栈如下。 [2017-09-14 08:56:28,123] ERROR java.lang.re
我是一名优秀的程序员,十分优秀!