2007年5月9日 星期三

作業八

我4/26有上課。

8.1
四連桿桿長r=[4 3 3 5],分別為固定桿、曲桿、結合桿、被動桿。 桿二為驅動桿,故linkdrive=0。 固定桿角度theta1=0(degree);角速度td2=10(rad/s);角加速度tdd2=0(rad/s^2)。 桿二角度假設為theta2=45(degree)。 題目沒有給定此連桿為閉合型或分支型,故mode=+1 or -1。

使用網路講義中第六章的f4bar程式找出各點的位置、速度、加速度:
------------------------------------------------------------------------------------------------
r=[4 3 3 5]; td2=10; tdd2=0; theta1=0; theta2=45; linkdrive=0;

mode=1;
[data,form] = f4bar(r,theta1,theta2,td2,tdd2,mode,linkdrive)

mode=-1;
[data,form] = f4bar(r,theta1,theta2,td2,tdd2,mode,linkdrive)

------------------------------------------------------------------------------------------------
執行結果:

data = 輸出矩陣,其大小為 4 X 7,各行之資料分配如下:

    1   2(deg) 3(rad/s) 4(rad/s^2) 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
其中第一行之連桿位置向量,屬於單桿的位置向量,以格式以複數表示。第二行為各桿之水平夾角,以度表示;第三及第四行為各桿之角度速度及角加速度,以單位 時間之弧度表示。第五至七行則為P點與Q點之速度與加速度量,第五行為向量,第六行為絕對量,第七行為夾角,以度數表示。

教授的講義在此處有誤:
1.程式輸出中沒有column7,經查看後f4bar程式的設計中也沒有設計column7,故上圖中只有6個column。
2.data(1,6)和data(2,6)為Q&的位置(以複數表示),data(3,6)和data(4,6)恆為0,皆不是column5的絕對值。


有了r2、r3、theta2、theta3、omega2、omega3、alpfa2、alpha3,我們就可以求出q點和p點的速度、加速度(位置已求出,就是data(1,6)和data(2,6))。
注意theta2&theta3是角度,故要使用cosd&sind函數。
-------------------------------------------------------------------------------------------------
r2=r(2);
r3=r(3);
theta2=data(2,2);
theta3=data(3,2);
omega2=data(2,3);
omega3=data(3,3);
alpha2=data(2,4);
alpha3=data(3,4);

Vq=j*r2*(omega2)*(cosd(theta2)+j*sind(theta2))
Vp=j*r2*(omega2)*(cosd(theta2)+j*sind(theta2))
+j*r3*(omega2)*(cosd(theta3)+j*sind(theta3))

Aq=(j*r2*alpha2-r2*omega2*omega2)*(cosd(theta2)+j*sind(theta2))
Ap=(j*r2*alpha2-r2*omega2*omega2)*(cosd(theta2)+j*sind(theta2))
+(j*r3*alpha3-r3*omega3*omega3)*(cosd(theta3)+j*sind(theta3))
-------------------------------------------------------------------------------------------------
執行結果:
mode=1
mode=-1


8.2
使用drawlinks畫出四連桿形狀,再利用之前f4bar所得到的資料畫出速度線、加速度線:
-------------------------------------------------------------------------------------------------
r=[4 3 3 5]; td2=10; tdd2=0; theta1=0; theta2=45; linkdrive=0;
mode=1;
[data,form] = f4bar(r,theta1,theta2,td2,tdd2,mode,linkdrive)
r2=r(2);
r3=r(3);
theta2=data(2,2);
theta3=data(3,2);
omega2=data(2,3);
omega3=data(3,3);
alpha2=data(2,4);
alpha3=data(3,4);

% 速度、加速度公式
Vp=j*r2*(omega2)*(cosd(theta2)+j*sind(theta2));
Vq=j*r2*(omega2)*(cosd(theta2)+j*sind(theta2))
+j*r3*(omega2)*(cosd(theta3)+j*sind(theta3));
Ap=(j*r2*alpha2-r2*omega2*omega2)*(cosd(theta2)+j*sind(theta2));
Aq=(j*r2*alpha2-r2*omega2*omega2)*(cosd(theta2)+j*sind(theta2))
+(j*r3*alpha3-r3*omega3*omega3)*(cosd(theta3)+j*sind(theta3));


