2007年5月25日 星期五

機動學 作業十

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

我的blog


題目:

1.請聲明本週(5/17)有來上課。

2.請思考速度與加速度的問題,當一桿以某特定點M等角速度迴轉時,其端點P之速度方向如何?其加速度方向如何?若該特定點M復以等速水平運動,則同一端點P之速度與加速度方向會變為如何?若M點同時也有加速度,則點P會有何變化?若以此推理四連桿的運動,則點P與Q之速度與加速度方向會與桿一(固定桿)之兩端點之關係如何?與我們前面的作業分析結果有無共通之處?(參看第六章之四連桿機構之運動分析)

3.設有一運動之曲柄滑塊連桿組合,設滑塊之偏置量為零,且在水平方向移動,試以此機構之曲桿長度及角度,以及連結桿之長度為輸入項,利用matlab寫出一程式計算在不同曲柄角度時,六點瞬心之對應位置。可順便探討六點瞬心與曲柄角間之關係。

10.1
我有上本週5/17的課



10.2
==>請思考速度與加速度的問題,當一桿以某特定點M等角速度迴轉時,其端點P之速度方向如何?其加速度方向如何?若該特定點M復以等速水平運動,則同一端點P之速度與加速度方向會變為如何?若M點同時也有加速度,則點P會有何變化?若以此推理四連桿的運動,則點P與Q之速度與加速度方向會與桿一(固定桿)之兩端點之關係如何?與我們前面的作業分析結果有無共通之處?(參看第六章之四連桿機構之運動分析)
Ans:

(1)
P點指的是桿三以及桿四相交的位置.
在此,我以r1,r2,r3,r4來分別表示各桿.
這時後,即可用老師上課所用的方法.首先,我們找出r1、r3的瞬時中心M13.
其位置會在r2、r4的延長線上,所以我們可以很清楚的看出來P點的速度以及加速度方向.
P的速度方向應該是在垂直r2的方向,而加速度是在r2的方向.














基本桿圖示意

若要比較科學化的分析,也可以如此看待:
一開始,先假設PM間距離為r(單位m).
而此時M就以等角速度ω(單位rad/s)轉動.
則P點此時有速度r*ω(m/s),其方向與r為垂直方向,且有向心加速度r*ω^2(單位m/s^2)










精簡化分析


(2)
那麼,假若該特定點M復以等速水平運動,則同一端點P之速度與加速度方向又會變為如何呢?
簡單來說,假若M複以V(m/s)等速水平移動,則P點此時之速度為:

==> V+ω*r ,其中方向為其向量合.

至於加速度方面則不受影響,依舊為r*ω^2,維持不變.














向量合力圖

(3)
而談到若M點同時也有加速度,則關於點P的變化,茲說明如下:
一言以蔽之,由於M點有了加速度,故此時P點的加速度將不再只有法線加速度而已.
它的切線方向理論上也會有一個切線加速度.
不過,在此和M有水平速度不一樣的地方在於M有無加速度這項條件.
其實並不會影響到P點的速度以及加速度方向!!!
它所能影響的,不外乎只有速度以及加速度的大小而已.
這其實就是物理上所學的,關於力的方向可以各自獨立計算.
加速度大致會變成:V(m/s)+r*ω^2*cos(θ)(m/s) i + r*ω^2*sin(θ)(m/s) j


(4)
藉由上面這些條件,我們便可以開始分析四連桿的運動了.
首先,關於速度的部份,可知P的速度是在垂直r2方向,Q則是在垂直r4的方向.
加速度的部份,P在r2的延長線上,Q則是位於r4的延長線上面.
P之速度方向是P與桿一端點連線的垂直方向,加速度方向則是P與桿一端點的連線方向.
Q的速度方向,則就是Q與桿一端點連線垂直,加速度方向則為Q與桿一端點的同一連線方向.

除此之外,若是桿三驅動的話,可以看出P的速度方向就是在垂直r3的方向,P的加速度就是在r3的方向上.

