java - 实时一维数据中的台阶检测

标签 java math real-time detection

对于一个小项目,我们正在尝试为轨道车实现自动驾驶仪。陀螺仪传感器安装在汽车上,每秒传送 20 次 Z 值(即作用在汽车/传感器上的离心力大小)。其中一个关键部分是检测汽车是否处于弯道或直线部分,以及汽车何时进入和何时离开该部分。只有这样我们才能可靠地预测 future 会发生什么。

目前,我们正在使用滑动窗口来平滑数据,然后使用硬编码限制(左曲线为 -400,右曲线为 +400)来检测哪种扇区(左、右、直)我们进来了。 显然,这花费的时间太长,因为需要几条消息,直到程序检测到由于平滑和硬编码限制而发生方向变化。

以下是在简单赛道上进行两轮比赛的示例,从方格区域开始: Example graph Example race track

完美的算法将在一轮中检测 S R S R S L S R S R S R S 扇区,并且仅延迟几个数据点。

我们考虑过使用陀螺仪值的一阶导数,但在第一条左曲线之后的示例图中,接下来的右曲线(22:36:40 和 22:36:42 之间)显示出转向的迹象。这里一阶导数将接近 0 并表示直线部分...... 此外,我们需要再次设置一个硬编码阈值,但由于数据的噪声,轨道中的小凹凸可能会导致噪声水平使其导数超过阈值。

现在我们不确定处理此类检测的最简单/最快/最可靠的方法是什么。使用衍生品是个好主意吗?有更好的办法吗?

任何意见将不胜感激:)

现有软件是用Java编写的。

最佳答案

在此类问题中,您必须牺牲稳健性来换取即时性。如果你不知道 future 会发生什么,你就只能做出假设。这些假设可能成立,也可能不成立。

从数据的外观来看,不需要任何平滑处理。如果定义合理的阈值,则应该非常可靠地识别曲线。但是,如果情况并非如此,您可以尝试以下一些操作:

您已经提到了平滑。关键是你如何平滑。非对称平滑内核可能是理想的(半三角形滤波器可以在恒定时间内更新)。您可以通过修改内核宽度直接权衡鲁棒性和即时性。

过滤的一个简单替代方法是计数。如果您的数据高于曲线阈值,则暂时不要将其称为曲线。计算连续有多少个数据点高于阈值。如果超过阈值的数据点超过 n 个,那么您很可能处于曲线中。

使用衍生品可能会出现问题。反对导数的主要原因是曲线根本不是由任何导数定义的(至少没有力的导数)。第二个问题是你只能以数值方式估计导数,这很不稳定,有很多噪音。因此,您必须平滑数据(或为噪声模型找到数值方案),这又需要一些延迟。

关于java - 实时一维数据中的台阶检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34111736/

相关文章:

java - 使用 testNG Maven 从 info.cukes 更改为 io.cucumber。抛出运行时错误

java - 如何使用 java dom 从 xml 中删除 namespace ?

java - 如何使用 jsoup 从表中解析值?

c# - 在 C# 中计算中值绝对偏差

javascript - 我正在尝试求解 node.js 中的非线性方程组

ios - Swift SceneKit 是围绕由两个 3D 点定义的轴的胶囊内的点

linux - ioread 中的延迟

Java Swing 在 MigLayout 中添加图像代码似乎不起作用?

iphone - 如何在两个iOS设备之间有效传输实时视频(如facetime、skype、fring、tango)

linux - rdts 标记时间截止日期