用于运动捕捉数据分析和可视化的 R 包

Posted

技术标签:

【中文标题】用于运动捕捉数据分析和可视化的 R 包【英文标题】:R package for motion capture data analysis and visualisation 【发布时间】:2011-12-30 17:05:25 【问题描述】:

我是 R 的新手,我很喜欢它,但我对完全缺乏用于分析动作捕捉数据的可靠软件包感到惊讶。

最简单的动作捕捉文件只是一个带有“XYZ”坐标的大表格,记录对象的每个点以及捕捉的每一帧都对应着“XYZ”坐标。我知道我可以在 R 中找到单独的方法和函数来执行复杂的操作(如主成分分析),或者我可以为所有点绘制时间序列。但是,当我在寻找可以从统计学上教育我分析人类运动的例子,并为数据的可视化表示提供很好的工具箱时,R 原来是一片寒冷的沙漠。另一方面,MATLAB 有Motion capture toolbox 和MoCap Toolbox,尤其是后者在绘制和分析捕获方面有很好的选择。但说实话 - 与 R 相比,MATLAB 的可视化引擎相当难看。

对 R 动作捕捉包的一些具体要求包括:

读取、编辑、可视化和转换动作捕捉数据 动力学和运动学分析 时间序列和主成分分析 动画数据

我在这里遗漏了什么(在我的谷歌搜索中)还是真的没有 R 的动作捕捉包?有没有人尝试在 R 中使用动作捕捉数据?能给我指路吗?

【问题讨论】:

您可能不会错过任何东西。我最喜欢的(u)rite 解决方案library(sos); findFn("motion capture") 没有提出任何有用的建议。存在文化问题:使用 R 可以做一些很酷的事情,但是如果所有从事动作捕捉的酷孩子都使用 MATLAB 或 Python,那么事情就可以在这里完成。我肯定会看看在 Python 中做了什么,并在将 Python 与 R 连接起来以进行任何尚未在 R 中实现的统计繁重工作...... 您可以使用包“forecast”和“ftsa”进行时间序列和主成分分析。 【参考方案1】:

更新,2019 年 12 月:Steen Harsted 的 mocapr 包似乎比我构建的工具更强大。享受吧。

看看我的包,mocap 包: https://github.com/gsimchoni/mocap

它远非完美,但它只是一个开始,目前仅在CMU Graphics Lab Motion Capture Database ASF/AMC 文件上进行测试。

here 是一篇包含更多详细信息的博文。

【讨论】:

【参考方案2】:

我使用包rgl 从运动手势数据集创建动画。虽然它不是专门为手势数据制作的包,但您可以使用它。

在下面的示例中,我们有上半身 8 个点的手势数据:脊椎、肩中心、头部、左肩、左手腕、右肩和右手腕。对象的双手向下,右臂向上移动。

我将数据集限制为 6 次观察(秒,如果你愿意的话),因为否则在这里发布会变得很大。

原始数据集中的每一行对应一个时间观察,每个身体点的坐标以 4 个为一组定义(每四列是一个身体点)。所以在每一行,我们有“x”、“y”、“z”、“br”作为脊柱,然后是“x”、“y”、“z”、“br”作为肩部中心,等等. “br”始终为 1,以便分隔每个身体部位的三个坐标 (x,y,z)。

这是原始(受限)数据集:

DATA.time.obs<-rbind(c(-0.06431,0.101546,2.990067,1,-0.091378,0.165703,3.029513,1,-0.090019,0.518603,3.022399,1,-0.042211,0.687271,2.987086,1,-0.231384,0.419869,2.953286,1,-0.299824,0.173991,2.882627,1,0.063367,0.399478,3.136306,1,0.134907,0.176191,3.159998,1),
                 c(-0.067185,0.102249,2.990185,1,-0.095083,0.166589,3.028688,1,-0.093098,0.519146,3.019775,1,-0.043808,0.687041,2.987671,1,-0.234622,0.417481,2.94581,1,-0.300324,0.169313,2.869782,1,0.056816,0.398384,3.135578,1,0.134536,0.180875,3.162843,1),
                 c(-0.069282,0.102964,2.989943,1,-0.098594,0.167465,3.027638,1,-0.097184,0.52169,3.019556,1,-0.046626,0.695406,2.989244,1,-0.23478,0.417057,2.943475,1,-0.300101,0.168628,2.860515,1,0.053793,0.395444,3.143226,1,0.134175,0.182816,3.172053,1),
                 c(-0.070924,0.102948,2.989369,1,-0.101156,0.167554,3.026474,1,-0.100244,0.522901,3.018919,1,-0.049834,0.696996,2.987933,1,-0.235301,0.416329,2.939331,1,-0.301339,0.170203,2.85497,1,0.04762,0.390872,3.142792,1,0.14041,0.186844,3.182172,1),
                 c(-0.071973,0.103372,2.988788,1,-0.103215,0.16776,3.025409,1,-0.102334,0.52281,3.019341,1,-0.051298,0.697003,2.991192,1,-0.235497,0.414859,2.935161,1,-0.297678,0.15788,2.833734,1,0.045973,0.386249,3.147609,1,0.14408,0.1916,3.204443,1),
                 c(-0.073223,0.104598,2.988132,1,-0.106597,0.168971,3.022554,1,-0.106778,0.522688,3.015138,1,-0.051867,0.697781,2.990767,1,-0.236137,0.414773,2.931317,1,-0.297552,0.153462,2.827027,1,0.039316,0.39146,3.166831,1,0.175061,0.214336,3.207459,1))

