2007年5月18日 星期五

機動學 作業九

作業九 b94611042 王志豪 (Due date: 12pm May 16, 2007)
我有上本週5/3的課

機動學分組:C組:5/17(四) 8:00am-9:30am
(蔡篤明,劉昶志,許惠善,張鈞崴,張延瑋,王志豪,范詠晴,林詠舜)

我的blog

題目:

•請聲明本週(5/3)有來上課。
•請閱讀機動論壇中有關下週分組上課的情形,並登記組別。

•請就教科書中第四章第五節之偏置機構作另類分析,分析過程可採你所知的方式(包括講義中所列的方法)。運動中分以曲桿驅動及滑塊驅動的方式,並說明運動的界限或範圍。設此機構之曲桿長Rcm , 連桿Lcm,滑塊之偏置量為10cm等數據作分析。其中,R=10+(學號末二碼),L=R+5 。

問題:
==>請就教科書中第四章第五節之偏置機構作另類分析,分析過程可採你所知的方式(包括講義中所列的方法)。運動中分以曲桿驅動及滑塊驅動的方式,並說明運動的界限或範圍。設此機構之曲桿長Rcm , 連桿Lcm,滑塊之偏置量為10cm等數據作分析。其中,R=10+(學號末二碼),L=R+5 。
Ans:

首先,題目所說的滑塊機構,其長相如下:














基本模式

由此,我們的分析正式展開.
一開始,我們得先討論題目所述之連桿,其運轉範圍之限制.
而在這邊,首先,我們就必須要先討論其限制的角度.
為了討論這些連桿的限制角度,網路講義第七章中,提供了一個很好用的函數.
這個函數,即為function sld_angle_limits

*******************************************************************
function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)
%
%function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)%
Find initital & final angles of driving link for slider
% linkdrive= 0 for crank; 1 for coupler as the driver, with
% Qstart & Qstop as the limit angles of driving link.
% linkdrive=2 for slider as input, with Qstart & Qstop as its
% initial & final positions of r1% Variables
% r= linkage row vector (cm)
% Examples:[Qst,Qsp]=sld_angle_limits([1 5 3 1],30,0)
r1=r(1);r2=r(2);r3=r(3);r4=r(4);g2d=180/pi;
switch linkdrive
case 0 %crank
if r3+r4<r2 & r4>=0 & r3>r4
Qstart=asin((r4-r3)/r2);Qstop=asin((r4+r3)/r2);
elseif r3+r4>=r2 & r4>=r3 & r3>=0
Qstart=asin((r4-r3)/r2);Qstop=pi-asin((r4-r3)/r2);
elseif r3-r4<=r2 & r4<0 & r3>=-r4
Qstart=asin((r4-r3)/r2);Qstop=asin((r4+r3)/r2);
elseif r3-r4>=r2 & r3>=0 & -r4>=r3
Qstart=-pi-asin((r4+r3)/r2);Qstop=asin((r4+r3)/r2);
else
Qstart=0;Qstop=2*pi;
end
case 1 %coupler
if r2-r4<=r3 & r4>=0 & r2>=r4
Qstart=asin((r4-r2)/r3);Qstop=pi-asin((r4-r2)/r3);
elseif r2+r4<r3 & r4>=0
Qstart=asin((r4-r2)/r3);Qstop=asin((r4+r2)/r3);
elseif r2+r4<=r3 & r4<=0 & r2+r4>=0
Qstart=-pi-asin((r4+r2)/r3);
Qstop=asin((r4+r2)/r3);
elseif r2-r4<r3 & r4<=0
Qstart=asin((r4-r2)/r3);Qstop=asin((r4+r2)/r3);
else %r2>=(r3+abs(r4))
Qstart=0;Qstop=2*pi;
end
case 2 %slider displacement
Qstart=0;Qstop=0;
arg2=(r2+r3)^2-r4^2;
if abs(r2-r3)>=r4
arg1=(r2-r3)^2-r4^2;
if arg1>0,Qstart=sqrt(arg1);end;
Qstop=sqrt(arg2);
else
if arg2<0, return; end
Qstart=sqrt(arg2);Qstop=-sqrt(arg2);
end
theta1=0;g2d=1;end %case
if Qstop<Qstart,TT=Qstart;Qstart=Qstop;Qstop=TT;end
adjust=(Qstop-Qstart)*1e-8;
Qstart=theta1+(Qstart+adjust)*g2d;
Qstop=theta1+(Qstop-adjust)*g2d;
*****************************************************************

