2007年6月16日 星期六

清大資工張智星教授的網頁

http://neural.cs.nthu.edu.tw/jang/

前兩篇提到的書和powerpoint檔就是這位教授所作。在他的個人網頁裡,不只有上次我po的Matlab簡報檔的連結,還有範例程式碼、習題解答、補充習題、勘誤表等等。我認為是不錯的學習Matlab的輔助教材。大家有空可以看看!

2007年6月13日 星期三

實際見識F1安全科技的發達



這是上個禮拜,F1加拿大站在比賽時所發生的嚴重車禍。Sauber BMW F1 Team的車手Robert Kubica以170mph的時速衝撞水泥護欄,車輛經過多次翻滾及撞擊後幾乎全毀。但駕駛艙卻完好無缺,車手也只有輕微腦震盪及腳踝扭傷,經過全身檢查後,隔天就出院了!



這是1972年,在F1場上發生的嚴重車禍。Ferrari的車手Gilles Villeneuve在這場車禍中不幸喪生。



這是1994年5月1號在義大利Imola賽道上發生的嚴重車禍,Williams Renault的車手Ayrton Senna在這場車禍中不幸喪生。

從1994年Senna的車禍之後,FIA(國際汽車聯盟)就致力於提高F1的安全性,將安全規格逐年提高。在這樣的主張下,發展出了可藉由撞擊時的潰縮與碎裂來吸收強大撞擊力道的碳纖維車身,以及保護車手頸部的HANSS裝置(簡單來說就是F1車手肩膀上的東西和頭盔所形成的一套保護系統)。1994年之後,F1場上也有過幾次嚴重車禍,但歸功於這些發達的安全科技,車手都能全身而退(Senna是最後一位因比賽車禍而喪生的F1車手)。回頭看看Robert Kubica的車禍影片,是不是碎片四處飛,車手的頸部也受到強烈的甩動?要不是碳纖維車身的車鼻和兩側進氣口的潰縮區,以及HANSS裝置,雙雙發生作用,如此強烈的撞擊力道下,車手是幾乎必死無疑的。比較1994年Senna的車禍就可以看得出來,Senna發生車禍時,車子是從側向去撞擊牆壁,車速也比Kubica發生車禍時要慢,但是兩者的結果卻大相逕庭。

這些高科技的安全技術,如今也開始慢慢轉移到市售車上,如潰縮區的概念已經引入眾多車種中。希望在不久的將來,我們平日開的車也能有一樣的安全性能。

Matlab程式應用的powerpoint

最近跟清大的學長聊天,聊到了Matlab。學長說他認識一位資工系的教授,叫做張智星,曾經出過兩本跟Matlab有關的書:「MATLAB 程式設計─入門篇」、「MATLAB程式設計與應用」。其中 「MATLAB程式設計─入門篇」就是劉昶志同學在機動學論壇的文章提到的那本書,而那位清大的學長也將這本書的投影片傳給了我。我稍微看了一下,還滿淺顯易懂,可以配合著教授的「Matlab在工程上的應用」 網路講義看,相信會有更好的學習效果。以下是投影片的連結:
http://homepage.ntu.edu.tw/~b94202029/slide.rar

作業十三

b94202029 物理二 張哲輔
我本週有上課。

1. 試設計一組複式齒輪,使其轉速比為125(請說明思考步驟及結果)。

step 1:決定複式齒輪組的齒輪數

通常兩相接齒輪的轉速比不宜超過10。假設我們使用的齒輪組所有相接齒輪間的轉速比都是10,則使用兩組時,轉速比為10*10=100,尚未超過125;使用三組時,轉速比為10*10*10=1000,超過125,故我們最少必須使用三組齒輪之組合。(也可使用超過三組齒輪之組合,但沒有必要)

step 2:決定齒輪類別

系統參數 全齒 全齒 全齒 栓齒
壓力角(度) 14.5 20 25 20
k值 1 1 1 0.8
N值 31.90 17.10 11.20 13.68
最低齒數 32 18 12 14

若沒有特殊需求,所有類別都可以選用。我們在這裡決定所有的齒輪都用壓力角為20度的全齒。為避免干涉現象,齒數必須在18以上。
注意共軸的大齒輪和小齒輪不一定要使用同樣類型的齒輪,只要相接的齒輪使用同一種類型就好。例如我們可以選用:第一個小齒輪使用a類型、同軸的大齒輪使用b類型;跟前一軸大齒輪相接的小齒輪b類型、同軸的大齒輪c類型……以此類推。

