首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android线性加速,计算轨迹

Android线性加速,计算轨迹
EN

Stack Overflow用户
提问于 2016-02-15 22:34:09
回答 2查看 1.5K关注 0票数 1

我想在我的车里使用我的加速度计,用加速度计的值,在excel或任何其他平台上画一条轨迹,原点在第一个位置值,也就是路径的开始。

我如何才能做到这一点?请告诉我细节,我没有任何物理概念。

请帮忙,提前谢谢。

附言:我已经编写了SensorListener……

例如,我有这样的例子:

代码语言:javascript
复制
@Override
public void onSensorChanged(SensorEvent event){
    if(last_values != null){
        float dt = (event.timestamp - last_timestamp) * NS2S;
        for(int index = 0 ; index < 3 ; ++index){
            acceleration[index] = event.values[index];
            velocity[index] += (acceleration[index] + last_values[index])/2 * dt;
            position[index] += velocity[index] * dt;
        }
        vxarr.add(velocity[0]);
        vyarr.add(velocity[1]);
        vzarr.add(velocity[2]);
        axarr.add(acceleration[0]);
        ayarr.add(acceleration[1]);
        azarr.add(acceleration[2]);
    }
    else{
        last_values = new float[3];
        acceleration = new float[3];
        velocity = new float[3];
        position = new float[3];
        velocity[0] = velocity[1] = velocity[2] = 0f;
        position[0] = position[1] = position[2] = 0f;
    }
    xarr.add(position[0]);
    yarr.add(position[1]);
    zarr.add(position[2]);
    tvX.setText(String.valueOf(acceleration[0]));
    tvY.setText(String.valueOf(acceleration[1]));
    tvZ.setText(String.valueOf(acceleration[2]));
    last_timestamp = event.timestamp;
}

但是当我用我的手机画一个圆圈时,我得到了这个:

有时候我只有负值,有时候我只有正值,我从来没有为了圆圈而有负值和正值。

EN

回答 2

Stack Overflow用户

发布于 2016-02-16 22:57:51

加速度是速度随时间的导数(换句话说,速度的变化率);速度是位置随时间的导数。因此,加速度是位置的二阶导数。相反,位置是加速度的第二个反导数。你可以测量加速度计,并随着时间的推移进行双重积分,以获得轨迹的位置,除了两个问题:

1)它是一个不定积分,即有无限多的解(见https://en.wikipedia.org/wiki/Antiderivative)。在这种情况下,这意味着您的测量不会告诉您任何关于初始速度的信息。但你可以从GPS (精度有限)或从用户输入的某种形式(例如,假设当用户点击某个按钮开始计算轨迹时速度为零)获得它。

2)误差累积。假设加速度计在任何给定方向上的误差a= 0.01 m/s^2 (基于我的手机的粗略猜测)。在t=5分钟内,这会给出a*t^2/2 = 450米的误差。

所以你不能得到一个非常准确的轨迹,特别是在很长一段时间内。如果这对你来说无关紧要,你可以使用其他答案中的代码,或者编写自己的代码等等,但首先你需要认识到这种方法的非常严重的局限性。

票数 2
EN

Stack Overflow用户

发布于 2016-02-16 16:38:42

如何使用加速度计的值计算设备的位置?

物理学家喜欢把物体在给定时间的空间位置看作是一个数学函数p(t),它的值是( x(t ),y(t),z(t) )。物体的速度v(t)是p(t)的一阶导数,加速度a(t)很好地拟合为v(t)的一阶导数。

从现在开始,我们只看一个维度,其他两个维度可以用同样的方法来处理。

为了从加速度中获得速度,我们必须使用已知的初始值来“反向”操作(如果没有它们,我们就不会获得唯一的解)。

我们面临的另一个问题是,我们没有将加速度作为函数。我们只是通过加速度计传感器或多或少地给我们提供样本值。

所以,向爱因斯坦,牛顿和黎曼祈祷,我们取这些值,把加速度函数想象成,一大堆粘在一起的小线。如果传感器经常触发,这将是一个非常好的近似值。

我们的问题现在变得简单得多:线性函数f(t) = m*t + b的(不定)积分(=反导数)是F(t) = m/2 * t^2 + b*t + c,其中可以选择c来满足初始条件(在我们的例子中是零速度)。

让我们使用点斜率形式来模拟我们的近似值(使用时间值t0和t1以及相应的加速值a0和a1):

代码语言:javascript
复制
a(t) = a0 + (a1 – a0)/(t1 – t0) * (t – t0)

然后我们得到(首先计算v(t0) + "integral-between-t0-and-t-of-a",然后用t1代替t)

代码语言:javascript
复制
v(t1) = v(t0) + (a1 + a0) * (t1 – t0) / 2

使用相同的逻辑,我们还得到了位置的公式:

代码语言:javascript
复制
p(t1) = p(t0) + (v(t1) + v(t0)) * (t1 – t0) / 2

翻译成代码,其中last_values用于存储旧的加速值:

代码语言:javascript
复制
float dt = (event.timestamp - last_timestamp) * NS2S;
for(int index = 0 ; index < 3 ; ++index){
    acceleration[index] = event.values[index];
    float last_velocity = velocity[index];
    velocity[index] += (acceleration[index] + last_values[index])/2 * dt;
    position[index] += (velocity[index] + last_velocity )/2 * dt;

    last_values[index] = acceleration[index];
}

**编辑:**

只要我们的设备与世界坐标系保持一致,所有这些都对我们有用。这种情况几乎永远不会发生。因此,在计算上面的值之前,我们首先必须使用SensorManager.getRotationMatrix()中的旋转矩阵将它们转换为世界坐标。

在这个answer中有一个Csaba Szugyiczki的代码片段,它展示了如何获得旋转矩阵。

但正如getRotationMatrix()上的documentation所说的那样

如果设备正在加速或置于强磁场中,则返回的矩阵可能不准确。

...so我对开车的时候用它有点悲观。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35412045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档