android-检测向下加速度,特别是电梯
我希望能够检测到手机对地面有加速度的情况(可能意味着这里也必须使用重力传感器) 我在Android文档中读了很多关于这个主题的文章,关于高通和低通滤波器以及其他文章,现在我有一个代码示例,在去掉重力后,可以得到X、Y和Z轴上的加速度:android-检测向下加速度,特别是电梯,android,accelerometer,android-sensors,hardware-acceleration,acceleration,Android,Accelerometer,Android Sensors,Hardware Acceleration,Acceleration,我希望能够检测到手机对地面有加速度的情况(可能意味着这里也必须使用重力传感器) 我在Android文档中读了很多关于这个主题的文章,关于高通和低通滤波器以及其他文章,现在我有一个代码示例,在去掉重力后,可以得到X、Y和Z轴上的加速度: if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { final float alpha = (float) 0.8; gravity[0] = alpha * g
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
final float alpha = (float) 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];
}
因此,linear_加速度
应该是在没有重力的情况下,X,Y,Z轴上的加速度
这一切都很好,但问题显然在于,这取决于用户如何握住手机,例如,在电梯中-如果他将手机放平,与地面平行-Z轴将发生变化,如果他将手机放直-Y轴将发生变化,等等
因此,例如,如果用户斜握着手机,加速度将在不同的轴之间“分割”,并且考虑到重力方向的位置,需要某种数学工作来计算该方向上的实际加速度
如果我错了,请纠正我
是否有可靠的方法检测向下(朝向地球)加速度?也许使用其他传感器,比如陀螺仪
顺便说一句,关于线性加速度,我读了这篇文章,说它实际上不是很精确 使用一些基本的物理知识。加速度是一个矢量。向量v的大小始终等于(v.v)^.5,或点积的平方根。或者用更简单的术语(x^2+y^2+z^2)^.5。这会告诉你加速度的大小,但不会告诉你它是朝向还是远离地球 如果您需要知道它是朝向地球还是远离地球,您可以将其与SensorManager.getOrientation中的数据结合起来。在他们进入电梯之前,你可能需要这样做——方向代码使用重力作为输入之一,因此如果你试图在电梯中使用它,它可能会出错。你需要测试一下
如果你需要把它分解成地球x,y,z轴的加速度-简单的几何。从方向结果中获取角度,并使用trig属性转换轴。如果你不知道公式,你需要在trig上读一读,否则即使我告诉你,你也会弄错的。我还想测量垂直运动。我就是这样做的,这对我很有效。第一次在这个网站上发布,我不知道如何正确格式 使用两种不同的android传感器:
Type\u线性加速度和Type\u重力
线性加速度会在手机的X、Y和Z轴上产生加速度,重力也会产生同样的加速度,但只是重力。您知道重力值之和应该=9.8,但这将在X、Y和Z坐标之间分割,具体取决于手机方向
我不会过多地讨论它的数学问题,但是下面的内容将给出没有重力的垂直加速度。如果你想更深入地理解它,就要像垂直握着手机一样,通过一些值,然后水平握着,即使手机倾斜,它也能工作
垂直加速度=(linearacelx*GravityX/9.8)+(linearacely*GravityY/9.8)+(linearacelz*GravityZ/9.8)
参见下面的代码(删除不相关的部分):
你能使用变化最大的轴值吗?谢谢你的回答。我确实用你的公式计算出了总加速度,我得到了方位的俯仰角、横滚角和方位角,但我真的不知道如何从这里继续,得到朝向地球的加速度。
{public class MainActivity extends AppCompatActivity implements SensorEventListener {
SensorManager sm;
Sensor linearaccelerometer;
Sensor gravity;
double Yaccel;
double Xaccel;
double Zaccel;
double gravityY;
double gravityX;
double gravityZ;
double verticalAccel;
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
linearaccelerometer = sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
gravity = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);
sm.registerListener(this, linearaccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
sm.registerListener(this, gravity, SensorManager.SENSOR_DELAY_NORMAL);
}
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
if (sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
Xaccel = (double) event.values[0];
Yaccel = (double) event.values[1];
Zaccel = (double) event.values[2];
}
if (sensor.getType() == Sensor.TYPE_GRAVITY) {
gravityX = (double) event.values[0];
gravityY = (double) event.values[1];
gravityZ = (double) event.values[2];
}
verticalAccel = (Xaccel * gravityX / 9.8) + (Yaccel * gravityY / 9.8) + (Zaccel *gravityZ /9.8);
}