2/16/07

第九章 滾動機構分析

物體接觸時,其表面決定其運動狀態。其中可分為滑動與滾動。滑動時屬滑塊運動之性質,而滾動則屬曲面不斷相互接觸之過程。在實際之應用上,通常滑動與滾動合併進行,如凸輪或齒輪等,這兩者之運動特質將另章敘述。

具有動滾動接觸面之連桿,其迴路向量則必須先通過該桿之圓心再與其他連桿相連。這種情況以凸輪、摩擦輪、皮帶輪或齒輪之情況,在分析齒輪組間之驅動時通常僅考慮為節圓接觸,因此無論其所採用之齒型如何,在大觀分析上齒輪動力傳遞仍以節圓為準。

兩節圓相接觸時,除瞬時所產生之迴路外,尚需考慮其滾動接觸的轉動關係,此稱為滾動接觸方程式。利用接觸時之滾動關係才能配合迴路向量之方程式進行解題。茲就節圓之接觸方式分別討論如下:

一、外接圓滾動




圖9.1 兩圓型連桿件滾動接觸時之情形


由圖9之兩滾動接觸圓之得知,其迴轉角度之關係如下:

R2θ2= -R4∆θ4

其中之負號表示迴轉的方向相反。而 兩角度量則是考慮轉動之起始與終點間之增量,故若整個機構(或此連桿組)本身亦具有系統迴轉量時,上述之角度量亦必須扣除系統迴轉量。設其迴轉量為θ5 ,則可修正上述關係如下:

R2(∆θ2-∆θ5)= -R4(∆θ4-∆θ5)


若考慮個別之初始角度與最終角度,即:

∆θ2=θ2-θ2i
∆θ4=θ4-θ4i
∆θ5=θ5-θ5i


代入上式,則公式可整理如下:

(θ2-θ2i)+(R4/R2)(θ4-θ4i)=[1+(R4/R2)(θ5-θ5i)]


此即為外接圓滾動接觸方程式。

二、內接圓滾動




圖9.2 內接圓滾動接觸時之情形


內接圓之滾動是其中一個圓在另一圓之內部滾動,此時之基本公式可由上面導出,只是因為兩圓之轉動方向相同的緣故,其符號將有所改變,如:


R2θ2= R4∆θ4
(θ2-θ2i)-(R4/R2)(θ4-θ4i)=[1+(R4/R2)(θS-θSi)]



三、直線滾動


小齒輪與齒條之組件即為一個外節圓與一直線平面接觸滾動的例子。圖11所示為初始位置當節圓在一平台上滾動時之相關位置,經過滾動一段距離後加上整個組合可能之轉動,可以得到如圖11b之位置。在轉動之過程中,O2P2與O4P4永遠垂直,故其迴轉之角度θS間之關係如下:

R2(∆θ2-∆θ5)= ∆r


代入初始角度,得:

(θ2-θ2i)-(θ4-θ4i)/R2=θ5-θ5i




圖9.3 直線滾動之變化情形


範例7.1


某包含一組齒輪之五連桿如圖7.6,其齒輪2與4之直徑分別為6、7cm。其他桿之相關尺寸為r1=8cm,r5=6cm。齒輪2為驅動輪。在初始位置時ABC正好成一直線,設桿2角度之初始值為零。試分析當桿2旋轉60度角時,其他相關之θ3、θ4、θ5值各為如何?

圖7.6

[解]:
這是有一組相互以連桿AB就圓心相連,但兩圓相互間作滾動的例子。雖然桿五與圓4在C點以旋轉結相連,但由於連桿AB之關係,使圓2與圓4不但會自行滾動,而且會依AB軸作轉動。因此,參考書中公式7.6之關係仍然維持。解題時可依下列過程進行:

1. 先就圖7.6(a)建立r3、r4、r5、r1等四桿間之向量關係,並在X-Y座標內建立方程式如下:

r3 + r4 = r5 + r1 7.11

圖7.6 範例7.1之初始位置及相關位置

r3cosθ3 + r4cosθ4 - r5cosθ5 - r1 = 0 (7.12)
r3sinθ3 + r4sinθ4 - r5sinθ5 =0 (7.13)

2. 通常初始位置選在bc桿成一直線時(圖7.6(b)),即 (兩者均為初始值),代入上式,得:

(r3 + r4)cosθ30 -r5cosθ50 = r1 (7.14)
(r3 + r4)sinθ30 -r5sinθ50 = 0 (7.15)


欲求得初始位置之對應角度θ30,θ50可先利用餘弦定理,求得θ50,即

(r3 + r4)² = r1²+r5²- 2r1r5cos²(π-θ50) (7.16)
cos(θ50)= {(r3 + r4)²-r1²-r5² }/(2r1r5) (7.17)

將7.17式代入7.14式後,可得另一個角度之餘弦:

cos(θ30)=(r1 + r5cosθ50)/(r1+r4) (7.18)

下面為利用MATLAB撰寫之程式函式f5link_int(),以計算桿3及桿5之初始角度,其呼叫型式為:


function [th3,th4,th5]=f5link_int(r)


其輸入項為r。其中包括五桿之長度,其中第二桿為驅動齒輪之半徑r2。

function [th3,th4,th5]=f5link_int(r1,R2,R4,r5)
% Program 7.1 solving eqs 7.11-7.17
% The 5 link system consists of 2 gears with one
% holding link(r5), except the ground(r1)
% Find the initial positions of the 5-link system
% Input:
% r1,r5: the length of ground and the 5th links.
% R2,R4: radius of the gear pair
%
% Output:
% th3,th4,th5: angles of link 3,4 & 5, degrees
% Example: [th3,th4,th5]=f5link_int(8, 3, 3.5, 6)
d2r=pi/180;
r3=R2+R4;
r34=r3+R4;
cos5=(r34*r34-r5*r5-r1*r1)/(2*r1*r5);
cos3=(r1+r5*cos5)/r34;
th50=acos(cos5);
th30=acos(cos3);
th3=th30/d2r;th4=th3;th5=th50/d2r;




執行例:

>> [th3,th4,th5]=f5link_int(8, 3, 3.5, 6)
th3 = 36.8699
th4 = 36.8699
th5 = 90


由初始角度公式7.6:

(θ2-θ2i)-(R4/R2)(θ4-θ4i)=[1+(R4/R2)(θS-θSi)] (7.6’)

由於θ2為輸入值,故其初始值可以設為0,即θ2i=0。且R4/R2 = 3.5/3 =7/6,其他齒輪組的初始角度可由程式得到:

θS=90°
θSi=θ3i=36.8699°
θ4i=36.8699°



將上述值代入公式7.6,初始值公式轉為:

(1+7/6)(θ3 - 36.8699) = 2 + 7/6(θ4 - 36.8699) 7.18

將相關參數代入公式7.12及7.13,得:

6.5cosθ3 + 3.5cosθ4 - 6cosθ5 = 8
6.5sinθ3 + 3.5sinθ4 - 6sinθ5 = 0 7.19

由於θ2=60度,故三個未知數與三聯立方程式應可得解。但由於過程較為複雜,讀者可試用疊代法,以程式求解。本題正解為:

θ2=60.0000
θ3= 52.1875
θ4= 13.8419
θ5= 95.8522


範例7.2



如同範例7.1之情況,其五桿之相關尺寸參看圖7.6,r=[8 3 6.5 3.5 6]cm,對應角θ=[0 60.0000 47.1166 20.6388 92.8391],即θ2=60度。設輸入桿2之角速度ω2為10 rad/s CCW,試利用公式7.6、7.12及7.13進行分析。

[解] :這是延續前例求得相關角度後,再進一步計算其對應之角速度之例子。設γ= r4/r2,初值分別θ30、θ40,則公式7.6、7.12及7.13可改寫如下:

r3cosθ3 +r4cosθ4 -r5cosθ5 -r1 =0
r3sinθ3 +r4sinθ4 -r5sinθ5 =0
(1 + γ)(θ3-θ30) =θ2 +γ(θ4-θ40) (7.28)

為求得各桿之角速度,可先將上式之兩邊對時間t微分:

-r3sinθ3ω3 -r4sinθ4ω4 +r5sinθ5ω5 =0
r3cosθ3ω3 +r4cosθ4ω4 -r5cosθ5ω5 =0
(1 + γ)ω3 -γω4 =ω2 (7.29)

公式7.29可直接用聯立方程式求解,亦可利用矩陣表示如下:

[ -r3sinθ3 -r4sinθ4 r5sinθ5] [ ω3] [0 ]
[ r3cosθ3 r4cosθ4 -r5cosθ5] [ ω4] = [0 ] (7.30)
[ (1 +γ) -γ 0 ] [ ω5] [ω2]

公式7.30之矩陣亦可以簡化為:AW=C之型式。再以MATLAB指令W=A\C解出桿3、4、5之角速度。程式內容參見f5link()。其中之呼叫參數說明如下:

 function [omega,theta,incta]=f5link(r1,R2,R4,r5,theta2,omega2)

輸入:r1、r5為第一(地桿)及第五桿之長度。
R2、R4為成對之齒輪半徑。
   omega2為桿2之驅動角速度,rad/s。
   theta2各桿2之對應角度。
輸出:omega為桿2、3、4、5之角速度。
   theta為桿2、3、4、5之水平角度。
   Incta為桿3與桿4成一直線時,桿3、4、5之初始角度。

程式內容