而當桿三有了加速度,假設為a......
此時桿三除了角速度W1以外還會有另一個隨時間變動的角速度at.
結果跟我們分析一開始桿二驅動的時候有點類似:
都是只會影響速度以及加速度的大小,而不影響速度與加速度的方向.














參考用的基本示意圖,可與解說對照了解

另外,以桿三為驅動桿,較為特別之處,在於我們要利用Q.R的瞬時中心M24!
有了M24,我們可以發現P和Q之間的速度以及加速度方向是一樣的.
只不過,由於兩者和瞬時中心間的距離不同,所以速度跟加速度的大小也會不同.



10.3

==>設有一運動之曲柄滑塊連桿組合,設滑塊之偏置量為零,且在水平方向移動,試以此機構之曲桿長度及角度,以及連結桿之長度為輸入項,利用matlab寫出一程式計算在不同曲柄角度時,六點瞬心之對應位置。可順便探討六點瞬心與曲柄角間之關係。
Ans:

在此,我是參照課本上的一個function slider_solve 來改寫的.
以下是我變形過的new function

主程式
==>
function slider_draw(R,L,e)
%R=桿一長
%L=桿二長
%e=偏置量
the1=slider_limit(R,L,e)
the2=90
ang=linspace(the1,the2,100);
d=slider_solve(ang,R,L,e,1);

x=R*cosd(ang);
y=R*sind(ang);
for n=1:100
hold on
line([0,x(n),d(n)],[0,y(n),e]);
line([d(n)-3,d(n)+3,d(n)+3,d(n)-3,d(n)-3],[e-2,e-2,e+2,e+2,e-2]);
plot(0,0,'go')
plot(x(n),y(n),'go')
plot(d(n),e,'go')
plot([0,0],[0,e-d(n)*(y(n)-e)/(x(n)-d(n))],'go:')
plot([x(n),0],[y(n),e-d(n)*(y(n)-e)/(x(n)-d(n))],'go:')
plot([x(n),d(n)],[y(n),y(n)*d(n)/x(n)],'go:')
plot([d(n),d(n)],[0,y(n)*d(n)/x(n)],'go:')
axis equal
axis ([-110 110 -110 110]);
pause(0.08)
clf
end

%以上,程式的主要概念在於先畫出外型,然後再做出瞬心位置,最後plot上去.

以下即分別是
R > L
R < L
R = L
三種不同情況下曲柄滑塊連桿的運動狀況:









以上是關於曲柄滑塊連桿組合運動狀況的部份.
接下來,即便是關於計算瞬心的部份了.
基本上,瞬心以甘迺迪定理可定出.....
瞬心13可由12及23的連線14及34的連線交點獲得.
24則為23及34連線與12及14連線之交點獲得.
在此,我寫了一個專門關於計算瞬心位置的function

function [M12,M13,M14,M23,M24,M34]=Centor(r2,th2,r3,th3)
M12=[0,0]
M13=M23-[r2*sin(th2)/tan(th2),r2*sin(th2)]
M14=[r2*cos(th2)+r3*cos(th3),0]
M23=[r2*cos(th2),r2*sin(th2)]
M24=M23+[r3*cos(th3),r3*cos(th3)*tan(th3)]
M34=M23+[r3*cos(th3),r3*sin(th3)]

這個程式基本上,是可以幫我們找出六個瞬心的!
而為了將他們畫出來,由上面這個瞬心function,可以延伸出一個新function.