Vp=Vp/10 % 速度線過長 調成十分之一
Vq=Vq/10 %
速度線過長 調成十分之一
Ap=Ap/100 % 加速度線過長 調成十分之一
Aq=Aq/100 % 加速度線過長 調成十分之一

drawlinks(r,theta1,theta2,mode,linkdrive);

% 把起點設在PQ兩個旋轉結上,再把速度向量、加速度向量加上去
VpVector=[real(data(1,6)) imag(data(1,6)) ; real(data(1,6)+Vp) imag(data(1,6)+Vp)];
VqVector=[real(data(2,6)) imag(data(2,6)) ; real(data(2,6)+Vq) imag(data(2,6)+Vq)];
ApVector=[real(data(1,6)) imag(data(1,6)) ; real(data(1,6)+Ap) imag(data(1,6)+Ap)];
AqVector=[real(data(2,6)) imag(data(2,6)) ; real(data(2,6)+Aq) imag(data(2,6)+Aq)];


line([VpVector(1,1);VpVector(2,1)],[VpVector(1,2);VpVector(2,2)],'color','c'); %Vp 青色線
line([VqVector(1,1);VqVector(2,1)],[VqVector(1,2);VqVector(2,2)],'color','b'); %Vq 藍色線
line([ApVector(1,1);ApVector(2,1)],[ApVector(1,2);ApVector(2,2)],'color','g'); %Ap 綠色線(和黑色連桿重疊會變青)
line([AqVector(1,1);AqVector(2,1)],[AqVector(1,2);AqVector(2,2)],'color','r'); %Aq 紅色線
-------------------------------------------------------------------------------------------------
執行結果:
mode=1
mode=-1

8.3
使用fb_angle_limits畫出四連桿形狀,再利用之前drawlinks畫出限制角度時的四連桿形狀:
-------------------------------------------------------------------------------------------------
r=[4 3 3 5]; td2=10; tdd2=0; theta1=0; theta2=45; linkdrive=0;
mode=1;

% 求出限制角度
[Ang1, Ang2]=fb_angle_limits(r,theta1,linkdrive)

% 將限制角度代入drawlink程式中,畫出限制角度時的四連桿形狀
drawlinks(r,theta1,Ang1,mode,linkdrive);
drawlinks(r,theta1,Ang2,mode,linkdrive);
-------------------------------------------------------------------------------------------------
執行結果:
mode=1
mode=-1
在x軸上的圖,是Ang1=28.9550度的圖;在x軸下的圖,是Ang2=331.0450度的圖。這個四連桿,不論是分支型或閉合型,極限角度都一樣,故兩張圖一樣。
值得注意的是,這個configuration就是從分支型轉換到閉合型那一瞬間configuration。拿Ang1=28.9550度的來看:若此時Q點往QR連線的右半平面移動,則四連桿會變成閉合型;若此時Q點往
QR連線左半平面移動,則四連桿會變成分支型。

8.4
利用for loop將不同theta2時的四連桿形狀畫出。
-------------------------------------------------------------------------------------------------
r=[4 3 3 5]; theta1=0; linkdrive=0;
mode=1;

for k=1:18;

theta2=20*k;
drawlinks(r,theta1,theta2,mode,linkdrive);