对于每个时间点,我们可以创建一个矩阵,其中每一行将是一个身体点,列将是坐标:

# Single time point for analysis
time.point<-1
# Number of coordinates
coordinates<-4
# Number of body points
body.points<-dim(DATA.time.obs)[2]/coordinates

# Total time of gesture
total.time<-dim(DATA.time.obs)[1]

# Transform data for a single time. observation into a matrix
DATA.matrix<-matrix(DATA.time.obs[1,],c(body.points,coordinates),byrow = TRUE)
colnames(DATA.matrix)<-c("x","y","z","br")
rownames(DATA.matrix)<-c("hip_center","spine","shoulder_center","head",
                         "left_shoulder","left_wrist","right_shoulder",
                         "right_wrist")

所以,我们在每个时间点都有一个这样的矩阵:

                        x        y        z br
hip_center      -0.064310 0.101546 2.990067  1
spine           -0.091378 0.165703 3.029513  1
shoulder_center -0.090019 0.518603 3.022399  1
head            -0.042211 0.687271 2.987086  1
left_shoulder   -0.231384 0.419869 2.953286  1
left_wrist      -0.299824 0.173991 2.882627  1
right_shoulder   0.063367 0.399478 3.136306  1
right_wrist      0.134907 0.176191 3.159998  1

现在我们使用rgl 来绘制来自这个矩阵的数据:

#install.packages("rgl")
library(rgl)

# INITIAL PLOT

x<-unlist(DATA.matrix[,1])
y<-unlist(DATA.matrix[,2])
z<-unlist(DATA.matrix[,3])

# OPEN A BLANK 3D PLOT AND SET INITIAL NEUTRAL VIEWPOINT
open3d()
rgl.viewpoint(userMatrix=rotationMatrix(0,0,0,0))

# SET FIGURE POSITION
# This is variable. It will depend on your dataset
# I've found that for this specific dataset a rotation
# of -0.7*pi on the Y axis works

# You can also plot and select the best view with
# your mouse. This selected view will be passed on
# to the animation.
U <- par3d("userMatrix")
par3d(userMatrix = rotate3d(U, -0.7*pi, 0,1,0))

# PLOT POINTS
points3d(x=x,y=y,z=z,size=6,col="blue")
text3d(x=x,y=y,z=z,texts=1:8,adj=c(-0.1,1.5),cex=0.8)

# You can also plot each body point name.
# This might be helpful when you don't know the
# initial orientation of your plot

# text3d(x=x,y=y,z=z,texts=rownames(DATA.matrix),
#        cex=0.6,adj=c(-0.1,1.5))

# Based on the plotted figure, connect the line segments
CONNECTOR<-c(1,2,2,3,3,4,3,5,3,7,5,6,7,8)
segments3d(x=x[CONNECTOR],y=y[CONNECTOR],z=z[CONNECTOR],col="red")

然后,我们有这个:

要创建动画,我们可以将所有这些放入一个函数中并使用lapply

movement.points<-function(DATA,time.point,CONNECTOR,body.points,coordinates)

  DATA.time<-DATA[time.point,]

  DATA.time<-matrix(DATA.time,c(body.points,coordinates),byrow = TRUE)

  x<-unlist(DATA.time[,1])
  y<-unlist(DATA.time[,2])
  z<-unlist(DATA.time[,3])

  # I used next3d instead of open3d because now I want R to plot 
  # several plots on top of our original, creating the animation

  next3d(reuse=FALSE)
  points3d(x=x,y=y,z=z,size=6,col="blue")
  segments3d(x=c(x,x[CONNECTOR]),y=c(y,y[CONNECTOR]),z=c(z,z[CONNECTOR]),col="red")
# You can control the "velocity" of the animation by changing the 
# parameter below. Smaller = faster
  Sys.sleep(0.5)

我知道这个解决方案并不优雅,但它确实有效。

【讨论】:

【参考方案3】:

通过在 RSeek 上的快速搜索判断,没有可用于 R 的动作捕捉包。看起来您需要为每个功能找到等效项。更通用的应该很容易找到(插值、子集、转换/投影、时间序列分析、pca、矩阵分析等),并且为特定事物(例如估计瞬时动能)编写自己的自定义函数的过程可能是最好的学习方式!

您可能会发现 plyr 可用于将数据成形,而 animation 包可用于可视化运动。

【讨论】:

以上是关于用于运动捕捉数据分析和可视化的 R 包的主要内容,如果未能解决你的问题,请参考以下文章

R语言生存分析数据分析可视化案例

R语言之数据可视化 - R的绘图颜色

使用R语言的正确姿势,最常用的R包整理

R语言︱常用统计方法包+机器学习包(名称简介)

将实时数据从运动捕捉系统写入 CSV 文件?

数据可视化应用绘制圆角条形图(附R语言代码)