function [M12,M13,M14,M23,M24,M34]=PrintCenter(r2,theta2,r3,theta3)
M12=[0,0]
M13=M23-[r2*sin(th2)/tan(th2),r2*sin(th2)]
M14=[r2*cos(th2)+r3*cos(th3),0]
M23=[r2*cos(th2),r2*sin(th2)]
M24=M23+[r3*cos(th3),r3*cos(th3)*tan(th3)]
M34=M23+[r3*cos(th3),r3*sin(th3)]
x1=0;
x2=r2*cos(th2);
x3=x2+r3*cos(th3);
x4=r2*cos(th2)+r3*cos(th3);
x5=x2-(r2*sin(th2)/tan(th3))
x6=x2+r3*cos(th3)
y1=0;
y2=r2*sin(th2)
y3=y2+r3*sin(th3)
y4=0
y5=y2-r2*sin(th2)
y6=y2+(r3*cos(th3)*tan(th2))
Print1=[x1 y1;x5 y5;x3 y3;x4 y4;x1 y1;x6 y6;x4 y4;x1 y1]
line(Print1(:,1),Print1(:,2))
text(x1,y1,'M12')
text(x2,y2,'M23')
text(x3,y3,'M34')
text(x4,y4,'M14')
text(x5,y5,'M13')
text(x6,y6,'M24')

而此時,又可以再度利用上面這個瞬心程式,做出另一個動畫哩.

主程式
==>
AXIS([-40 40 -40 40]);
for th1=0:5:360
AXIS([-40 40 -40 40]);
PrintCenter(20,th1,15,85)
pause(0.2)
clf
end














瞬心圖舉例



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)















軌跡分析

















軌跡各項要素分析

2007年5月9日 星期三

機動學 作業八

作業八 b94611042 王志豪 (Due date: 12pm May 9, 2007)
我有上本週4/26的課
我的blog

題目:

有一組四連桿,其桿長分別為r=[4 3 3 5],由桿2驅動,設第一固定桿角度theta1=0度; 角速度 td2=10rad/s; 角加速度tdd2=0 rad/s^2。

* 問題一:設桿2角度theta2=45度時,求各點之位置、速度與加速度為何?
* 問題二:繪出此四連桿之相關位置及標明各點之速度方向及大小(以程式為之)。
* 問題三:當桿2迴轉時,求出此組四連桿之限制角度,並繪出其位置(以程式為之)。
* 問題四:設theta2=[0:20:360],試繪出此組四連桿之重疊影像,解釋為何有些沒有值。
* 問題五:若將問題三考慮在內,只在可迴轉的範圍內迴轉,請問你能讓此組四連桿作成動畫方式迴轉嗎?

8.1
==>設桿2角度theta2=45度時,求各點之位置、速度與加速度為何?
Ans:

首先,按題目所示,我引用了網路講義第六章的一個函式function f4bar:

***********************************************************************
function [data,form] = f4bar(r,theta1,theta2,td2,tdd2,mode,linkdrive)
%
%function [data,form] = f4bar(r,theta1,theta2,td2,tdd2,mode,linkdrive)
% This function analyzes a four-bar linkage when the driving link is
% crank or coupler. The input data are:
% theta1,theta2 are angles in degrees
% r=[r1 r2 r3 r4]= lengths of links(1=frame)
%td2 = crank or coupler angular velocity (rad/sec)
%tdd2 = crank or coupler angular acceleration (rad/sec^2)
%mode = +1 or -1. Identifies assembly mode
%linkdrive = 0 for crank as driver; 1 for coupler as driver
%data (1:4,1) = link positions for 4 links
%data (1:4,2) = link angles in degrees
%data (1:4,3) = link angular velocities
%data (1:4,4) = link angular accelerations
%data (1,5) = velocity of point Q
%data (2,5) = velocity of point P
%data (3,5) = acceleration of point Q
%data (4,5) = acceleration of point P
%data (1,6) = position of Q
%data (2,6) = position of P
%form = assembly status. form = 0, mechanism fails to
% assemble.
% program revised from Waldron's Textbook
% Revised:DSFON, BIME, NTU. Date: Feb. 7, 2007
if nargin<7,linkdrive=0;end mode="1;end" data="zeros(4,6);" linkdrive="=" r="[r(1)" rr="r.*r;d2g=" t1="theta(1);tx=" s1="sin(t1);c1=" sx="sin(tx);cx=" a="2*r(1)*r(4)*c1-2*r(2)*r(4)*cx;" c="rr(1)+rr(2)+rr(4)-rr(3)-2*r(1)*r(2)*(c1*cx+s1*sx);" b="2*r(1)*r(4)*s1-2*r(2)*r(4)*sx;" pos="B*B-C*C+A*A;">=0,
form=1;
% Check for the denominator equal to zero
if abs(C-A)>=1e-5
t4=2*atan((-B+mode*sqrt(pos))/(C-A));
s4=sin(t4);c4=cos(t4);
t3=atan2((r(1)*s1+r(4)*s4-r(2)*sx),(r(1)*c1+r(4)*c4-r(2)*cx));
s3=sin(t3);c3=cos(t3);
else
% If the denominator is zero, compute theta(3) first
A=-2*r(1)*r(3)*c1+2*r(2)*r(3)*cx;
B=-2*r(1)*r(3)*s1+2*r(2)*r(3)*sx;
C=rr(1)+rr(2)+rr(3)-rr(4)-2*r(1)*r(2)*(c1*cx+s1*sx);
pos=B*B-C*C+A*A;
if pos>=0,
t3=2*atan((-B-mode*sqrt(pos))/(C-A));
s3=sin(t3); c3=cos(t3);
t4=atan2((-r(1)*s1+r(3)*s3+r(2)*sx),...
(-r(1)*c1+r(3)*c3+r(2)*cx));
s4=sin(t4);c4=cos(t4);
end
end
theta(3)=t3;theta(4)=t4;
%velocity calculation
td(2)=td2;
AM=[-r(3)*s3, r(4)*s4; -r(3)*c3, r(4)*c4];
BM=[r(2)*td(2)*sx;r(2)*td(2)*cx];
CM=AM\BM;
td(3)=CM(1);td(4)=CM(2);

%acceleration calculation

tdd(2)=tdd2;
BM=[r(2)*tdd(2)*sx+r(2)*td(2)*td(2)*cx+r(3)*td(3)*td(3)*c3-...
r(4)*td(4)*td(4)*c4;r(2)*tdd(2)*cx-r(2)*td(2)*td(2)*sx-...
r(3)*td(3)*td(3)*s3+r(4)*td(4)*td(4)*s4];
CM=AM\BM;
tdd(3)=CM(1);tdd(4)=CM(2);
%store results in array data
% coordinates of P and Q
if linkdrive==1,
c2=c3;c3=cx;s2=s3;s3=sx;
r(2:3)=[r(3) r(2)];theta(2:3)=[theta(3) theta(2)];
td(2:3)=[td(3) td(2)];tdd(2:3)=[tdd(3) tdd(2)];
else
c2=cx;s2=sx;
end
for j=1:4,
data(j,1:4)=[r(j)*exp(i*theta(j)) theta(j)/d2g td(j) tdd(j)] ;
end % position vectors
data(1,5)=r(2)*td(2)*exp(i*theta(2));%velocity for point Q
data(2,5)=r(4)*td(4)*exp(i*theta(4));%velocity for point P
data(3,5)=r(2)*(i*tdd(2)-td(2)*td(2))*exp(i*theta(2));%acc of Q
data(4,5)=r(4)*(i*tdd(4)-td(4)*td(4))*exp(i*theta(4));%acc of P
data(1,6)=data(2,1);%position of Q, again
data(2,6)=data(1,1)+data(4,1);% position of P

%find the accelerations
else
form=0;
if linkdrive==1,
r=[r(1) r(3) r(2) r(4)];
for j=1:4, data(j,1)=r(j).*exp(i*theta(j));end % positions
end
end
***********************************************************************

