Android获得标准化加速度

Android获得标准化加速度,android,physics,accelerometer,trigonometry,gyroscope,Android,Physics,Accelerometer,Trigonometry,Gyroscope,我想得到Android手机的加速度矢量。问题是,加速计坐标与手机的旋转有关。我想要的是“绝对”加速度,也就是说,无论手机朝向哪个方向,它都应该返回相同的值。(我想检测正在滑雪的用户是否在不使用GPS的情况下从斜坡上滑下。我还需要能够区分滑下和爬上升降椅。) 我可能可以通过组合加速度计和陀螺仪得到这些值,但我不知道如何用陀螺仪抵消加速度计的值 这可能吗?如果可能,如何计算?无论手机的方向如何,都可以使用以下方法计算加速度: a = sqrt(x*x + y*y + z*z) 其中,a是绝对加速度

我想得到Android手机的加速度矢量。问题是,加速计坐标与手机的旋转有关。我想要的是“绝对”加速度,也就是说,无论手机朝向哪个方向,它都应该返回相同的值。(我想检测正在滑雪的用户是否在不使用GPS的情况下从斜坡上滑下。我还需要能够区分滑下和爬上升降椅。)

我可能可以通过组合加速度计和陀螺仪得到这些值,但我不知道如何用陀螺仪抵消加速度计的值


这可能吗?如果可能,如何计算?

无论手机的方向如何,都可以使用以下方法计算加速度:

a = sqrt(x*x + y*y + z*z)

其中,
a
是绝对加速度,
x
y
z
是手机3个轴的加速度计值。

考虑使用GPS。在飞行记录应用程序中,我使用加速度(尽管是绝对值,而不是矢量)来过滤嘈杂的GPS数据(我删除了速度变化所需加速度不合理的位置):


如果你用上一次修正和当前修正的坐标来计算速度,你得到的加速度是矢量。

除非你重新定义一下这个问题,否则你所描述的无法实现。为了帮助您重新定义它,我将概述主要问题:

首先,我猜你所说的“绝对加速度”是指相对于地理参考的加速度。由于加速计不知道地理参考,因此无法单独使用加速计进行测试。如果你移动得足够远,可以使用gps,或者使用指南针,你也许可以绕过这个问题,但是每一个问题都有它自己的问题(尽管至少这个问题是可以解决的)

第二个问题是,仅使用加速度计完全无法区分重力和加速度(这被称为“等效原理”)。因此,任何测量的加速度总是重力和加速度的矢量和,但这些方程总是有多个解,在加速度小于重力的通常情况下,你真的无法确定加速度的任何东西。虽然重力是恒定的,但也有办法解决这个问题,比如使用陀螺仪,或者用户可以将手机保持在固定的方向(例如,通过观察地平线等外部线索),这两种方法中的任何一种都可以让您减去重力的影响,但这通常是一个非常重要的问题

最后一点是,你似乎是在地球固定的坐标系中思考,而手机的加速计只是手机固定的。这是加速度计的z轴,许多与地球上的上下没有任何关系,而这种关系将取决于手机的方向。事实上,很多人更喜欢地球固定系统,但手机并不知道这一点。您可以使用外部提示(GPS、磁场、陀螺仪、重力、地平线等)来尝试对齐它们,但如果只从加速度计中读取一次任意读数,信息就不存在了

定义:
加速度矢量:这是加速度计的x、y、z读数(每个读数取决于手机方向),有时写为A=(ax、ay、az)。
加速度幅值:这是a=sqrt(ax2+ay2+az2),这不应取决于手机方向(如果不同的轴被校准为相同)。如果手机静止不动,这基本上只是重力读数。还要注意的是,使用这种测量方法会丢失加速度矢量中的许多信息。
标准化加速度:加速度方向,其大小为1,即A/A
地球坐标中的加速度:我认为这是你真正想要的,没有简单的方法可以得到它,即使你可以,我也不认为它会像一开始看起来那样有用

滑雪:
我认为你有很好的机会根据加速度计的测量结果来确定某人何时滑雪。使用加速计时,颠簸和转弯等情况都应该非常独特。对于这些,我将使用全加速度向量。例如,依次,加速度大小将大致保持不变,方向将扫描。还要注意的是自由落体(即,基本上当滑雪者的天空/脚/屁股/等不在地面上时,无论他们是在发起碰撞/跳跃时向上移动,还是从升降椅上掉下来时),自由落体的加速度值将为零。对于升降椅来说,似乎在一个平面内可能会有一种独特的节奏摆动

所有这些事情都可以解决。如果你真的想解决这个问题,我建议你在滑雪时记录加速度计的数据,看看你是否能根据数据的特征来确定你什么时候滑雪。(我的猜测是,你在这方面的主要障碍将是数学,因为提出一个能够区分滑雪特征的算法可能有点棘手,所以看来复习向量数学,以及点积和叉积之类的东西是一个好主意,而且,我怀疑在另一个主题上有一点known作为FFT或傅里叶变换可能有助于整理滑雪与在举重椅中摆动的时间和频率特征。)


你也可以将GPS测量值折叠起来,这样就不那么可靠了,或者提供了很好的时间分辨率,但至少可以用来再次检查你的算法。

有些手机内置了气压计(气压传感器)。应用移动平均线后,我发现它已准备就绪,可以确定
/**
 * Remove noise from the measurement of the location.
 * @param loc a location
 * @return Answer <code>false</code> iff the location should not be used.
 */
private boolean filterNoise(final Location loc) {
    if( ! loc.hasSpeed() )
        return true;
    if( this.recentSpeeds.isEmpty() ) {  // rescentSpeeds is a queue of locations
        this.recentSpeeds.add(loc);
        return true;
    }
    final Location lastFix = this.recentSpeeds.getHead();
    final long delta_t = (loc.getTime() - lastFix.getTime()) / 1000;
    if( delta_t == 0 )
        return false;
    final float delta_v = loc.getSpeed() - lastFix.getSpeed();
    final float a = delta_v / delta_t;
    if( Math.abs(a) <= AccelThreshold ) {
        this.recentSpeeds.add(loc);
        return true;
    }
    return false;
}