I discussed this problem yesterday with Pickett here. We concluded that the best solution may be just Interpolate
and then NIntegrate
to get the position vector. I also suggested smoothing but as Pickett commented you can lose important details with it.
How to calculate the position from acceleration data in Mathematica?
Example where moving to one direction and other directions about the same
Import["http://pastebin.com/raw.php?i=jZ57mqZT"]
or
time_tick,acc_X_value,acc_Y_value,acc_Z_value
0.008387,-7.051625,-0.432767,-6.701011
0.041984,-7.308113,-0.712300,-6.199558
0.074841,-6.989672,-1.105712,-6.235771
0.108211,-7.580313,-0.931228,-5.587518
0.141834,-7.547990,-0.979114,-5.437576
0.174273,-7.075867,-1.138783,-6.130123
0.208107,-7.554275,-0.835906,-5.692567
0.240980,-7.329661,-0.960558,-5.710225
0.274663,-7.546344,-0.690752,-5.827994
0.308129,-6.949119,-0.860447,-6.631278
0.341972,-6.716275,-0.842939,-6.727797
0.374906,-7.340585,-0.757642,-6.366709
0.408325,-6.646092,-0.905340,-6.730790
0.440989,-6.814441,-1.069348,-6.686945
0.474559,-7.092926,-0.681474,-6.726151
0.508442,-6.090618,-0.887832,-7.290455
0.541162,-7.464041,-0.712600,-6.281712
0.574674,-6.314932,-0.937214,-6.787804
0.608281,-6.961689,-0.820642,-6.581596
0.641125,-7.042347,-0.777395,-6.264054
0.674738,-6.658662,-0.941104,-6.425518
0.708979,-6.956152,-0.764526,-6.639957
0.741439,-6.618408,-0.791462,-6.837934
0.774397,-6.924129,-0.730108,-6.721961
Answer
Assuming that all the initial positions (x[0]
, y[0]
and z[0]
) and the initial velocities (x'[0]
, y'[0]
and z'[0]
) are equal to 0
you can do:
adat = Rest@Import["http://pastebin.com/raw.php?i=jZ57mqZT"];
{ax, ay, az} = Interpolation /@ (adat[[All, {1, #}]] & /@ {2, 3, 4});
{xt, yt, zt} = (x /. Quiet@First@NDSolve[{
x[0] == 0, x'[0] == 0,
x''[t] == #[t]
}, x, {t, First@adat[[All, 1]], Last@adat[[All, 1]]}] & /@ {ax, ay, az});
Plot[{ax[t], ay[t], az[t]}, {t, First@adat[[All, 1]],Last@adat[[All, 1]]},
PlotLabel -> "Acceleration", Frame -> True,
FrameLabel -> {"Time", "Aceleration"}]
Plot[{xt[t], yt[t], zt[t]}, {t, First@adat[[All, 1]], Last@adat[[All, 1]]},
PlotLabel -> "Positions", Frame -> True,
FrameLabel -> {"Time", "Position"}]
ParametricPlot3D[{xt[t], yt[t], zt[t]}, {t, First@adat[[All, 1]], Last@adat[[All, 1]]},
PlotRange -> {{0, -2}, {-1, 1}, {0, -2}},
AxesLabel -> {"X", "Y", "Z"}]
Comments
Post a Comment