如何使用加速度计检测1G以上的振动?

3

我正在开发一款类似于汽车黑匣子的安卓应用程序,记录汽车行驶过程。

但现在我面临一个问题,如何整合一个可以检测微小移动(可能> 1Gs)的加速度计,当发生事故时它能够触发视频录制停止并将其保存到存档文件中,从而不会因事故而丢失文件。有人知道如何监测任何形式的振动吗?

我是安卓/Java的新手,可以有人帮助我指导一下吗?先谢谢了...

这是视频录制部分的一部分,但现在我该如何将加速度计整合到“自动归档”中呢?


第一个try块缺少“{”和“catch”块! - CRM
1个回答

1

你需要使用接口 SensorEventListener 的回调函数 onSensorChanged(SensorEvent event)

在这里获取 SensorEvent 类的详细信息:http://developer.android.com/reference/android/hardware/SensorEvent.html

IBM 的 developerWorks 页面上有一个示例:http://www.ibm.com/developerworks/opensource/library/os-android-sensor/index.html


来自 Android 参考页面:

public final float[]

values Since: API Level 3

values数组的长度和内容取决于正在监测的传感器类型(有关使用的坐标系的定义,请参见SensorEvent)。 Sensor.TYPE_ACCELEROMETER:所有值都以国际单位制(m/s^2)表示。

values[0]:x轴上的加速度减去Gx

values[1]:y轴上的加速度减去Gy

values[2]:z轴上的加速度减去Gz

这种类型的传感器测量应用于设备的加速度(Ad)。从概念上讲,它通过使用关系式测量施加在传感器本身上的力(Fs)来实现:Ad = -∑Fs / mass

特别地,重力的作用力始终影响着测量的加速度:Ad = -g - ∑F / mass

因此,当设备放在桌子上(显然不加速)时,加速度计读取9.81 m/s^2的大小。

同样,当设备处于自由落体状态并且危险地朝向地面加速时,其加速度计读数为0 m/s^2。

很明显,为了测量设备的实际加速度,必须消除重力的作用。这可以通过应用高通滤波器来实现。相反,可以使用低通滤波器来隔离重力。

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

嗨,谢谢你的回答。但是很不幸,我并不擅长物理学... 但是我该如何将你上面的代码实现到我的当前活动类中,以感知任何大于1G力的碰撞呢? - Vivian
@Vivian,你读了上面的链接吗?那里有关于如何实现监听器的示例。然后使用 onSensorChanged(...) 发布的代码,并对 linear_acceleration 数组执行任何想要的操作。在你的情况下,我认为你需要比1G大得多的加速度值才能检测到碰撞。我不知道具体数值,你将不得不研究出最佳阈值是什么。最后一个提示:考虑加速度的绝对值 - Aleadam
抱歉,如果我没有理解你的意思或者你提供的文档,因为我只是一个刚学了一个月左右的Android编程业余爱好者,而且这个任务只有两周时间才能完成,由我的讲师分配给我... :( 因为我不太明白如何使用linear_acceleration的值来编写onSensorChanged(...)以触发停止记录并将其存档到目录中。我知道我可能要求过多,因为这不是你的任务...但你能给我更多的帮助吗? - Vivian
@Vivian,在onSensorChanged方法内添加一个if块,并在加速度高于阈值时调用startRecording()函数。您应该能够与您的讲师讨论实现细节。此外,我看到您有三个已回答的问题。请考虑将它们标记为已接受。请记住,这是一个提出具体问题的网站,而不是完全功能的代码块。 - Aleadam
你能告诉我这两个答案哪一个更好吗?--> http://stackoverflow.com/questions/5321476/speedometer-using-accelerometer-no-output 和 https://dev59.com/cVfUa4cB1Zd3GeqPFjIK - Vivian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接