step 3:決定大小齒輪的齒數

我們先決定小齒輪齒數。齒數只要在18以上就不會產生干涉現象,故我們直接選用18齒。由於我們選用三組齒輪之組合,又轉速比為125,故每組齒輪的齒數比值都選5,就可以得到125的轉速比。以這樣的齒數比值,可以算出大齒輪齒數為18*5=90齒。
注意:有時候我們會希望齒數比值是每組齒輪都一樣的,這時候我們就會把轉速比開n次方根(n是齒輪組數),然後決定小齒輪到底要幾齒時大齒輪的齒數會最接近整數。但有時我們也可以接受齒數比值不一樣的情形,這時候我們就會把轉速比拿來做因式分解,再從眾多因數中選擇適當的組合,決定出齒數比值。


故我們得到整組齒輪組的規格為:
齒輪組數 齒輪類型 壓力角 k值 小齒輪齒數 大齒輪齒數
3 全齒 20度 1 18 90

2. 請指出本學期中你自己最感得意的一次作業(請說明其原因,且該作業必須在自己的部落格內)。

我最感到得意的作業是作業十一:http://b94202029mechanisms.blogspot.com/2007/05/blog-post_30.html

之所以會對這個作業感到滿意,有幾個原因:
1.老師出題目的時候偏置量和返程運動型式都沒有規定,於是我就做出了可自由輸入偏置量和去程及返程運動型式的程式。
2.我把本次作業三個小題合併成一個大程式,且可以一次得到三個小題的figure,這是我前幾次作業一直都想學起來的技巧。我原本是想把三小題的figure統統濃縮在一個figure裡面呈現,不過做出來的結果並不是很清楚,為了維持高度的辨識性,我才決定把三小題的figure分開來呈現。
3.我原本以為把偏置量這個quantity引入後,並不會增加太多撰寫上的難度,但事實卻不然。對於有偏置量的凸輪,凸輪轉動角度和凸輪實際位置的數學關係遠比我想像中複雜,我花了大約兩小時,用網路講義的各種程式去畫圖,從圖裡面去找出轉動角度和實際位置的關係,又花了約兩小時,才把跟偏置量有關的程式碼寫完。當時已經是清晨五點,所以我印象特別深刻,也對這個程式特別有感情。
4.雖然我有四個作業100分,但是我選擇了這個95分的作業。老師在回應裡面提到x軸跟y軸不一樣,應該使用axis equal。我在撰寫這個程式時曾想過這個問題,但使用了axis([xmin xmax ymin ymax])就會使axis equal失效,使用了axis equal就會使axis([xmin xmax ymin ymax])失效,這是我很多次作業都碰到的問題,也找不到方法解決。所以我為了不讓凸輪圖形在figure上因[xmin xmax ymin ymax]未規定而上下左右擺動,選擇犧牲了axis equal。這也是我對於這個作業印象深刻的部份。

2007年6月9日 星期六

有關車子的網站

http://classroom.u-car.com.tw/classroom-home.asp
這個網站是和在機動學論壇頻頻出現的Toyota汽車教室合作的網站,兩個網站的內容幾乎一模一樣,不過這個網站在懸吊系統介紹的比較多一點,獨立式和非獨立式都有。裡面有還算清楚完整的汽車構造解說。

http://www.autoth.com/forums/index.php?s=8fbdd4738d439704882e1aad514fb623&
這個網站叫做汽車技術網,是一個論壇,有不少同好在裡面討論各種汽車方面的知識。

http://www.f1technical.net/
這是一個外國論壇,討論F1的科技。和其他討論汽車或F1的論壇不同的是,F1車隊的工程師有些會上這個論壇和大家交流,可以和製造F1賽車的人討論是一件很令人興奮的事!

2007年6月6日 星期三

作業十二

b94202029 物理二 張哲輔
我本週有上課。


徑節Pd (diametral pitch) = 8
齒數N (teeth number) = 30T / 48T
壓力角ψ(pressure angle) = 20o


第一題

(此圖是從老師的講義擷取而得)

要算出接觸線長度,必須先算出兩圓之節圓半徑R1&R2、齒冠a1&a2:
(齒冠的規格有兩種: 。老師程式裡使用的規格是前者,故這邊也沿用此規格。)接觸線長度可由以下公式求得:在計算接觸比之前,必須先算出基周節Pb:接觸比可由以下公式求得:我們也可以用網路講義的contact_ratio.m程式得到接觸線長度與接觸比:
[c_ratio, c_length,ad,pc,pb,r2,r3,ag]=contact_ratio(8,30,48,20)