這個程式的基本使用大致如下:
[data,form] = f4bar(r,theta1,theta2,td2,tdd2,mode,linkdrive)
* r(1:4) = 各桿之長度,r(1)為固定桿,其餘分別為曲桿、結合桿及被動桿,即r=[r1 r2 r3 r4]。
* theta1 = 第一桿之水平角,或為四連桿之架構角,以角度表示。
* theta2 = 驅動桿之水平夾角,以角度表示。一般為曲桿角,但若為結合桿驅動,則為結合桿之水平夾角。
* td2 = 驅動桿(第二桿或第三桿)之角速度(rad/sec)。
* tdd2 = 驅動桿(第二桿或第三桿)之角加速度(rad/sec^2)。
* mode = +1 or -1. 組合模數,負值表示閉合型,正值為分支型,但有時需視實際情況而定。
* linkdrive = 0 (驅動桿為第二桿); 1 (驅動桿為第三桿) 。
* form = 組合狀態, 0 :表示無法組合; 1:可以正確組合
* data = 輸出矩陣,其大小為 4 X 7,各行之資料分配如下:

**********************************************************
    1   2(deg) 3(rad/s) 4(rad/s2) 5 6   7
I   桿1位置   θ1 ω1    α1    VQ  |VQ|  ∠VQ
II  桿2位置 θ2   ω2    α2    VP  |VP|  ∠VP
III 桿3位置  θ3   ω3    α3    AQ  |AQ|  ∠AQ
IV 桿4位置   θ4   ω4    α4    AP  |AP|   ∠AP
**********************************************************

因此,我們便可以利用這個程式來解決問題.
首先,便是把題目所需條件代入程式中.

***主程式==>
[val,form]=f4bar([4 3 3 5],0,45,10,0,-1,0)
abs(val(:,1))
abs(val(:,2))
abs(val(:,3))
abs(val(:,4))
%我是以mode=-1來執行,也就是討論閉合型的狀況

此時,便可得解,而由於位置他是以向量的模式來表現,所以實際位置必須直接用手計算之.


各桿之速度(rad/s):
第一桿 : 0
第二桿 : 10.0000
第三桿 : 16.2681
第四桿 : 4.9677


各桿之加速度(rad/s^2):
第一桿 : 0
第二桿 : 0
第三桿 : 491.4428
第四桿 : 383.6120


P點的
位置 : (2.12 , 2.12)
速度 (rad/s) : 0.0212 + 0.0212i (10)
加速度 (rad/s^2) : -0.2121 - 0.2121i (0)


Q點的
位置 : (3.17 , 4.93)
速度 (rad/s) : 0.0041 - 0.0245i (16.2681)
加速度 (rad/s^2) : -1.8712 - 0.4391i (491.4428)


8.2

==>繪出此四連桿之相關位置及標明各點之速度方向及大小(以程式為之)。
Ans:

按題目所示,我引用了網路講義第六章的一個函式function drawlinks:

***********************************************************
function [values]=drawlinks(r,th1,th2,mode,linkdrive)
%function drawlinks(r,th1,th2,mode,linkdrive)
%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
%mode: assembly mode
%linkdrive: 0 for crank, 1 for coupler
%clf;
if nargin<5,linkdrive=0;end
if nargin<4,mode=1;end
[values b]=f4bar(r,th1,th2,0,0,mode,linkdrive);
rr=values(:,1);
rr(3,1)=rr(1,1)+rr(4,1);
rx=real(rr(:,1));rx(4)=0;
ry=imag(rr(:,1));ry(4)=0;
if b==1
plot([0 rx(1)],[0 ry(1)],'k-','LineWidth',4);
hold on;
if linkdrive==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)],'g-','LineWidth',1.5);
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');
else
fprintf('Combination of links fail at degrees %6.1f\n',th2);
end
axis equal
grid on
******************************************************************

這個程式的基本使用大致如下:
function drawlinks(r,th1,th2,mode,linkdrive)
* r(1:4) = 各桿之長度,r(1)為固定桿,其餘分別為曲桿、結合桿及被動桿。
* theta1 = 第一桿之水平角,或為四連桿之架構角,以角度表示。
* theta2 = 驅動桿之水平夾角,以角度表示。一般為曲桿角,但若為結合桿驅動,則為結合桿之水平夾角。
* mode = +1 or -1. 組合模式,負值表示閉合型,正值為分支型,但有時需視實際情況而定。
* linkdrive = 0 (驅動桿為第二桿); 1 (驅動桿為第三桿)