function [omega,theta,incta]=f5link(r1,R2,R4,r5,tha2,w2)
% Program 7.2
% Solve the angular velocities of a 5-link system
% Input:
% r1,r5: the length of ground and the 5th links.
% R2,R4: radius of the gear pair%
% tha2: angular position of link 2, degrees
% w2: angular velocity of link 2, rad/s
% Output:
% omega:the ang. velocitis of links, rad/s
% theta:the angles of links, degrees
% incta:initial positions of links, degrees
% omega=[omega3 omega4 omega5], in rad/s
% Example [omega,theta,incta]=f5link(8,3,3.5,6,60,10)
d2r=pi/180;th2=tha2*d2r;
r3=R2+R4;
if r3+r5<=r5,
theta='Not available';
incta=0;
return
end
r34=r3+R4;
cos5=(r34*r34-r5*r5-r1*r1)/(2*r1*r5);
cos3=(r1+r5*cos5)/r34;
th50=acos(cos5);
th30=acos(cos3);th40=th30;
incta=[th30 th40 th50]/d2r;
%============================================
% To solve the angular position of each links
rr=R4/R2;
func_1=1; func_2=1;
% Force next WHILE statement to be true
th5=th50;th4=th40;
while abs(func_1)>0.01 | abs(func_2)>0.01,
% Evaluate loop equations
th3=th30+(th2+rr*(th4-th40))/(1+rr);
func_1=r3*cos(th3)+R4*cos(th4)-r5*cos(th5)-r1;
func_2=r3*sin(th3)+R4*sin(th4)-r5*sin(th5);
F=[-func_1; -func_2];
% Evaluate partial derivatives
A=[-r3*sin(th3)*rr-R4*sin(th4) r5*sin(th5);...
r3*cos(th3)*rr+R4*cos(th4) -r5*cos(th5)];
% Solve 2 equations in 2 unknowns with Cramer's rule
delta=A\F;
% Make new guess for both theta3 and theta4
th4=th4+delta(1);
th5=th5+delta(2);
end;
theta=[0 th2 th3 th4 th5]/d2r;
%============================================
% Calculate the angular velocities of links
% Set up the 3x3 maxtrix A
A=[-r3*sin(th3) -R4*sin(th4) r5*sin(th5);...
r3*cos(th3) R4*cos(th4) -r5*cos(th5);...
1+rr -rr 0];
C=[0 0 w2]';
W=A\C; %Matrix division, or solution of AW=C
omega=[w2,W'];



執行例一:r1=8 cm、R2=3 cm、R4=3.5 cm、r5= 6cm,θ2= 60度,ω2=10 rad/s

>> [w,theta,incta]=f5link(8,3,3.5,6,60,10)
w =   10.0000 2.7194 -3.5211 1.8456
theta = 0 60.0000 52.1875 13.8419 95.8522
incta = 36.8699 36.8699 90.0000



故ω3=2.7194 rad/s,ω4= -3.5211 rad/s, ω5= 1.8456 rad/s

執行例二:r1=50 cm、R2=12 cm、R4=14 cm、r5= 50cm,θ2= 30度,ω2=10 rad/s,則:

>> [omega ,theta,incta]=f5link(50,12,14,50,30,10)
omega = 10.0000 2.4549 -4.0123 0.4351
theta = 0 30.0000 73.5832 54.0023 133.5048
incta =   66.4218 66.4218 132.8436


故ω3= 2.4549 rad/s,ω4=-4.0123 rad/s, ω5= 0.4351 rad/s

本程式中,實際上綜合f5link_init()函式之內容,並進行作位置解,將公式7.18及7.19利用疊代法求得各桿之對應角度。其後再利公式7.30之矩陣除法求得各桿之角速度。在求解過程中,桿2之角度及角速度均必須為已知值。

習題7.10


試就範例7.1,撰寫一MATLAB程式以求得θ3、θ4、θ5之適當解。

[解]:
由範例一之三個聯立方程式改為通式,並設γ= R4/R2,初值分別θ30、θ40,則方程式可改寫如下(7.28):

r3cosθ3 +r4cosθ4 -r5cosθ5 -r1 =0
r3sinθ3 +r4sinθ4 -r5sinθ5 =0
(1 + γ)(θ3-θ30) =θ2 +γ(θ4-θ40) (1)

將公式(1)c改變如下:

θ3 = θ30 + θ2/(1+γ) + [γ/(1+γ)](θ4 - θ40)

上式中,θ2為輸入,其餘僅θ4為變數,故若對θ4微分應可得:

d(θ3)/d(θ4) = [γ/(1+γ)] (2)

利用疊代法以泰勒級數展開式求解,首先將公式(1)之前兩式設為兩個函數f1(θ4,θ5),f2(θ4, θ5) ,或:

f1(θ4,θ5)=r3cosθ3 +r4cosθ4 - r5cosθ5 -r1 =0
f2(θ4,θ5)=r3sinθ3 +r4sinθ4 - r5sinθ5 =0



上兩函數之最終值均應等於零,其對應之θ4,θ5值即為答案。首先可以給兩個初估值,再利用泰勒展開式求其誤差Δθ4,Δθ5,即:

f1(θ4,θ5)=df1/d(θ4)Δθ4 +df1/d(θ5)Δθ5
f2(θ4,θ5)=df2/d(θ4)Δθ4 +df2/d(θ5)Δθ5 (3)

為簡化起見僅取其第一項。而θ3因公式(2)之關係與之θ4變數可作轉換,在此僅列出二項變數。
公式(3)可化為矩陣型式以求解:

[df1/d(θ4) df1/d(θ5)] [Δθ4 ] = [-f1]
[df2/d(θ4) df2/d(θ5)] [Δθ5 ] [-f2] (4)

求得Δθ4, Δθ5之後可以得到新值,如此循環運算直到獲得合理答案為止。
公式(3)與(4)中之偏微分係數可以計算如下:

df1/d(θ5)=r5sinθ5
df2/d(θ5)=-r5cosθ5
df1/d(θ4)=d{r3cosθ3 +r4cosθ4 - r5cosθ5 -r1 }/dθ4
=-r3sinθ3(1+γ)/γ-r4sinθ4
df2/d(θ4)=r3cosθ3(1+γ)/γ+r4cosθ4


MATLAB之程行內容如下:

function [angle, init]=exP7_9(r,theta2,theta4,theta5)
%
% Find the position for 5-Link mechanism that contains one pair of gears
% in mesh using Tayler's series
% Input:r: length of five links
% theta2: input angle in degrees
% theta4, theta5:gusessing angles
% Output: angle: all angles in degree
% init: initial angles
% Example: [angles,init]=exP7_9([50 12 36 14 50],60,0,100)
% --Program designed by Din-sue Fon
d2r=pi/180;
gama=(r(3)-r(2))/r(2);rr=(1+gama)/gama;
% Find the initial value for theta3 & theta4
r34=r(3)+r(4);
cos5=(r34*r34-r(5)*r(5)-r(1)*r(1))/(2*r(1)*r(5));
cos3=(r(1)+r(5)*cos5)/r34;
th50=acos(cos5);
th30=acos(cos3);
th40=th50-th30;
init=[th30 th40 th50]/d2r;
func_1=1; func_2=1; % Force next WHILE statement to be true
th2=theta2*d2r;th5=theta5*d2r;th4=theta4*d2r;
while abs(func_1)>0.01 | abs(func_2)>0.01,
% Evaluate loop equations
th3=th30+(th2+gama*(th4-th40))/(1+gama);
func_1=r(3)*cos(th3)+r(4)*cos(th4)-r(5)*cos(th5)-r(1);
func_2=r(3)*sin(th3)+r(4)*sin(th4)-r(5)*sin(th5);
F=[-func_1; -func_2];
% Evaluate partial derivatives
A=[-r(3)*sin(th3)*rr-r(4)*sin(th4) r(5)*sin(th5);...
r(3)*cos(th3)*rr+r(4)*cos(th4) -r(5)*cos(th5)];
% Now solve 2 equations in 2 unknowns with Cramer's rule
delta=A\F;
% Make new guess for both theta3 and theta4
th4=th4+delta(1);
th5=th5+delta(2);
end;
angle=[th2 th3 th4 th5]/d2r;

執行例一:

>> [angle,in]=exP7_9([8 3 6.5 3.5 6],60,0,100)
angle =60.0000 47.0356 20.6090 92.8499
in = 36.8699 53.1301 90.0000

得到的角度如下:

θ2=60.0000
θ3=47.0356
θ4=20.6090
θ5=92.8499

執行例二:輸入角θ2為30,r=[50 12 36 14 50],則

>> [angles,init]=exP7_9([50 12 36 14 50],30,0,100)
angles = 30 63.819 50.736 120.35
init = 60 60 120

得到的角度如下:

θ2=30.0000
θ3=63.819
θ4=50.736
θ5=120.35

其初始角分別為

θ30=60
θ40=60
θ50=120


習題7.11


試就範例7.1之五連桿,其尺寸為r=[8 3 6.5 3.5 6]cm,當θ2=60。時其對應角為θ=[0 60 47.1 20.6 92.8]度。復由範例7.2得其對應角速度為ω=[0 10 2.634 -3.679 1.336] rad/s(正值為CCW),設ω2=10 rad/s CCW為定值,試撰寫一MATLAB程式以求得α3、α4、α5之適當解。

[解]:
將公式7.28對時間t再微分,改寫之得:

-r3sinθ3α3-r4sinθ4α4+r5sinθ5α5=r3cosθ3ω3²+r4cosθ4ω4²-r5cosθ5ω5²
r3cosθ3α3+r4cosθ4α4-r5cosθ5α5=r3sinθ3ω3²+r4sinθ4ω4²-r5sinθ5ω5²
(1+γ)α3-γα4 = 0

[-r3sinθ3 -r4sinθ4 r5sinθ5] [α3] [f1]
[ r3cosθ3 r4cosθ4 -r5cosθ5] [α3] = [f2]
[ 1+γ -γ 0 ] [α4] [ 0]





MATLAB程式撰寫如下:
function [alpha]=EX7_10(r,theta,omega)
% P7_2
% Problem No. 2 Find the angular velocities of the 5-link system
% theta: angles for each link(include the 1st link), in degrees
% omega:[omega1 omega2 omega3 omega4 omega5]
% Example [omega]=EX7_10([50 12 36 14 50],[0 30 63.819 50.736 120.35],[0 10 1.3198 -3.0203 0.22948])
%
d2r=pi/180;
th=theta*d2r;
rr=(r(3)-r(2))/r(2);
ww=omega.*omega;
A=[-r(3)*sin(th(3)) -r(4)*sin(th(4)) r(5)*sin(th(5));...
r(3)*cos(th(3)) r(4)*cos(th(4)) -r(5)*cos(th(5));...
1+rr -rr 0];
F=[r(3)*cos(th(3))*ww(3)+r(4)*cos(th(4))*ww(4)-r(5)*cos(th(5))*ww(5);...
r(3)*sin(th(3))*ww(3)+r(4)*sin(th(4))*ww(4)-r(5)*sin(th(5))*ww(5);0];
W=A\F;
alpha=W';

執行例一:




r=[8 3 6.5 3.5 6],θ=[0 60 47.0 20.6 92.9],ω=[0 10 2.6316 -3.6841 1.3306] rad/s
>> [omega]=EX7_10([8 3 6.5 3.5 6],[0 60 47.0 20.6 92.9],…
[0 10 2.6316 -3.6841 1.3306])
omega = 3.2362 6.0102 16.436
故α3=2.6316 rad/s2,α4= -3.6841 rad/s2,α5= 1.3306 rad/s2

>> [omega]=EX7_10([50 12 36 14 50],[0 30 63.819 50.736 120.35],[0 10 1.3198 -3.0203 0.22948])
omega = 1.5375 2.3062 4.2759
故α3=1.5375 rad/s2,α4= 2.3062 rad/s2,α5= 4.2759 rad/s2

9.1 滾動的車輪

滾動的車輪


要讓輪子能夠轉動,並且在一個平面上滾動,尚必須熟悉其他有關指令。在MATLAB中,並沒有繪圓的指令,雖然有做立體球之相關指令,但純為繪圓則必須自己寫。我們已經在MATLAB論壇中公佈了一個繪圓的指令:

>>circle(r, x0,y0)

實際上,圓之程式可以利用下列指令簡單完成:


xx=[r*cos(th) 0];yy=[r*sin(th) 0];


其中加上[0 0]這點圓心,主要目的是要加上一條半徑線,使圓之迴轉可以看得出來。圓型的物體在平面上滾動時,其行走之圓周長應等於前進之距離。周長為半徑與迴轉弧度之乘積。其運動之軌跡因此可以利用此一關係計算。

話說要使一個輪子在平面上滾動,其一輪子必須移動,其二輪子必須自轉。這兩個動作必須合併進行。前面已經談過,移動與轉動必須借助trans4這個函數指令,並且呼叫兩次。而每次的座標轉換,應先在原點上自轉後再將座標移動到需要的位置,如此才能使過程簡化。

程式內容


車輪滾動時,中間有一半徑作為指標。車輪由兩圓組成,其握把分別為h及h1,一為實線,一為虛線。使車輪有滾動的感覺。當車輪滾至兩端時,會返回,使其維持在同一平台上。

function rolling_wheel(r,v)
% circle motion
% Example: rolling_wheel(10,10)
clf;
ww=max(100,3*r);
axis([-r ww+r 0 r]);
axis equal;axis off;
ss=100/pi/3;
th=linspace(0,2*pi,120);
xx=[r*cos(th) 0];yy=[r*sin(th) 0];
line([-r ww+r]',[0 0]','linewidth',3,'color','b');
h=line('xdata',[],'ydata',[],'erasemode','xor',...
'linestyle','-.','linewidth',6,'color','r');
h1=line('xdata',[],'ydata',[],'color','b','linewidth',4);
title('Rolling Wheel (Press Ctl-C to stop)');
s=pi/120*v;sth=0;d=0;
while 1,
x=xx*cos(sth)-yy*sin(sth)+d;
y=xx*sin(sth)+yy*cos(sth)+r;
set(h1,'xdata',x,'ydata',y);
set(h,'xdata',x,'ydata',y);
sth=sth-s; d=-r*sth;
if sth>0|d>ww, s=-s;end;
drawnow;
pause(0.01);
end



執行結果




環內迴轉


除了在直線迴轉之情況下,亦可考慮在圓圈內迴轉時之情形如下:

function rolling_wheel2(r1,r2,v)
% circle motion
% Example: rolling_wheel2(15,30,1)
clf;
axis([-r2 r2 -r2 r2]);
axis equal;axis off;
ss=100/pi/3;
t0=linspace(0,2*pi,360);
h0=line(r2*cos(t0),r2*sin(t0),'linewidth',3,'color','b');
h=line('xdata',[],'ydata',[],'erasemode','xor',...
'linestyle','-.','linewidth',max(1,ceil(r1/5)),'color','r');
t1=linspace(0,2*pi,120);
xx=[r1*cos(t1) 0];yy=[r1*sin(t1) 0];
title('Press Ctl-C to stop');
s=pi/120*v;sth=0;th=0;

while 1,
dx=(r2-r1)*cos(th);
dy=(r2-r1)*sin(th);
x=xx*cos(sth)-yy*sin(sth)+dx;
y=xx*sin(sth)+yy*cos(sth)+dy;
set(h,'xdata',x,'ydata',y);
th=th-s;
sth=sth+s*r2/r1;
if sth>2*pi,sth=sth-2*pi;end
if th>2*pi,th=th-2*pi;end;
drawnow;
pause(0.01);
end

執行結果




由這個例子中,除了因桿長不同可以看出擺線的位置不同外,同學亦可思考其應用方向,例如:
  1. 將桿子(握把h1)變換為一個人的形式,會有什麼不同?
  2. 將n值作成n=3在地面上滾動時,會產生那些不合理的地方?若有應如何修正?
  3. 能否將平面改成一個已知的曲面,使圓輪在曲面內滾動?
  4. 如果圓輪與地面有打滑時(例如打滑率3%),則程式如何修正以反應此點?

9.2 旋轉的風扇

會旋轉的風扇是葉片的變換而已,這是一個明顯的機動學例子,也可以看出它是一個純轉動的狀況。為製造出葉片的數目,必須先作出一個葉片的形狀,然後令其轉動數次,以求得整個葉片的座標。

x=[1 2 1 -3 -1]';y=[1 7 10 11.5 1]';%propeller shape
x0=x;y0=y;
for i=1:6,
theta=60*i;
xy=trans4([x0,y0],theta,5);
x=[x; xy(:,1)];y=[y;xy(:,2)];
end;

第一行是單片葉片的外圍形狀座標點,可由同學自行決定。然後利用這些座標旋轉6次,每次轉動60度,成為一圈所需的葉片座標。特別注意的是各座標均為行矩陣,故累加時亦必須轉成行矩陣才能相加。其餘的程序與前面各例的手法大致相同。只是這個函數有個速度參數v,可以決定該葉片的轉動速度。

程式內容


此程式呼叫一小程式circ(r),是以原點出發,以某一輸入半徑r繪圓的函數。其傳回之參數為該圓之握把h。主程式中共呼叫circ三次,第一次h0為風扇輪轂之外圈,為黑色之厚圓。第二次為葉片之內輪h1,第三次為葉輪之外圓h2,後兩者均可以隨葉片迴轉。

function demo_mot8(v)
%demo_mot8.m
%Moving propeller
%Example: demo_mot8(10)
%Author:DSFon, BIME,NTU. Date:Jan. 24, 2007
clf;
x=[1 2 1 -3 -1]';y=[1 7 10 11.5 1]';%propeller shape
x0=x;y0=y;
for i=1:6,
theta=60*i;
xy=trans4([x0,y0],theta,5);
x=[x; xy(:,1)];y=[y;xy(:,2)];
end;
delt=pi/30; %delaying time for display
axis([-15 15 -15 15]);
axis image;axis off;
h0=circ(13);set(h0,'linewidth',8,'color','k');
h1=circ(1); %the inner circle, r1
h2=circ(12.2); %The outside circle, r2
h11=line(x,y,'erasemode','xor','color','r','linewidth',5);
x1=get(h1,'xdata');y1=get(h1,'ydata'); % (x1,y1)for inner circle
x2=get(h2,'xdata');y2=get(h2,'ydata'); % (x2,y2)for outer circle
x11=get(h11,'xdata');y11=get(h11,'ydata');%(x11,y11)for propeller
set(h1,'EraseMode','xor','color','r','linewidth',3,'linestyle',':')
set(h2,'EraseMode','xor','color','b','linewidth',5,'linestyle','-.')
title('Press Ctl-C to stop');
theta1=0;s1=v*delt;
while 1,
drawnow;
pause(0.01);
theta1=theta1+s1;
z1=trans4([x1',y1'],theta1,5);
set(h1,'xdata',z1(:,1),'ydata',z1(:,2)); % inner circle
z2=trans4([x2',y2'],theta1,5);
set(h2,'xdata',z2(:,1),'ydata',z2(:,2)); % Outer circle
z11=trans4([x11',y11'],theta1,5);
set(h11,'xdata',z11(:,1),'ydata',z11(:,2)); % propeller
if theta1>2*pi,theta1=theta1-2*pi;s1=-s1;end;
end
function h=circ(r)
th=linspace(0,2*pi,50);
h=line(r*cos(th),r*sin(th));

執行後,其迴轉情況如下面之映像:

9.3 兩輪接觸滾動

兩輪接觸滾動,雖然在機動學中不常見,但其基本觀念則是齒輪的運動狀態。

這個範例所用到的程式函數與前面之單圓滾動之情形相同,但由於兩輪的直徑可能不同,兩輪的中心可以置於水平線上。表面上看來,這兩個輪子僅是作固定位置旋轉,不必作任何平移動作。實際則不然,因為座標的原點不可能放在兩個輪的軸心上,若然,亦僅能將其中一個置於原點,另一個還是要進行平移。

本題目係將座標置於兩輪之接觸點上,因此各輪均要平移與轉動。目前因為兩輪均是圓的,故轉動起來,即使採用座標轉動的變化也看不出來,當然投機取巧不讓它轉動也是可以的,但將來若表面是有齒輪面的話,也必須表現出來。

為使表現能夠明顯。因此在各輪上設有一個徑向把,可以看出其真正轉動情形。其初始動作如圖4所示。

這個函數有三個參數,前二者為二輪之半徑,後者為r1轉動的速度。

<3>程式內容
這個程式呼叫circle函數,也是繪圓,與前面的circ功能相同,也是屬不同的寫法。讀者可以印證其功能。兩主圓分別為h1及h2,分別使用藍色與紅色;且為突顯其轉動狀態,特別改用虛線。其次是利用h11與h21分別設定兩桿,注意各桿之兩端均有標記,其型式也是以圓圈。

控制兩圓迴轉之速度為s1與s2,其關係與兩圓之半徑有關,故可以利用下式計算:

theta1=theta1+s1;
theta2=theta2-s1*r1/r2;

程式內容


每個圓圈之迴轉則利用tans4這個副程式。這個程式內容在上一節中已經有討論過,可以參考。亦可自行撰寫簡單的程式應用。

function demo_mot7(R1,R2,v)
%demo_mot7.m
% Inputs:R1,R2:radius of two circles
% v: speed of rotation
%Two matched cicles in motion
% Example: demo_mot7(50,100,2)
%Author:DS Fon, Bime. NTU Date: Jan. 24, 2007
if nargin==0,R1=50;R2=100;v=100;end
clf;
r1=min(abs(R1),abs(R2));
r2=max(abs(R1),abs(R2));
height=max(r1,r2)*1.5;
axis([-2.5*r1 2.4*r2 -height height]);
axis image;axis off;
line([-2*r1 2*r2]',[0 0]','color','k',...
'linewidth',1,'linestyle','-.'); %The ground line
circle(r1/4,r2,0,10);circle(r1/4,-r1,0,10);
h1=circle(r1,0,0); %Draw the 1st circle of radius r1
h2=circle(r2,0,0); %Draw the 2nd circle of radius r2
h11=line([0 r1]',[0 0]','erasemode','xor','color','b',...
'linewidth',4,'marker','o','markersize',8); %Rod 1
h21=line([0 -r2]',[0 0]','erasemode','xor','color','r',...
'linewidth',8,'marker','o','markersize',16); %Rod 2
hold on;
%Get coordinates (x1,y1) & (x2,y2) of both circles
x1=get(h1,'xdata');y1=get(h1,'ydata');
x2=get(h2,'xdata');y2=get(h2,'ydata');
x11=get(h11,'xdata');y11=get(h11,'ydata');% rod 1
x21=get(h21,'xdata');y21=get(h21,'ydata');% rod 2
set(h1,'EraseMode','xor','color','b',...
'linewidth',1,'linestyle','-.')
set(h2,'EraseMode','xor','color','r',...
'linewidth',2,'linestyle','-.')
grid on;
title('Press Ctl-C to stop');
theta1=0;theta2=0;s1=v*pi/20;
while 1,
drawnow;
pause(0.1);
theta1=theta1+s1;
theta2=theta2-s1*r1/r2;
z1=trans4([x1',y1'],theta1,5);%rotate circle 1
z1=trans4(z1,[-r1 0],1);%translate circle 1
z2=trans4([x2',y2'],theta2,5);%rotate circle 2
z2=trans4(z2,[r2 0],1);%translate circle 2 to (r2,0)
z11=trans4([x11',y11'],theta1,5);%rotate rod 1
z11=trans4(z11,[-r1 0],1);%translate rod 1 to (-r1,0)
z21=trans4([x21',y21'],theta2,5);%rotate rod 2
z21=trans4(z21,[r2 0],1);%translate rod 2 to (r2,0)
set(h1,'xdata',z1(:,1),'ydata',z1(:,2)); % circle 1 data
set(h2,'xdata',z2(:,1),'ydata',z2(:,2)); % Circle 2 data
set(h11,'xdata',z11(:,1),'ydata',z11(:,2)); % Rod 1
set(h21,'xdata',z21(:,1),'ydata',z21(:,2)); % Rod 2
if theta1>2*pi,theta1=theta1-2*pi;s1=-s1;end;
end

function h = circle(r,x0,y0,nn)
% The inputs:
% r = radius of circle
% x0, y0= coordinates of the circular center
% Example: circle(10,0,0,10)
if nargin==3,nn=50;end;
t=0:2*pi/nn:2*pi;
h=line(x0+r*cos(t),y0+r*sin(t));


執行結果





看看這個例子,同學可以思考未來還可加一些什麼,因為可用的指令都有了。想一想較困難的吧,諸如:

  1. 把一個人字形的人圖像放在圓圈中央,讓它耍把戯。
  2. 試著在輪外圍加上齒輪的外形,其外形僅作一個就好,其餘用轉動拷貝的,如此就可以作成實際的齒輪動作了。
  3. 能否加上第三個輪,其變換方向又有不同。
  4. 能否作一個齒輪組。
  5. 不知將圓輪變成多角形時會怎樣?

2/11/07

第八章 瞬時中心

瞬時中心之軌跡


物件運動過程中,常會在特定時間環繞一定點轉動,此定點稱為瞬時中心。瞬時中心有固定者、有活動者。以四連桿為例,除四個端點為瞬心外,其餘有兩瞬心屬活動性的。一在兩固定瞬心之連線上,另一則會隨四連桿之位置而變化。

在求順心之位置時,必須利用兩點連線之沿線。因此需按其位置比例求出其座標。本例中,以Xsect函數求瞬心座標。其輸入需要第一線上a1、a2與第二線上b1、b2的座標。這四點座標均以複數表示。所得之交點所得之交點P也是採用複數座標。

整個函數名稱為movef4centros,其輸入項與f4bar函數相同。程式內容如下:

四連桿程式內容



function movef4centros(r,th1,td2,tdd2,sigma,driver,ntimes,npts)
%
%function movef4centros(r,th1,td2,tdd2,sigma,driver,ntimes,npts)
%Author: D. S. Fon, BIME, NTU. Date: Feb. 17, 2007
%draw the centros of four-bar links
%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
%example:
% movef4centros([4 2 3 4],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);
[pa1,f1]=Xsect(0,vr(1,6),vr(1,1),vr(2,6));
[pa2,f2]=Xsect(0,vr(1,1),vr(1,6),vr(2,6));
val(1:3,i)=[vr(1,1);vr(2,1);vr(1,1)+vr(4,1)];
val(4:5,i)=[pa2;pa1];
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','-.');
range=([1.5*min(min(x(1:3,:))) 2*max(max(x(1:3,:))),...
1.5*min(min(y(1:3,:))) 2*max(max(y(1:3,:)))]);
axis(range);axis equal;grid off;
for i=2:4,set(h(i),'erasemode','xor','linewidth',6);end
h0=line('xdata',[],'ydata',[],'erasemode','xor','color','k',...
'marker','o','linestyle',':');
i=0;s=-1;axis off;
title('Hit enter to continue...');
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',[0 x(5,i) x(3,i) x(4,i) x(1,i)],...
'ydata',[0 y(5,i) y(3,i) y(4,i) y(1,i)]);
drawnow; %flush the draw buffer
pause;
end
end % for m loop