c_ratio =
1.7005

c_length =

0.6275

ad =
0.1250

pc =
0.3927

pb =
0.3690

r2 =
3.7500

r3 =
6

ag =
10.4850 9.9211 20.4061

6.5532 6.2007 12.7538


第二題
節圓直徑: 基圓直徑:


第三題
(此圖是從老師的講義擷取而得)

若齒輪滿足下列任一不等式則不會發生干涉情形:
將數值帶入後得:
不等式成立,故不會發生干涉現象。

我們也可以用網路講義的isinterf.m程式來分辨會不會有干涉現象(0為沒有,1為有)
[x]=isinterf(20,30,48)
x = 0


第四題

我將老師的draw_gear.m程式稍做修改後,做出第四題要的旋轉動畫。
有三個地方是修改重點:
  1. 修改成兩個齒輪的資料都必須輸入進程式內,以便同時繪出兩個齒輪。
  2. 把做齒輪數據和畫齒輪的那幾行程式碼都修改成兩個齒輪各作一次。
  3. 加入while、rotate和pause,使其變成動畫。
有關程式的解說已經附在裡面。

function draw_gearNew(Dp1,N1,phi1,range1,x01,y01 , Dp2,N2,phi2,range2,x02,y02)
% draw_gearNew(Dp1,N1,phi1,range1,x01,y01,Dp2,N2,phi2,range2,x02,y02)
% To draw a whole gear
% Inputs:
% Dp: Diametrical pitch
% N: no of teeth in a gear
% phi: pressure angle, degrees
% range: the section range to be drawn
% x0,y0: the location of the gear center
% Example draw_gearNew(8,30,20,360,0,0,8,48,20,360,9.75/2,0)

% 做第一個齒輪的數據
[coord1,theta1,rp1,rb1]=tooth(Dp1,N1,phi1);
coords1=[];i=0;
while i coord11=rotate2D(coord1,-i,x01,y01);
coords1=[coords1;coord11];
i=i+theta1;
end

% 做第二個齒輪的數據
[coord2,theta2,rp2,rb2]=tooth(Dp2,N2,phi2);
coords2=[];i=0;
while i coord12=rotate2D(coord2,-i,x02,y02);
coords2=[coords2;coord12];
i=i+theta2;
end

% 將第一個齒輪的繪圖物件通通存成handle,以便待會旋轉。
h11=plot(coords1(:,1),coords1(:,2));hold on;
[coord1]=bushing(rp1/8,x01,y01);
h21=plot(coord1(:,1),coord1(:,2),'b-');
[coord1]=bushing(-rp1,x01,y01);
h31=plot(coord1(:,1),coord1(:,2),'r:');
[coord1]=bushing(-rb1,x01,y01);
h41=plot(coord1(:,1),coord1(:,2),'b:');
axis equal;

% 將第二個齒輪的繪圖物件通通存成handle,以便待會旋轉。
h12=plot(coords2(:,1),coords2(:,2));hold on;
[coord2]=bushing(rp2/8,x02,y02);
h22=plot(coord2(:,1),coord2(:,2),'b-');
[coord2]=bushing(-rp2,x02,y02);
h32=plot(coord2(:,1),coord2(:,2),'r:');
[coord2]=bushing(-rb2,x02,y02);
h42=plot(coord2(:,1),coord2(:,2),'b:');
axis equal;

% 原本的繪圖是tooth對tooth,必須要旋轉成tooth對clearance,這樣咬合才正確
% 把其中一個齒輪做旋轉,旋轉幅度是360/(2*齒數)
rotate(h12,[0 0 1],360/(2*N2),[x02 y02 0]);

