gpt4 book ai didi

c# - 从坐标列表中提取运动数据

转载 作者:太空狗 更新时间:2023-10-29 19:26:48 27 4
gpt4 key购买 nike

我有一系列带有时间戳坐标(X、Y 和 Z,单位为毫米)的 CSV 文件。从它们中提取运动数据的最简单方法是什么?

可衡量的

我要提取的信息包括以下内容:

  1. 方向改变次数
  2. 第一个和最后一个 Action 的初始加速度
  3. ...以及这些运动的方位(角度)
  4. 非静止时的平均速度

理想情况下,我最终希望能够对运动模式进行分类,因此可以为任何可以提出这样做​​方法的人加分。让我印象深刻的是,我可以做到这一点的一种方法是从坐标生成运动的图片/视频,并要求人类对它们进行分类 - 非常欢迎就我如何做到这一点提出建议。

噪音

一个复杂的事实是读数被噪声污染了。为了克服这个问题,每个录音都以至少 20 秒的静止开始,这可以作为一种“噪音剖面”。不过,我不确定如何实现。

细节

如果有帮助的话,记录的 Action 是一个人的手在简单抓取任务中的 Action 。数据是使用附在手腕上的磁性运动跟踪器生成的。另外,我使用的是 C#,但我猜数学与语言无关。

编辑

赏金

为了赏金,我真的很想看一些(伪)代码示例。

最佳答案

让我们看看您的示例数据可以做什么。

免责声明:我没有阅读您的硬件规范 (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]}]

enter image description here

现在,两个观察结果:

  • 您的运动在第 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]}]

enter image description here

由于曲线有足够的噪声破坏计算,我们将用 Gaussian Kernel 对其进行卷积去噪:

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];

enter image description here

所以你可以在下面看到原始轨迹和平滑轨迹:

enter image description here

enter image description here

现在我们准备好对速度和加速度求导数了。我们将使用 fourth order approximants对于一阶和二阶导数。我们还将像以前一样使用高斯核对它们进行平滑处理:

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]]

enter image description here enter image description here

现在,我们还有速度和加速度模数:

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]

enter image description here enter image description here

还有 Heading,作为 Velocity 的方向:

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}]]]

enter image description here

我认为这足以让您入门。如果您在计算特定参数方面需要帮助,请告诉我。

喂!

编辑

举个例子,假设你想计算手不静止时的平均速度。因此,我们选择所有速度大于截止值的点,例如 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]}]

enter image description here

所以您看到 5 是一个合适的值。

关于c# - 从坐标列表中提取运动数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6082970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com