LINEAR_ACCELERATION 所需的传感器
Sensors required for LINEAR_ACCELERATION
背景:我正在开发一个应用程序,其核心功能包括从 android phone,等等。我还计划在安装应用程序的同时提供设备,因为我们的目标客户主要是组织,并且系统是本地部署的,而不是通过商店部署的。
困境 : 现在在选择设备时,设备中需要哪些硬件传感器才能可靠地获取 LINEAR_ACCELERATION
指标?
在搜索时,我发现 LINEAR_ACCELERATION
是一个 "fused" 传感器 ,它使用硬件 and/or 软件实现的组合来减去来自 ACCELEROMETER
读数的重力系数。
我找到了这个 here :
TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR are "fused" sensors which return respectively the linear acceleration, gravity and rotation vector (a quaternion). It is not defined how these are implemented. On some devices they are implemented in h/w, on some devices they use the accelerometer + the magnetometer, on some other devices they use the gyro.
关于此的其他信息不多。那么有人可以提供更多信息吗?
提前致谢。
不完全是一个答案,但据我所试,加速计不是一个非常准确的传感器。如果设备没有移动,它应该向下显示 9.8。好吧,我制作了一个应用程序,它只显示 X Y Z 读数,并且 运行 它可以在许多不同的设备上显示。 Z 读数从 8 到 11,两个设备放在同一个移动车上,显示不同的 X 和 Y 读数...
TYPE_LINEAR_ACCELERATION需要陀螺仪。
经过各种设备的反复试验,我想我现在有了一个大概的想法:
首先,来自这个android-developers forum post:
TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR are "fused" sensors which return respectively the linear acceleration, gravity and rotation vector (a quaternion). It is not defined how these are implemented. On some devices they are implemented in h/w, on some devices they use the accelerometer + the magnetometer, on some other devices they use the gyro.
就是这样。
现在我通过反复试验发现只有加速度计的设备不提供LINEAR_ACCELERATION传感器(可能会有例外,有些设备可能仍然有传感器,但 none 我试过的设备有传感器)。
所以要获得 LINEAR_ACCELERATION 传感器,您必须至少有一个磁力计或陀螺仪——这在 8000 印度卢比(120 美元)以下的智能手机中非常少见.
现在,不是问题的一部分,而是 如何在这两种类型的设备上将代码写入 运行?
嗯,我最后做的是这样的:
首先,检查设备是否有传感器:
Sensor linearAcceleration = sMgr.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
if (linearAcceleration==null){
hasLinearAccSensor = false;
}
else {
hasLinearAccSensor = true;
}
如果你有传感器,那就酷了!但如果你不这样做,那么你可以使用 TYPE_ACCELEROMETER 传感器并自己锻炼线性加速度。像这样:
public void processPseudoAcceleration(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.8f;
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];
float linear_acceleration[] = {0,0,0};
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
setAccValues(linear_acceleration[0],linear_acceleration[1],linear_acceleration[2]);
}
但请注意,在我的测试中,我发现此功能不如实际传感器读数可靠,但它适用于大多数应用。
希望有人觉得这有用。
干杯。
背景:我正在开发一个应用程序,其核心功能包括从 android phone,等等。我还计划在安装应用程序的同时提供设备,因为我们的目标客户主要是组织,并且系统是本地部署的,而不是通过商店部署的。
困境 : 现在在选择设备时,设备中需要哪些硬件传感器才能可靠地获取 LINEAR_ACCELERATION
指标?
在搜索时,我发现 LINEAR_ACCELERATION
是一个 "fused" 传感器 ,它使用硬件 and/or 软件实现的组合来减去来自 ACCELEROMETER
读数的重力系数。
我找到了这个 here :
TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR are "fused" sensors which return respectively the linear acceleration, gravity and rotation vector (a quaternion). It is not defined how these are implemented. On some devices they are implemented in h/w, on some devices they use the accelerometer + the magnetometer, on some other devices they use the gyro.
关于此的其他信息不多。那么有人可以提供更多信息吗?
提前致谢。
不完全是一个答案,但据我所试,加速计不是一个非常准确的传感器。如果设备没有移动,它应该向下显示 9.8。好吧,我制作了一个应用程序,它只显示 X Y Z 读数,并且 运行 它可以在许多不同的设备上显示。 Z 读数从 8 到 11,两个设备放在同一个移动车上,显示不同的 X 和 Y 读数...
TYPE_LINEAR_ACCELERATION需要陀螺仪。
经过各种设备的反复试验,我想我现在有了一个大概的想法:
首先,来自这个android-developers forum post:
TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR are "fused" sensors which return respectively the linear acceleration, gravity and rotation vector (a quaternion). It is not defined how these are implemented. On some devices they are implemented in h/w, on some devices they use the accelerometer + the magnetometer, on some other devices they use the gyro.
就是这样。
现在我通过反复试验发现只有加速度计的设备不提供LINEAR_ACCELERATION传感器(可能会有例外,有些设备可能仍然有传感器,但 none 我试过的设备有传感器)。
所以要获得 LINEAR_ACCELERATION 传感器,您必须至少有一个磁力计或陀螺仪——这在 8000 印度卢比(120 美元)以下的智能手机中非常少见.
现在,不是问题的一部分,而是 如何在这两种类型的设备上将代码写入 运行?
嗯,我最后做的是这样的:
首先,检查设备是否有传感器:
Sensor linearAcceleration = sMgr.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
if (linearAcceleration==null){
hasLinearAccSensor = false;
}
else {
hasLinearAccSensor = true;
}
如果你有传感器,那就酷了!但如果你不这样做,那么你可以使用 TYPE_ACCELEROMETER 传感器并自己锻炼线性加速度。像这样:
public void processPseudoAcceleration(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.8f;
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];
float linear_acceleration[] = {0,0,0};
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
setAccValues(linear_acceleration[0],linear_acceleration[1],linear_acceleration[2]);
}
但请注意,在我的测试中,我发现此功能不如实际传感器读数可靠,但它适用于大多数应用。
希望有人觉得这有用。 干杯。