Home > リソース > MBDynチュートリアル > 11.自由回転するブロック(4)〜出力データの処理(一般)
MBDynチュートリアル

11.自由回転するブロック(4)〜出力データの処理(一般)

第7項で、movファイルに書き出される運動データの基本的な処理方法を説明しました。しかし、第7項で扱ったのは、nodeが唯1つだけ存在する、むしろ特殊なケースでした。本項では、一般に複数のnodeが存在する場合のmovファイルの処理方法について説明します。

複数のnodeが存在する場合のmovファイルのフォーマット

前項でdummy nodeを追加した入力ファイル「free_rotating_block_dummynode.mbd」には、nodeが全部で2つ含まれています。この入力ファイルを用いてMBDyn解析を行い、結果として得られるmovファイル「free_rotating_block_dummynode.mov」の内容を図1に示します。


movfile_format_example_multinodes

図1: 「free_rotating_block_dummynode.mov」のデータの一部を表計算ソフトウェアで表示した様子

movファイルのデータの1列目はnodeラベルです(第7項参照)。図1のデータを見ると、node「1」のデータとnode「2」のデータが一行ごとに交互に書き出されているのが分かります。このようにnodeが2つ存在する場合には、各時間ステップでそれぞれのnodeの運動データが1行ずつ書き出されます。一般にN個のnodeがある場合には、各時間ステップでN個のnodeに対応するN行のデータが書き出されます。(図2参照)



movfile_multinode_schematic

図2: 複数のnodeが存在する場合のmovファイルのフォーマット

movファイルのデータをnodeごとに分離

複数のnodeが存在する場合のmovファイルのデータは、図2に示したように一列の中に複数のnodeのデータが織り込まれたフォーマットになっているので、第7項で行ったようにmovファイルの列データをそのまま用いてグラフ等を作成することは出来ません。従って、この場合、データを利用するためには、図3に示すようにデータをnodeごとに分離する処理が必要になります。


node_data_separation_schematic

図3: movファイルのデータをnodeごとに分離

MATLABによるデータ処理

図3の処理は、MATLAB等で簡単なプログラムを組むことによって行うことが出来ます。下のリンクは、 movファイルのデータを読み込みつつ同時にこの処理を行ってくれる便利なMATLAB関数のMファイル(及び他のソフトウェア用の類似のプログラムファイル)です。

MBDynLoad.m (for MATLAB)

MBDynLoad.sci (for Scilab)

MBDynLoad2.m (for Octave)


この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ファイル以外のデータ出力ファイル(inefrcjnt)にも同様に適用できます。

ブロックの角の軌跡

それでは、本例題のブロックの角の軌跡をプロットしてみましょう。コード1に示すのは、movファイル「free_rotating_block_dummynode.mov」を読み込んで、ラベル「2」のnodeの変位を3次元プロットするMATLABスクリプトです。(「MBDynLoad」を使用しています。)

plot_dummynode_trajectory.m
% 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: ブロックの角の軌跡を3次元プロットするMATLABスクリプト

コード1のMATLABスクリプトを用いて、次の2ケースのシミュレーションにおけるブロックの角の軌跡を3次元プロットしたものを、図4と図5にそれぞれ示します。

ケース1ではx軸周りにブロックが回転するので、角の軌跡は円を描きます。ケース2はx軸周りの回転運動の不安定性により回転軸が大きく変化してしまうケースで、角の軌跡も円から外れて複雑な軌跡を描きます。

free_rotating_block_dummynode_wx

図4: ブロックの角の軌跡,ケース1: Wx0=5., Wy0=0., Wz0=0.

free_rotating_block_dummynode_wx_perturbed

図5: ブロックの角の軌跡,ケース2: Wx0=5., Wy0=0.02, Wz0=0.