首页 > 解决方案 > 应该如何实时计算加速度计数据(jerk)的时间导数(Java)?

问题描述

我正在尝试从onReceive()循环 Android 方法中的流式加速度计数据计算加速度(加加速度)的时间导数。

我假设,从一个传感器更新到下一个,我可以通过简单地计算增量加速度 (x, y, z) 和相关的增量时间来近似这一点。为了确保最大的准确性,我使用了该System.nanoTime()方法(除以 10e8)。

一切似乎都很愉快,并且出现了 jerk 数据,但我认为检查所有delta_times ( sumDeltaTime) 的总和是否接近 和 之间的差是last_time明智的first_time。令我惊讶的是,差异是几千倍。即使替换System.nanoTime()System.currentTimeMillis()(除以 10e2)也没有改变这种差异。这是我的代码:

// calculate jerk (time derivative of acceleration)

accel_count++;

if (accel_count == 1) {
    first_time = new_time = System.nanoTime() / 10e8; // captures first time value (in seconds)
    newAccel[0] = accel[0]; // x
    newAccel[1] = accel[1]; // y
    newAccel[2] = accel[2]; // z
    } else {
    prev_time = new_time; // assigns previous time value
    new_time = System.nanoTime() / 10e8; // immediately updates to the new time value (in seconds)
    prevAccel[0] = newAccel[0]; // x
    prevAccel[1] = newAccel[1]; // y
    prevAccel[2] = newAccel[2]; // z
    // set up for next iteration
    newAccel[0] = accel[0]; // x
    newAccel[1] = accel[1]; // y
    newAccel[2] = accel[2]; // z
    }
float[] delta_accel; // difference in acceleration between consecutive sensor measurements
delta_accel = new float[] {
    (newAccel[0] - prevAccel[0]), // x
    (newAccel[1] - prevAccel[1]), // y
    (newAccel[2] - prevAccel[2])  // z
    };
double delta_time = (new_time - prev_time); // time difference between consecutive sensor measurements (in seconds)

float[] jerk;
jerk = new float[] {
    (float) (delta_accel[0] / delta_time), // x
    (float) (delta_accel[1] / delta_time), // y
    (float) (delta_accel[2] / delta_time)  // z
    };

total_time = new_time - first_time; // total time duration of entire recording (in seconds)
sumDeltaTime += delta_time; // testing sum of deltas

谁能看到我一定做错了什么?谢谢!

标签: javaandroidaccelerometertimedeltadifferentiation

解决方案


您没有prev_time在第一次通过 ( accel_count == 1) 时进行初始化,因此您第一次计算时可能为 0 delta_time。这使得第一个delta_time异常大,因为new_time它远大于 0,就像System.nanoTime()远大于 0 一样。


推荐阅读