Showing posts with label 自由度. Show all posts
Showing posts with label 自由度. Show all posts

1/26/07

第四章 機構之自由度

在參考書第三章中討論到機構之自由度。如前所言,在二維運動中任何元件均應有三個自由度,即XY方向的移動與Z方向之轉動,亦即有三個自由度。在三維的空間則更多,亦即有XYZ各方向有移動而XYZ軸方向各有轉動,故有六個自由度。實際上,無論二維或三維,任何物件若運動太過自由,實際上也構不成機構,正如一個團體或國家放任每個人都能完全自由的話,就無法成為一個團體或國家一樣。

有些物件在運動過程中因而必須有約束力,這些約束力約會減少物件的自由度,或稱為拘束度。不過一個元件除了當固定桿外,其自由度不能為零,否則就無動產生運動。機構並不僅由一元件組成,通常由許多元件互相一運動結連繫而成。這一連繫就會使元件之運動受到約束,其自由度也會減少。機構之自由度減到為零時,表示這個機構變成靜物,不再有運動現象。這也是屬於一般靜力的範圍了。

一個機構,例如四連桿,由四個連桿元件及四個運動結組成。照前面所言,在二維的機構中,每一連桿應有三個自由度,四個連桿應有十二個自由度。但事實上可能這麼多嗎?讓我們來算它一算。由於成為機構之條件是要有一桿為固定,故要減去三個自由度;四個運動結對連桿而言目的在拘束連桿之運動,若每一個運動結若均為旋轉結,則每接一個結僅能傳遞一個自由度,亦即需減去二個拘束度,因此四個結必須減去八個拘束度。剛剛說,四連桿總共十二個自由度,減去三個再減去八個,僅剩一個自由度。所以四連桿僅能傳遞一個輸入變數。

上述之四連桿有一個自由度,為與一般元件的自由度判別,機構的自由度統稱為可動度,因為它是指向一個機構到底可以不可以動起來。若可動度為零,則屬靜態結構;若為負值則表示為靜不定結構,都是不可動的機構。

計算一個機構的可動度,通常可用古魯伯公式,下節將詳加介紹。


4.1古魯伯公式



古魯伯公式主要是根據下列計算公式演繹而來,可以計算一個機構之可動度M。可動度大於或等於一,才能成為可運動的機構,小於一時則變成結構。就計算的過程而言,一個機構之可動度應為其總自由度扣除總拘束度,其計算法則又稱為古魯伯(Grueber)公式,其規則如下:

  M = 3*(N-1)-(3J-Σf)
   = 3*(N-J-1)+Σf


式中,

  M = 可動度,即系統之自由度
  N = 連桿之總數
  J = 運動結之總數
   = 第i運動結之連結度

程式設計


程式gruebler是針對上式公式設計的一個函數。其主要功能在於先找出結的型式與數目。在本程式中係用利用jointype來達成。jointype是採用陣列的方式,依序安排節的位置與數量,其順序依序為:
  • 1 R型結
  • 2 滑動結
  • 3 複式結
  • 4 球結
  • 5 圓筒結
  • 6 平面結
  • 7 滾筒結
  • 8 凸輪
  • 9 螺旋結 
  • 10 球滑結
  • 11 點觸結

例如:jointype=[3 1],即表示有三個R型結,一個滑動結。另一個輸入參數為nlink,即為連桿之總數。jointype的安排上最大的缺點是若中間沒有該結時,必須留空,或在該位置填以零值。例如:一個R型結及三個球結,則jointype=[1 0 0 4]。

不過比較特別是,在jointype中若包括第四項以上時,這些結均為三維空間的結。故程式會以此作為判斷gruebler公式是計算二維或三維空間之桿結問題。因此,若一個三維空間的結,不含第四項球結以後的各項時,則至少在第四項必須以0表示,例如:jointype=[3 1 0 0],表示一組三維空間之連桿組,但具有三個R型結及一個滑動結。

在程式中,為求得對應於jointype中對應結之各結自由度,則利用code作為對應值,故每次必須選擇對應結之自由度。

程式內容


程式開始時,先決定jointype陣列之長度,除確定其維度外,同時作為計算各結自由度之基礎。利用njoint確定總結數,ff累計Σf之值,最後得到答案。


function [df]=gruebler(nlink,jointype)
%
% [df]=gruebler(nlink,jointype)
% nlink:no. of total links
% jointype:row matrix for number of joints for each type,
% the order of elements is:
% 1 R-joint 2 slider 3 compound joint(sliding & rolling)
% 4 ball 5 cylinder 6 planar 7 cylinder rolling
% 8 cam 9 helix 10 ball & 11 point contact
% Example: df=gruebler(4,[4])
% Author:D.S.Fon Bime,NTU. Date:Jan. 30, 2007
code=[1 1 2 3 2 3 1 2 1 3 5];
n=length(jointype);
dim=3;if n>3, dim=6;end;
ff=0;njoint=0;
for i=1:n,
njoint=njoint+jointype(i);
ff=ff+jointype(i)*code(i);
end;
df=dim*(nlink-njoint-1)+ff;
%-------------------