% 利用while做出無窮迴圈
while 1
rotate(h11,[0 0 1],1,[x01 y01 0]); % 其中一個齒輪每次轉一度
rotate(h12,[0 0 1],-N1/N2,[x02 y02 0]); % 另一個齒輪每次轉兩齒輪齒數比值的負值
axis equal;
pause(0.05);
end




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [coords,theta,rp,rb]=tooth(Dp,N,phi)
% Example tooth(10,10,20)
nn=10;
d2r=pi/180;
phir=phi*d2r;
rp=N/Dp/2;
pc=pi/Dp;
ra=rp+1/Dp;
rb=rp*cos(phir);
rd=rp-1.25/Dp;
thpb=pc/rp;% angle respect to one pitch
tp=pc/2;
rr=linspace(rb,ra,nn)';
invphi=tan(phir)-phir;
for i=1:nn
beta=acos(rp/rr(i)*cos(phir));
tt(i)=(tp/rp/2+invphi-tan(beta)+beta);
end
coord1=[rr.*cos(tt') rr.*sin(tt')];
coord3=reverse(coord1);
th1=linspace(thpb/2,thpb/2-tt(nn),nn)';
coord0=[cos(th1) sin(th1)]*rd;
th2=linspace(tt(nn),-tt(nn),nn)';
coord2=[cos(th2) sin(th2)]*ra;
coord4=reverse(coord0);
coords=[coord0;coord1;coord2;coord3;coord4];
theta=thpb/d2r;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [B]=reverse(A)
nn=length(A); B=A;
for i=1:nn,B(i,:)=A(nn-i+1,:);end
B=[B(:,1) -B(:,2)];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [coords] = bushing(rr,x0,y0)
d2r=pi/180;
theta=[360:-10:0]*d2r;
r=abs(rr);
rx=r*cos(theta);ry=r*sin(theta);
if rr<0,
rx=rx+x0;
ry=ry+y0;
coords=[rx' ry'];
return;
end;
rx1=rx/2;rx2=-rx1;
ry1=ry/2;ry2=-ry1;
r4=r+r/4;r3=r/3;
bx=[ 0 0 0 -r -r -r4 -r4 r4 r4 -r r r];
by=[r3 -r3 0 0 -r -r -r4 -r4 -r -r -r 0];
coords(:,1)=[bx rx rx1 rx2]'+x0;
coords(:,2)=[by ry ry1 ry2]'+y0;

%%%%%%%%%%%%%%%%%%%%%%%%

function [coords]=rotate2D(coord,theta,x0,y0)
th=theta*pi/180;
c=cos(th);s=sin(th);fact=[c s;-s c];
coords=coord*fact;
coords(:,1)=coords(:,1)+x0;
coords(:,2)=coords(:,2)+y0;





2007年5月30日 星期三

作業十一

我本週有上課。

我將本作業的三個小題合併成一個大程式,因為老師沒有在題目內明講偏置量e為多少,故我的程式設計成可自行輸入偏差量;由於返程的運動形式為自訂,故我的程式設計成去程及返程的運動形式都可以自行輸入。以下為程式碼以及解釋:

-------------------------------------------------------------------------------------------------

function homework9(r0,s,e,L,range,pattern,cw)
% 把本作業的三個小題整合在一個程式內,分別以三個figure呈現出來。
% uses plot_dwell.m
% uses pincam.m

