モデリング講座:遊星歯車のダイナミクス(準備2)

モデリング講座:遊星歯車のダイナミクス(準備2)

座標変換を本来解説すべきですが、
数式CADの都合上ちょっとお待ちくださいね。

今回は、MATLAB用いた遊星歯車のダイナミクスとして
アニメーションを紹介します。

これは、遊星歯車のキャリア部分のイメージです。
MATLABアニメ

本当は一筆書きで、遊星歯車のキャリアを描くことができればいいのですが
MATLABで描くと線と線との交点座標をいちいち計算で求めるのも
面倒なので半円のついた直方体を一つ描きます。

それを座標変換(回転座標)を用いて120度ごとに複写します。

半円のついた長方形は描いた順番に重なり合ってます。
それをごまかすために、回転中心に円を描く。

こうしたインチキをうまいことやってます。

MATLABアニメーション

MATLABアニメーションのやり方ですが、
通常のプロットをforループでどんどん描きます。

これがMATLABアニメーションの基本で
BASICやC言語でもやっていることは同じです。

ただ、これがプロットデータか、画像(動画)データかで
若干変わってきますが、深く考えないでいいと思います。

そうしたforループでプロットを書いたり消したりするだけでは
BASICならBASIC上、C言語ならexeファイルでの実行になります。

MATLABではMATLABのfigure上でしか表現できません。

そこでMATLABの場合その時のデータを
getframe
というコマンドで取得します。

さらに
movie2avi
というコマンドでaviファイルにすれば、MATLABがなくても
動画プレイヤーで再生可能になります。

今回、遊星歯車のキャリア動画をaviファイルにしたんですが・・・
わずか数秒の動画なのになんと53MBとなり、アップロードできませんでした。

一応、圧縮もできるのですが、どうもいろんな条件があってできなかったので、
gifアニメーションにしました。

データも軽くしたのですが、実に数十キロバイト、
およそ1/1000のサイズになりました。

これはrgb2indというコマンドとimwriteというコマンドを使います。
この場合MATLABの古いバージョンではrgb2indが実装されていない可能性が
ありますので注意してくださいね。

MATLABアニメーションプログラム(pla_step2up.m)

下記プログラムをpla_step2up.mとして保存、実行してください。
実行するとmyPeaks.aviとoutput.gifが生成されます。

function pla_step2up
%遊星歯車要素
rr=10;
rs=5;
rc=(rr+rs)/2;

%figure準備
figure
hold on

%plot carrier
%キャリアの基本、円付長方形
w=2;
c1cx=linspace(0,pi);
c1x=w/2*cos(c1cx)+0;
c1y=w/2*sin(c1cx)+rc;
c2x=c1x(100);
c2y=c1y(100)-6.4;
c3x=c1x(100)+w;

%複写用回転行列
R1=[cos(-2/3*pi),-sin(-2/3*pi);sin(-2/3*pi),cos(-2/3*pi)];
R2=[cos(2/3*pi),-sin(2/3*pi);sin(2/3*pi),cos(2/3*pi)];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%キャリアの座標データ
carierb=[c3x c1x c2x;c2y c1y c2y];%基本
carier1=R1*[c3x c1x c2x;c2y c1y c2y];%複写1
carier2=R2*[c3x c1x c2x;c2y c1y c2y];%複写2
carierc=[1.5*sin(linspace(0,2*pi));1.5*cos(linspace(0,2*pi))];%円
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%アニメーションプロット
for i=1:20
axis([-11 11 -11 11])
axis square
cla
%アニメーション用回転行列
Rm=[cos(1/10*pi),-sin(1/10*pi);sin(1/10*pi),cos(1/10*pi)];

%キャリアの回転座標
carierb=Rm*carierb;
carier1=Rm*carier1;
carier2=Rm*carier2;
carierc=Rm*carierc;

%キャリア要素塗りつぶし
fill(carierb(1,:),carierb(2,:),’r’);
fill(carier1(1,:),carier1(2,:),’r’);
fill(carier2(1,:),carier2(2,:),’r’);
fill(carierc(1,:),carierc(2,:),’r’);

%動画フレーム(avi用)
mov(i) = getframe(gcf);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%gif用データ変換
[X,map] = rgb2ind(mov(i).cdata,256);
if i==1
% GIFファイルに書き出し
imwrite(X,map,’output.gif’)
else
% 2回目以降は’append’でアニメーションを作成
imwrite(X,map,’output.gif’,’WriteMode’,’append’)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end

% Create AVI file.
movie2avi(mov, ‘myPeaks.avi’, ‘compression’, ‘None’,’FPS’,10);

end

Tags: , ,

Leave a Reply