在此,應題目之要求,開始設定數值.

*r(1) 固定桿(第一桿)
*r(2) 曲桿 =52(because 42+10)
*r(3) 結合(連)桿=57(because 52+5)
*r(4) 垂直偏置量=10
*theta1 : 第一桿之水平角
*theta2 : 驅動桿之水平夾角
*td2 : 驅動桿角速度
*tdd2 : 驅動桿角加速度
*sigma : 組合模數
*driver : 驅動桿

在這裡,基本上我們是不用設定第一桿的長度.
這主要是因為第一桿的方向雖然是固定的,但其長度卻會隨機構運動而不停變動伸縮.
其中,對於r的設定基本如下:
r=[第一桿、曲桿、連桿、偏置量]
因此,透過這些的條件,我們便可以把數值代入主程式中:

1.這是以第二桿作驅動桿的(driver為0),其結果如下:
***主程式==>
r=[0 52 57 10];
theta1=0;
linkdrive=0;
sld_angle_limits(r,theta1,linkdrive);

Qstart =

-64.6683


Qstop =

244.6683















第二桿驅動限制角度位置圖


2.接下來我們便以第三桿為驅動桿(driver為1)
***主程式==>
r=[0 52 57 10];
theta1=0;
linkdrive=1;
sld_angle_limits(r,theta1,linkdrive);

Qstart =

-47.4631


Qstop =

227.4631















第三桿驅動限制角度位置圖


3.接下來我們便以滑塊為驅動桿(driver為2)
***主程式==>
r=[0 52 57 10];
theta1=0;
linkdrive=2;
sld_angle_limits(r,theta1,linkdrive);

Qstart =

-108.5403


Qstop =

108.5403















滑塊驅動限制角度位置圖


由上面的結果,便可知道機構運動時的基本限制!!!



在了解極限角度的狀況後,我們便可以開始討論其運動狀況.
關於這個部分,我們可以利用一個講義第七章中的還是來幫助我們運算.
即是function drawsldlimits(r,th1,sigma,driver)!!!
這個函式正是能幫助我們算出運動界限.
桿長r為:(第一桿、曲桿、連桿、偏置量)
第一桿的水平角度為th1=0
Sigma如同第八次作業中的mode.
Driver則依照我們討論的情形有所更改.
當中,0代表驅動桿為第二桿,1代表驅動桿為第三桿,2代表由滑塊驅動.

*****************************************************************
function [values]=drawsldlinks(r,th1,th2,sigma,driver)
%function drawlinks(r,th1,th2,sigma,driver)
%draw the positions of four-bar links
%call f4bar funcion
%r: row vector for four links
%th1: frame angle
%th2: crank angle or couple angle
%sigma: assembly mode
%driver: 0 for crank, 1 for coupler
%% Example:
% drawsldlinks([1 2 3 4],0,60,1,0)
%clf;
[values b]=sldlink(r,th1,th2,10,0,sigma,driver)
;rr=values(:,1);rr(3)=rr(3)+rr(2);
rx=real(rr);rx(4)=0;
ry=imag(rr);ry(4)=0;
if b==1
plot([0 rx(1)],[0 0],'k-','LineWidth',4);%ground line
hold on;
plot([0 rx(1)],[0 ry(1)],'g-','LineWidth',1.5);
if driver==0
plot([0 rx(2)],[0 ry(2)],'b-','LineWidth',1.5);
plot([rx(2) rx(3)],[ry(2) ry(3)],'r-','LineWidth',2);
else
plot([0 rx(2)],[0 ry(2)],'r-','LineWidth',2);
plot([rx(2) rx(3)],[ry(2) ry(3)],'b-','LineWidth',1.5);
end
plot([rx(1) rx(3)],[ry(1) ry(3)],'k-');
plot(rx,ry,'bo');
text(0,0,' O');text(rx(1),ry(1),' R');
text(rx(2),ry(2),' P');text(rx(3),ry(3),' Q');
length=max(abs(values(2:3,1)));
len=.20*length;ww=.15*length;
[coords] = sldbox(len,ww,rx(3),ry(3),th1);
plot(coords(:,1),coords(:,2),'r-','LineWidth',2);
[coords] = sldbox(len*3,0,rx(3),ry(3)-ww/2,th1);
plot(coords(:,1),coords(:,2),'r:','LineWidth',1.5);else
fprintf('Combination of links fails at degrees %6.1f\n',th2);
axis equal;
grid on;
end
axis equal;
grid on;
******************************************************************

