Давайте посмотрим, что можно сделать с данными вашего примера.
Отказ от ответственности: я не читал ваши спецификации оборудования (tl; dr:))
Я поработаю с этим в Mathematica для удобства. Соответствующие алгоритмы (не так много) будут предоставлены в виде ссылок.
Первое наблюдение состоит в том, что все ваши измерения распределены по времени одинаково, что наиболее удобно для упрощения подхода и алгоритмов. Мы представим «время» или «отметки» (измерения) для удобства, поскольку они эквивалентны.
Давайте сначала построим вашу позицию по оси, чтобы увидеть, в чем проблема:
(* This is Mathematica code, don't mind, I am posting this only for
future reference *)
ListPlot[Transpose@(Take[p1[[All, 2 ;; 4]]][[1 ;;]]),
PlotRange -> All,
AxesLabel -> {Style["Ticks", Medium, Bold],
Style["Position (X,Y,Z)", Medium, Bold]}]

Теперь два замечания:
- Ваше движение начинается около тика 1000
- Ваше движение не начинается с {0,0,0}
Итак, мы немного преобразуем ваши данные, вычитая нулевую позицию и начиная с отметки 950.
ListLinePlot[
Drop[Transpose@(x - Array[Mean@(x[[1 ;; 1000]]) &, Length@x]), {}, 950],
PlotRange -> All,
AxesLabel -> {Style["Ticks", Medium, Bold],
Style["Position (X,Y,Z)", Medium, Bold]}]

Поскольку кривые имеют достаточный шум, чтобы испортить вычисления, мы свернем его с Гауссовым ядром , чтобы понизить шум:
kern = Table[Exp[-n^2/100]/Sqrt[2. Pi], {n, -10, 10}];
t = Take[p1[[All, 1]]];
x = Take[p1[[All, 2 ;; 4]]];
x1 = ListConvolve[kern, #] & /@
Drop[Transpose@(x - Array[Mean@(x[[1 ;; 1000]]) &, Length@x]), {},
950];

Таким образом, вы можете увидеть ниже исходные и сглаженные траектории:


Теперь мы готовы принять производные для скорости и ускорения. Мы будем использовать аппроксиманты четвертого порядка для первой и второй производных. Мы также сгладим их, используя ядро Гаусса, как и раньше:
Vel = ListConvolve[kern, #] & /@
Transpose@
Table[Table[(-x1[[axis, i + 2]] + x1[[axis, i - 2]] -
8 x1[[axis, i - 1]] +
8 x1[[axis, i + 1]])/(12 (t[[i + 1]] - t[[i]])), {axis, 1, 3}],
{i, 3, Length[x1[[1]]] - 2}];
Acc = ListConvolve[kern, #] & /@
Transpose@
Table[Table[(-x1[[axis, i + 2]] - x1[[axis, i - 2]] +
16 x1[[axis, i - 1]] + 16 x1[[axis, i + 1]] -
30 x1[[axis, i]])/(12 (t[[i + 1]] - t[[i]])^2), {axis, 1, 3}],
{i, 3, Length[x1[[1]]] - 2}];
И мы их строим:
Show[ListLinePlot[Vel,PlotRange->All,
AxesLabel->{Style["Ticks",Medium,Bold],
Style["Velocity (X,Y,Z)",Medium,Bold]}],
ListPlot[Vel,PlotRange->All]]
Show[ListLinePlot[Acc,PlotRange->All,
AxesLabel->{Style["Ticks",Medium,Bold],
Style["Acceleation (X,Y,Z)",Medium,Bold]}],
ListPlot[Acc,PlotRange->All]]

Теперь у нас также есть модуль скорости и ускорения:
ListLinePlot[Norm /@ (Transpose@Vel),
AxesLabel -> {Style["Ticks", Medium, Bold],
Style["Speed Module", Medium, Bold]},
Filling -> Axis]
ListLinePlot[Norm /@ (Transpose@Acc),
AxesLabel -> {Style["Ticks", Medium, Bold],
Style["Acceleration Module", Medium, Bold]},
Filling -> Axis]

И курс, как направление скорости:
Show[Graphics3D[
{Line@(Normalize/@(Transpose@Vel)),
Opacity[.7],Sphere[{0,0,0},.7]},
Epilog->Inset[Framed[Style["Heading",20],
Background->LightYellow],{Right,Bottom},{Right,Bottom}]]]

Я думаю, этого достаточно, чтобы вы начали. дайте мне знать, если вам нужна помощь в расчете определенного параметра.
НТН!
Редактировать
В качестве примера предположим, что вы хотите вычислить среднюю скорость, когда рука не находится в покое. Итак, мы выбираем все точки, скорость которых больше, чем отсечка, например, 5, и вычисляем среднее значение:
Mean@Select[Norm /@ (Transpose@Vel), # > 5 &]
-> 148.085
Единицы для этой величины зависят от ваших единиц времени, но я не вижу их где-либо указанным.
Обратите внимание, что скорость отсечки не является "интуитивной". Вы можете найти подходящее значение, построив график зависимости средней скорости от скорости отсечки:
ListLinePlot[
Table[Mean@Select[Norm /@ (Transpose@Vel), # > h &], {h, 1, 30}],
AxesLabel -> {Style["Cutoff Speed", Medium, Bold],
Style["Mean Speed", Medium, Bold]}]

Итак, вы видите, что 5 является подходящим значением.