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比較複雜,你能想出更好的處理方法嗎?