應用方法


其呼叫方式為:

[df]=gruebler(nlink,jointype)


其中之參數內容如下:

nlink:總桿數。
Jointype:行矩陣,代表屬於表3.1中所列各種型結之數目,其中各元素之內容為:
1 旋轉結(R) 2 滑動結(P) 3 複式結(滑動與轉動) (S) 4 球結(B) 5 圓筒結(C)
6 平面結(PL) 7 圓柱滾動(CR) 8 凸輪接觸(CP) 9 螺旋結(H)
10 球結(滾動與滑動)(BR) 11 點接觸結(SP)。

若以各元素代號表示即為

  Jointtype=[R P S B C PL CR CP H BR SP]

其中各代號之位置為該結之結數。中間沒有該結時,以零填之。例如:

     jointype=[2 0 1 0 1]

表示有兩個旋轉結,一個複式結,一個圓筒結。
例如:jointype=[2 0 1 0 1],表示有兩個旋轉結,一個複式結,一個圓筒結。

範例一


決定一組四連桿之可動度:N=4, R=4

>> df=gruebler(4,[4])
df = 1


範例二


三度空間連桿組具五連桿但有三個旋轉結(R型結)及三個球結。

>> df=gruebler(5,[3 0 0 3])
df = 0


範例三


但是同樣的四連桿若,若為三維,則完全沒有自由度,例如:

>> df=gruebler(4,[4 0 0 0])
df = -2

顯然,例一之平面四連桿僅是三維中之一特例。

gruebler函數之撰寫只是簡單的matlab程式之應用,但其輸入參數中使用的jointype比較複雜,你能想出更好的處理方法嗎?

4.2 機構之元件

機構之元件


機構之元件除前節所述之桿形(linkshape)外,其餘如滑塊、接地結、球結、圓筒結等都是常見的型態。本節就各種型狀再進一步論述。

接地結(ground)


接地結通常可以提供滑塊、圓筒結等在運動時與地接觸之表示法。通常接地結除繪一橫線表示地面外,為表示其不動的狀態,在其橫線下,用許多斜線表示接地。此接地結會將其相對應之值繪出,然後輸出其相對之座標。若僅想取其座標,不事先繪圖,則可以設dd值為負值。此處dd值代表由接地之原點往前與往後延伸之距離。

此函數ground執行時,必須有旋轉點(x0,y0)之資料,以及旋轉之角度theta。此外,尚有參數dd作為以旋轉點往兩側延伸之距離。其使用例將配合其他元件使用。


function [x,y]=ground(x0,y0,dd,theta)
% The ground line
% Inputs:
% x0,y0:the pivot point
% dd:distance on both sides
% theta:inclined angle, deg
% Example: ground(0,0,5,30)
d=abs(dd);d8=d/8;
xm=[-d/2:d/8:d/2];
xu=[xm;-d/16+xm;xm];xu=xu(:);
ym=zeros(size(xm));
yu=[ym;ym-d/8;ym];yu=yu(:);
x1=[-d;xu;d]+x0;y1=[0;yu;0]+y0;
th=-theta*pi/180;
x=x1*cos(th)-y1*sin(th);
y=x1*sin(th)+y1*cos(th);
if dd<0,
line(x,y,'linewidth',3);
axis equal;
end

此程式將配合後面之範例應用。

底座(anchor)


底座anchor函數為配合其他連桿結端點必須固定時,所需顯示之固定座。其外圍之圓弧半徑為rr,中心點(x0,y0)為桿端之連結位置,也是旋轉之迴轉中心。

此程式若直接接地,則會呼叫上述之ground函數,為使其僅傳回座標,參數rr值可設為正值,若要繪圖則設為負值。但rr之正負值並不影響圓弧之半徑。底座需要旋轉時,可以利用theta調整,其單位以度數表示。