end
-------------------------------------------------------------------------------------------------
執行結果:
mode=1
mode=-1
不論mode=1或mode=-1,我們都可以發現在theta2=20/340/360處畫不出來。老師的drawlinks是設計成接收到無法實際存在的configuration時,會顯示出"Combination of links fail at degrees xxx.x"的字樣,告訴使用者該四連桿無法作xxx.x度的輸入。
原本在8.3小題我們只知道兩極限角度,但不知道可以移動的範圍是優弧(在此四連桿中為從
28.9550度順時針繞到331.0450度)還是劣弧(在此四連桿中為從28.9550度逆時針繞回331.0450度),但從8.4小題中,我們就可以判斷出這個四連桿可以移動的範圍是從28.9550度順時針繞到331.0450度。
另外,仔細觀察mode=1和mode=-1的兩張圖,可以發現兩張圖其實根本就是上下顛倒而已。這代表此四連桿有一個特性:若該連桿在x軸以上是分支型,則該連桿在x軸以下就會轉成閉合型,反之亦然。

8.5
先利用8.4小題的程式碼來判斷該連桿到底作怎麼樣的運動:
將8.4小題的程式碼中的theta2改成從極限角度30&330度代換,並畫圖觀察Q點的運動情形

-------------------------------------------------------------------------------------------------
r=[4 3 3 5]; theta1=0; linkdrive=0;
mode=1;

for k=1:11;

theta2=30*k;
drawlinks(r,theta1,theta2,mode,linkdrive);

end
-------------------------------------------------------------------------------------------------
執行結果:
mode=1
-------------------------------------------------------------------------------------------------

看mode=1的情況:
在theta逆時針接近331.0450度時,可看出Q會往左上方移動,故到達極限位置後,Q往左上方移動且P往右下方移動。這告訴我們這個四連桿在x軸上方為分支型,逆時針轉到x軸下方後變成閉合型,在通過331.0450度後又會變回分支型,再回到x軸上方後又變回閉合型,在通過28.9550度後又變回分支型......一直下去!mode=-1的情況就只是上下顛倒,不需要再討論。

所以在繪圖時:當驅動桿逆時針旋轉時,必須將mode設定為1;當驅動桿順時針轉回時,必須將mode設定-1。以上設定適用於起始位置在x軸上方且為分支型的情況,若上下顛倒或是型態對調都會使mode改變對調。

由於老師的drawlinks程式無法把axis鎖定在固定大小,所以我做了一點修改,命名為drawlinksNew:
-------------------------------------------------------------------------------------------------
因原程式碼貼上blog時會變成亂碼,故我以圖檔代替之:


基本上我只是在所有plot前面都加了axis([-5 5 -5 5]),把整張圖鎖在10*10的座標裡面。另外在最後面的axis equal也刪除,因為已經沒有必要。

以下是動畫的程式碼:
-------------------------------------------------------------------------------------------------
r=[4 3 3 5]; theta1=0; linkdrive=0;
mode=1;

axis([-5 5 -5 5]);

% k矩陣的row1:從k(1,1)到k(1,303)是儲存逆時針旋轉的角度值,從k(1,304)到k(1,606)是儲存逆時針旋轉的角度值。
% k矩陣的row2:從k(1,1)到k(1,303)是儲存逆時針旋轉的mode,從k(1,1)到k(1,303)是儲存逆時針旋轉的mode。

k=[linspace(29,331,303) linspace(331,29,303); linspace(1,1,303) linspace(-1,-1,303)];

while 1
for l=1:604;

clf;
theta2=k(1,l);
mode=k(2,l);
drawlinksNew(r,theta1,theta2,mode,linkdrive);
pause(0.01);

end
end
-------------------------------------------------------------------------------------------------
執行結果:由於我的電腦同時執行Matlab跟CamStudio會變慢,所以動畫有點不順,請見諒!


3 則留言:

不留白老人 提到...

作得很好,首先謝謝你指出程式版本的錯誤。請義將依此作修正。
在速度的第一圖中,似乎第四桿端的速度不顯出垂直的情況,是沒有axis equal嗎?還是其他問題。請你查明。

匿名 提到...

真厲害!!你寫的好詳細,

看你連拿兩次一百分就趕快來參觀看看囉。

也歡迎你有空也來我的部落格比較比較,

我是分組討論跟你同組的黃君席。

我的blog

dragon 提到...

你太厲害了!!
真不是蓋的!!
好詳細!!