Как следует рассчитать производную по времени данных акселерометра (рывок) в реальном времени (Java)?

Я пытаюсь вычислить производную ускорения (рывка) по времени из потоковых данных акселерометра в циклическом методе Android onReceive ().

Я предположил, что от одного обновления датчика к следующему я мог бы приблизиться к этому, просто вычислив дельта-ускорение (x, y, z) и соответствующее дельта-время. Чтобы обеспечить максимальную точность, я использовал метод System.nanoTime() (и делил на 10e8).

Все выглядело счастливым, и появлялись данные о рывках, но я счел целесообразным проверить, чтобы сумма всех delta_time (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

Кто-нибудь может понять, что я делаю неправильно? Спасибо!


person davwillev    schedule 19.02.2020    source источник
comment
10e2 == 100, 10e8 == 100000000, поэтому ваши расчеты отклоняются в 10 раз. Также используйте SensorEvent.timestamp.   -  person greeble31    schedule 20.02.2020
comment
Я попробовал для начала 10e3 и 10e9, и, как ни странно, total_time не возвращал секунды. Попытайся; странный! Большое спасибо за совет по поводу SensorEvent.timestamp.   -  person davwillev    schedule 21.02.2020


Ответы (1)


Вы не инициализировали prev_time на первом проходе (accel_count == 1), поэтому, вероятно, было 0 при первом вычислении delta_time. Это сделало первый delta_time необычно большим, потому что new_time намного больше 0, так же как System.nanoTime() намного больше 0.

person greeble31    schedule 20.02.2020
comment
Да! Это помогло - большое спасибо! Total_time и сумма delta_times теперь идеально совпадают :) (я проголосовал за, но мой голос не отображается, так как мой счет недостаточно высок) - person davwillev; 21.02.2020