6

我希望得到 Android 手机的加速度矢量。问题是,加速度计坐标是相对于手机的旋转。我想要的是“绝对”加速,即无论手机面向何种方式,它都应该返回相同的值。(我想检测正在滑雪的用户是否在不使用 GPS 的情况下滑下斜坡。我还需要能够区分滑行和上缆车。)

我可能可以通过将加速度计与陀螺仪相结合来获得这些值,但我不知道如何用陀螺仪的值来抵消加速度计的值。

这可能吗?如果可以,怎么做?

4

4 回答 4

12

除非您重新定义问题,否则您描述的内容无法完成。为了帮助您重新定义它,我将概述主要问题:

首先,我猜你所说的“绝对加速度”是指相对于地理参考的加速度。不能单独使用加速度计来完成,因为它不知道地理参考。如果您为 GPS 移动足够远,或使用指南针,您也许可以解决这个问题,但每个问题都有其自身的问题(尽管至少问题是可以解决的)。

第二个问题是仅使用加速度计完全无法区分重力和加速度(这被称为“等效原理”)。因此,任何测得的加速度总是重力和加速度的矢量和,但这些方程总是有多个解,在通常加速度小于重力的情况下,你真的无法确定加速度. 由于重力在某种程度上是恒定的,因此也有一些方法可以解决这个问题,例如使用陀螺仪,或者您的用户可以将手机保持在固定方向(例如,通过查看像地平线这样的外部线索),并且其中任何一个方法可能会让你减去重力的影响,但这通常是一个不平凡的问题。

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

定义:
加速度矢量:这是来自加速度计的 x、y、z 读数(每个读数将取决于手机的方向),有时写为 A=(a x , a y , a z )。
加速度幅度:这是 a=sqrt(a x 2 + a y 2 + a z 2 ),这不应该取决于手机的方向(如果不同的轴被校准为相同)。如果手机是静止的,这基本上只是重力读数。另请注意,使用此度量会丢失加速度矢量中的许多信息。
归一化加速度: 加速度方向, 大小为 1,
地球坐标中的 A/a加速度:我认为这是你真正想要的, 没有简单的方法得到它, 真的即使你能, 我不认为它会像起初看起来一样有用。

滑雪
我认为您可以根据加速度计的测量结果确定某人何时滑雪。使用加速度计,颠簸和转弯之类的东西都应该非常独特。对于这些,我将使用完整的加速度矢量。例如,反过来,加速度大小将保持大致恒定,方向将扫过。还要注意自由落体(即,基本上每当滑雪者的天空/脚/屁股/等不在地面上时,无论他们是在跳跃/跳跃时向上上升,还是从升降椅上掉下来) ,在自由落体中加速度幅度为零。对于吊椅索道,似乎它可能会在一个平面内具有独特的节奏摇摆。

所有这些事情都可以弄清楚。我建议,如果你真的想解决这个问题,那就是在滑雪时记录你的加速度计的数据,看看你是否可以根据数据的特征确定你什么时候滑雪。(我的猜测是,你的主要绊脚石将是数学,因为想出一个可以区分滑雪特征的算法可能有点棘手,所以看起来检查向量是个好主意数学,以及点积和叉积之类的东西,而且,我怀疑另一个称为 FFT 或傅里叶变换的主题可能有助于整理滑雪与在升降椅上摆动的时间和频率特征.)

您还可以折叠 GPS 测量,这不会那么可靠,或者提供良好的时间分辨率,但至少可以用来仔细检查您的算法。

于 2012-01-18T18:58:58.190 回答
3

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

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

其中a是绝对加速度xyz是手机 3 个轴中每个轴的加速度计值。

于 2011-12-19T18:17:25.060 回答
1

有些手机内置了气压计(气压传感器)。应用移动平均线后,我发现它已准备好确定用户是上升还是下降 - 也许对您的问题有用。在 Galaxy s4 和 5 上,我得到了足够好的分辨率来确定设备是否刚刚从桌子上移到了地板上。

请注意,天气的逐渐变化会影响您的读数,因此您必须在合理的时间间隔内考虑 Delta,并忽略某个阈值附近的变化。

于 2015-07-03T08:15:20.980 回答
0

考虑使用 GPS。在飞行记录应用程序中,我使用加速度(尽管是绝对值,而不是矢量)来过滤嘈杂的 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;
}

如果您使用上一次定位和当前定位的坐标计算速度,您将获得加速度作为矢量。

于 2012-01-18T08:40:09.987 回答