% Inputs:
% cth:angle of cam, degrees
% r0:radius of base circle
% e:offset
% s:stroke
% L:length of pin
% cw:rotation direction of cam(-counterclockwise,+clockwise
% pattern = denote the type of motion used(a 3 element-row matrix)
% 1:uniform 2:parabolic 3:simple harmonic 4: cycloidal
% 5:polynomial motion
% example [4 3]
% range =the degrees the specific motion starts, eg.[90 180 240]

% 我一律設定所有圖表都是每度畫一次,使用者不得自行更改。
ctheta=0:1:359;

% r0必小於e,否則會有凸輪轉到一半從動件跟凸輪失去接觸的情況。
if r0<=e
error('Please try another set of r0 & e, since r0 cannot be smaller than e!')
end

%%%%%%%%%%%%%%%%%%%%%%%%%%% 第一小題 %%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下是將老師的plot_dwell稍做修改後得到:

figure(1); % 第一小題,使用figure1。
clf;
[y,yy,yyy]=dwell(ctheta,range,pattern);
plot(ctheta,y*s,'b-',ctheta,yy*s,'k-',ctheta,yyy*s,'r-'); % 我僅把此行的handle拿掉,其他都跟原程式碼一樣。
legend('Displacement','Velocity','Acceleration',3)
xlabel('Elapsed Angle, degrees')
grid

%%%%%%%%%%%%%%%%%%%%%%%%%%%% 第二小題 %%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下是將老師的pincam修改後得到:

figure(2); % 第二小題,使用figure2。
clf;
th=ctheta*pi/180;
s0=sqrt(r0*r0-e*e);

for i=1:length(ctheta)

t=th(i)*cw;
A=[cos(t) -sin(t);sin(t) cos(t)];
[ym,yy,yyy]=dwell(ctheta(i),range,pattern);
x0=s0+ym*s;
Sx=[0 x0 x0+L;e e e];
X=A\Sx;
x(i)=X(1,2);y(i)=X(2,2);

% 每十度畫一次從動件的延伸和從洞件。
% 若是每一度都畫一次,圖形會密到看不出來。
r= mod(i,10); % 計數器i可以被10整除時就畫一次。
if r == 0
line(X(1,1:2),X(2,1:2)); % 畫從動件的延伸
line(X(1,2:3),X(2,2:3),'linewidth',3,'color','red'); % 畫從動件
end

end

hold on;
plot(0,0,'ro',x,y,'k-') % 畫工作曲線
axis([-(r0+s+L+5) (r0+s+L+5) -(r0+s+L+5) (r0+s+L+5)])

%%%%%%%%%%%%%%%%%%%%%%%%%%%% 第三小題 %%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下是將第二小題的程式再進行修改後所得到:

figure(3); % 第三小題,使用figure3。
clf;

% 分成有沒有偏移量e來處理
if e==0 % 無偏移量e

while 1 % 讓動畫可以無限循環
for i=1:length(ctheta)

clf; % 製作動畫所必須的更新畫面。
% 將所有點繞原點旋轉1度後畫工作曲線。
x = x.*cosd(1) - y.*sind(cw) ;
y = x.*sind(cw) + y.*cosd(1) ;
plot(0,0,'ro',x,y,'k-');
hold on;

% 畫從動件的延伸以及從動件。
plot([x(i) x(i)+L],[0 0],'red','LineWidth',3);
plot([0 x(i)],[0 0],'blue');
axis([-(r0+s+L+5) (r0+s+L+5) -(r0+s+L+5) (r0+s+L+5)]);
pause(0.01);

end
end

else % 有偏移量e

while 1 % 讓動畫可以無限循環
for i=1:length(ctheta)

clf; % 製作動畫所必須的更新畫面。

% 當cw=-1,也就是順時針旋轉時:
% i等於360時x(i+1)會讀到第361項,需修正為第1項。
if i == 360 && cw==-1
i = 0;
end
% 當cw=-1,也就是順時針旋轉時:
% i等於1時x(i-1)會讀到第0項,需修正為第360項。
if i == 1 && cw==1
i = 360;
end
% 雖然在這裡有可能會改到計數器i,但是經過測試後發現:計數器本身並不會因為i被暫時改變而計算錯!
% 例:i=1且cw=1時i被改為360,但for迴圈下次再跑進來的時候i會是2而不是361!

% 以下寫法特殊,另行說明。
R2 = ( (x(i-cw))^2 + (y(i-cw))^2 )^0.5 ;
phi = asind(y(i-cw)/R2) - asind(e/R2) ;

x = x.*cosd(phi) - y.*sind(-phi) ;
y = x.*sind(-phi) + y.*cosd(phi) ;
plot(0,0,'ro',x,y,'k-');
hold on;
% 以上寫法特殊,另行說明。

% 畫從動件的延伸線所切出的包絡圓。
p=linspace(0,2*pi,360)';
pp=e*(sin(p)+j*cos(p));
plot(pp);

% 畫從動件的延伸以及從動件。
plot([x(i-cw) x(i-cw)+L],[e e],'red','LineWidth',3);
plot([x(i-cw) 0],[e e],'blue');
axis([-(r0+s+L+5) (r0+s+L+5) -(r0+s+L+5) (r0+s+L+5)]);
pause(0.01);

end
end

end

-------------------------------------------------------------------------------------------------
homework9(15,5,5,10,[100 200 260],[2 5],-1)

(選擇偏置量=5、返程運動型式=5)




ework9



-------------------------------------------------------------------------------------------------
另行說明部份:
我在那裡用了不太直觀的寫法。假設偏差量是e,然後我想要把凸輪順時針轉動theta角,這時候不能先用pincam把圖畫出來再把圖轉theta角!理由將配合以下兩圖說明:
上面是錯誤的轉法:假設凸輪是上面的橢圓形,從動件為紅線,左圖是一開始的樣子。我想得到凸輪順時針轉了theta角(上圖theta為45度,程式內是1度)後的圖形,然後我就直接把整張凸輪的圖都轉了theta角後,再把從動件放上去,結果就會發生上圖所畫出來的有誤差的情況。

這張是正確的轉法:因為我不能直接轉theta角,所以我必須繼續把圖旋轉,直到錯誤的那張圖的誤差量等於零,總共必須旋轉phi角。

注意!若偏差量e為0,則不會有此問題。這也是為什麼e==0那部份的程式碼較簡單的原因!

phi角與theta角的關係如下:
          R2 = ( (x(i-cw))^2 + (y(i-cw))^2 )^0.5 ;
phi = asind(y(i-cw)/R2) - asind(e/R2) ;

2007年5月23日 星期三

作業十

1.我本週有上課。

2.
由於本題使用相當多數學式,無法在blog上顯示,故我在此po上pdf連結:
http://homepage.ntu.edu.tw/~b94202029/mechanism_HW10_1.pdf
另外我也將內容抓成圖檔貼在下方:

2.
本題也使用相當多數學式,無法在blog上顯示,故我在此po上pdf連結:
http://homepage.ntu.edu.tw/~b94202029/mechanism_HW10_2.pdf
另外我也將內容抓成圖檔貼在下方:

以下是程式碼,內附解釋:
function [ICposition]=instantaneousCenterPosition(theta,r2,r3)
% ICposition代表六點瞬心位置:
% ICposition=[ X12(必為0) X23 X34 X41(設為0) X13 X24(必為0) ; Y12(必為0) Y23 Y34(必為0) Y41(設為inf,正負號與sind(theta)同號) Y13 Y24 ]
% theta請輸入degree

% 不接受360度以外角度,不接受曲桿長大於等於連結桿長。
%(曲桿長等於連結桿長時,一旦theta到達90度,則滑塊就有可能停留在原地不動,但曲桿仍然在旋轉。)
%(曲桿長大於連結長時,一旦theta到達90度,則滑塊會被抬離地面。)
if (theta>=360) || (theta<0)>=r3) || (r2<=0) || (r3<=0) ; error('Not acceptable input(s).'); end; % 先製造出ICposition以便使用。 % ICposition=[ X12(必為0) X23 X34 X41(設為0) X13 X24(必為0) ; Y12(必為0) Y23 Y34(必為0) Y41(設為inf,正負號與sind(theta)同號) Y13 Y24 ] % (14瞬心的位置使用(0,-inf)代表之) ICposition=[ 0 0 0 0 0 0 ; 0 0 0 -inf 0 0 ]; % 以下計算方法的推導過程請見pdf檔 phi = asind( (r2/r3)*sind(theta) ) ; L = r2*cosd(theta) + r3*cosd(phi) ; ICposition(1,2)=r2*cosd(theta); ICposition(2,2)=r2*sind(theta); ICposition(1,3)=L; ICposition(2,4)=-inf; ICposition(1,5)=L; ICposition(2,5)=L*tand(theta); ICposition(2,6)=L*tand(phi); % 畫出滑塊機構。閉合型或分支型的區別在這邊只會造成左右的差異而已。 % 也就是說,分支型的150度等於閉合型的30度,以此類推。 % 故我們只挑其中一種來做就可以。 [values]=drawsldlinks([0 r2 r3 0],0,theta,1,0); % 畫出尋找瞬心13和24的輔助線 line([ICposition(1,1);ICposition(1,6)],[ICposition(2,1);ICposition(2,6)],'color','m','linestyle',':','marker','p'); line([ICposition(1,2);ICposition(1,6)],[ICposition(2,2);ICposition(2,6)],'color','m','linestyle',':','marker','p'); if ICposition(2,5)~=inf & ICposition(2,5)~=-inf line([ICposition(1,2);ICposition(1,5)],[ICposition(2,2);ICposition(2,5)],'color','m','linestyle',':','marker','p'); line([ICposition(1,3);ICposition(1,5)],[ICposition(2,3);ICposition(2,5)],'color','m','linestyle',':','marker','p'); end ---------------------------------------------------------------------------------------------------------- 執行結果:
瞬心位置數據(theta=30/90/150;r2=2;r3=5)
圖形(theta=30;r2=2;r3=5)
圖形(theta=90;r2=2;r3=5)
圖形(theta=150;r2=2;r3=5)
瞬心位置數據(theta=210/270/330;r2=2;r3=5)
圖形(theta=210;r2=2;r3=5)
圖形(theta=270;r2=2;r3=5)
圖形(theta=330;r2=2;r3=5)

