2011-11-16 6 views
23

私はRの初心者ですが、それは大好きですが、モーションキャプチャデータを分析するための完全なパッケージがないことに驚いています。モーションキャプチャデータ分析とビジュアライゼーションのためのRパッケージ

最も単純なモーションキャプチャファイルは、記録された被写体にアタッチされた各ポイントとキャプチャされたすべてのフレームについて、 'XYZ'座標を持つ大規模なテーブルです。私は、複雑な操作(主成分分析のような)を実行するためにRの個々のメソッドと関数を見つけることができること、あるいはすべての点について時系列をプロットできることを知っています。しかし、人の動きを分析することについて統計的に教えてくれる例を探していて、データの視覚的表現に素敵なツールボックスを提供すると、Rは寒い砂漠になってしまいます。一方、MATLABにはMotion capture toolboxMoCap Toolboxがあり、特に後者ではキャプチャをプロットして解析するための非常に優れたオプションがあります。しかし、のは正直言ってみましょう - MATLABはR.

にRモーションキャプチャパッケージのためのいくつかの特定の要求含まれる比較は非常に醜い可視化エンジンがあります。

  • 読み取り、編集、MOCAPデータを可視化し、変換
  • 運動をし、運動学的分析
  • 時系列および主成分分析
  • アニメーションデータ

ここで何かが見つからないのですか(グーグルグーグルでは)か、実際にはRのためのmocapパッケージはありませんか?誰でもRでモーションキャプチャデータを再生しようとしましたか?あなたは私にいくつかの指示を与えることができますか?

+2

あなたは何かを見逃すことはできません。私のfavo(u)儀式の解決策、 'library(sos); findFn( "{モーションキャプチャ}") 'は、何も役に立たなかった。文化的な問題があります:Rでクールなことをすることは可能かもしれませんが、モーションキャプチャに取り組むクールな子供たちがMATLABまたはPythonを使用している場合、それが実現します。私は間違いなく、Pythonで何が行われているかを見て、PythonとRをインターフェースして、Rで実装されていない統計的な重い持ち上げを見ていきます。 –

+1

timeseriesと "ftsa"パッケージは "forecast"と "ftsa"主成分分析。 – power

答えて

1

RSeekのクイック検索で判断すると、Rで利用できるモーションキャプチャパッケージはありません。各機能の同等機能を見つける必要があるようです。より一般的なもの(補間、部分集合、変換/投影、時系列解析、pca、行列解析など)は非常に簡単であり、瞬間的な運動エネルギーを推定するような特定の事柄のための独自の関数を書くプロセスはおそらく学ぶ最善の方法!

データを形状にノックするのに便利なplyrと、動きを視覚化するためのanimationパッケージがあります。 https://github.com/gsimchoni/mocap

それははるかに完璧からですが、それは現在だけCMU Graphics Lab Motion Capture Database ASF/AMCファイルでテスト開始、です:

2

は、mocapパッケージを私のパッケージを見てください。

hereは、さらに詳細なブログ記事です。

1

パッケージrglを使用して、モーションジェスチャデータセットからアニメーションを作成しました。ジェスチャーデータ用に特別に作られたパッケージではありませんが、それを使って作業することができます。

下の例では、上半身の8点のジェスチャデータがあります。背骨、肩の中心、頭、左肩、左手首、右肩、右手首です。被験者は手を下ろし、右腕は上向きの動きをしています。

データセットを6回の観測に制限しました。そうしないと、ここに投稿することができなくなるからです。

元のデータセットからの各行は時間観測に対応し、各ボディポイントの座標は4つのセット(4つの列ごとに1つのボディポイント)で定義されます。だから、各ラインには、背骨の「x」、「y」、「z」、「br」、そしてショルダーの中心の「x」、「y」、「z」、「br」などがあります。各身体部分の3つの座標(x、y、z)を分離するために、「br」は常に1である。我々は、各行が本体点となる行列を作成することができ、列座標になり、各時点について

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が、この行列からデータをプロットします

アニメーションを作成するために、我々は関数にこのすべてを入れて、lapplyを使用することができます。

#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") 

その後、我々はこれを持っています。

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

私はこのソリューションがエレガントではないことは知っていますが、機能します。

enter image description here

関連する問題