第7項で、movファイルに書き出される運動データの基本的な処理方法を説明しました。しかし、第7項で扱ったのは、nodeが唯1つだけ存在する、むしろ特殊なケースでした。本項では、一般に複数のnodeが存在する場合のmovファイルの処理方法について説明します。
前項でdummy nodeを追加した入力ファイル「free_rotating_block_dummynode.mbd」には、nodeが全部で2つ含まれています。この入力ファイルを用いてMBDyn解析を行い、結果として得られるmovファイル「free_rotating_block_dummynode.mov」の内容を図1に示します。
movファイルのデータの1列目はnodeラベルです(第7項参照)。図1のデータを見ると、node「1」のデータとnode「2」のデータが一行ごとに交互に書き出されているのが分かります。このようにnodeが2つ存在する場合には、各時間ステップでそれぞれのnodeの運動データが1行ずつ書き出されます。一般にN個のnodeがある場合には、各時間ステップでN個のnodeに対応するN行のデータが書き出されます。(図2参照)
複数のnodeが存在する場合のmovファイルのデータは、図2に示したように一列の中に複数のnodeのデータが織り込まれたフォーマットになっているので、第7項で行ったようにmovファイルの列データをそのまま用いてグラフ等を作成することは出来ません。従って、この場合、データを利用するためには、図3に示すようにデータをnodeごとに分離する処理が必要になります。
図3の処理は、MATLAB等で簡単なプログラムを組むことによって行うことが出来ます。下のリンクは、 movファイルのデータを読み込みつつ同時にこの処理を行ってくれる便利なMATLAB関数のMファイル(及び他のソフトウェア用の類似のプログラムファイル)です。
このMATLAB関数「MBDynLoad」は次のように使用します。
[LABEL,DATA] = MBDynLoad(FILENAME);
FILENAMEに実在するmovファイルのファイル名を代入してこのコマンドを実行すると、LABELにはnodeラベルのリストが格納され、DATAにはnodeごとに分離されたデータが3次元配列として格納されます。DATA(i,j,k)の値は、k番目のnode(ラベル「k」のnodeではないことに注意)のi時間ステップにおけるj列目成分の値です。
例えば、「sample.mov」をあるmovファイルとし、
[LABEL,DATA] = MBDynLoad('sample.mov');
を実行した時、
x = DATA(:,2,LABEL==5);
とすれば、node「5」のx方向変位の時系列データベクトルを得ることができます。
尚、「MBDynLoad」はmovファイル以外のデータ出力ファイル(ine、frc、jnt)にも同様に適用できます。
それでは、本例題のブロックの角の軌跡をプロットしてみましょう。コード1に示すのは、movファイル「free_rotating_block_dummynode.mov」を読み込んで、ラベル「2」のnodeの変位を3次元プロットするMATLABスクリプトです。(「MBDynLoad」を使用しています。)
% plot_dummynode_trajectory.m clear; close all; [LABEL,DATA]=MBDynLoad('free_rotating_block_dummynode.mov'); x=DATA(:,2,LABEL==2); y=DATA(:,3,LABEL==2); z=DATA(:,4,LABEL==2); plot3(x,y,z,'LineWidth',1) grid on; axis([-0.2,0.2,-0.2,0.2,-0.2,0.2]); axis vis3d; set(gca,'FontSize',12); xlabel('x (m)','FontSize',12); ylabel('y (m)','FontSize',12); zlabel('z (m)','FontSize',12); title('Trajectory of the block corner','FontSize',12);
コード1のMATLABスクリプトを用いて、次の2ケースのシミュレーションにおけるブロックの角の軌跡を3次元プロットしたものを、図4と図5にそれぞれ示します。
ケース1ではx軸周りにブロックが回転するので、角の軌跡は円を描きます。ケース2はx軸周りの回転運動の不安定性により回転軸が大きく変化してしまうケースで、角の軌跡も円から外れて複雑な軌跡を描きます。