2007年5月16日 星期三

作業九

我本週有上課。

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

我的學號:b94202029
曲桿長R=39;
連桿長L=44;
滑塊偏置量e=10;

首先網路講義對於sldlink的解說有誤: r(1)為固定桿長,其長度會變化,故可設為0。 r(4)為偏置量,不是可有可無,當有偏置量時必須輸入。

另外網路講義中sld_angle_limits的程式碼沒有把所有狀況都寫進去:
第二桿為驅動桿的第2種情況沒有寫入程式碼中
應該加入以下程式碼(請插在case 0 中,if和第1個else if 中間)
------------------------------------------------------------------------------------------
elseif r3+r4>=r2 & r4>=r3 % 網路講義中的(2) 此部份是網路的程式碼中遺漏的部份
Qstart=asin((r4-r3)/r2);
Qstop=pi-asin((r4-r3)/r2);
------------------------------------------------------------------------------------------

網路講義介紹drawsldpaths的部份,其呼叫方式、輸入參數與程式內容部份,引數都不一樣。正確的應該是:
drawsldpaths(r6,th6,r,th1,td2,tdd2,sigma,npts,driver,mode)
r6:外加固定桿長度
th6:外加固定桿角度
r:各桿件長度
th1:地桿水平角度
td2:驅動桿角速度
tdd2:驅動桿角加速度
sigma:分支型or閉合型
npts:分割點數目
driver:=0,曲桿
驅動;=1,結合桿驅動;=2,滑塊驅動
mode:
=0,畫簡單位置圖;=1 畫所有圖表;=2畫所有圖表,但用簡單位置圖。
而固定桿就只能在曲桿上,無法挑選。

