对于一个小项目,我们正在尝试为老虎车实施自动驾驶仪。陀螺仪传感器安装在汽车上,每秒20次传递Z值(意味着作用在汽车/传感器上的离心力的大小)。其中一个关键部分是检测汽车是否处于曲线或直线部分以及何时进入并且何时离开该部分。只有这样,我们才能对未来发生的事情进行可靠的预测。
至于现在,我们正在使用滑动窗口来平滑数据,然后使用硬编码限制(左曲线为-400,右曲线为+400)来检测哪种扇区(左,右,直接)我们在。 显然这需要太长时间,因为它需要一些消息,直到程序检测到它是一个方向改变,因为平滑和硬编码限制。
一个完美的算法可以检测一轮的扇区S R S R S S S S S S S S,只有几个数据点的延迟。
我们考虑使用陀螺仪值的一阶导数,但在第一条左曲线后面的样本图中,下面的右曲线(在22:36:40和22:36:42之间)显示出转向的迹象。这里的一阶导数将接近0并表示直线部分...... 此外,我们需要再次设置硬编码阈值,但是对于数据的噪声,轨道中的小凹凸可能会导致这样的噪声水平导致它的导数超过阈值。
现在我们不确定处理这种检测的最简单/最快/最可靠的方法。使用衍生物会是一个好主意吗?还有更好的方法吗?
非常感谢任何输入:)
现有软件是用Java编写的。
答案 0 :(得分:1)
在这些问题中,你必须交易稳健性以实现即时性。如果您不知道将来会发生什么,您只能做出假设。这些假设可能会持有也可能不会。
从数据的外观来看,不应该进行必要的平滑处理。如果定义合理的阈值,则应该非常可靠地识别曲线。但是,如果不是这种情况,可以尝试以下方法:
你已经提到了平滑。关键是你如何平滑。可能需要非对称平滑内核(可以在恒定时间内更新半三角滤波器)。您可以通过修改内核宽度来直接衡量稳健性和即时性。
过滤的一个简单替代方法是计算。如果您的数据高于曲线阈值,请暂时不要将其称为曲线。计算连续多少个数据点高于阈值。如果超过阈值的n
个数据点超过static String getString()
{
String eisodos;
InputStreamReader eisodosString = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(eisodosString);
try
{
eisodos=br.readLine();
}
catch(Exception e)
{
return "x";
}
}
,那么您最有可能处于曲线中。
使用衍生物可能存在问题。反对导数的主要原因是曲线不是由任何导数定义的(至少没有力的导数)。第二个问题是你只能用数字来估计导数,这是非常不稳定的,有很多噪音。因此,您必须平滑数据(或找到噪声模型的数值方案),这又需要一些延迟。