有了這個程式後,我們便可以開始討論各項狀況了.



1.以第二桿為驅動桿的狀況(driver為0)

在此,由機動學的講義中,可以知道這部分應該會有四種可能性

1.是當r3≧r4≧0,且 r3+r4 ≦ r2
2.是當r4≧r3≧0,且 r3+r4 ≧ r2
3.是當r3≧-r4≧0,且 r3-r4 ≦ r2
4.是當-r4≧r3≧0,且 r3-r4 ≧ r2

從條件[0 52 57 10]裡面,可以看出沒有符合我們上面四個條件.
縱使把偏置量改成-10cm,[0 52 57 -10],依然無法符合上面四個條件的任何一種.
所以可得結論,這個滑塊機構是無法以第二桿為驅動桿的.



2.以第三桿為驅動桿的狀況(driver為1)

討論類似上面,分成四部份討論.

1.是當0≦r4,且0≦r2-r4≦r3
2.是當0≦r4,且r2+r4≦r3
3.是當r4≦0,且0≦r2+r4<r3
4.是當r4≦0,且r2-r4<r3 時

從條件[0 52 57 10]我們可以看出我們符合第一個條件.
所以這個機構是可行的.
此時,欲畫基本圖型,程式如下:

drawsldlinks([0 52 57 10],0,i,-1,0)

結果參照上面角度分析的圖.
即是"第三桿驅動限制角度位置圖"

這時候,為了方便觀察分析,可以製作成動畫型式來呈現.
***主程式==>
for i=-47.4631:2:227.4631
pause(0.1)
clf
drawsldlinks([0 52 57 10],0,i,-1,0)
axis([-130 130 -130 130])
end





3.以滑塊為驅動桿的狀況(driver為2)

在這個以滑塊為驅動桿的部份,基本上只會有兩種情形產生.
1.|r2-r3|>r4時,其條件限制於r1所給之長短
2.|r2-r3|< r4時
由我們的桿長[0 52 57 10],可知是第二種情形
所以這個機構是可行的.
此時,欲畫基本圖型,程式如下:

drawsldlinks([0 52 57 10],0,i,-1,2)

結果參照上面角度分析的圖.
即是"滑塊驅動限制角度位置圖"

這時候,為了方便觀察分析,可以製作成動畫型式來呈現.
(這個動畫向右運動的情形和向左是一樣的)
而此時的Qstart跟Qstop指的是第一桿的起點位置以及終點位置.
如果想要使用drawsldlinks來做成動畫的話,我們必須先算出角度.

θmin =sin-1(r4/(r2+r3)) = 5.264
θmax =π- sin-1(r4/(r2+r3)) = 174.736

***主程式==>
for i=5.264:(174.736-5.264)/60:174.736
pause(0.1)
clf
drawsldlinks([0 52 57 10],0,i,-1,1)
axis([-130 130 -130 130])
end




(註:本來以前一直解決不了動畫執行的時候,其範圍大小會不斷變化,造成視野縮放不停,使得觀賞上較不順眼.而在5/17的時候,由於一個不小心睡過頭,錯過了小組討論,然而上課時,感謝教授的指正與教誨,讓我終於明白原來問題是出在於for迴圈以及clf身上,經修正之後,視野果然不復過去不停縮放的窘境,非常高興,十分感謝!!!)




在大致上的討論告一段落以後......
接下來便可以來討論滑塊連桿之軌跡.
此時,可以利用講義上的function drawsldpaths.
這是個蠻厲害的函式.
在前面,任何桿之延伸點上之位移、速度及加速度等東西......
均可利用sldlink()、body()、fb_sld_linits()及drawlinks()等函數進行分析!!!
然而,利用drawsldpaths()函數則還可以達到整合的目的.
故頗為實用.
此函式的程式碼如下:

