Скорость не работает через вычислительную интеграцию

Отказ от ответственности: я полный нуб и не большой кодер.
У меня 10DOF ИДУ. Я пытаюсь получить скорость датчика. На поверхностном уровне я понимаю ограничение датчиков со сносом и т. Д. Я проведу вас через мой ход мыслей.

Этот двойной массив содержит значения XYZ моего акселерометра. Это числа линейного ускорения, алгоритм учел и вынул коэффициент гравитации.

accelCompoDoub[0] = parseDouble(accelCompoString[0]);
accelCompoDoub[1] = parseDouble(accelCompoString[1]);
accelCompoDoub[2] = parseDouble(accelCompoString[2]);

Мое приложение будет отслеживать истекшее время, а также потребуется deltaT. DeltaT будет использоваться для вычислительной интеграции ускорения.

currentTime = System.nanoTime();
if (startTime == 0.0 && previousTime == 0.0){
      startTime = currentTime;
      previousTime = currentTime;
    }else{
    deltaT = currentTime - previousTime;
     }


runningTime = currentTime - startTime;

runningTime = TimeUnit.NANOSECONDS.toMillis(runningTime);
runningTimeDouble = runningTime/1000.0;

Преобразовано из нано в микро, а не в милли. Причина в том, что мои данные встретили много 0,0.

deltaT = TimeUnit.NANOSECONDS.toMicros(deltaT);
deltaTDoub = deltaT/1000000.0;
previousTime = currentTime;

Здесь скорость = скорость + (ускорение) * (изменение во времени)

velocityComp[0] += accelCompoDoub[0]*deltaTDoub;
velocityComp[1] += accelCompoDoub[1]*deltaTDoub;
velocityComp[2] += accelCompoDoub[2]*deltaTDoub;
Log.i("Velocity", Arrays.toString(velocityComp));

Мои результаты, когда я двигаю датчик с большой скоростью по оси Z. Это не правильно, и я пытался это исправить. Спасибо за помощь мне. Дайте мне знать, если нужна дополнительная информация.

Результаты расчетов.

I/Velocity: [-0.063722465, -0.132597938, 0.06367645599999999]
I/Velocity: [-7.25024E-4, -0.0018097799999999998, 5.87136E-4]
I/Velocity: [-8.90561E-4, -0.0026836670000000003, 3.80492E-4]
I/Velocity: [-7.223840000000001E-4, -0.002324192, -8.8788E-5]
I/Velocity: [-0.0014603620000000002, -0.0046326660000000006, -0.0013441560000000002]
I/Velocity: [-0.056317518, -0.161929746, -0.10376649000000002]
I/Velocity: [-5.45706E-4, -0.001396428, -0.001515708]
I/Velocity: [-0.00108585, -0.00286045, -0.0047196]
I/Velocity: [-0.001350592, -0.00551372, -0.010952008000000001]
I/Velocity: [-0.027746648999999998, -0.12593060399999997, -0.285394104]
I/Velocity: [-3.4505000000000007E-4, -9.82105E-4, -0.003035925]
I/Velocity: [-3.19982E-4, -0.00120291, -0.004499598]
I/Velocity: [1.67466E-4, -0.001290081, -0.004254081]
I/Velocity: [7.457259999999999E-4, -0.0025310280000000003, -0.007799432000000001]
I/Velocity: [0.016570047999999997, -0.099231992, -0.27039305599999996]
I/Velocity: [-1.6146000000000002E-4, -0.0014244750000000001, -0.00291915]
I/Velocity: [-8.8816E-4, -0.002367105, -0.003107767]
I/Velocity: [-0.001062369, -0.001895124, -0.001395471]
I/Velocity: [-0.0028341610000000004, -0.004603984, -0.001379862]
I/Velocity: [-0.130232, -0.2220188, 0.0293022]
I/Velocity: [-0.00333146, -0.00568062, 0.003315785]
I/Velocity: [-0.00167499, -0.0026628819999999997, 0.002802716]
I/Velocity: [-0.0020831459999999997, -0.0031751069999999995, 0.005024214]
I/Velocity: [-0.001439764, -0.002181253, 0.004799388999999999]
I/Velocity: [-0.12709468599999998, -0.134937772, 0.47205287199999996]
I/Velocity: [-8.29008E-4, -4.7601299999999996E-4, 0.0031751369999999998]
I/Velocity: [-9.500479999999999E-4, -1.14048E-4, 0.0034474880000000003]
I/Velocity: [-0.001443932, 2.46308E-4, 0.00481496]
I/Velocity: [-0.0042386279999999995, 0.001372604, 0.012284638]
I/Velocity: [-0.10745787999999999, 0.025316348, 0.27256053799999996]
I/Velocity: [-9.26115E-4, -5.916E-5, 0.00209409]
I/Velocity: [-0.0018333919999999999, -6.785679999999999E-4, 0.003609672]
I/Velocity: [-5.516159999999999E-4, -3.88362E-4, 9.315279999999998E-4]
I/Velocity: [-0.001341424, -0.001413168, 0.0021391039999999997]

PS: я также пытался ограничить выборку так, чтобы deltaT составляла приблизительно 0,01 секунды.

1 ответ

Ваши значения ускорения по осям x и y кажутся небольшими, что является хорошей точкой, если вы переместились по оси z. Имейте в виду, что если ваше движение не будет направлено, скорость на этих осях никогда не будет нулевой.

Учитывая значения по оси Z, я бы проверил, с какой разницей вы умножаете выборки. Он должен быть равен обратной частоте дискретизации вашего датчика. Например, если f_s = 100 Гц, deltaT = 0,01 с. Если вы используете датчик спуска, это значение должно быть почти постоянным во времени. Кроме того, зачем использовать системное время, а не временную метку, которая, вероятно, предоставляется для каждого образца?

Наконец, но, возможно, самое важное:

Здесь скорость = скорость + (ускорение) * (изменение во времени)

Твои рассуждения верны... в теории. Помимо смещения гравитации, которое, как вы сказали, устранено, проблема в том, что ваш сигнал содержит шум. Как вы упомянули, интеграция со временем будет дрейфовать, потому что вы интегрируете шум, включенный в ваш сигнал. Численное интегрирование сигнала ускорения не даст вам правильную скорость, если у вас не будет способа убрать шум, прежде чем делать это. Если вам действительно нужно интегрировать этот сигнал, попробуйте отфильтровать его. Лучший вариант - объединить его с датчиком другого типа (оптическим?), Чтобы использовать ускорение вместо скорости, но я сомневаюсь, что это возможно, если вы разрабатываете приложение для мобильного устройства...

Другие вопросы по тегам