function [P,ff]=Xsect(a1,a2,b1,b2)
a1x=real(a1);a1y=imag(a1);a2x=real(a2);a2y=imag(a2);
b1x=real(b1);b1y=imag(b1);b2x=real(b2);b2y=imag(b2);
A=[(a2y-a1y) -(a2x-a1x); (b2y-b1y) -(b2x-b1x)];
determinant=abs(det(A));
if determinant > 10^(-10) %if matrix is not singular
B=[(a2y-a1y)*a1x-(a2x-a1x)*a1y;...
(b2y-b1y)*b1x-(b2x-b1x)*b1y];
s=A\B; P=complex(s(1),s(2));ff=0;
else % Locate the intersection when the matrix is singular
xx= 10^10;
angle = atan2((a2y-a1y),(a2x-a1x));
P=complex(xx,xx*tan(angle));ff=1;
end



執行例


>> movef4centros([4 2 3 4],0,10,0,-1,0,4,100)
Qstart =
3.6e-006
Qstop =
360



2/6/07

第七章 滑塊機構

在課本第四章4.3.2節以後,均談到滑塊機構之運作情形。滑塊配合連桿之運動也甚為重要,而且在實際的例子上幾乎俯拾皆是,反而比四連桿之應用更多。但是連桿組中,若能預先瞭解四連桿之運動情形,對於具有滑塊之連桿組件之分析反而更為容易。所以,這兩種連桿組應是相輔相成的。