以及引用之前作業用過的function dyad_draw
*******************************************************************
function dyad_draw(rho,theta,td,tdd)
% Call function dyad(rho,theta,td,tdd) to
% analyze a dyad linkage composing cranks and a dyad with drawing.
% Inputs: rho:length of links
% theta:incling angles, deg.
% td:angular velocity, rad/s
% tdd:angular acceleration, rad/s^2
% Example:
% dyad_draw([15 10 5],[0 60 90],[.5 .8 .5],0)
clf;
[vec,data] = dyad(rho,theta,td,tdd);
x=[0;cumsum(real(data(:,1)))];y=[0;cumsum(imag(data(:,1)))];
for i=1:length(x)-1
linkshape([x(i) y(i)],[x(i+1) y(i+1)],1);
end
for k=1:length(rho)
x0=x(k+1);y0=y(k+1);
vx=x0+real(data(k,2));vy=y0+imag(data(k,2));
ax=x0+real(data(k,3));ay=y0+imag(data(k,3));
line([x0 vx],[y0 vy],'marker','s','linewidth',2);
line([x0 ax],[y0 ay],'marker','s','color','r','linewidth',3)
end
sdata=sum(data);
ss=[real(sdata(1)) imag(sdata(1))];
vv=[real(sdata(2)) imag(sdata(2))];
aa=[real(sdata(3)) imag(sdata(3))];
line([0 ss(1)],[0 ss(2)],'linestyle',':','linewidth',2)
line([ss(1) ss(1)+vv(1)],[ss(2) ss(2)+vv(2)],...
'marker','d','color','g','linewidth',3)
line([ss(1) ss(1)+aa(1)],[ss(2) ss(2)+aa(2)],...
'marker','d','color','m','linewidth',3)
axis equal;grid on
*********************************************************************

因此,我們便可以利用這兩個程式來解決問題.
於是,便把題目所需條件代入程式中.

***主程式==>
drawlinks([4 3 3 5],0,45,-1,0)















四連桿相關位置

drawlinks([4 3 3 5],0,45,-1,0)
dyad_draw([4 5],[0 99.5246],[0 4.9677]*0.05,[0 383]*0.001)
dyad_draw([3 3],[45 69.4856],[10 16.2681]*0.05,[0 491]*0.001)















連桿之速度方向與大小


8.3
==>當桿2迴轉時,求出此組四連桿之限制角度,並繪出其位置(以程式為之)。
Ans:

關於這題,在此則是使用了極限函數fb_angle_limits:

*************************************************************
function [Ang1, Ang2]=fb_angle_limits(r,theta1,linkdrive)
%
%function [Ang1, Ang2]=fb_angle_limits(r,theta1,linkdrive)
% Find initital & final angles for the driving link
% linkdrive= (0 for crank; 1 for coupler as the driver).
% Variables:
% r=linkage row vector (cm)
% theta1=frame angle(degree);
% Ang1,Ang2=initial & final angles of the driving link(deg)
%Program
if nargin<3,linkdrive=0;end theta1="0;end" linkdrive="=" r="[r(1)" r1="r(1);r2=" r3="r(3);r4=" rmin="min(r);rmax=" rtotal="sum(r);" ang1="0;" ang2="2*pi;">(r3+r4)& abs(r1-r2)(r3+r4)& abs(r1-r2)>=abs(r3-r4)
Ang1=acos((r2^2-(r4+r3)^2+r1^2)/(2*r1*r2));
Ang2=-Ang1;
end
% if (r1+r2)<=(r3+r4)&abs(r1-r2)>=abs(r3-r4)
% Ang1=0;
% Ang2=2*pi;
% end
if (r1+r2)<=(r3+r4)&abs(r1-r2)
[Ang1, Ang2]=fb_angle_limits([4 3 3 5],0,0)

