我正在开发一款类似于汽车黑匣子的安卓应用程序,记录汽车行驶过程。
但现在我面临一个问题,如何整合一个可以检测微小移动(可能> 1Gs)的加速度计,当发生事故时它能够触发视频录制停止并将其保存到存档文件中,从而不会因事故而丢失文件。有人知道如何监测任何形式的振动吗?
我是安卓/Java的新手,可以有人帮助我指导一下吗?先谢谢了...
这是视频录制部分的一部分,但现在我该如何将加速度计整合到“自动归档”中呢?
我正在开发一款类似于汽车黑匣子的安卓应用程序,记录汽车行驶过程。
但现在我面临一个问题,如何整合一个可以检测微小移动(可能> 1Gs)的加速度计,当发生事故时它能够触发视频录制停止并将其保存到存档文件中,从而不会因事故而丢失文件。有人知道如何监测任何形式的振动吗?
我是安卓/Java的新手,可以有人帮助我指导一下吗?先谢谢了...
这是视频录制部分的一部分,但现在我该如何将加速度计整合到“自动归档”中呢?
你需要使用接口 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];
}
onSensorChanged(...)
发布的代码,并对 linear_acceleration
数组执行任何想要的操作。在你的情况下,我认为你需要比1G大得多的加速度值才能检测到碰撞。我不知道具体数值,你将不得不研究出最佳阈值是什么。最后一个提示:考虑加速度的绝对值。 - AleadamonSensorChanged
方法内添加一个if块,并在加速度高于阈值时调用startRecording()
函数。您应该能够与您的讲师讨论实现细节。此外,我看到您有三个已回答的问题。请考虑将它们标记为已接受。请记住,这是一个提出具体问题的网站,而不是完全功能的代码块。 - Aleadam