Comments
Description
Transcript
スポーツのための Matlab 講習会
スポーツのための Matlab 講習会 対象者:VICON 利用を考えている学部生・大学院生 卒論、修士論文、博士論文のバイオメカニクスデータを分析するにあたって、 多変量、多変数のパラメーターを分析するとなると、エクセルを用いて分析を していては、何ヶ月もかかって効率が悪い。そこで、行列計算を行うことがで きる Matlab というプログラム言語を利用することで、短時間に分析することが でき、研究の他の部分に時間をまわすことができる。 Matlab に関する本は多くあるが、スポーツの分析に必要な方法がバラバラに 記述されており、独学すると習得するために莫大な時間かかる。そこで、効率 よく Matlab の使い方を講義して、実践的に使えるようにするのが本講習会の目 的である。 ①行列の抽出 BMI=体重(Kg)÷(身長(m)×身長(m)) RJ_index=跳躍高(m)/接地時間(秒) 跳躍高(滞空時間から求める)=(1/8)×9.81(重力加速度 m/s)×滞空時間2 A=[1 2 3;4 5 6;7 8 9] A=1 2 3 4 5 6 7 8 9 縦が「行」、横が「列」 行と列を区別できるようにする A=[1 2 3;;4 5 6;7 8 9] A=[1 2 3;4 5 6;7 8 9]; 式の最後に;セミコロンをつけると画面表示され ない 2 列目だけ抽出する QQ(:,2) 4 行目だけ抽出する QQ(4,:) :コロンをつけると、すべての行、すべての列を抽出する。 2 列目~5 列目を抽出する QQ(:,2:7) 抽出したい変数(はじめの列:終わりの列) 4 行目~7 列目を抽出する QQ(4:7,:) 抽出したい変数(はじめの行:終わりの行) mean 平均値 max 最大値 sum 合計 std 標準偏差 median 中央値 var 分散 min 最小値 ②行列の結合 行列同士を結合するには、行列 A と行列 B の行の大きさ、列の大きさが同じで ないと結合できない。 行列 行列 A=[1 2 3 4 5] B=[5 6 7 8 9] 行列を横に結合するには、変数間にスペースを空けて並べてから、括弧で囲む [ ]。 C=[A B] C=[1 2 3 4 5 5 6 7 8 9] 行列を縦に並べるには、並べたい変数の間にセミコロン(;)を入れて、括弧 で囲む[ ]。 C=[A;B] D=1:2:10 E=2:3:33 問題 D と E を横に並べてください E と D を縦に並べてください。 行行列を列行列に変更する 列行列を行行列に変更する。 D’ アポストロフィを付ける(Shift を押して 7 のキーを押す) ③エクセルデータの取り込み [DATA HEAD]=xlsread('Rotation.xls'); 「xlsread」はエクセルのファイルを読み込む関数です。 エクセルファイルを読み込ますには、 「エクセル 5.0/95 ブック」の形式にする。 エクセルの最新のファイル形式は読み込まないので注意。 ファイル名は ’ ’ で囲む。 ④グラフの作成 figure(1) 複数のグラフを作成するときには必ず先頭に入力する。 グラフの表示 plot(Time,DATA(:,2),Time,DATA(:,4),Time,DATA(:,6)) plot(X,Y,,X2,Y2,X3,Y3) X 軸データ、Y 軸データの順に入力していく タイトル、X 軸、Y 軸の表示方法 title('Rotation') xlabel('Time(sec)') ylabel('Angle(deg)') ‘ ’で表示させたい文字を囲む 凡例の表示 legend('Lower','Upper','Hip') plot (X1Y1 X2Y2 X3Y3)に対応させて入力する。 ‘ ’で表示させたい文字を囲む 凡例の位置の設定 legend('Lower','Upper','Hip',-1) -1 1 2 3 4 図表の外に凡例が表示される。 図表の右上に表示される。 図表の左上に表示される。 図表の左下に表示される。 図表の右下に表示される。 ⑤グラフの線、プロットのサイズの設定 plot(Time,DATA(:,2) ,’-ok ’,Time,DATA(:,4),’-vk ’,Time,DATA(:,6) ,’ -sk ’,) X軸データ、Y軸データ, ’グラフの線の種類、マーカの種類、線・マーカーの色の設定’, X と Y のデータのあとに入力する。 線種類 直線 点線 : 鎖線 -一点鎖線 -. マーカの種類 丸 プラス 四角 下三角 五角形 o + s v p 色 黒 青色 赤色 緑色 紫色 k b r m m X 軸、Y 軸の大きさを調整する。 axis([X 軸最小値 X 軸最大値 Y 軸最小値 Y 軸最大値]) 特に設定しないときは、最小値には-Inf 最大値には Inf を入力する。 ⑥行列の行の大きさをもとめる LL=length(DATA) 「length」は行・列で最も長い「行」「列」を調べる関数です。 ⑦行列の行と列の大きさを求める size(DATA) size は行の長さ、列の長さを同時に調べる関数です。 ⑧ヘッダーの検索、データーの抽出 エクセルデータからヘッダーの位置を検索する。 II=strmatch('LASI:X',HEAD) 「strmatch」を使って、何列目に必要なデータがあるか検索する関数 カッコの中は(‘検索したい文字列’,検索したい文字がある行列)の順に入力 する。 5 列目に必要なデータがあれば、5と表示される。 5 列目に必要なデータがあることがわかったので、5 列目のデータを、すべての 行を抽出するように式を書く。 LASI=DATA(:,II) VICON のデータの場合は、すべてのデータが X 軸、Y 軸、Z 軸の順に記述されて いるので、「○○:X」の列番号がわかっていれば、 「○○:X」+1した列番号が「○○:Y」のデータになり、 「○○:X」+2した列番号が「○○:Z」のデータになる。 3 列まとめて抽出すると、 LASI=DATA(:,II:II+2) のように書く必要がある。 VICON は座標データが「ミリ単位」で出力されるので、 メートル単位に単位変換をする必要がある。 II=strmatch('LASI:X',HEAD); LASI=DATA2(:,II:II+2)/1000; 1000 で割ると、ミリ単位からメートル単位に変換される。 ⑨時間軸の作成 II=strmatch('Frame',HEAD); Frame=DATA2(:,II); LL=lenght(Frame) length 関数を用いて、行列の長さを調べる(行の長さを調べる) Time=0:(1/120):(LL-1)*(1/120); 120Hz の時間軸作成 (LL-1)をしないと、実際の行数より多くなってしまうのでマイナス1する。 Time2=0:(1/250):(LL-1)*(1/250); 250Hz の時間軸作成 ⑩subplot 関数の使い方 1つのグラフに複数のグラフに出力する 上下に並べる figure(1) subplot(2,1,1) plot(x,y,x1,y1) subplot(2,1,2) plot(x,y,x1,y1) subplot(行、列、番号)を用いて、1 つの図表に複数の図表を表示する。 何個の図表を表示させたいか決めて、行と列の大きさを入力する。 2×1行列であれば 上部に表示させたければ1、下部の表示させたければ 2 と入力する。 2×1 行列 1 2 1×2 行列 1 2 2×2行列 1 3 3×2行列 1 3 5 2 4 6 左右に並べる figure(2) subplot(1,2,1) plot(x,y,x1,y1) subplot(1,2,2) plot(x,y,x1,y1) 4分割する figure(3) subplot(2,2,1) plot(x,y,x1,y1) subplot(2,2,2) plot(x,y,x1,y1) subplot(2,2,3) plot(x,y,x1,y1) subplot(2,2,4) plot(x,y,x1,y1) 2 4 ⑪関節角度の算出 関節角度を算出するには、 「上部セグメント角度」と「下部セグメント角度」の 2つを求めて、その2つのパラメーターを用いて関節角度を算出する。 ベクトルの作り方 中心となる関節を起点としてベクトルを2つ作る。 終点-起点=起点を中心としたベクトル 大転子-膝=大腿部ベクトル 外果 -膝=下腿部ベクトル (課題1 1列行列ごとに作る 課題2 3列行列ごとに作る) 角度算出 セグメント角度を求めるには、[atan2]という関数を用いて角度を算出する。 角度(ラジアン単位)=atan2(縦軸,横軸); 縦軸、横軸を間違えると算出できないので注意。 角度単位変換 ラジアン単位だとわかりづらいので、Radian から Degree へ、角度単位を変換す る。 角度=(算出した角度*180)*pi(円周率=3.14) %膝関節角度 UPLEG_V=RASI-RKNE; KKUP=atan2(UPLEG_V(:,3),UPLEG_V(:,2)); UPLEG_ag=(KKUP*180)/pi; DOLEG_V=RANK-RKNE; KKDO=atan2(DOLEG_V(:,3),DOLEG_V(:,2)); DOLEG_ag=(KKDO*180)/pi; RKNE_ag=UPLEG_ag-DOLEG_ag; ⑫フィルタリング フィルタリングとは,角度、角速度算出にあたって生じるノイズを取り除くた めに行われる。研究室によって使い方の考え方が異なるが、基本的には角度デ ータにフィルターをかけたら、2回フィルターをかけない。論文では位相ずれ なしの4次のバターワースローパスフィルターを、遮断周波数○○Hz で行った という記述でフィルタリングについて書かれてある。 まず、バターワースフィルターの作成(設計) [B,A]=butter(フィルターの次数,遮断周波数 / [取り込んだデータの周波数 /2]); AG=filtfilt(B,A,[フィルターをかけたいデータ]); filtfilt を使用するのであれば、4 次のフィルターであれば 2 と設定する。 [B,A]=butter(2,10/60); AG=filtfilt(B,A,RKNE_ag); ⑬速度を算出する 位置座標、角度データ→フィルター→速度、角速度計算 3 点微分法(スポーツバイオメカニクス 阿江参照) 速度の計算方法① COMassV1=(-3*COMassm(1,:)+4*COMassm(2,:)-COMassm(3,:))/(1/60); COMassV2=(COMassm(3:LL,:)-COMassm(1:LL-2,:))/(1/60); COMassV3=(COMassm(LL-2,:)-4*COMassm(LL-1,:)+3*COMassm(LL,:))/(1/60); COMassV=[COMassV1;COMassV2;COMassV3]; 速度の計算方法② LL=length(x); AGV=[(-3*x(1,:)+4*x(2,:)-x(3,:))/(1/60);... (x(3:LL,:)-x(1:LL-2,:))/(1/60);... (x(LL-2,:)-4*x(LL-1,:)+3*x(LL,:))/(1/60)]; 250Hz の分析は LL=length(x); AGV=[(-3*x(1,:)+4*x(2,:)-x(3,:))/(1/125);... (x(3:LL,:)-x(1:LL-2,:))/(1/125);... (x(LL-2,:)-4*x(LL-1,:)+3*x(LL,:))/(1/125)]; ⑭時間軸作成 応用編 膝の最大屈曲時を 0 秒にして、時間軸を作成する。 [RKneMin RKneMinF]=min(RKNE_AG); Time=(0:(1/120):(1/120)*(RR-1))'; Frame=(1:RR)'; figure(7) subplot(2,1,1) plot(Time,RKNE_AG) xlabel('Time(sec)') subplot(2,1,2) plot(Frame,RKNE_AG) ylabel('Frame') axis([1 Inf -Inf Inf]) RKneMinF RR Excel ファイル「時間軸」を参照 %わからなくなったら Excel で確認しながら作成する。 TimeA=0:(1/120):(1/120)*(RR-RKneMinF); TimeB=-(1/120)*(RKneMinF-1):(1/120):-(1/120); %0 は含まないので、行列の数をマイナス 1 する必要がある。 Time2=[TimeB TimeA]'; %2 つの行列を合成する。 ⑮Matlab 情報の検索 Matlab プログラムをしてわからなくなったら? 1.ヘルプを見る。 2.Google で検索してみる。「Matlab ○○(捜したいキーワード)」 Yahoo は Matlab 関連の検索はあまりよくないので使っていない。 3.http://www.cybernet.co.jp/matlab/ サイバーネットシステムのサイトに行く 4.テクニカル FAQ で検索する。 http://www.cybernet.co.jp/matlab/support/techkwdb/ 5.Mathwork 社(Matlab の開発をしている)のページに行く。 http://www.mathworks.com/matlabcentral/ File Exchange に行くと、人が作ったファイルを手に入れることができる。 6.Matlab の本を買って読んでみる。 マニア向け(BASIC や C 言語などの他のプログラムの発想を取り入れる) ⑯Matlab の勉強法 予備実験でもいいので実験を行って分析してみる。 講習会の資料を基にして、データーを分析してみる。 Matlab の本を一冊はじめから、終わりまで、式を書きながらやってみる。 David A.Winter. Biomechanics John Wiley & Sons,Inc を読んでみる。 わからない数学の部分は、数学の本を借りたり買ったりして理解する。 卒論のプログラムを作ってみる(はじめは 1 週間以上かかる) ⑰ダウンサンプリング ダウンサンプリング:地面反力が 1080Hz で取り込まれていて、VICON のデー タが 120Hz で取り込まれている場合、地面反力のデータを 9 分の 1 にして、VICON のデータにあわせること。 サンプリングが小さいデータに、サンプリングが大きいデータを、データ数 を少なくしてあわせること。 規格化:0.13 秒でリバウンドジャンプする人と、0.22 秒でリバウンドジャンプ をする人の各関節の動きを比較したいときに、時間の長さを同じにして比較す る方法。 ダウンサンプリングの練習 clc close all clear all は入力しておく。 %データ取り込み [DATA HEAD]=xlsread('○○'); エクセルのファイルを開く FDATA=csvread('yano12.csv',10,0); CSV ファイル(カンマ区切り)ファイ ルを開く 10,0 は、11 行目、1 列目からデータを抽出することを示している %ダウンサンプリング FF2=FDATA(:,○○:○○); る。 QQ=length(FF2); フォースプレート2のデータが必要なので抽出す FDATA をプロットしてください。 タイトル、X軸、Y軸、凡例をつけてください。 axis([Xmin Xmax Ymin Ymax]) [B,A]=butter(4,40/○○); FF2=filtfilt(B,A,FF2); フォースプレートのデータにノイズがあるので取 り除くためにフィルターを作ります。フォースプレ ート 1080Hz、 1080÷●●すると、○○に入力する数字がわかりま す。 位相ずれなしのバターワースフィルターをかける。 ①基本の時間軸を作る Time=(0:(1/1080):(QQ-1)*(1/1080))'; サンプリングレート 1080Hz のデータ Time=0:0.001:2 ②変更したい時間軸を作る TimeS=(0:(1/120):(QQ-1)*(1/1080))'; サンプリングレート 120Hz のデータ TimeS=0:0.008:2 ③ダウンサンプリングする 出力=spline(①,ダウンサンプリングしたいデータを入力,②); ※1 行ごとしかダウンサンプリングできないので注意。 FX2=spline(Time,FF2(:,1),TimeS); FX FY FZごとを合成して出力する。 ⑱規格化 MM=length(RANKLE_ExFx); TimeA=(0:(1/120):(1/120)*(MM-1)); 基本の時間軸 MaxA=max(TimeA); 時間の最後を捜してくる。 InterA=MaxA/100; スタートから時間の最後までを 100 等分する。 ※一般的には 100%に規格化することが多い。 ATime=(0:InterA:MaxA)'; 新しい時間軸 =spline(TimeA【規格化前の時間軸】,規格化したいデータ,ATime【規格化後の データ】); ANKLE_SP=spline(TimeA,RANKLE_ExFx,ATime); 規格化(実際の場合) ①分析したい区間の時間軸を新しく作る。 ②分析したい区間を 100 等分する。【上記の方法と同様】 ③spline(①元の時間軸,データ(分析したい区間),②新しい時間軸) 出題:右膝の最大屈曲時から最後のフレームまでを規格化する。 [RKNE_max RKNE_maxF]=max(RKNE_ExFx); ①右膝の最大屈曲時のフレームを捜 す BB=length(RKNE_ExFx); ②最終フレームを捜す BL=BB-RKNE_maxF; ①スタートから②終了フレームまでに、何フレームある求 める。 TimeBB=(0:(1/120):BL*(1/120))'; 新しい時間軸を作る 新しい時間軸を 100 等分する MaxB=max(TimeBB); InterB=MaxB/100; TimeCC=(0:InterB:MaxB)'; 3次のスプライン関数を用いて規格化する。 ANKLE_SP=spline(TimeBB,RKNE_ExFx(RKNE_maxF:BB),TimeCC); ※規格化したい区間だけを計算にかける必要がある。 PTime=0:100; 規格化用の時間 直線補間 地面反力を補間するときはこちらの方がよい場合もある SP_EX=interp1(Time,DATA,STime,'linear'); ⑲グラフを出力する。 saveas(figure(1),'yano12','tif') 保存したいグラフが figure(2)であれば、figure(2)と入力する。 ⑳データを出力する。 計算したデータを、エクセルファイルに出力する PADATA=[A;B;C;D]; 出力したいデータは[]カッコで囲む。 PAHead={'Data_A','DATA_B','DATA_C','DATA_D'}; ヘッダーをつけるときは、{}カッコで囲む。文字には’’で囲む。 xlswrite('yano12_KickX.xls',PADATA,'sheet1','B1'); xlswrite('yano12_KickX.xls',PAHead,'sheet1','A1'); ※行列の形がそろっているか注意 計算したーデータを、ロータス 123 ファイルに出力する wk1write('Matlab1',PADATA,1,0) 1行目をあけたい場合(ヘッダーを作る場合)は、1,0と入力する