有關四連桿之分析,屬各桿固定的部份,己見於前節之說明。但在實際的分析過程上,除這種簡化的機構外,一般常見的滑塊曲柄的型式,在分析上亦屬於四連桿機構的範疇。內燃機引擎、工業用之壓縮機及往復型運動機構均屬之。分析上屬於滑塊的機構實質與固定桿長的四連桿型式相同,唯一差異是滑塊部份的一桿因滑動的關係,均具有速度及加速度,而其位移也不斷在改變。

位置分析



圖7.1 滑塊為元件之四連桿

7.1位置分析


圖7.1為具一滑塊的示意分析圖,幾乎所有具滑塊件的機構均可化成這樣的簡化向量圖,只是有些特殊狀況仍然會存在,例如第四桿之長度為零,滑塊之移動方向因而與r1桿重合。就整個機構而言,若與前面四連桿比較,第二及第三桿之位置大體相同,不同的地方是第一桿與第四桿之出現。目前滑塊需在一平面上滑動,故具有往復運動。

為代表這種滑動的動作,可配合四連桿,並讓第一桿之方向與滑塊之路徑平行。通過滑塊中心對此桿作垂線,塑造出兩相互垂直的第一及第四桿,故分析的過程中,滑塊連桿仍然存在四個連桿。只是第一桿雖然方向固定,其長度則成為變數,而第四桿則維持相同的長度與角度,形成一個如同可移動的”固定桿”。第四桿之長度亦為滑塊行進方向與原心之重直距離,此一距離又稱為偏置值。有些滑塊曲柄結構之偏置量為零,亦即其滑動的方向剛好通過原心,此時之第四桿之長度為零,第一桿終與OP連線重合。變成僅有三桿構成一個閉合圈。

為使分析過程有一致性,我們仍將各桿及水平夾角分別標示為r1、r2、r3、r4與θ1、θ2、θ3、θ4,此時第一桿之θ1固定,第四桿則屬固定桿,其角度θ4與θ1有如下的關係:

θ4 =θ1 + π/2         (7.1)

若第二桿為驅動桿時,其情況非常類似前面四連桿中,將第四桿固定,而直接驅動第三桿之分析過程。茲依前一節之敘述,得到閉合公式如下:

rp = r2 + r3 = r1 + r4     (7.2)

r2ejθ2+r3ejθ3 = r1ejθ1+r4ejθ4

經轉換為尤拉表示式,其結果將化為兩項聯立方程式:

r2 cosθ2 + r3 cosθ3 = r1 cosθ1 + r4 cosθ4
r2 sinθ2 + r3 sinθ3 = r1 sinθ1 + r4 sinθ4 (7.3)


解上述閉合方程式時,變數r2、 r3、 r4、θ1、θ4等均應為已知,而θ2、θ3、 r1等三個參數待解,故只要在這三個未知項中,令其中一項為已知,以求得其他兩個對應參數之值。

(一)θ2為已知,求解θ3與r1



此時,可先消去θ3,再利用前面之技巧求得r1,方式如下:

r3 cosθ3 = r1 cosθ1 + r4 cosθ4- r2 cosθ2
r3 sinθ3 = r1 sinθ1 + r4 sinθ4- r2 sinθ2   (7.4)

兩邊平方後相加,以消去θ3:

r3² = r1²+ r2²+ r4²
+2 r1 r4 (cosθ1 cosθ4 + sinθ1 sinθ4)
-2 r1 r2 (cosθ1 cosθ2 + sinθ1 sinθ2)
-2 r2 r4 (cosθ2 cosθ4 + sinθ2 sinθ4) (7.5)


目前式中已消去θ3,僅剩r1為待解之變數,可將之變換成為:

r1² + A r1 + B = 0         (7.6)

其中,

A=2 r4 (cosθ1 cosθ4 + sinθ1 sinθ4)
-2 r2 (cosθ1 cosθ2 + sinθ1 sinθ2)
B= r2²+ r4²- r3²
-2 r2 r4 (cosθ2 cosθ4 + sinθ2 sinθ4)


式(7.6)為r1的一元二次方程式,解之得

r1 = [-A ±(A²- 4B )1/2] / 2     (7.7)


式中之±值表示r1有兩個對應值,負值代表與正值在相反的方向。為在程式中表示這個種模式均存在,可用ε來代表±1之值,以供選擇。

在求開方根之時,基本上,內部值不能為負值,否則會有虛根出現。虛根表示此四連桿之滑塊機構組合無法形成,必須另外調整適當的組合。為避免虛根之出現,可先檢驗A²> 4B的條件,只要符合即可得解。經獲得r1值之後,可回到原先之閉合方程式(7.3),兩邊各互除,可得到θ3。


tanθ3 =[ r1 sinθ1 + r4 sinθ4 - r2 sinθ2] /
[r1 cosθ1 + r4 cosθ4 - r2 cosθ2]    (7.8)


由(7.8)式計算得之角度θ3會有兩個值,分別落在不同象限。故為瞭解其所處之象限,分子及分母之符號必須保留,以確定其所處之象限。在MATLAB中,有一個指令可以判別其所處象限的位置,即:


θ=tan2(x,y)


由參數中之x與y值之正負來決定,角度θ之實際值,該角度之大小亦會反應其座落的象限。

有了上述之θ1、θ2、θ3及θ4之後,配合各桿之長度即可求得點P、Q、R等之位置向量:


Rq = r2 ejθ2= r2 (cosθ2 + j sinθ2)      (7.9)
Rp = r2 ejθ2+ r3 ejθ3
= r2 (cosθ2 + j sinθ2)+ r3 (cosθ3 + j sinθ3) (7.10)


或者

Rp = r1 ejθ1+ r4 ejθ4
= r1 (cosθ1 + j sinθ1)+ r4 (cosθ4 + j sinθ4) (7.11)


(二)當r1為已知,求解θ2、θ3



由r1求θ2的過程可再依公式(7.5) 進行,並歸納使其併成下列型式:


A cosθ2+B sinθ2+C =0


其實際內容應為:

[-2 r1 r2 cosθ1 -2 r2 r4 cosθ4] cosθ2+
[-2 r1 r2 sinθ1-2 r2 r4 sinθ4] sinθ2+
[r1²+r2²+r4²-r3²+2r1 r2 (cosθ1 cosθ4 + sinθ1 sinθ4)]
=0 (7.12)


兩者間之對應項目ABC分別為:

A=2 r1 r2 cosθ1 -2 r2 r4 cosθ4
B=2 r1 r2 sinθ1-2 r2 r4 sinθ4
C= r1²+r2²+r4²-r3²+2 r1 r4 (cosθ1 cosθ4 + sinθ1 sinθ4)
(7.13)


為求得A cosθ2+B sinθ2+C=0之解,可利用半角公式。設

β=tan(θ2/2)


代入三角函數:

(C – A) β²+ 2 Bβ+( A+C) = 0 (7.14)


解此二次方程式,

   β=[-B ±(B²-C²+A²)1/2]/[C-A]          (7.15)


同樣,β應有二根,代表兩個位置解。程式中可用ε= ±1來進行選擇。並進而求得θ2:

   θ2 = 2 tan-1β


其範圍存在於 -π/2≦tan-1β≦π/2,故-π≦θ4≦π。

(三) 當θ3為已知,求解θ2與r1



在解題工作上,其過程類似第一狀況,以θ2為輸入。故所用之公式中,只要將標碼之2與3互換,即可求得相同的解。

7.2 滑塊速度及加速度分析

速度分析


圖7.1 滑塊為元件之四連桿(續)

本題目中,由於參數r2、 r3、 r4、θ1、θ4等均應為定數,且為已知,故在速度部份這些相關項目ω1、ω4、r4'等均應為零,問題因此可以簡化。茲就相對應速度之變化量以點P而言,可為:

rp' = r2' + r3' = r1' (7.16)

改以複數表示,方程式如下:

jr2ω2ejθ2+jr3ω3ejθ3= r1'ejθ1            (7.17)

jr2ω2(cosθ2 +jsinθ2)+jr3ω3 (cosθ3 +jsinθ3)
= r1'(cosθ1+jsinθ1) (7.18)

將實數與虛數部份分開,得閉合方程式:

- r2ω2 sinθ2-r3ω3 sinθ3 = r1' cosθ1
r2ω2 cosθ2 + r3ω3 cosθ3 = r1' sinθ1 (7.19)

解上述閉合方程式時,其參數包括r1'、ω2及ω3項。茲就三項中已知一項進行討論,求解另二項變數時,可以分析如下:

(一)若r1'為輸入項


則其矩陣之型式為:

[- r2 sinθ2 - r3 sinθ3] [ω2] = [r1'cosθ1]
[ r2 cosθ2   r3 cosθ3] [ω3] [r1'sinθ1] (7.20)

(二)若為ω2輸入項


求r1'及ω3之矩陣如下:

[cosθ1 - r3 sinθ3] [r1'] = [- r2 sinθ2]
[sinθ1 r3 cosθ3] [ω3 ] [ r2 cosθ2] (7.21)

(三)若為項ω3輸入項


求r1'及ω2之矩陣則如下列型式:


[cosθ1 - r2 sinθ2] [r1'] = [-r3 sinθ3 ]
[sinθ1 r2 cosθ2 ] [ω2 ] = [r3 cosθ3 ] (7.22)

由第二項第三項之矩陣內容,可以找到其相關的對應變化,這對以程式解題時相當有幫助。

至於其點Q與P 之速度則可由下式獲得:

Vq =[r2' + j r2ω2]ejθ2=j r2ω2 (cosθ2 + j sinθ2) (7.23)
Vp =[r2' + j r2ω2]ejθ2+[r3'+jr3ω3]ejθ3
=jr2ω2(cosθ2 +jsinθ2)+jr3ω3(cosθ3+jsinθ3) (7.24)

或者

Vp = [r1'+jr1ω1]ejθ1+[r4'+jr4ω4] ejθ4
= r1'(cosθ4 +jsinθ4) (7.25)

加速度分析


由公式7.16,利用同樣的方式,可以求得各點之加速度。不過,在求四連桿之加速度時,仍然需應用前面所得之位置與速度資料如θ2、θ3及ω3。且因加速度項中之r2"、r3"、r4"、ω1、ω4及角加速度α4之值均為零,r4"項亦將為零。故將7.16式速度項下再次微分,可得

rp" = r2" + r3" = r1" (7.26)

用複數型式表示如下,但右邊項僅為軸方向之向量:

d/dt [jr2ω2ejθ2]+ d/dt[jr3ω3ejθ3]
= d/dt [r1'ejθ1] (7.27)

首先,考慮左邊任意第1及2項之微分,設該項以k代表:

d/dt [j rkωk ejθk] =
[jrk'ωkejθk+jrkαkejθk-rkωk²e]
= jrkαk ejθk- rk ωk2 ejθk
= jrk'ωkejθk+(jrkαk-rk ωk²) ejθk
(7.28)

公式(7.27)之左邊因rk'為零,故僅得(7.28)式右邊之右項;而(7.27)式之右邊項則因僅為軸向量之故,ω1為零,結果反而僅存第一項:

d/dt [ r1'ejθ1] = r1"ejθ1- jr1'ω1ejθ1
= r1"ejθ1

故(7.28)式可為調整為:

[jr2α2-r2ω2²] ejθ2+[jr3α3-r3ω3²]ejθ3
= r1"ejθ1 (7.29)

(jr2α2-r2ω2²) (cosθ2 +jsinθ2) +(jr3α3-r3ω3²) (cosθ3+jsinθ3)
= r"1 ( cosθ1 + jsinθ1)

將實數與虛數分離之:

-r2ω2²cosθ2-r2α2sinθ2-r3ω3²cosθ3-r3α3sinθ3=r"1cosθ1
-r2ω2²sinθ2+r2α2cosθ2-r3ω3²cosθ3+r3α3cosθ3=r"1sinθ1
(7.30)

由於上面二聯立方程式之變數有r"1、α2、α3,故只要知道其中一項,應可求解。

設α2為已知


整理上二式,可有不同的變化,若角加速度中,設α2為已知,其求法如下:

r"1 cosθ1+ r3α3 sinθ3 =
-r2α2 sinθ2- r2ω2²cosθ2-r3ω3²cosθ3 =f1(α2)
r"1sinθ1 - r3α3 cosθ3 =
+r2α2 cosθ2- r2ω2²sinθ2-r3ω3²cosθ3=f2(α2)

整理為矩陣型式:

   [cosθ1 r3sinθ3 ] [r"1] = [f1(α2)]
   [sinθ1 -r3cosθ3] [α3 ] [f2(α2)] (7.32)

設α3為已知


同理若α3為已知,其型式變成2與3之指標對調即可,亦即:

 [cosθ1 r2sinθ2] [r"1] = [f1(α3)]
 [sinθ1 -r2cosθ2] [α2 ] [f2(α3)] (7.33)

因此在程式中,可以利用同一型式或函數呼叫,改變指標的代碼即可得到所需要的答案。這個特點與求速度解時之ω3 與ω2相同。同時,由其矩陣亦可以看出,無論求速度或加速度,前面之[RM]矩陣內容均相同。其解法也與前面速度之解法相同。

設r"1為已知


其次討論的是:若已知r"1時,需求得α2、α3。同樣利用公式(7.30),將其調整可以獲得如下的安排:

- r3α3 sinθ3 - r2α2 sinθ2=
 r"1 cosθ1 + r2 ω2²cosθ2+r3ω3²cosθ3 = F1(r"1)
r3α3 cosθ3 + r2α2 cosθ2=
 r"1sinθ1 + r2 ω2²sinθ2 +r3ω3²cosθ3 = F2(r"1)

[-r3sinθ3 -r2sinθ2] [α3] = [F1(r"1)]
[ r3cosθ3 r2cosθ2] [α2] [F2(r"1)] (7.34)

至此,應可完全得到四連桿之各角加速度解。而類同速度之分析,在求得各桿之α2、α3、r1"之後,配合各桿之長度及角速度,即可求得點P、Q、R等之加速度向量,即:

Aq =[jr2α2-r2ω2²]ejθ2
=[jr2α2-r2ω2²] (cosθ2 + j sinθ2) (7.35)
Ap = [jr2α2-r2ω2²]ejθ2+[jr3α3-r3ω3²]ejθ3
= [jr2α2-r2ω2²] (cosθ2 +jsinθ2)+
[jr3α3-r3ω3²] (cosθ3 + j sinθ3) (7.36)

或者

Ap = r"1 ejθ4= r"1 (cosθ1 + j sinθ1) (7.37)

7.3 建立滑塊程式

曲桿滑塊之分析仍可當做一般四連桿之型式進行分析,故其所需之程式僅需針對一般四連桿加以修改即可。曲桿滑塊雖仍有四連桿之結構,但是第一桿則可代表滑塊滑動的方向,故其角度會影響滑塊之滑動路徑,而其長短亦代表滑塊在該路徑移動的距離。故此時之第一桿之方位雖仍為固定,但長度將會變動,此外第四桿其長度雖不變動,但角度需與第一桿相互垂直,其長度因此可以表示滑塊與水平線之偏置距離。在這種情況下,第四桿之長度可為零,代表滑塊完全在第一桿之方向上滑動,這也可能是滑塊之最常用之位置。第四章中之曲桿滑塊之四連桿分析可供參考。本節則針對其動作為MATLAB動作程式加以說明。目前所設計之程式有sldlink.m、drawsldlinks.m、 sld_angle_limits.m、drawsldlimits.m等四個程式,茲分別說明如下:

一、sldlink函數



sldlink 函數之呼叫格式如下:

function [values,form] = sldlink(r,theta1,theta2,td2,tdd2,sigma,driver)

輸入變數:


  • r(1:4) = 各桿之長度,r(1)為固定桿,其餘分別為曲桿、結合桿及被動桿,但r(4)值可有可無,因為會被更改。
  • theta1 = 第一桿之水平角,或為四連桿之架構角,以角度表示。
  • theta2 = 驅動桿之水平夾角,以角度表示。一般為曲桿角,但若為結合桿驅動,則為結合桿之水平夾角。
  • td2 = 驅動桿(第二桿或第三桿)之角速度(rad/sec)。
  • tdd2 = 驅動桿(第二桿或第三桿)之角加速度(rad/sec^2)。
  • sigma = +1 or -1. 組合模式,負值表示閉合型,正值為分支型,但有時需視實際情況而定。
  • driver = 0 (驅動桿為第二桿); 1 (驅動桿為第三桿) ;2(滑塊驅動)

輸出變數:



  • form = 組合狀態, 0 :表示無法組合; 1:可以正確組合
  • values = 輸出矩陣,其大小為 4 X 8,各行之資料分配如下:








桿序
12(deg)3(rad/s)4(rad/s2)5678
桿1位置r1θ1ω1α1r1'Vq|Vq|∠Vq
桿2位置r2θ2ω2α2r1"Vp|Vp|∠Vp
桿3位置r3θ3ω3α3Q2AQ|AQ|∠AQ
桿4位置r4θ4ω4α4P3AP|AP|∠AP


其中第一行之連桿位置向量,屬於單桿的位置向量。第二行為各桿之水平夾角,第三及第四行為各桿之角度速度及角加速度。第五行為第一桿之軸向速度與加速度、P及Q點之位置向量。第六至八行則為P點與Q點之速度與加速度量,第五行為向量,第六行為絕對量,第七行為夾角。
內容上,值得一提的是第一行、三行、四行及五行之向量表示法屬於複數之型式。故若要得到其絕對值僅需在MATLAB指令檔中,以abs()這一個函數指令即可求得,而以函數angle()則可求得其夾角,雖然第二行與第七行之輸出亦有相對應之夾角。

程式內容




function [data,form] = sldlink(r,theta1,theta2,td2,tdd2,sigma,driver)
%
% function [data,form] = sldlink(r,theta1,theta2,td2,tdd2,sigma,driver)
% rivesed from Waldron's
% This function analyzes a slider crank mechanism
% driver =0,1,2 for link 2,3 & slide as crank,with td2 & tdd2 being their
% angular velocity & acceleration.
%Input:
% theta1,theta2= Angles of frame & crank in degrees
% r = [r1 r2 r3 r4], r4:slider offset.
% td2 = crank or coupler angular velocity (rad/sec)
% tdd2 = crank or coupler angular acceleration (rad/sec^2)
% sigma = +1 or -1. Identifies assembly mode
% data = data stored accordingly,
% | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
% I | r1 | t1 | td1 | tdd1 | r1' | Vq | |Vq|| ThVq |
% II | r2 | t2 | td2 | tdd2 | r1" | Vp | |Vp|| ThVp |
% III| r3 | t3 | td3 | tdd3 | Q2 | Aq | |Aq|| ThAq |
% IV | r4 | t4 | td4 | tdd4 | P3 | Ap | |Ap|| ThAp |
%form = assembly flag. form = 0 for failure of assembly.
%Example: [val,form] = sldlink([1 2 3 4],0,60,10,0,1,0)
f=@(num,ndg) round(num*10^ndg)/10^ndg;
data=zeros(4,8);
if driver==1, r(2:3)=[r(3) r(2)];end
rr=r.*r;d2g=pi/180;
theta=[theta1 theta2 0 theta1+90]*d2g;
t1=theta(1);t4=theta(4);
[td,tdd,rd,rdd]=deal(zeros(4,1));
s1=sin(t1);c1=cos(t1);
s4=sin(t4);c4=cos(t4);
switch driver
case 2 % for the sliding block as driver
rd(1)=td2;
rdd(1)=tdd2;
A=-2*r(1)*r(2)*c1-2*r(2)*r(4)*c4;
B=-2*r(1)*r(2)*s1-2*r(2)*r(4)*s4;
C=rr(1)+rr(2)+rr(4)-rr(3)+2*r(1)*r(4)*(c1*c4+s1*s4);
arg=B*B-C*C+A*A;
arg=f(arg,5);
if (arg>=0)
form=1; %assembly flag
t2=2*atan((-B+sigma*sqrt(arg))/(C-A));
s2=sin(t2); c2=cos(t2);
t3=atan2((r(1)*s1+r(4)*s4-r(2)*s2),(r(1)*c1+r(4)*c4-r(2)*c2));
theta(2)=t2; theta(3)=t3;
s3=sin(t3); c3=cos(t3);
%velocity calculation
AM=[-r(2)*s2, -r(3)*s3; r(2)*c2, r(3)*c3];
BM=[rd(1)*c1;rd(1)*s1];
CM=AM\BM;
td(2)=CM(1); td(3)=CM(2);
%acceleration calculation
BM=[r(2)*td(2)*td(2)*c2+r(3)*td(3)*td(3)*c3+rdd(1)*c1;...
r(2)*td(2)*td(2)*s2+r(3)*td(3)*td(3)*s3+rdd(1)*s1];
CM=AM\BM;
tdd(2)=CM(1); tdd(3)=CM(2);
else
form=0; return;
end
case {0,1} % for link 2 or 3 as a crank
td(2)=td2; tdd(2)=tdd2; tx=theta(2);
sx=sin(tx); cx=cos(tx);
% position calculations
A=2*r(4)*(c1*c4+s1*s4)-2*r(2)*(c1*cx+s1*sx);
B=rr(2)+rr(4)-rr(3)-2*r(2)*r(4)*(cx*c4+sx*s4);
arg=A*A-4*B;
arg=f(arg,5);
if (arg>=0)
form=1; %assembly flag
r(1)=(-A+sigma*sqrt(arg))/2;
t3=atan2((r(1)*s1+r(4)*s4-r(2)*sx),(r(1)*c1+r(4)*c4-r(2)*cx));
theta(3)=t3;
s3=sin(t3); c3=cos(t3);
%velocity calculation
AM=[c1, r(3)*s3; s1, -r(3)*c3];
BM=[-r(2)*td(2)*sx;r(2)*td(2)*cx];
CM=AM\BM;
rd(1)=CM(1); td(3)=CM(2);
%acceleration calculation
BM=[-r(2)*tdd(2)*sx-r(2)*td(2)*td(2)*cx-r(3)*td(3)*td(3)*c3;...
r(2)*tdd(2)*cx-r(2)*td(2)*td(2)*sx-r(3)*td(3)*td(3)*s3];
CM=AM\BM;
rdd(1)=CM(1); tdd(3)=CM(2);
else
form=0;
if driver==1,
r(2:3)=[r(3) r(2)];
for j=1:4, data(j,1)=r(j).*exp(i*theta(j));end % position vectors
end
return;
end
if driver==1,
r(2:3)=[r(3) r(2)];
c2=c3;c3=cx;s2=s3;s3=sx;
td(2:3)=[td(3) td(2)];
tdd(2:3)=[tdd(3) tdd(2)];
theta(2:3)=[theta(3) theta(2)];
elseif driver==0
c2=cx;s2=sx;
end
end % end of switch
for j=1:4,
data(j,1)=r(j).*exp(i*theta(j));
data(j,2:4)=[theta(j)/d2g,td(j),tdd(j)];
end
data(:,5)=[rd(1);rdd(1);data(2,1);data(2,1)+data(3,1)];
data(1,6)=i*r(2)*td(2)*exp(i*theta(2));
data(2,6)=data(1,6)+i*r(3)*td(3)*exp(i*theta(3));
data(3,6)=r(2)*(i*tdd(2)-td(2)*td(2))*exp(i*theta(2));
data(4,6)=data(3,6)+r(3)*(i*tdd(3)-td(3)*td(3))*exp(i*theta(3));
%[Vq;Vp;Aq;Ap]
data(1:4,7)=abs(data(1:4,6));data(1:4,8)=angle(data(1:4,6))/d2g;





繪出滑塊連桿位置函數drawsldlinks程式


程式必須呼叫drawsldlinks函數繪出對應之連桿及滑塊位置。此程式未來可以作為其他多項之用途。

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);
end
axis equal
grid on


執行範例



此時之輸入角速度td及角加速度tdd項所代表之值為第一桿之軸向線速度及線加速度,在輸入時應特別注意。

例一:為第二桿為驅動桿



>> [val,form] = sldlink([1 2 3 4],0,60,10,0,1,0)
val =
Columns 1 through 3
2.9638 0 0
1 + 1.7321i 60 10
1.9638 + 2.2679i 49.111 -5.0922
2.4493e-016 + 4i 90 0
Columns 4 through 6
0 -5.7716 -17.321 + 10i
0 -418.87 -5.7716 +1.7764e-015i
118.15 1 + 1.7321i -100 - 173.21i
0 2.9638 + 4i -418.87 -2.8422e-014i
Columns 7 through 8
20 150
5.7716 180
200 -120
418.87 -180
form =
1


本例中,有框線者表示其為輸入值。但第一行則已經轉換為複數型式,未來複數型式要轉為x-y座表時,只要使用函數real()及imag()兩指令,即可進行轉換。值得注意的是,第一桿之數值已經變動,將val矩陣取絕對值如下:

>> abs(val)
ans =
Columns 1 through 6
2.9638 0 0 0 5.7716 20
2 60 10 0 418.87 5.7716
3 49.111 5.0922 118.15 2 200
4 90 0 0 4.9783 418.87
Columns 7 through 8
20 150
5.7716 180
200 120
418.87 180


使用繪圖程式drawsldlinks可以得到繪圖的結果與資料:

>> drawsldlinks([1 2 3 4],0,60,1,0)
ans =
Columns 1 through 3
2.9638 0 0
1 + 1.7321i 60 10
1.9638 + 2.2679i 49.111 -5.0922
2.4493e-016 + 4i 90 0
Columns 4 through 6
0 -5.7716 -17.321 + 10i
0 -418.87 -5.7716 +1.7764e-015i
118.15 1 + 1.7321i -100 - 173.21i
0 2.9638 + 4i -418.87 -2.8422e-014i
Columns 7 through 8
20 150
5.7716 180
200 -120
418.87 -180




例二:為第三桿(coupler)為驅動桿




>> drawsldlinks([1 2 3 4],0,60,1,1)
ans =
Columns 1 through 3
2.9264 0 0
1.4264 + 1.4019i 44.504 -10.516
1.5 + 2.5981i 60 10
2.4493e-016 + 4i 90 0
Columns 4 through 6
0 -11.238 14.743 - 15i
290.83 -715.46 -11.238
0 1.4264 + 1.4019i -565.46 + 259.81i
0 2.9264 + 4i -715.46 -5.6843e-014i
Columns 7 through 8
21.032 -45.496
11.238 180
622.29 155.32
715.46 -180

此時之第一桿已經與第一例略有不同。可能是計算上之誤差。其結果如下圖。



例三:以滑塊為驅動桿(slider)為驅動桿(第一桿)



>> drawsldlinks([1 2 3 4],0,60,1,2)
ans =
Columns 1 through 3
1 0 0
-0.97808 + 1.7445i 119.28 -3.4968
1.9781 + 2.2555i 48.749 -1.729
2.4493e-016 + 4i 90 0
Columns 4 through 6
0 10 6.1002 + 3.4202i
-9.0794 0 10
9.7031 -0.97808 + 1.7445i 27.799 - 12.451i
0 1 + 4i 0 +1.7764e-015i
Columns 7 through 8
6.9936 29.278
10 0
30.46 -24.127
1.7764e-015 90

7.4 滑塊連桿(RRRP)之迴轉限制

與四連桿一樣,滑塊四連桿在轉動之過程中,仍然受到長度及其他角度之限制,驅動桿無法繞原點作完整之迴轉。這些限制有些基於三角形三邊之構成原理;有些則是基於二桿平行之原則。

四連桿迴轉過程中,有可能其中兩桿會連成一線,或重疊成一線,前者若成立時,即變成三角形,後者若重疊時,亦會構成另一個三角形。理論上連桿構成三角形應不會有相對運動。故可稱為四連桿之運動極限。由這兩個極端位置,可以知道四連桿之最終運動限制。

下面的圖形是利用drawsldlimits函數繪出,繪圖過程中並呼叫sld_angle_limits。此兩程式內容將待後述,目前僅觀察其搭配之成果。當驅動桿為第二及第三桿時,其Qstart與Qstop分別表示驅動桿之最小及最大角度;但當驅動件為滑塊時,其不再是角度,而是其對應之桿一最小及最大長度,亦即r1min與r1max。所繪出之圖中,粗黑色桿表示地桿,但其長度會依滑塊之位置而變。細黑色為第四桿,即固定點垂直於滑塊滑動面之距離,或稱為偏離量。藍色為驅動桿,紅色為連結桿。

A. 第二桿為驅動桿


測試滑塊連桿之組成,以第二桿為驅動桿時有下列四種情況:

(1)當r3≧r4≧0,且 r3+r4 ≦ r2時(例如:[ 1 5 3 1])

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



圖7.3 第二桿驅動,有限度迴轉(r = ([1 5 3 1] )


drawsldlimits([1 5 3 1],0,-1,0)
Qstart = -23.578
Qstop = 53.13


(2)當r4≧r3≧0,且 r3+r4 ≧ r2時(例如:[ 1 5 3 4])

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




圖2.4 第一及第二象限中運轉,第三桿與第四桿重合(r =[1 5 3 4])

drawsldlimits([1 5 3 4],0,1,0)
Qstart = 11.537
Qstop = 168.46


(3)當r3≧-r4≧0,且 r3-r4 ≦ r2時(例如:[1 5 3 -1])

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




圖7.5 與圖7之情形相同,但前後角度限制相反(r =[1 5 3 -1])



drawsldlimits([1 5 3 -1],0,1,0)
Qstart =-53.13
Qstop = 23.578

(4) 當-r4≧r3≧0,且 r3-r4 ≧ r2時(例如: [1 5 3 -5])

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



圖7.6 第三與第四桿共線,與圖8相同但相反,r=[1 5 3 –5]

drawsldlimits([1 5 3 -5],0,1,0)
Qstart =-156.42
Qstop =-23.578

B. 第三桿為驅動桿


第三桿結合桿為驅動桿時,則只要r2≧|r3|+|r4|之條件成立,結合桿即可完全迴轉,即 0≦θ3≦2π。當r2≧|r3|+|r4|條件不能成立時,迴轉會開始有限制,即在第二桿與滑動線相垂直時會發生。

(1) 當0≦r4,且0≦r2-r4≦r3 時 (例如:[3 3 6 1])

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



圖7.7兩側對稱,第二桿垂直於第一桿(r =[3 3 6 1])


drawsldlimits([3 3 6 1],0,-1,1)
Qstart =-19.471
Qstop =199.47

(2) 當0≦r4,且r2+r4≦r3 時 (例如:[3 2 6 3])

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




圖7.8 第二桿垂直於第一桿(r =[3 2 6 3 ])


drawsldlimits([3 2 6 3],0,-1,1)
Qstart =9.5941
Qstop =56.443

(3) 當r4≦0,且0≦r2+r4<r3(例如:[3 3 6 -2])

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




圖7.9 不同角度但在第三及第四象限內之活動(r =[3 3 6 -2])


drawsldlimits([3 3 6 -2],0,-1,1)
Qstart =-189.59
Qstop =9.5941

(4) 當r4≦0,且r2-r4<r3 時 (例:[3 3 8 -4])

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


圖7.10 第一及第四象限中活動,兩角度者和為(r =[3 3 8 -4 ])


drawsldlimits([3 3 8 -4],0,-1,1)
Qstart =-61.045
Qstop =-7.1808

C. 滑塊為驅動桿


由於屬於直線運動,故在程式中之Qstart及Qstop值為第一桿位移之最大與最小量。

(1)當|r2-r3|>r4時,其條件限制於r1所給之長短,其值為:

rmin = {[r2-r3]2-r42}1/2
rmax = {[r2+r3]2-r42}1/2



圖7.11 滑塊驅動之情形r=[3 3 8 4]

drawsldlimits([3 3 8 4],0,-1,2)
Qstop =10.247

其對應之第二桿角度為:

θmin =θ1 + sin-1((r2+r3) / r4),
θmax =θ1 +sin-1((r2-r3) / r4)

其對應之第二桿角度為:

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


圖7.12 滑塊驅動之情形r=[3 8 3 4]


drawsldlimits([3 8 3 4],0,-1,2)
Qstart =3
Qstop =10.247


(2) 當|r2-r3|< r4時, r1 值為:

rmin = -{[r2+r3]2-r42}1/2
rmax = {[r2+r3]2-r42}1/2

其對應之第二桿角度為:

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



圖7.13 滑塊驅動之情形r=[3 8 3 6]

qstart =-9.2195
qstop = 9.2195


sld_angle_limits函數


觀察上面討論之四個極限角度,可以寫一組程式進行計算。由於以第三桿驅動與第二桿驅動,在計算上僅是將其中之r2與r3之位置對調即可。為尋找上述極限角度θmin、θmax,可用函數fb_angle_limits進行尋找,其格式如下:

function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)

其中輸入項目有:
r = 四連桿之長度向量,其定義與前函數相同。
theta1 = 第一桿之夾角,角度表示(deg)。
linkdrive = 驅動模式(=0 第二桿驅動; =1 第三桿驅動 =2 滑塊驅動)。
而輸出項為兩個角度:
Qstart = 驅動桿(第二桿或第三桿)之最低限角度 (deg)
Qstop = 驅動桿(第二桿或第三桿)之最高限角度 (deg)

上述中若linkdrive=2,表示滑塊驅動,因此輸出項Qstart、Qstop不再表示角度,而是第一桿之最小長度r1min至最大長度r1max。因此其第二桿之對應角度必須另行計算。

drawsldlimits函數則是呼叫sld_angle_limits.m函數,然後將其極限位置繪出。其輸入項目與drawsldlinks函數相同。

程式內容



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;


滑塊外形函數sldbox


這是搭配drawsldlinks函數,繪出滑塊外形之程式。其輸入為滑塊之長度與高度,以及其中心點位置。這個滑塊也會隨其方位迴轉。其功能也可以與前述之sldblks函數比較。

function [coords] = sldbox(length,height,x0,y0,theta)
%
%function [coords] = sldbox(length,height,x0,y0,theta)
% Determines the coordinates of points for the block.
% The input:
% length,height = length & height of the block
% [x0,y0] = coordinates of the central block
% theta = rotation angle relative to the horizontal x axis (deg)
% The results are returned in the vector "coords".
theta=theta*pi/180;dx=abs(length)/2;dy=abs(height)/2;
if dy==0,
coords=[-dx,0;dx,0];
else
coords=[-dx,-dy;+dx,-dy;+dx,+dy;-dx,+dy;-dx,-dy];
end
c=cos(theta);s=sin(theta);
trsf=[c s;-s c];
coords=coords*trsf;
coords(:,1)=coords(:,1)+x0;
coords(:,2)=coords(:,2)+y0;


繪出滑塊連桿位置函數drawsldlinks程式


程式必須呼叫drawsldlinks函數繪出對應之連桿及滑塊位置。此程式未來可以作為其他多項之用途。

function [values]=drawsldlinks(r,th1,th2,sigma,driver)
%function drawlinks(r,th1,th2,sigma,driver)
%draw the positions of four-bar links
%call sldlink 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);
end
axis equal
grid on


繪出滑塊連桿界限函數drawsldlimits程式


這是呼叫之主程式,程式中特別處理當驅動桿為滑塊時之情形。由於滑塊主動時,其得到之Qstart及Qstop值不是角度,而是其對應r1之長度,故必須求其對應之桿二角度,以便繪出相對位置之連桿。

此程式除呼叫sld_angle_limits獲得迴轉之範圍外,呼叫drawsldlink函數繪出各桿之位置。

function drawsldlimits(r,th1,sigma,driver)
%function drawlmits(r,th1,sigma,driver)
%draw the positions of slide-crank links
%call sldlink.m funcion
%r: row vector for four links
% th1: frame angle
% sigma: assembly mode
% driver: 0 for crank, 1 for coupler,3 for block move
% Example:
% drawsldlimits([1 2 3 4],10,1,0)
%
g2d=180/pi;
[Qstart, Qstop]=sld_angle_limits(r,th1,driver)
if Qstart==0 & Qstop==0, return; end
switch driver
case 0 %Link 2 as driving link
[rr]=drawsldlinks(r,th1,Qstart,sigma,driver);
text(real(rr(2,1)/2),imag(rr(2,1)/2),['s1=' num2str(Qstart,'%6.1f')]);
[rr]=drawsldlinks(r,th1,Qstop,sigma,driver);
text(real(rr(2,1)/2),imag(rr(2,1)/2),['s2=' num2str(Qstop,'%6.1f')]);
case 1 %Link 3 as driving link
[rr]=drawsldlinks(r,th1,Qstart,sigma,driver);
text(real(rr(2,1)+rr(3,1)/2),imag(rr(2,1)+rr(3,1)/2),...
['s1=' num2str(Qstart,'%6.1f')]);
[rr]=drawsldlinks(r,th1,Qstop,sigma,driver);
text(real(rr(2,1)+rr(3,1)/2),imag(rr(2,1)+rr(3,1)/2),...
['s1=' num2str(Qstop,'%6.1f')]);
case 2 %Slide as driving link
if abs(r(2)-r(3))<r(4)
angx=asin((r(2)+r(3))/r(4))*g2d;
tmax=th1+angx;
tmin=th1+180-angx;
else
tmin=th1+asin((r(2)+r(3))/r(4))*g2d;
tmax=th1+asin((r(2)-r(3))/r(4))*g2d;
end
r(1)=Qstart;offr=0.1*Qstart;
[rr]=drawsldlinks(r,th1,tmin,sigma,driver);
text(real(rr(1,1)/2),imag(rr(1,1)/2)+offr,['r1=' num2str(Qstart,'%6.1f')]);
r(1)=Qstop;
[rr]=drawsldlinks(r,th1,tmax,sigma,driver);
text(real(rr(1,1)/2),imag(rr(1,1)/2)-offr,['r1=' num2str(Qstop,'%6.1f')]);
end
axis equal
grid on

7.5 滑塊四連桿上之點軌跡

滑塊連桿之軌跡


與四連桿之分析相同,在任何桿之延伸點上之位移、速度及加速度等亦可利用sldlink()、body()、fb_sld_linits()及drawlinks()等函數進行分析。利用drawsldpaths()函數則可達到整合的目的。其呼叫之方式如下:

drawsldpaths(r6,th6,r,th1,theta,td2,tdd2,sigma,npts,driver,mode)

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

程式內容

function drawsldpaths(r6,th6,r,th1,td2,tdd2,sigma,npts,driver,mode)
%
%drawsldpaths(r6,th6,nlink,r,th1,td2,tdd2,sigma,npts,driver,mode)
% To draw sets of positions of slider-crank links
%Author:D.S.Fon, BIME, NTU. Dated April 11, 2003
%call sldlink.m, drawsldlinks.m, sld_angle_limits.m & body.m
%
%Inputs:
% r: row vector for four links
% th1, th2: frame and driving link angle, in degrees
% td2,tdd2:angular velocity and acceleration of the driving link.
% sigma: assembly mode
% driver: 0 for crank, 1 for coupler, 2 for slider
% npts: number of points divided
% r6,rh6,nlink:additional length and angle for nlink link.
% mode=0 simple position graph only.
% =1 all 3 graphs. =2 simple graph+velocity graph
% =3 all 3 graphs but with simple position graph
%Example:
% drawsldpaths(2,30,[4 2 3 4],0,10,10,1,50,0,0)
%
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);
patch('xdata',real(para(1:3)),'ydata',imag(para(1:3)),...
'facecolor','r','facealpha',0.6,'marker','o');hold on;
plot(para(2),'bo');text(real(para(2)),imag(para(2)),' A');
end
val(1:3,i)=[vr(1,1)+vr(4,1);vr(2,1);para(2)];%Sq,Sp,Sa
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-');%crank angle or r1
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-');%Omega of crank
fact=round(max(val(7,:))/max(val(6,:))*10)/10;
hold on;plot(th2,val(7,:)/fact,'b-');%Omega of coupler
xlabel(intitle);ylabel(title3(driver+1));
grid on;
%
subplot(2,2,3);
plot(th2,val(8,:),'k-');% vel of slider
hold on;plot(th2,val(9,:),'r-');% vel of A
xlabel(intitle);ylabel(title2(1));
grid on;
%
subplot(2,2,4);
plot(th2,val(10,:),'k-');%Acc of slider
hold on;plot(th2,val(11,:),'r-');% Acc of A
xlabel(intitle);ylabel(title2(2));
grid on;

執行例


(1)桿1驅動


>> drawsldpaths(2,30,[3 4 3 6],0,10,10,1,50,0,2)
Qstart =
48.59
Qstop =
131.41




(2)桿2驅動


>> drawsldpaths(2,30,[3 8 3 6],0,10,10,1,50,1,0)
Qstart =
-41.81
Qstop =
221.81




(2)滑塊驅動



>> drawsldpaths(2,30,[3 8 3 6],0,10,10,1,50,2,0)
Qstart =
-9.2195
Qstop =
9.2195


滑塊連桿之動畫


move_sldpaths函式參數



move_sldpaths(r,r6,th6,nlink,th1,td2,tdd2,sigma,driver,ntimes,npts)

輸入參數:
r : 四連桿之長度,一列向量表示。
th1: 第一桿的水平角度(通常為零)。
th2: 驅動桿或聯結桿的水平角度。
td2, tdd2:驅動桿之角速度及角加速度。
Sigma:連桿之組合模式選擇(需為+1或-1)
Driver:驅動桿之設定( 0 表示苗桿驅動,1 表示由聯結桿驅動,3滑塊驅動)。
Npts: 設定分割的點數或位置。
r6,rh6,nlink:桿上特定點之位置,包括桿長,與桿之夾角及附於何桿。

move_sldpaths程式內容




function move_sldpaths(r,r6,th6,nlink,th1,td2,tdd2,sigma,driver,ntimes,npts)
%
% draw_sldpaths(r,r6,th6,nlink,th1,td2,tdd2,sigma,driver,ntimes,npts)
% To animate the positions of a slider link
% Author: D.S.Fon, BIME, NTU, date: Feb. 14, 2007
% call sldlink.m,drawsldlinks.m,fb_sld_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, 2 for slider
% ntimes: no. of cycles
% npts: number of points divided
% r6,rh6,nlink:additional length and angle for nlink link.
%example:
% move_sldpaths([4 2 3 4],2,-30,3,0,10,0,1,0,4,100)
%
clf;
warning off;
if nargin<10, ntimes=3;npts=100;end;
figure(1);
[Qstart, Qstop]=sld_angle_limits(r,th1,driver);
npoint=abs(npts);
th2=linspace(Qstart,Qstop,npoint);
val=zeros(9,npoint);
for i=1:npoint,
[vr b]=sldlink(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
drawsldlimits(r,th1,sigma,driver);
x=real(val);y=imag(val);
line(x(5,:),y(5,:),'color','k','linestyle',':');
line(x(4,:),y(4,:),'color','b','linestyle','-.');
line(x(6,:),y(6,:),'color','c','linewidth',3);
range=1.2*([min(min(x)) max(max(x)) min(min(y)) max(max(y))]);
axis(range);axis image;grid off;
h(1)=patch('xdata',[],'ydata',[],'facecolor','r');
h(2)=line(0,0,'linewidth' ,4,'color', 'b');% Crank
h(3)=line(0,0,'linewidth' ,4, 'color', 'r');% Rocker
h(4)=line(0,0,'linewidth' ,1,'color', 'k','linestyle',':');% rocker
h(5)=line(0,0,'linewidth' ,2,'erasemode','xor','color','r');% block
h(6)=line(0,0,'linewidth' ,4,'color', 'k');% boxline
for i=1:4,set(h(i),'erasemode','xor','marker','o');end
boxlen=max(abs(r(2:3)));
i=0;s=-1;
for m=1:ntimes
s=-s;sound(1,2);
if abs(Qstop-Qstart-360)<1,i=0;s=1;end;
while 1,
i=i+s;
if i>npoint|i==0,break;end;

%%%%%%%%%%%%%%%%%%%%%%
%set(link5, 'xdata',x(5,i), 'ydata',y(5,i))%marker
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(h(1),'xdata',x(4:6,i),'ydata',y(4:6,i));
[coords] = sldbox(.20*boxlen,.15*boxlen,x(3,i),y(3,i),th1);
set(h(5),'xdata',coords(:,1), 'ydata',coords(:,2));
[coords] = sldbox(.20*boxlen,0,x(3,i),y(3,i)-0.075*boxlen,th1);
set(h(6),'xdata',coords(:,1), 'ydata',coords(:,2));
switch driver
case 0
set(h(2),'Color','blue');%crank
set(h(3),'Color','red');%coupler
case 1
set(h(2),'Color','red');%crank
set(h(3),'Color','blue');%coupler
case 2
set(h(3),'Color','red');%coupler
set(h(2),'Color','red');%crank
end

drawnow; %flush the draw buffer
% Do meaningless calculation to slow down the linkage
pause(0.1);
end
end % for m loop
hold off;warning on;
%%%%%%%%%%%%%%%%%%%%%


執行結果



7.6 反置型滑塊連桿之運動分析

Slider-Crank Inversion



圖7.2 反置滑塊為元件之四連桿

滑塊應於用油壓機械如鏟斗、堆土機、驅動連桿等場合相當多。這些機構應用特色是採用油壓唧筒或活塞,使支撐桿之長度可以自由伸縮,以控制機構之運動。圖7.2所示即為此機構之分析圖。這個四連桿結構中,與前面略有不同。其第一桿固定,滑塊之中心線與第三桿共線,亦即沿第三桿軸線上作相對運動。曲塊應為第四桿,但必須一方向與第三桿共線,一方向與固定桿維持一固定距離。為便於分析,將第三桿與第四桿之連接點Q設於第三桿之連線與固定點R相垂直的位置。亦即第三桿為PQ,其長度會因滑塊的運動而變化;而第四桿則為RQ,與PQ維持垂直。如此亦構成四連桿的結構。與一般四連桿不同之處是點P與點Q的位置調換,其閉合方向程式因而略有不同。

為使滑塊的分析過程與前面普通四連桿取得一致性,我們仍將各桿及水平夾角分別標示為r1、r2、r3、r4與θ1、θ2、θ3、θ4,此時第一桿之θ1固定,第四桿則屬固定桿,其角度θ4為:

θ4 =θ3 - π/2 (7.38)

所以若第二桿為驅動桿時,則非常類似前面四連桿,固定第四桿,驅動第三桿之分析過程。茲依前一節之敘述,得到閉合公式為:

rp = r2 = r1 + r3 + r4 (7.39)
r2ejθ2= r1ejθ1+r3ejθ3+r4 ejθ4

將公式代入上式,即可將上式轉為:

r2 cosθ2 = r1 cosθ1 + r3 cosθ3 + r4 cosθ4
r2 sinθ2 = r1 sinθ1 + r3 sinθ3 + r4 sinθ4 (7.40)

解上述閉合方程式時,變數r1、r2、r4、θ1、θ4等均為已知,而θ2、θ3、 r3等三個參數待解,故可依這三個未知項中,令其中一項為已知,以求得其他兩個對應參數之值。

位置分析


茲就上述三個參數進行解析:

(1)θ2為已知之解


當θ2為已知時,可先消去θ3,再利用前面之技巧求得r1,即:

  r2 cosθ2 - r1 cosθ1 = r3 cosθ3 + r4 sinθ3
  r2 sinθ2 - r1 sinθ1 = r3 sinθ3 - r4 cosθ3 (7.41)

兩邊平方相加,以消去θ3:

r3² =r1²+r2²-r4²-2r1r2(cosθ1cosθ2+sinθ1 sinθ2 ) (7.42)

因此,可以求得r3之值。其次利用公式7.41之1式,設C= r2 cosθ2 - r1 cosθ1,則可以改寫成r3 cosθ3+r4 sinθ3 = C之型式。利用半角公式,設β=tan((θ3/2),即可以作化為下面之型式:

  sinθ3=[2 tan(θ3/2)] / [1+ tan2 (θ3/2)]=2β/(1+β2)
  cosθ3=[[1- tan2 (θ3/2)] / [1+ tan2 (θ3/2)]= (1-β2)/(1+β2)
(7.43)

將此二式代入公式7.41之1,則

r3 (1-β2)/(1+β2) + r4 2β/(1+β2) = C



(C + r3 )β2 - 2 r4β + (C – r3) = 0

解之得:

β = [r4 +ε(r4²-C²+r3²)1/2] / (C +r3) (7.44)

式中之±值表示β有兩個值,負值代表與正值在相反的方向。為在程式中表示這個種模式均存在,可用ε來代表±1之值。輸入所需之值決定之。

在求開方根時,內部值不能為負值,否則會有虛根出現。若有虛根出現,表示四連桿無法在真實世界上存在,故必須避免。故利用上式檢驗r4²+r3²>C²。若不符合,表示上述所給的四連桿尺寸無法構成,必須加以檢討及修正。

得到β後,即可利用θ3 =2 tan-1β求得θ3。

(2)θ3為已知之解



若為θ3已知,則θ2 及r3為未知,公式7.44可改寫如下:

r2 cosθ2 = r1 cosθ1 +r3 cosθ3+ r4 sinθ3
r2 sinθ2 = r1 sinθ1 +r3 sinθ3 - r4 cosθ3 (7.44)'

兩邊平方相加,可消去θ2而求得r3如下:

r3²+2r3r1(cosθ1cosθ3+sinθ1 sinθ3)+
2r1 r4(cosθ1 sinθ3 -sinθ1 cosθ3)+r1²+r4²-r2²=0
(7.45)

設 B及C代表其中項如下:

 B = 2 r1 (cosθ1 cosθ3 + sinθ1 sinθ3 )
 C = 2r1 r4 (cosθ1 sinθ3 - sinθ1 cosθ3 )+r1²+r4²-r2²

 則以r3為主之二次方程式可以表示如下:

 r3²+ Br3 + C = 0

解之得:

r3 = {-B +ε[B²–4C]1/2}/2 (7.46)

為在程式中表示這個種模式均存在,可用ε來代表±1之值。輸入所需之值決定之。

有了r3之後,即可利用公式7.44'求得θ2:

θ2= tan-1{[r1 sinθ1 +r3 sinθ3 - r4 cosθ3]/
[r1 cosθ1 +r3 cosθ3+ r4 sinθ3]} (7.47)

(3)r3為已知之解



r2 cosθ2 - r1 cosθ1 = +r3 cosθ3+ r4 sinθ3
r2 sinθ2 -r1 sinθ1 = +r3 sinθ3 - r4 cosθ3 (7.44)'

兩邊平方之並相加調整得:

-2 r2 r1 (cosθ1 cosθ2+ sinθ1 sinθ2 )+
(r2²+r1²-r3²-r4²)=0

將上式調整為 A cosθ2+B sinθ2+ C =0 之型式。令

A=-2 r2 r1 cosθ1
B=-2 r2 r1 sinθ1
C= r2²+r1²-r3²-r4²

利用半角公式可以得

θ2 =2tan-1{[-B +ε(B²-C²+A²)1/2]/(C-A)}
(7.48)

有了之後,可以利用閉合式之兩邊相除,並設

A= (r2 cosθ2 - r1 cosθ1) / ( r2 sinθ2 - r1 sinθ1)

則:

tanθ3=( r3+A r4)/( A r3- r4) (7.49)


速度分析



本題目中,由於參數r1、 r2、 r4、θ1等均為固定值,故在速度部份這些相關項目r'1、r'2、ω1、r'4均應為零,且ω3=ω4,因此問題可以簡化。茲就P點依兩路徑所得之相對應速度之變化量應相等,因此:

rp' = r2' = r1' + r2' + r3' (7.50)

用複數型式表示之:

jr2ω2ejθ2= r3'ejθ3+jr3ω3ejθ3+jr4ω4ejθ4
(7.51)

分離成尤拉公式:

 jr2ω2 (cosθ2+j sinθ2)= r3'(cosθ3 +jsinθ3)+
  jr3ω3(cosθ3+jsinθ3)+jr4ω4(cosθ4+jsinθ4) (7.52)

將其實數與虛數部份分開,得其閉合方程式:

- r2ω2 sinθ2= r3'cosθ3 - r3ω3 sinθ3 - r4ω3sinθ4 (7.53)
r2ω2 cosθ2= r3'sinθ3 + r3ω3 cosθ3 + r4ω3cosθ4 (7.54)

(1)ω2為已知時


利用下列關係式:

r3'cosθ3 - r3ω3 sinθ3 - r4ω3sinθ4 =-r2ω2 sinθ2 (7.55)
r3'sinθ3 + r3ω3 cosθ3 + r4ω3cosθ4 = r2ω2 cosθ2

寫成矩陣型式:

 [cosθ3 -r3sinθ3-r4sinθ4] [r3'] = [-r2ω2 sinθ2]
[sinθ3 r3cosθ3+r4cosθ4] [ω3 ] [ r2ω2 cosθ2] (7.56)

(2)ω3為已知時


其關係式如下:

 -r2ω2sinθ2 - r3'cosθ3 = - r3ω3 sinθ3 - r4ω3sinθ4
r2ω2cosθ2 - r3'sinθ3 = r3ω3 cosθ3 + r4ω3cosθ4 (7.57)

改寫成矩陣型式:

 [-r2sinθ2 -cosθ3] [ω2 ] = [-r3ω3sinθ3-r4ω3sinθ4]
[ r2cosθ2 -sinθ3] [r3'] [ r3ω3cosθ3+r4ω3cosθ4] (7.58)


(3)r3'為已知時



-r2ω2sinθ2+r3ω3 sinθ3+r4ω3sinθ4=r3'cosθ3

r2ω2cosθ2-r3ω3 cosθ3-r4ω3cosθ4=r3'sinθ3 (7.59)

改寫為矩陣型式:

   [-r2 sinθ2   r3sinθ3+r4sinθ4] [ω2] = [r3'cosθ3]
[ r2 cosθ2 -r3cosθ3-r4cosθ4] [ω3] [r3'sinθ3] (7.60)


加速度分析


由公式(7.53),利用同樣的方式,當求四連桿之加速度時,仍然應用前面所得之位置與速度資料如θ2、θ3、ω2及ω3。且因加速度項中之r1"為零,而角加速度α3 =α4、ω3=ω4。故將(7.53-54)式速度項下再次微分,可得:

  rp"= r2" = r3" + r4"            (7.61)

用複數型式表示時第第二及第四桿相同均有此項加速度:(jrkαk-rkωk²)ejθk,而第三桿則是相當自由的桿,其分析如下:

r3"= r3"ejθ3+jr3'ω3ejθ3+[jr3'ω3ejθ3
+jr3α3e jθ3-r3ω3²ejθ3]
= r3"ejθ3+2jr3'ω3ejθ3
+(jr3α3–r3ω3²)ejθ3
(7.62)

上式可以採用尤拉關係式:

(jr2α2-r2ω2²)(cosθ2+jsinθ2) =
   r3"(cosθ3+jsinθ3)+2jr3'ω3(cosθ3+jsinθ3)
   +(jr3α3-r3ω3²)(cosθ3+jsinθ3)
+[jr4α3-r4ω3²] (cosθ4+jsinθ4)


將實數與虛數分離之,

-r2α2 sinθ2-r2ω2²cosθ2=
r3"cosθ3-2r3'ω3sinθ-3r3ω3²cosθ3-
  r3α3sinθ3-r4ω3²cosθ4-r4α3sinθ4

r2α2cosθ2-r2ω2²sinθ2=
r3"sinθ3+2r3'ω3cosθ-3r3ω3²sinθ3+
r3α3cosθ3-r4ω3²sinθ4+r4α3cosθ4 (7.63)



(1)α2為已知時



r3"cosθ3-r3α3 sinθ3-r4α3sinθ4=
-r2α2sinθ2-r2ω2²cosθ2+2r3'ω3sinθ3
+r3ω3²cosθ3+r4ω3²cosθ4=f1

r3"sinθ3+r3α3 cosθ3+r4α3cosθ4=
r2α2cosθ2-r2ω2²sinθ2-2r3'ω3cosθ3
+r3ω3²sinθ3+r4ω3²sinθ4=f2 (7.64)


將上式之右端分別設為f1及f2:

  [cosθ3 -r3sinθ3-r4sinθ4] [r3"] = [f1]
  [sinθ3 r3cosθ3+r4cosθ4] [α3 ] [f2] (7.65)


(2)α3為已知時



-r2α2 sinθ2-r3"cosθ3=
r2ω2²cosθ2-2r3'ω3sinθ-3r3ω3²cosθ3
-r3α3sinθ3-r4ω3²cosθ4-r4α3sinθ4= f3

r2α2cosθ2-r3"sinθ3=
r2ω2²sinθ2+2r3'ω3cosθ-3r3 ω3²sinθ3
+r3α3cosθ3-r4ω3²sinθ4+r4α3cosθ4= f4 (7.66)


改寫為矩陣型式:

   [-r2sinθ2 -cosθ3] [α2 ] = [f3]
[r2 cosθ2 -sinθ3] [r3"] [f4] (7.67)



(3)r3'為已知時



r2α2 sinθ2 - r3α3 sinθ3- r4α3sinθ4=
-r3"cosθ3-r2ω2²cosθ2+2r3'ω3sinθ3
+r3ω3²cosθ3+r4 ω3²cosθ4=f5

-r2α2cosθ2 + r3α3 cosθ3 + r4α3cosθ4=
-r3"sinθ3-r2ω2²sinθ2-2r3'ω3cosθ3
+r3ω3²sinθ3+r4ω3² sinθ4=f6
(7.68)

化簡為矩陣型式:

 [-r2sinθ2 r3sinθ3+r4sinθ4] [α2] = [f5]
[ r2cosθ2 -r3cosθ3-r4cosθ4] [α3] [f6] (7.69)