android-检测向下加速度,特别是电梯

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

我希望能够检测到手机对地面有加速度的情况(可能意味着这里也必须使用重力传感器)

我在Android文档中读了很多关于这个主题的文章,关于高通和低通滤波器以及其他文章,现在我有一个代码示例,在去掉重力后,可以得到X、Y和Z轴上的加速度:

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);

}