最後,move_sldpaths程式碼內有很多個"符號,造成無法執行。但現在已經修改過了。
但這個程式也無法做出連續的連桿動作。關於這部份我會在底下討論運動情形時詳述。

------------------------------------------------------------------------------------------------
我們先來檢視這個滑塊機構的極限運動情形。現在設:
r=[0 39 44 10];
theta1=0;

使用sld_angle_limits,找出驅動桿極限運動情形,並用drawsldlimits畫出其位置:
注意:當驅動桿為第二及第三桿時,其Qstart與Qstop分別表示驅動桿之最小及最大角度;但當驅動件為滑塊時,其不再是角度,而是其對應之桿一最小及最大長度,亦即r1min與r1max。
-----------------------------------------------------------------------------------------------
驅動桿為曲桿情形:

r=[0 39 44 10];
theta1=0;
driver=0;
[Qstart, Qstop]=sld_angle_limits(r,theta1,driver)

Qstart =
-60.6679
Qstop =
240.6679

sigma=1;
drawsldlimits(r,theta1,sigma,driver);

sigma=-1;
drawsldlimits(r,theta1,sigma,driver);



驅動桿為結合桿情形:

driver=1;
[Qstart, Qstop]=sld_angle_limits(r,theta1,driver)

Qstart =
-41.2306
Qstop =
221.2306

sigma=1;
drawsldlimits(r,theta1,sigma,driver);

sigma=-1;
drawsldlimits(r,theta1,sigma,driver);




驅動桿為滑塊之情形:

r=[0 39 44 10];
theta1=0;
driver=2;
[r1min, r1max]=sld_angle_limits(r,theta1,driver)

r1min =
-82.3954
r1max =
82.3954

sigma=1;
drawsldlimits(r,theta1,sigma,driver);

sigma=-1;
drawsldlimits(r,theta1,sigma,driver);


-----------------------------------------------------------------------------------------------
由以上觀察可得知:在極限角度下的滑塊桿件的狀態不會跟滑塊桿件是分支型或閉合型有關!其實sld_angle_limits的input本來就沒有sigma,所以只是把極限狀況畫出來的drawsldlimits,在正常的滑塊分析上,可能可以被改寫成不需要輸入sigma。
-----------------------------------------------------------------------------------------------


到目前為止,我們已經知道了在曲桿、結合桿、滑塊為驅動桿時,驅動桿的極限角度(或位置)以及整組桿件的狀態。
接下來我們要分析的是這個桿件如何運動。首先要釐清一點:不管是用曲桿、結合桿、滑塊當作驅動桿,整個桿件組做完一次完整的運動的歷程是不會改變的。但是這個運動歷程會和這個桿件是分支型還是閉合型有關。有關這部份,我的作業八裡面就有提過。所以以下我只挑選用曲桿作為驅動桿,討論分支型與閉合型下的桿件運動。
(此處的運動是指桿件行進的軌跡,不是桿件的速度與加速度。不同的驅動桿和不同的輸入都會造成整個桿件的速度與加速度不同。)