此時,我們便可以得到:
Ang1(即驅動桿與x軸之間最小夾角,start)= 28.9550度
Ang2(即驅動桿與x軸之間最大夾角,stop )= 331.0450度

因此,我們便可以利用這兩個角度來繪圖,同樣是用到function drawlinks

***主程式==>
[Ang1, Ang2]=fb_angle_limits([4 3 3 5],0,0)
drawlinks([4 3 3 5],0,28.9551,-1,0)
drawlinks([4 3 3 5],0,331.0449,-1,0)















四連桿之極限角度位置圖


8.4
==>設theta2=[0:20:360],試繪出此組四連桿之重疊影像,解釋為何有些沒有值。
Ans:

在此,我將theta2設為i,用function drawlinks直接寫一個for迴圈即可

***主程式==>
for i=0:20:360
drawlinks([4 3 3 5],0,i,-1,0)
end















四連桿之重疊影像

跑完程式後,Matlab顯示了這些訊息:
Combination of links fail at degrees 0.0
Combination of links fail at degrees 20.0
Combination of links fail at degrees 340.0
Combination of links fail at degrees 360.0
這也就是我們在第三題裡面,所求出的四連桿之限制角度,是從28.955到331.045間才可做旋轉,因此其他角度是不會發生的.換個方式來講,沒有值的部份,其實就是沒有符合網路上第六章講義起先提到的:我們的四連桿必要滿足r2ejθ2+r3ejθ3=r1ejθ1+r4ejθ4,當四連桿滿足條件就代表實際情形中,它是可以轉到該角度的,故可得知我們上一題所算的限制角度,其實也就是運用這個閉合關係,完全是息息相關的.


8.5
==>若將問題三考慮在內,只在可迴轉的範圍內迴轉,請問你能讓此組四連桿作成動畫方式迴轉嗎?
Ans:

當然能的.
在此,我們可以再次利用網路上的資源,也就是function move_4paths.
這是一個頗讚的動態模擬function,可以處理很多種軌跡.

*****************************************************************************
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=" npoint="abs(npts);" th2="linspace(Qstart,Qstop,npoint);" val="zeros(6,npoint);" i="1:npoint," x="real(val);y=" h="f4limits(r,th1,sigma,driver);" range="1.2*([min(min(x))" i="2:4,set(h(i),'erasemode','xor');end" h0="patch('xdata',[],'ydata',[],'erasemode','xor','facecolor','r',..." i="0;s=" m="1:ntimes" s="-s;" i="0;s=" i="i+s;">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
**************************************************************************

***主程式1==>
move_4paths([4 3 3 5],0,0,3,0,10,0,1,0,4,150)


使用function move_4paths做出的動畫


當然,假如不依賴這個強大的function move_4paths的話,也是可以用兩個for迴圈,然後把最大極限角度最小極限角度當作上下限,然後區分成50等份(等分隨意,任人高興,純粹是動畫流暢度的問題),然後再把各角度代入function drawlinks中,運用for迴圈每次清圖(使用clf),便可以做出動畫了!只不過,這個做出來的品質明顯沒有使用function move_4paths來得好,因此這個程式,顯然地過於簡陋,還有頗多進步的空間......(汗).

***主程式2==>
AXIS([-5 5 -5 5]);
for theta=28.9551:(331.045-28.9551)/50:331.045
clf
axis equal
AXIS([-5 5 -5 5]);
drawlinks([4 3 3 5],0,theta,-1,0)
pause(0.2)
clf
end
grid on
for theta2=331.045:-(331.045-28.9551)/50:28.9551
clf
axis equal
AXIS([-5 5 -5 5]);
drawlinks([4 3 3 5],0,theta2,-1,0)
pause(0.2)
end
grid on


使用兩個for迴圈所製成的動畫