2/4/07

6.10 四連桿之動態模擬

MATLAB 指令中,可以使用擦拭重畫法以產生動畫。產生動畫之原理是將某一物體之座標改變之後,擦去前面所繪的圖像,重新依新座標繪製一次,如此連續不斷,產生一系列的動作畫面。 典型的畫法是畫出該物體後,然後在迴圈中,不斷地些微改變其位置座標,然後繼續畫出整個畫面。其座標分別以xyz表示。在指令中亦可用參數改變其擦拭的模式。總共有三種模式可供選用:

  • none - MATLAB 會在繪出新圖案前不將舊圖清除。
  • background - MATLAB 會用背景顏色將舊圖重新繪製一次。故此種模式除將舊圖清除外,其底下原有的繪製物如格線等亦被清除。
  • xor – 此模式僅擦拭物體部份,故最常用於動畫。

這三種模式是MATLAB繪圖指令中之執行速度最快者,但仍然視圖像的細節及運算的時間而定。有時仍然需要使用延遲的功能才能看到它的變化。由於它是一個較為簡易的方式,故本機動學二將以此功能配合各項分析結果產生動畫,使學者可以瞭解其中之變化過程。

程式解說


基本上,程式之結構與前述繪製程式之軌跡的方式相同 ,只是在表現為繪圖時,其時序略有不同。此時必須先將各圖,如曲桿、連結桿及搖桿等三個均為可動狀態,而且其對應之位置隨時不同,因此必須針對每桿之狀態建立一個圖群,並給予不同的握把。且將其對應的握把設定為擦拭模式,如:

  for i=2:4,set(h(i),'erasemode','xor');end

在此程式中,除主程式外,共呼叫四個副程式,即f4bar.m、 f4limits.m、 fb_angle_limits.m及 body.m。其功能分別說明如下:

fb_angle_limits函數是計算輸入之連桿組迴轉時之限制,這個限制角度包括曲柄及搖臂之迴轉角,利用這兩個角度繪製均分角度下之各桿方位。呼叫此函數時,除各桿長度外,必須有固定桿之角度及驅動桿之屬性,驅動桿為曲桿或連結桿,其結果會有不同。

有了限制角度後,才在限制角度之範圍內進行細分。其細分度依輸入項之npts而定,其預設值為100點。在驅動桿不同角度下,呼叫f4bar函數以計算各桿之對應角度。此時其輸出之b值應均會等於1。表示可以組合成四連桿之實際位置。其後再呼叫body函數。這個函數旨在確定特定桿上之延伸點之動作。為方便起見,此處之body為決定附屬之桿號及角度,其三角形下之頂點A即為所要檢視之點,並以三角形表示之。

在程式中,也呼叫f4limits這個函數。這個函數是將 fb_angle_limits計算出之角度限制位置之四連桿繪出。由此可以看到真正連桿之活動界限。

程式內容



function move_4paths(r,r6,th6,nlink,th1,td2,tdd2,sigma,driver,ntimes,npts)
%
%function move_4paths(r,r6,th6,nlink,th1,td2,tdd2,sigma,driver,ntimes,npts)
%
%draw the positions of four-bar links
%call f4bar.m funcion, f4limits.m, fb_angle_limits.m, body.m
%
%Inputs:
% r: row vector for four links
% th1: frame angle
% th2: crank angle or couple angle
% td2,tdd2:angular velocity and acceleration of the driving link.
% sigma: assembly mode
% driver: 0 for crank, 1 for coupler
% ntimes: no. of cycles
% npts: number of points divided
% r6,rh6,nlink:additional length and angle for nlink link.
%example:
% move_4paths([4 2 3 4],2,-30,3,0,10,0,1,0,4,100)
%
%clf;
if nargin<10, ntimes=3;npts=100;end;
figure(1);
[Qstart, Qstop]=fb_angle_limits(r,th1,driver);
npoint=abs(npts);
th2=linspace(Qstart,Qstop,npoint);
val=zeros(6,npoint);
for i=1:npoint,
[vr b]=f4bar(r,th1,th2(i),td2,tdd2,sigma,driver);
[para]=body(r6,th6,vr,nlink);
val(1:3,i)=[vr(1,1);vr(2,1);vr(1,1)+vr(4,1)];
val(4:6,i)=[para(1);para(3);para(2)];
end
x=real(val);y=imag(val);
h=f4limits(r,th1,sigma,driver);
line(x(5,:)',y(5,:)','color','r','linestyle',':');
line(x(4,:)',y(4,:)','color','b','linestyle','-.');
line(x(6,:)',y(6,:)','color','k','linestyle',':');
range=1.2*([min(min(x)) max(max(x)) min(min(y)) max(max(y))]);
axis(range);axis equal;grid off;
for i=2:4,set(h(i),'erasemode','xor');end
h0=patch('xdata',[],'ydata',[],'erasemode','xor','facecolor','r',...
'marker','o');
i=0;s=-1;axis off;
for m=1:ntimes
s=-s;
if abs(Qstop-Qstart-360)<1,i=0;s=1;end;
while 1,
i=i+s;
if i>npoint|i==0,break;end;
set(h(2),'xdata',[0 x(2,i)], 'ydata',[0 y(2,i)]);%crank
set(h(3),'xdata',[x(2,i) x(3,i)], 'ydata',[y(2,i) y(3,i)]);%coupler
set(h(4),'xdata',[x(1,i) x(3,i)], 'ydata',[y(1,i) y(3,i)]);%Rocker
set(h0,'xdata',[x(4:6,i)], 'ydata',[y(4:6,i)]);
drawnow; %flush the draw buffer
pause(0.1);
end
end % for m loop

%
function h=f4limits(r,th1,sigma,driver)
%function f4lmits(r,th1,sigma,driver)
%draw the positions of four-bar links
%call f4bar funcion
%r: row vector for four links
%th1: frame angle
%sigma: assembly mode
%driver: 0 for crank, 1 for coupler
% Example:h=f4limits([4 2 3 4],0,1,0)
[Qstart, Qstop]=fb_angle_limits(r,th1,driver)
[values b]=f4bar(r,th1,Qstart,0,0,sigma,driver);
if b==1,
h=draw4link(values,driver);
else
fprintf('Combination of links fails at degrees %6.1f\n',Qstart);
end
[values b]=f4bar(r,th1,Qstop,0,0,sigma,driver);
if b==1,
h=draw4link(values,driver);
else
fprintf('Combination of links fails at degrees %6.1f\n',Qstart);
end
axis equal
grid on


執行結果