function [x,y]=anchor(rr,x0,y0,theta)
% The anchor of a joint
% Inputs:r:outer radius of anchor
% x0,y0:center point
% theta:inclined angle, ang
% Example: anchor(5,0,0,30)
r=abs(rr);
th=0:pi/50:2*pi;r15=r*1.5;
x1=r*cos(th);y1=r*sin(th);
xx=x1/5;yy=y1/5;
th=-theta*pi/180;
[xm,ym]=ground(0,-r15,-r15,0);
x1=[0 xx x1 r15 xm' -r15 x1(50) 0]+x0;
y1=[0 yy y1 -r15 ym' -r15 y1(50) 0]+y0;
x=x1*cos(th)-y1*sin(th);
y=x1*sin(th)+y1*cos(th);
if rr<0,line(x,y);axis equal;end

此程式使用例與後面之範例合併。

滑塊(sldblk)


滑塊是方塊的物件,必須在一個平滑的面上移動。因此必須配合前述之接地結ground使用。但為使程式活用,本函數sldblk並沒有直接呼叫ground,因此必須由外部合併呼叫。其中LL,W分別為方塊之長與寬度,LL同時作為是否立即繪圖之指標,若使用負值,則會同時繪圖,否則僅傳回其外型之座標值。

方塊之中心(x0,y0)為參考點,可由連桿之端點在此連接。若方塊必須旋轉在某一方向,則方塊將以此點為旋轉中心,其旋轉角度為theta。


function [x,y]=sldblk(LL,W,x0,y0,theta)
% circular motion
% Inputs:LL,W:length and width of slider
% x0,y0:center point
% theta:inclined angle, degrees
% Example: sldblk(3,2,0,0,30)
L=abs(LL);th=0:pi/50:2*pi;
xx=W/5*cos(th);yy=W/5*sin(th);
th=-theta*pi/180;
%The coordinates of the blok
x1=[0 xx L/2 L/2 -L/2 -L/2 0 L/2 L/2]+x0;
y1=[0 yy 0 W/2 W/2 -W/2 -W/2 -W/2 0]+y0;
%Rotating the block by an angle th in radians
x=x1*cos(th)-y1*sin(th);
y=x1*sin(th)+y1*cos(th);
if LL<0,line(x,y);axis equal;end

執行例



% demo1.m
clf;
anchor(-0.6,0,0,0);%設底座,rr=-0.6表示要繪出圖形
linkxy([0 0],[2,2],-1);%繪第一桿
linkxy([2 2],[7,-1],-1);%繪第二桿
[x,y]=sldblk(-1.5,1,7,-1,30);%繪滑塊
ground(x(end-2),y(end-2),-2,30);%繪接地結



% demo2.m
clf;
anchor(-0.7,0,0,270);%繪底座一
linkxy([0 0],[-1,3],-1);%繪桿一
linkxy([-1 3],[-4 3],-1);%繪桿二
linkxy([-4 3],[-6 8],-1);%繪桿三
anchor(-0.7,-6,8,180);%繪底座二




滾動結(rolls)


滾動為一圓在另一平面上滾動。圓心則與另一桿相連,而圓周則在一平面上滾動。此平面可能為傾斜面,亦可能為平面,由前面的接地結函數ground決定。但是為符合滾動的原則,圓與地應有一起始點,以表示與接地結有一定的關係,為此可以在圓上畫一半徑,作為起點標示之用。

若地為水平狀態,圓之半徑與地垂直,成為最基本但也最簡單的狀態。若滾動接觸的地面傾斜某一角度時,此時必須連將圓與其一個半徑迴轉同一角度。程式之圓筒半徑為r,其中心點為(x0,y0),同時地面之傾斜角度為theta。

function [x,y]=rolls(r,x0,y0,theta)
% circular motion
% Inputs:r:radius of circle
% x0,y0:center of the circle
% theta:inclined angle, ang
% Example: rolls(5,0,0,30)
th=-pi/2:pi/50:1.5*pi;
xx=r*cos(th);yy=r*sin(th);
xi=xx/5;yi=yy/5;
th=theta*pi/180;
%x1,y1 are coordinates of circle and radius
x1=[0 xx xi 0];y1=[0 yy yi 0];
x=x1*cos(th)-y1*sin(th)+x0;
y=x1*sin(th)+y1*cos(th)+y0;
line(x,y);axis equal

執行例



% demo3.m
clf;
anchor(-0.7,-6,8,180);%上方底座
linkxy([-4 3],[-6 8],-1);%第一連桿
linkxy([0 0],[-4,3],-1);%第二連桿
[x,y]=rolls(2,0,0,30);%滾輪接地成30度
ground(x(2),y(2),-2,30);%接地結,與地成30度


4.3 連桿之種類

就與接頭之搭接情形而言,通常可分為雙接頭、參接頭及肆接頭或多接頭等。雙接頭在前面之連桿已經詳明,並且可以使用Matlab進行繪圖連接。多接頭之連結桿則是一種具有兩個以上之結點在同一個桿上。因此其形狀及外觀也特別與雙接頭桿不同。此節將設法介紹此類的桿型。

下面之程式為quatenary函數,可以輸入同一桿中之連結點位置(x0,y0),dd為各結之直徑,若為負值,表示需要繪圖。各點依序以在二維中最高點依反時針方向選取,因而可以得到正確的方位。

程式內容


此程式與前述之應用可以連結在一起,以獲得不同的機構表示法。不過,這個程式並不是最好的結果,讀者也許可以由此在研發更妥善的程式。此函數理論上可以處理許多點構成的多點桿,其結點之座標由(x0,y0)決定,因此它可以使用行陣表示,但必須一對一相互對應。dd為結孔之直徑。

每一結點之圓孔以dd為直徑,其座標利用linspacce(0,2*pi,60)以60點組成。基本上每一點均需由結之中心點開始,故這些座標必須相連接點出。其次決定外圍及內圍的線座標。


function [x,y]=quatenary(x0,y0,dd)
% Drawing for multiple links
% Inputs:
% x0,y0:coordinates of points,the points
% must be specified in counterclockwise.
% dd:dia. of circle
% Example
% [x,y]=quatenary([0.5 2 3 2],[1 3 2 0.5],-1);

nn=length(x0);d=abs(dd)/2;
th=linspace(0,2*pi,60);
xc=[0 d*cos(th) 0];yc=[0 d*sin(th) 0];
%collect the coordinates of all joint holes
x=[];y=[];
for i=1:nn,
x=[x x0(i)+xc];
y=[y y0(i)+yc];
end
x=[x x0(1)];y=[y y0(1)];
mx=mean(x0);my=mean(y0);r=1.3;
%find the outer coordinates
for i=1:nn,
x=[x (x0(i)-mx)*r+mx];
y=[y (y0(i)-my)*r+my];
end
x=[x (x0(1)-mx)*r+mx];
y=[y (y0(1)-my)*r+my];
if dd<0,patch(x,y,[.5 .5 .5]);axis equal;end


執行例



[x,y]=quatenary([0.5 2 3 2],[1 3 2 0.5],-0.1);




應用例



% demo4_1.m
clf;
quatenary([5 4 9],[6 2 5],-0.5);
anchor(-1,0,0,0);
linkxy([0 0],[2,5],-1);
linkxy([2 5],[5,6],-1);
linkxy([9 5],[8,3],-1);
linkxy([8 3],[10,0],-1);
anchor(-1,4,2,0);
anchor(-1,10,0,0);




Linkplate函數


上述繪製多結桿之函數,可以用另一函數改善,此函數稱為linkplate,其輸入及功能與quaternary函數相同,但外觀較佳。下面為此函數之內容:

程式內容


此程式之設計與前述之quaternary略有不同,它是利用複數型式進行向量之轉換,與前述之links函數之應用法相同。但其輸入項及內容與quaternary函數則完全相同。

function [x,y]=linkplate(x0,y0,dd)
% Drawing for multiple links
% Inputs:
% x0,y0:coordinates of points,the points
% must be specified in counterclockwise.
% dd:dia. of circle
% Example
% [x,y]=linkplate([0.5 2 3 2],[1 3 2 0.5],-1);
nn=length(x0);d=abs(dd)/2;
x0=x0(:);x2=[x0(2:end);x0(1)];
y0=y0(:);y2=[y0(2:end);y0(1)];
V=(x2-x0)+(y2-y0)*i;
D=abs(V);th=angle(V);
t=linspace(pi/2,2.5*pi,20);
Cout=max(d,0.2)*exp(j*t');Cin=Cout/2;
M=[];
for k=1:nn,
P=[Cin;Cout(1:10);D(k)+[Cout(11:20);Cin;Cout(20)]];
xx=real(P);yy=imag(P);tx=th(k);
x=xx*cos(tx)-yy*sin(tx)+x0(k);
y=xx*sin(tx)+yy*cos(tx)+y0(k);
if dd<0, line(x,y);end
end


執行例


前例亦可利用上面之函數執行,其指令及結果如下:

% demo4.m
clf;
linkplate([5 4 9],[6 2 5],-1);
anchor(-1,0,0,0);
linkxy([0 0],[2,5],-1);
linkxy([2 5],[5,6],-1);
linkxy([9 5],[8,3],-1);
linkxy([8 3],[10,0],-1);
anchor(-1,4,2,0);
anchor(-1,10,0,0);




另一執行例


此例包括滑塊、底座及多結桿等之應用,其指令檔及執行結果如下:

% demo5.m
clf;
anchor(-1,0,0,0);
linkxy([0 0],[1 2],-1);
linkxy([1 2],[6 3],-1);
linkplate([3 6 6],[6 3 7],-1);
linkxy([6 3],[8 0],-1);
anchor(-1,8,0,0);
linkxy([6 7],[8,9],-1);
anchor(-1,8,9,180);
linkxy([3 6],[-2,7],-1);
[x,y]=sldblk(-2,1.5,-2,7,-30);
ground(x(end-2),y(end-2),-2,-30);