我先討論sigma=1的情形。畫出曲桿在各個角度下時,整個桿件的狀態:
-----------------------------------------------------------------------------------------------
以下有呼叫drawsldlinks程式者,此程式內容有更動:我將axis([-90,90,-30,30])加在axis equal之前一行,以固定整個座標軸的大小。但座標軸隨著桿件而平移是無可避免之事。
------------------------------------------------------------------------------------------------
r=[0 39 44 10];
theta1=0;
driver=0;
sigma=1;

[Qstart, Qstop]=sld_angle_limits(r,theta1,driver)
[values]=drawsldlinks(r,theta1,Qstart,sigma,driver);
pause;
pause(0.05);
clf;

for theta2=(-60):1:240;
[values]=drawsldlinks(r,theta1,theta2,sigma,driver);
pause(0,05);
clf;
end

[values]=drawsldlinks(r,theta1,Qstop,sigma,driver);



------------------------------------------------------------------------------------------------

這是從Qstart開始到Qstop停止的影片。注意到滑塊一開始是往右邊移動,後來就開始往左移動,不斷往左移動直到影片結束。那如果曲桿的的運動是從Qstart開始到Qstop、再從Qstop開始到Qstart、再從Qstart開始到Qstop......一直下去,這樣的情況下整個桿件會怎麼移動?
上一段提到滑塊在曲桿角度接近Qstop時,一直都是往左移動。所以到了Qstop的瞬間,滑塊的速度方向是往左,此時結合桿施加給滑快的力完全沒有平行方向的分量,所以滑塊在水平方向的速度在這一瞬間不會改變,也就是說滑塊在曲桿角度經過Qstop的時候會繼續往左移動。這正代表當整個桿件從Qstop開始回到Qstart的時候,桿件的狀態是sigma=-1而不是sigma=1!!老師的move_sldpaths程式的錯誤就是在這裡。

sigma=-1的情況就不用討論,只是和sigma=1的情況左右相反罷了。

所以我只要把從Qstop開始回到Qstart的運動寫下,再用while使他做無限迴圈,就可以製造出這個連桿的運動動畫。
------------------------------------------------------------------------------------------------
以下有呼叫drawsldlinks程式者,程式有更動,更動內容在上面已經提過
------------------------------------------------------------------------------------------------
r=[0 39 44 10];
theta1=0;
driver=0;

[Qstart, Qstop]=sld_angle_limits(r,theta1,driver)

% 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=[Qstart linspace(-60,240,301) Qstop linspace(240,-60,301) ; linspace(1,1,302) linspace(-1,-1,302)];

while 1
for l=1:604;

clf;
theta2=k(1,l);
sigma=k(2,l);
[values]=drawsldlinks(r,theta1,theta2,sigma,driver);
pause(0.01);

end
end



------------------------------------------------------------------------------------------------
作業八和作業九的最後一題,我都得到「連桿在極限角度時將在閉合與分支之間切換型態」的結論,故我大膽推測:可能所有的四連桿都有這樣的性質!!

另外,可用drawsldpaths程式,輸出速度、加速度、角速度、角加速度隨角度變化圖,另外還可附上桿件運動路徑。由於運動路徑已經可以很清楚的從上面的影片看出,所以我就只把速度、加速度、角速度、角加速度隨角度變化圖附上。
------------------------------------------------------------------------------------------------
設角速度=180/pi,角加速度=0,npts=50。

driver=0,sigma=1:
drawsldpaths(0,0,[0 39 44 10],0,180/pi,0,1,50,0,2);

driver=0,sigma=-1:
drawsldpaths(0,0,[0 39 44 10],0,180/pi,0,-1,50,0,2);

driver=1,sigma=1:
drawsldpaths(0,0,[0 39 44 10],0,180/pi,0,1,50,1,2);

driver=1,sigma=-1:
drawsldpaths(0,0,[0 39 44 10],0,180/pi,0,-1,50,1,2);

driver=2,sigma=1:
drawsldpaths(0,0,[0 39 44 10],0,180/pi,0,1,50,2,2);

driver=2,sigma=-1:
drawsldpaths(0,0,[0 39 44 10],0,180/pi,0,-1,50,2,2);

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會變慢,所以動畫有點不順,請見諒!