*******************************************************************
function drawsldpaths(r6,th6,r,th1,td2,tdd2,sigma,npts,driver,mode)
clf;
figure(1);
warning off;
r(abs(r)<eps)=eps;
[Qstart, Qstop]=sld_angle_limits(r,th1,driver)
npoint=abs(npts);
th2=linspace(Qstart,Qstop,npoint);
val=zeros(11,npoint);
for i=1:npoint,
if driver==2, r(1)=th2(i);end
[vr b]=sldlink(r,th1,th2(i),td2,tdd2,sigma,driver);
[para]=body(r6,th6,vr,3);
if mod(i,5)==0|i==1|i==npoint,
drawsldlinks(r,th1,th2(i),sigma,driver);

end
val(1:3,i)=[vr(1,1)+vr(4,1);vr(2,1);para(2)];%Sq,Sp,Sa %找q,p,a
switch driver
case 0
val(4:7,i)=[abs(vr(1,1));vr(3,2);vr(3,3);vr(3,4)];
case 1
val(4:7,i)=[abs(vr(1,1));vr(2,2);vr(2,3);vr(2,4)];
case 2
val(4:7,i)=[abs(vr(2,2));vr(3,2);vr(2,3);vr(3,3)];
end
val(8:11,i)=[vr(1,5);para(4);vr(4,6);para(5);];
%Vs, Va, As, Aa
end
warning on; %路徑繪制
plot(val(1,:),'k-','LineWidth',1.5,'linestyle',':');% path of Q
plot(val(2,:),'k-','LineWidth',1.5);% path of P
plot(val(3,:),'g-','LineWidth',1.5);% path of A
axis equal
if mode==0, return;end;
th2=th2(3:end-3);val=val(:,3:end-3);
title0={'Crank Angle','Coupler Angle','Slider Pos'};
title1={'\Theta3(r) & r1(k)', '\Theta2(r) & r1(k)',...
'\Theta2(r) & \Theta3(k)' };
title2={'Vel of A (r) & Slider(k)',...
'Acc of A(r) & Slider(k)' };
title3={'\omega(r) & \alpha(b) of Coupler',...
'\omega(r) & \alpha(b) of Crank',...
'\omega of Crank(r) & Coupler(b)'};
intitle=title0(driver+1);
val(abs(val)>10e+5)=NaN;
val(8:11,:)=abs(val(8:11,:));
figure(2);
clf;
subplot(2,2,1);
plot(th2,val(4,:),'k-');
hold on;fact=round(max(val(5,:))/max(val(4,:))*10)/10;
plot(th2,val(5,:)/fact,'r-');% crank or coupler angle
xlabel(intitle);ylabel(title1(driver+1));
grid on
subplot(2,2,2);
plot(th2,val(6,:),'r-');
fact=round(max(val(7,:))/max(val(6,:))*10)/10;
hold on;plot(th2,val(7,:)/fact,'b-');
xlabel(intitle);ylabel(title3(driver+1));
grid on;
subplot(2,2,3);
plot(th2,val(8,:),'k-');
hold on;plot(th2,val(9,:),'r-');
xlabel(intitle);ylabel(title2(1));
grid on;
subplot(2,2,4);
plot(th2,val(10,:),'k-');
hold on;plot(th2,val(11,:),'r-');
xlabel(intitle);ylabel(title2(2));
grid on;
*****************************************************************

關於這個函式,其基本使用方式如下:
* r : 四連桿之長度,一列向量表示.
* th1: 第一桿的水平角度(通常為零).
* th2: 驅動桿或聯結桿的水平角度.
* td2, tdd2:驅動桿之角速度及角加速度.
* Sigma:連桿之組合模式選擇(需為+1或-1)
* Driver:驅動桿之設定( 0 表示苗桿驅動,1 表示由聯結桿驅動,3滑塊驅動).
* Npts: 設定分割的點數或位置.
* r6,rh6,nlink:桿上特定點之位置,包括桿長,與桿之夾角及附於何桿.
* Mode:mode=0,畫簡單位置圖;=1 畫所有圖表;=2畫所有圖表,但用簡單位置圖.


***主程式==>
drawsldpaths(0,0,[0 52 57 10],0,0.01,0.01,1,50,0,1)















軌跡分析

















軌跡各項要素分析

1 則留言:

大鳥 提到...

座標範圍用的適當,圖會更好看喔!!