2007年4月29日 星期日

汽車懸吊系統 - 獨立懸吊與非獨立懸吊

資料來源http://www.u-car.com.tw/

獨立懸吊系統

獨立懸吊系統是左、右輪可以獨立運動的懸吊型式。常見的獨立懸吊系統有雙A臂式、麥花臣支柱式、多連桿式、拖曳臂式、半拖曳臂式。

雙A臂式

Double-Wishbone Type英文直譯為雙叉骨式或雙雞胸骨式,依構造的形狀又稱為雙A臂式。採用雙A臂式獨立懸吊系統的車輛總是給人有高級和性能化的感覺。雙A臂式懸吊因使 用目的不同而有多樣化的結構型式,上、下控制臂呈A型、V型或▽型。雙A臂式懸吊可以設計成當車輪彈跳或車身傾斜時,左右車輪間的輪距不變或是車輪的傾角 不變,一般採用雙A臂式懸吊的車型則是取其中間;當車輪彈跳或車身傾斜時,輪距的變化和傾角變化都會比其他的懸吊方式小;因為避震器不會被彎曲使避震器的 磨擦阻力小;連桿可以全部裝置在副車架上,以阻隔震動和噪音;因此採用雙A臂式懸吊容易使汽車擁有突出的轉向性能和乘坐舒適性,例如Honda許多車系的 前、後懸吊均是採用雙A臂式獨立懸吊系統。


麥花臣支柱式

麥花臣支柱式懸吊是演變自雙A臂式懸吊的一種懸吊型式。它將雙A臂式懸吊的上支臂和轉向節與避震器結合在一起,並將彈簧安置在避震器的上段,避震器的上端 則與車體結合。麥花臣支柱式懸吊與雙A臂式懸吊使用相同的下支臂。由於麥花臣支柱式以避震器做為車輪轉動時的中心軸,而與荷重的軸線互不重疊,使避震器在 伸縮時造成彎矩,而產生磨擦阻力。使用在後軸的麥花臣支柱式懸吊會再加上半徑桿以保持前後方向的剛性。


多連桿式

多連桿式懸吊是一種衍生自雙A臂式懸吊的懸吊型式,此構型看起來與雙A臂式懸吊極為相似而不易辨別,因此辨認此型懸吊時多以汽車製造廠所公佈的為準;例如 Lexus 430的後懸吊下支臂及看似多連桿式,但Toyota宣佈其為雙A臂式懸吊。多連桿式懸吊的各連桿以不同的長度、角度做連結,以找出最適合的幾何變化。近 年來由於對於對於乘坐舒適性和操控性的要求越來越高,因而汽車製造廠紛紛投入從事多連桿式懸吊的研究。



拖曳臂式

托曳臂的樞軸以與車身中心線成直角的關係裝置在懸吊架,是一種專門使用在後輪的懸吊系統。由於托曳臂的樞軸與車身中心線成直角,使托曳臂和車輪與車身中心 線成平行狀態,車輪的行程與地面成垂直。托曳臂式懸吊有傾角變化為0的優點,並使避震器不會彎曲,乘坐舒適性及空間利用率佳。在轉向時托曳臂會造成車輪角 度呈前展狀態,而不利於操控的穩定性。



半拖曳臂式

半托曳臂式懸吊的托曳臂以與車身中心線成一斜角關係的方式裝置在懸吊架。由於車輪的行程劃出較大的圓弧,半托曳臂式懸吊在轉向時,車輪的傾角和輪距變化較 托曳臂式小,使車輛在轉向時的穩定性極佳。因此半托曳臂式懸吊為多款高級房車和高性能車型採用。例如第一代Lexus LS400車型的後軸即採用半托曳臂式懸吊。



獨立懸吊的優點

1.懸吊系統重量較輕,車輪的貼地性良好,乘坐舒適性佳,操控的穩定性良好。
2.車輪角度變化量的自由度大,有利於改善操控的穩定性。
3.懸吊構件之間的自由度是防震的方法,也有利於防止噪音發生。



獨立懸吊的缺點

1.零件數量多,零件的精密度要求高,導致成本偏高。
2.因連桿的自由度大,有不利於輪胎磨耗的可能。
3.需要較大的裝置空間。
4.懸吊系統的特性必須做仔細的調整。






非獨立懸吊系統


非獨立懸吊系統是以一支車軸(或結構件)連結左右二輪的懸吊方式,因懸吊結構的不同,以及與車身連結方式的不同,使非獨立懸吊系統有多種型式。常見的非獨立懸吊系統有平行片狀彈簧式’ 、扭力樑車軸、扭力樑式三種。


平行片狀彈簧式

平行片狀彈簧式是用二組平行安裝的片狀彈簧支撐車軸,片狀彈簧當做避震裝置的彈簧,也做為車軸的定位之用。由於這種懸吊方式的構造非常的簡單,使製造成本 減少,因片狀彈簧的強度高而有較高的可靠度,以及可以降低車身底板的高度。使用在車身重量變化大的汽車上,可以在車身高度降低時還不容易改變車輪的角度, 使操控的感覺保持一致,因而保持不變的乘坐舒適性。市面上強調乘載量的商用車型,其後懸吊多採用平行片狀彈簧式。


扭力樑車軸式
扭力樑車軸式主要使用在前置引擎前輪驅動(FF)的車。有一連結左右輪的樑,在樑的二端有用來做為前後方向定位的拖曳臂,整個懸吊系統以拖曳臂的前端與車 身連結,在樑的上方有用來做為橫向定位的連桿。在車身傾斜時因扭力樑車軸的扭曲,使車輪的傾角會有變化。由於扭力樑車軸式的構造簡單,以及佔用車底的空間 較小,相對的車室空間就可以加大,因此大多使用在小型車;例如使用在Toyota Tercel車型的後懸吊。


扭力樑式

※Toyota Wish的後軸懸吊,便是扭力樑式非獨立懸吊系統。

扭力樑式在左右拖曳臂的中間設置扭力樑,使懸吊的外形類似H型,懸吊系統以拖曳臂的前端與車身連結。因左右拖曳臂的剛性大,所以不需要裝設橫向連桿。在車 身傾斜時因扭力樑車軸的扭曲,會使車輪的傾角發生變化。歐洲小型掀背車之後懸吊,多採用扭力樑式設計。而Toyota現行的ETA Beam系統中,加入了可控制方向的襯套(Toe-Control Bushing),使懸吊在車身傾斜時有較佳的指向性。目前ETA Beam被使用在Toyota With等國產車型。


非獨立懸吊系統的優點
1.左右輪在彈跳時會相互牽連,輪胎角度的變化量小使輪胎的磨耗小。
2.在車身高度降低時還不容易改變車輪的角度,使操控的感覺保持一致。
3.構造簡單,製造成本低,容易維修。
4.佔用的空間較小,可降低車底板的高度。


非獨立懸吊系統的缺點
1.左右輪在彈跳時,會相互牽連,而降低乘坐的舒適性及操控的安定性。
2.因構造簡單使設計的自由度小,操控的安定性較差。

一本供初學者學習Matlab的書

在這裡推薦一本供初學者學習Matlab的書給大家:


書名:Matlab 7 在工程上的應用
作者:William J. Palm III
譯者:王晉中
出版社:McGraw-Hill

這本書講的非常淺顯易懂,而且完全從頭教起,第一次使用Matlab的人只要依照他的指示,一樣可可以輕鬆上手。更重要的是,每一章節後面都有模擬實際工程問題的習題,會讓讀者一一去檢視自己有沒有學會這個章節的各種指令與功能的使用方法與時機。總而言之,我認為這是一本供初學者從基本觀念開始打起的好書。不過如果是想要知道或是查詢進階一點的功能與指令的用法的話,由於這本書比較偏向教科書而不是工具書,故比較不適合。

對這本書有興趣的同學,可以和我借,但因為我常常需要用到這本書,所以可能只能在課堂上出借。

我常用的基本matlab指令

由於我自己常常記不起來常用指令的功用和格式,所以我就整理了幾個常用的指令,要使用的時候就可以直接剪下貼上使用。以後有學到新的常用指令也會隨時更新。

  1. ctrl+c:停
  2. A(2,3):A矩陣第2列(上往下數第2個)第3行(左往右數第3個)
  3. (a:b):從a到b
  4. a=a(:):把matrix排成column vector
  5. ...:換下一行
  6. hold on:把figure留住不被plot洗掉
  7. line:把新圖加在舊圖上
  8. line([x1 x1';x2 x2';.....;xn xn'],[y1 y1';y2 y2';......;yn yn']):有prime跟沒prime各一條線
  9. myLine=line(x,y,z,'color','顏色代碼','linestyle','線形狀代碼','linewidth','線寬度')
  10. set(myLine,'color','b','linestyle','-','linewidth','3')
  11. linspace(initial value,final value,# of points):切割等分
  12. xlabel:在x軸加註解
  13. ylabel:在y軸加註解
  14. axis equal:座標軸等比例
  15. axis off:座標軸拿掉
  16. axis([xmin xmax ymin ymax]):訂座標軸範圍
  17. grid on:加上座標格線
  18. colordef white(or balck or none):換底色
  19. [x,y] = pol2cart(theta,rho) 或 [x,y,z] = pol2cart(theta,rho,z):柱座標轉直角座標
  20. [theta, rho]=cart2pol(x,y):直角座標轉極座標
  21. clf:把figure淨空
  22. zbar=conj(z):共軛複數

2007年4月25日 星期三

作業七

我本週有上課。

1.
角加速度alpha(t)=alpha (rad/s^2)
角速度omega(t)=omega(0)+alpha*t (rad/s)
角度theta(t)=theta(0)+omega(0)*t+(1/2)*alpha*t^2 (rad)
桿長rho=[19 24 14] (cm) (b94202029,9+10=19)

由上列方程式可知當t=[1 2 3 4 5]秒時:
tdd=[ [0 0.1 0.2] [0 0.1 0.2] [0 0.1 0.2] [0 0.1 0.2] [0 0.1 0.2] ]
td=[ [0.2 0.6 0.5] [0.2 0.7 0.7] [0.2 0.8 0.9] [0.2 0.9 1.1] [0.2 1.0 1.3] ]
theta=[ [0.2 0.55 0.4] [0.4 1.2 1] [0.6 1.95 1.8] [0.8 2.8 2.8] [1.0 3.75 4] ] * (180/pi)
(warning:程式要求theta為角度、td與tdd為弳度量)

輸入至dyad程式後可得:vec(1,1)為端桿頂端位置向量的長度,vec(2,1)為端桿頂端位置向量的角度。由位置向量的長度角度可決定端桿頂端的位置。

以下為程式碼:
-------------------------------------------------------------------------------------------------
% 為製作包含從t=1到t=5的資料的tdd、td、theta矩陣,必須製造暫時的矩陣
rho=[19 24 14];
alpha=[0, 0.1, 0.2];
omega=[0.2, 0.5, 0.3];
t=[1; 2; 3; 4; 5];
x=[1; 1; 1; 1; 1];

% 利用column*row可以變成大矩陣的性質,做出包含從t=1到t=5的資料的tdd、td、theta矩陣
tdd=[alpha;alpha;alpha;alpha;alpha];
td=x*omega+t*alpha;
theta=t*omega+0.5*(t.*t)*alpha;

% theta必須要用角度表示
theta=theta*(180/pi);

% 執行dyad,找出各時間的vec(1,1)和vec(2,1)
[vecAt1sec,dyadataAt1sec]=dyad(rho,theta(1,:),td(1,:),tdd(1,:))
[vecAt2sec,dyadataAt2sec]=dyad(rho,theta(2,:),td(2,:),tdd(2,:))
[vecAt3sec,dyadataAt3sec]=dyad(rho,theta(3,:),td(3,:),tdd(3,:))
[vecAt4sec,dyadataAt4sec]=dyad(rho,theta(4,:),td(4,:),tdd(4,:))
[vecAt5sec,dyadataAt5sec]=dyad(rho,theta(5,:),td(5,:),tdd(5,:))
-------------------------------------------------------------------------------------------------
執行結果:

vecAt1sec =

56.3521 25.0016 13.7512
22.7270 116.1214 -174.1359


dyadataAt1sec =

18.6213 + 3.7747i -0.7549 + 3.7243i -0.7449 - 0.1510i
20.4606 +12.5445i -7.5267 +12.2764i -8.6203 - 2.4700i
12.8949 + 5.4519i -2.7259 + 6.4474i -4.3141 + 1.2160i


vecAt2sec =

53.5358 29.4255 19.7579
50.9038 149.6174 -132.1570


dyadataAt2sec =

17.5002 + 7.3989i -1.4798 + 3.5000i -0.7000 - 0.2960i
8.6966 +22.3689i -15.6583 + 6.0876i -6.4982 -10.0911i
7.5642 +11.7806i -8.2464 + 5.2950i -6.0626 - 4.2596i


vecAt3sec =

46.7970 32.9682 27.3973
85.5681 -168.0365 -84.3886


dyadataAt3sec =

15.6814 +10.7282i -2.1456 + 3.1363i -0.6273 - 0.4291i
-8.8843 +22.2950i -17.8360 - 7.1075i 3.4565 -15.1573i
-3.1808 +13.6339i -12.2705 - 2.8627i -0.1503 -11.6796i


vecAt4sec =

34.6999 35.5868 36.5417
130.5678 -115.1438 -28.8492


dyadataAt4sec =

13.2374 +13.6298i -2.7260 + 2.6475i -0.5295 - 0.5452i
-22.6133 + 8.0397i -7.2357 -20.3520i 17.5128 - 8.7735i
-13.1911 + 4.6898i -5.1588 -14.5102i 15.0233 - 8.3129i


vecAt5sec =

20.3585 38.2439 46.9169
-155.8638 -50.5629 35.4094


dyadataAt5sec =

10.2657 +15.9879i -3.1976 + 2.0531i -0.4106 - 0.6395i
-19.6934 -13.7175i 13.7175 -19.6934i 21.0652 +11.7481i
-9.1510 -10.5952i 13.7738 -11.8963i 17.5843 +16.0757i
-------------------------------------------------------------------------------------------------
在原程式碼後面再執行dyad_draw程式,以得到各時刻桿件圖形:

dyad_draw(rho,theta(1,:),td(1,:),tdd(1,:))

dyad_draw(rho,theta(2,:),td(2,:),tdd(2,:))

dyad_draw(rho,theta(3,:),td(3,:),tdd(3,:))

dyad_draw(rho,theta(4,:),td(4,:),tdd(4,:))

dyad_draw(rho,theta(5,:),td(5,:),tdd(5,:))
------------------------------------------------------------------------------------------------
2.
以下為程式碼:

% 角加速度alpha(t)=alpha (rad/s^2)
% 角速度omega(t)=omega(0)+alpha*t (rad/s)
% 桿長r1=19;r2=24;r3=14; (cm) (b94202029,9+10=19)
% 速度v(t)=r*omega(t)
% 加速度a(t)=( r*(alpha(t))^2 + (r*omega(t)^2)^2 )^0.5
% 以上所有物理量都是在該桿的joint上所看到的
% 若站在地面看整個桿件的運動,則:(該桿頂端的某物理量)=(sigma)(該桿之前所有joint的物理量)

% 將0~5秒劃分成100等分
t=0:0.05:5;
% 角速度與角加速度
alpha1=0*t;
alpha2=0.1*t;
alpha3=0.2*t;
omega1=0.2+0*t;
omega2=0.5+0.1*t;
omega3=0.3+0.2*t;
% 桿長
r1=19;r2=24;r3=14;


% 第二旋轉結的速度加速度
v2=r1.*omega1;
a2=( r1.*(alpha1).^2 + (r1.*omega1.^2).^2 ).^0.5;
% 第三旋轉結的速度加速度
v3=v2+r2.*omega2;
a3=a2+( r2.*(alpha2).^2 + (r2.*omega2.^2).^2 ).^0.5;
% 端桿頂端的速度加速度
v4=v3+r3.*omega3;
a4=a1+( r3.*(alpha3).^2 + (r3.*omega3.^2).^2 ).^0.5;

% 繪圖
line(t,v2,'color','k'); % v2為黑線
line(t,a2,'color','B'); % a2為藍線
line(t,v3,'color','C'); % v3為藍綠線
line(t,a3,'color','G'); % a3為綠線
line(t,v4,'color','M'); % v4為紫紅線
line(t,a4,'color','R'); % a4為紅線

% 標註
xlabel('time(sec)');
ylabel('velocity(cm/sec) or acceleration(cm/sec^2)');
-------------------------------------------------------------------------------------------------
3.
以下為程式碼:


function animationOfDyad

% alpha=[0, 0.1, 0.2];
% omega=[0.2, 0.5, 0.3];

rho=[19 24 14];

% 將0~5秒劃分成100等分
for t=0:0.05:5

% 設定角加速度、角速度、角度函數
tdd=[0, 0.1, 0.2];
td=[0.2, 0.5, 0.3]+[0*t, 0.1*t, 0.2*t];
theta=[0.2*t, 0.5*t, 0.3*t]+0.5*[0*(t^2), 0.1*(t^2), 0.2*(t^2)];
% theta必須要用角度表示
theta=theta*(180/pi);

% 繪圖
dyad_draw(rho,theta,td,tdd);
pause(0.05);

end



-------------------------------------------------------------------------------------------------
此題之所以能在短短幾行內就結束,是因為老師的dyad_draw檔案裡面用了一個叫做clf的指令。clf可以將figure上的所有圖案全部清除,故每次執行dyad_draw的時候,前一瞬間的圖案就被抹除,然後被新圖案取代。這樣一來,只要隔一小段時間就執行一次dyad_draw,就可以達到動畫效果。

作業六

我有上本週(十二日)的課。

6.1某一平面組合機構如下圖,其中包括兩滑塊元件一與地固定,另一分於固定於兩桿。青色者則為滑槽。試
  • 標出桿號及結數,並計算共計有多少連桿及結數。
  • 利用古魯伯公式,計算此機構之可動度,請列出其計算方法。
(1)在此例中總桿數為12,如圖中所標之桿序,注意滑塊也算一桿(8號桿)。

(2)機構中共有R3、R4、R5、R7、R9五處共結,分別是:

 R3為(3-1)=2結,即桿2、4、5。


 R4為(3-1)=2結,即桿3、4、6。


 R5為(3-1)=2結,即桿5、7、9。


 R7為(3-1)=2結,即桿6、10、11。


 R9為(3-1)=2結,即桿1、11、12。


 另外,桿8與桿1之間有一滑塊,算稜柱結,連結度為1。


 (或是直接把R6+P3看成複式結中的滑塊結,連結度為2,得到的結論一樣)


 (P1+R2也合起來看成一個槽梢結,連結度為2,最後結論跟分開看還是一樣)


 (P2+R8也可以用以上方法合起來看,連結度亦為2)

(3)由上述可知:總結點數J=4(正常結)+2*5(五個共結)+1(P3(就是滑塊)的稜柱結)+1(P1稜柱結)+1(P2稜柱結)

       =4(正常結)+2*5(五個共結)+2(滑塊結)+2(左側槽梢結)
+2(右側槽梢結,因有兩桿連接故乘2)-3(算滑塊結與槽梢結時重複計算了三個旋轉結)

       =17

(4)套入公式計算:N=12;J=17;(sigma)fi=17

        M=3(N-J-1)+
(sigma)fi=-1(靜不定結構)



  • 請利用function[df]=gruebler()函數計算其對應之可動度。
gruebler(12,[14 3])=-1(靜不定結構)

12:總桿數,[14 3]:14個旋轉結、3個滑塊結

  • 討論此機構中滑塊及滑槽對可動度之影響。
滑塊換成旋轉結=>少8號桿(M少3),少P3棱柱結(M多2)=>M少1

左側P1+R2換成旋轉結=>少P1棱柱結(M多2),多一桿(R3與此旋轉結中間的桿,若照原本的機構看,此部份算在2號桿內)(M多3)=>M多5


右側P2+R8換成旋轉結=>少P2棱柱結(M多2),桿序多1(M少2)=>M不變


由以上可知,把滑塊與滑槽統統換成旋轉結M就能多4而變成+1,從靜不定結構轉成可動結構(單項輸入機構)。




6.2 下面為一個立體機構,分別由兩個旋轉結,一個筒結及兩個球結組成。試說明:
  • 各結之自由度如何?
  R1、R2:旋轉結,自由度為1

  S1、S2、S3:球結,自由度為3

  C:圓柱結,自由度為2




  • 利用古魯伯公式如何計算整個機構之自由度,可以動嗎?
總桿數N=7,運動結總數J=6,(sigma)fi=3*3(三個球結)+2*1(一個筒結)+1*2(兩個旋轉結)=13
M=6(N-J-1)+(sigma)fi=13(為可動結構、多項輸入機構)

  • 請利用function[df]=gruebler()函數計算其對應之可動度,並相互印證。
gruebler(7,[2 0 0 3 1])=13(可動結構)

7:總桿數,[2 0 0 3 1]:2個旋轉結、3個球結、1個筒結

  • 這裡有所謂楕性自由度嗎?其對整個機構之影響如何?
有兩個:
(1)S1與S2中間的4號桿可以自轉
(2)S3與C中間的7號桿可以自轉
故總共須扣掉兩個自由度,正確自由度應為11。
此例中,惰性自由度的出現並不會對整個機構造成影響,機構仍為可動機構。

ruebler(7,[2 0 0 3 1])=13
(可動結構)

7:總桿數,[2 0 0 3 1]:2個旋轉結、3個球結、1個筒結



6.3
  • 何謂葛拉索機構及非葛拉索機構?
葛拉索利用s+l<p+q(見圖1.40)這個不等式,區分了兩種四連桿的基本型式。此處s是四連桿的最短桿,l是四連桿的最長桿,p和q是四連桿的其他兩桿。遵守這個不等式的四連桿稱為葛拉索第一類型連桿(Grashof type 1 linkage,又稱葛拉索型連桿),有兩個運動結可以做完整的旋轉,另外兩個運動結則在動作極限之間做振盪,兩個可以做完整旋轉的運動結必在最短桿的兩端。不遵守這個不等式的四連桿稱為葛拉索第二類型連桿(Grashof type 2 linkage,又稱非葛拉索型連桿),四個運動結皆無法做完整的旋轉,只能在動作極限之間做振盪。
葛拉索第一類型連桿的行為取決於基桿與可作完整旋轉的運動結之間的相對位置。以下是三個分辨葛拉索第一類型連桿行為的附加規則:
  1. 若最短桿與基桿相連,則此四連桿為曲柄搖桿(crank-rocker)機構(見圖1.41)。因基桿與最短桿之間的運動結可以做完整旋轉,故最短桿為曲柄(crank),與基桿連接的另一側桿則在動作極限之間做振盪,為搖桿(rocker)。
  2. 若最短桿就是基桿,則基桿上的兩個運動結皆可做完整旋轉,故兩隻與基桿連接的側桿件皆為曲柄,為雙曲柄(double-crank,又稱drag-link)機構(見圖1.42)。此時輸入桿若為等轉速,則輸出雖然與輸入同向,但其速率會隨角位移而變化。
  3. 若最短桿與基桿不相連,則基桿上的兩個運動結皆無法做完整旋轉,故兩隻與基桿連接的側桿件皆為搖桿,為第一類型雙搖桿(type 1 double-rocker)機構(見圖1.43)此時耦桿(coupler)可以「打滾」,也就是做相對於基桿的完整旋轉。
葛拉索第二類型連桿的行為只有一種:不論基桿為何,四連桿皆為雙搖桿機構,此機構稱為第二類型雙搖桿(type 2 double-rocker)機構。它與第一類型雙搖桿機構的不同在於:葛拉索第二類型連桿的藕桿不能「打滾」。

另外有一種特別的四連桿,發生在
s+l=p+q時,此種四連桿稱為葛拉索中立連桿(Grashof neutral linkage)。這種連桿可以達到「躺平」的狀態,也就是四根桿件全部在同一直線上。這種連桿的特性是:給定一驅動桿角度可得到兩種狀態(躺平時除外)。而從躺平狀態離開時到任何一特定驅動桿角度時,此四連桿可以選擇兩種狀態的任何一種。


  • 假設有三組四連桿,設第一桿為固定桿,各桿長度分別如下:
  1. 第一組:桿1-桿4分別為7,4,6,5cm
  2. 第二組:桿1-桿4分別為8,3.6,5.1,4.1cm
  3. 第三組:桿1-桿4分別為5.4,3.1,6.6,4.7cm
  • 試問各組應屬何種機構?其迴轉情況會如何?
第一組:s=4;l=7(基桿);p=5;q=6;因s+l=p+q,故此四連桿為葛拉索中立連桿。此連桿會做不 可預知的運動(同一驅動桿角度可得兩種狀態),最短桿可以完整旋轉。

第二組:s=3.6;l=8(基桿);p=5.1;q=4.1;因s+l>p+q,故此四連桿為非葛拉索型連桿。此四連 桿為雙搖桿機構,兩側連桿接在動作極限之間做震盪,無法旋轉。

第三組:s=3.1;l=6.6;p=5.4(基桿);q=4.7;因s+l<p+q,故此四連桿為葛拉索型連桿。又因最 短桿與基桿相連,故此四連桿為曲柄搖桿機構。最短桿為曲柄,可以完整旋轉;與 基桿連接的另一側桿則為搖桿,會在動作極限之間做震盪。
  • 試用grashof()函數檢驗上述三組的連桿組合。
答案正確,程式執行結果如下:
  • 上述三組連桿若要成為葛拉索機構,則應如何改善?
(以下假設基桿不可更換)

第一組:一是增長p或q,二是縮短s或l。兩種方法皆可使原四連桿變成
曲柄搖桿機構
第二組:
一是增長p或q,二是縮短s或l,兩種方法都必須做到使s+l<p+q。兩種方法皆可使原四連桿變成曲柄搖桿機構
第三組:原本就是葛拉索機構中的
曲柄搖桿機構。

(若想要變成雙曲柄或第一類型雙搖桿結構,則除了改變桿件長度外,基桿也要換成別支)

2007年4月13日 星期五

有關作業四

先前沒有把結果執行影片放上,現在已放上。惟考慮作業四繳交時間已過,故不再修改程式內容或解釋。不好意思!

作業五(b94202029物理二張哲輔)

-------------------------------------------------------------------------------------------------
作業五
1.1~1.3:

程式body(畫手的資料已經包含在內)
-------------------------------------------------------------------------------------------------

function body(L1,L2,L3,theta1,theta2,theta3)
% 手臂長L1公分、手肘長L2公分、手掌長L3公分、角度算法詳見機動學作業網頁上的圖示

% 繪圖用的角度
p0=linspace(0.5*pi,2.5*pi,13);
p1=linspace(0.5*pi,1.5*pi,7);
p2=linspace(1.5*pi,2.5*pi,7);
p3=linspace(1.5*pi,1.75*pi,10);
p4=linspace(1.75*pi,2.75*pi,7);

% 我的肩膀寬10公分、手肘寬7公分、手腕厚4公分、手指粗2公分、手臂長30公分、手肘長24公分、手掌長19公分,本程式可自行輸入手長度。
% D1=10;
% D2=7;
% D3=4;
% D4=2;
% L1=30;
% L2=24;
% L3=19;

% 假設肩膀寬10公分、手肘寬7公分、手腕厚4公分、手指粗2公分
D1=10;
D2=7;
D3=4;
D4=2;

% 手臂形狀
arm1=[(D1/4)*cos(p0) 0 (D1/2)*cos(p1) L1 L1+(D2/2)*cos(p2) L1 L1+(D2/4)*cos(p0) L1 0 0 ;...
(D1/4)*sin(p0) (D1/2) (D1/2)*sin(p1) (-D2/2) (D2/2)*sin(p2) (D2/4) (D2/4)*sin(p0) (D2/2) (D1/2) (D1/4)];

% 手肘形狀
arm2=[ 0 (D2/2)*cos(p1) L2 L2+(D3/2)*cos(p2) L2 0 ;...
(D2/2) (D2/2)*sin(p1) (-D3/2) (D3/2)*sin(p2) (D3/2) (D2/2)];

% 手掌形狀(含上彎的手指)
palm=[L3/2 L3/2+(D4/2)*cos(p2) L3/2 L3/2+(D4/4)*cos(p0) L3/2 0 0 (D3/4)*cos(p0) 0 (D3/2)*cos(p1) L3/2 ...
L3/2+(D4/2)*cos(p3) L3/2+(D4/2)*cosd(315)+(L3/2)*cosd(45) L3/2+(L3/2)*cosd(45)+(D4/2)*cos(p4) L3/2 ;...
(-D4/2) (D4/2)*sin(p2) (D4/4) (D4/4)*sin(p0) (D4/2) (D3/2) (D3/4) (D3/4)*sin(p0) (D3/2) (D3/2)*sin(p1) (-D4/2) ...
(D4/2)*sin(p3) (D4/2)*sind(315)+(L3/2)*sind(45) (L3/2)*sind(45)+(D4/2)*sin(p4) D4/2];

% 把相對夾角換成絕對角度
phi1=-theta1;
phi2=phi1+(theta2-180);
phi3=phi2+(theta3-180);

% 手肘、手臂、手掌的旋轉矩陣
rotateArm1=[cosd(phi1) -sind(phi1); sind(phi1) cosd(phi1)];
rotateArm2=[cosd(phi2) -sind(phi2); sind(phi2) cosd(phi2)];
rotatePalm=[cosd(phi3) -sind(phi3); sind(phi3) cosd(phi3)];

% 執行旋轉動作
arm1=rotateArm1*arm1;
arm2=rotateArm2*arm2;
palm=rotatePalm*palm;

% 求出手臂和手肘、手肘和手掌之連接點(bearing)位置
bearing12=[L1*cosd(phi1) ; L1*sind(phi1)];
bearing23=[L1*cosd(phi1)+L2*cosd(phi2) ; L1*sind(phi1)+L2*sind(phi2)];

% 將手肘及手掌平移,把bearings連接好
arm2(1,:)=arm2(1,:)+bearing12(1,1);
arm2(2,:)=arm2(2,:)+bearing12(2,1);
palm(1,:)=palm(1,:)+bearing23(1,1);
palm(2,:)=palm(2,:)+bearing23(2,1);

% 轉置成x座標&y座標為column vector
arm1=arm1';
arm2=arm2';
palm=palm';

% 繪圖
axis equal;
line(arm1(:,1),arm1(:,2),'color','b','erasemode','background','linewidth',3);
line(arm2(:,1),arm2(:,2),'color','b','erasemode','background','linewidth',2);
line(palm(:,1),palm(:,2),'color','b','erasemode','background','linewidth',1);

----------------------------------------------------------------------------------------------------------------------------
程式bodyNew(畫手的資料已經包含在內)(用rotate指令重新寫過的)
-------------------------------------------------------------------------------------------------
function bodyNew(L1,L2,L3,theta1,theta2,theta3)
% 手臂長L1公分、手肘長L2公分、手掌長L3公分、角度算法詳見機動學作業網頁上的圖示


axis equal;


% 繪圖用的角度
p0=linspace(0.5*pi,2.5*pi,13);
p1=linspace(0.5*pi,1.5*pi,7);
p2=linspace(1.5*pi,2.5*pi,7);
p3=linspace(1.5*pi,1.75*pi,10);
p4=linspace(1.75*pi,2.75*pi,7);

% 我的肩膀寬10公分、手肘寬7公分、手腕厚4公分、手指粗2公分、手臂長30公分、手肘長24公分、手掌長19公分,本程式可自行輸入手長度。
% D1=10;
% D2=7;
% D3=4;
% D4=2;
% L1=30;
% L2=24;
% L3=19;
% 假設肩膀寬10公分、手肘寬7公分、手腕厚4公分、手指粗2公分
D1=10;
D2=7;
D3=4;
D4=2;


% 把相對夾角換成絕對角度
phi1=-theta1;
phi2=phi1+(theta2-180);
phi3=phi2+(theta3-180);


% 求出手臂和手肘、手肘和手掌之連接點(bearing)位置
bearing12=[L1*cosd(phi1) L1*sind(phi1)];
bearing23=[L1*cosd(phi1)+L2*cosd(phi2) L1*sind(phi1)+L2*sind(phi2)];


% 手臂形狀
arm1=[(D1/4)*cos(p0) 0 (D1/2)*cos(p1) L1 L1+(D2/2)*cos(p2) L1 L1+(D2/4)*cos(p0) L1 0 0 ;...
(D1/4)*sin(p0) (D1/2) (D1/2)*sin(p1) (-D2/2) (D2/2)*sin(p2) (D2/4) (D2/4)*sin(p0) (D2/2) (D1/2) (D1/4)];
% 將圖形存到handle裡
arm1=arm1';
arm1Fig=line(arm1(:,1),arm1(:,2),'color','b','linewidth',3);


% 手肘形狀
arm2=[ 0 (D2/2)*cos(p1) L2 L2+(D3/2)*cos(p2) L2 0 ;...
(D2/2) (D2/2)*sin(p1) (-D3/2) (D3/2)*sin(p2) (D3/2) (D2/2)];
% 把手肘放到連接點上
arm2(1,:)=arm2(1,:)+bearing12(1,1);
arm2(2,:)=arm2(2,:)+bearing12(1,2);
% 將圖形存到handle裡
arm2=arm2';
arm2Fig=line(arm2(:,1),arm2(:,2),'color','b','linewidth',2);


% 手掌形狀(含上彎的手指)
palm=[L3/2 L3/2+(D4/2)*cos(p2) L3/2 L3/2+(D4/4)*cos(p0) L3/2 0 0 (D3/4)*cos(p0) 0 (D3/2)*cos(p1) L3/2 ...
L3/2+(D4/2)*cos(p3) L3/2+(D4/2)*cosd(315)+(L3/2)*cosd(45) L3/2+(L3/2)*cosd(45)+(D4/2)*cos(p4) L3/2 ;...
(-D4/2) (D4/2)*sin(p2) (D4/4) (D4/4)*sin(p0) (D4/2) (D3/2) (D3/4) (D3/4)*sin(p0) (D3/2) (D3/2)*sin(p1) (-D4/2) ...
(D4/2)*sin(p3) (D4/2)*sind(315)+(L3/2)*sind(45) (L3/2)*sind(45)+(D4/2)*sin(p4) D4/2];
% 把手掌放到連接點上
palm(1,:)=palm(1,:)+bearing23(1,1);
palm(2,:)=palm(2,:)+bearing23(1,2);
% 將圖形存到handle裡
palm=palm';
palmFig=line(palm(:,1),palm(:,2),'color','b','linewidth',1);


axis off;


% 旋轉手肘以接在一起
rotate(arm1Fig,[0 0 1],phi1,[0 0 0]);
rotate(arm2Fig,[0 0 1],phi2,[bearing12 0]);
rotate(palmFig,[0 0 1],phi3,[bearing23 0]);

----------------------------------------------------------------------------------------------------------------------------
1.4:

程式homework5_1_4
-------------------------------------------------------------------------------------------------
% 人正面朝向+x軸
% 手臂長L1=30公分、手肘長L2=26公分、手掌長L3=19公分、角度算法詳見機動學作業網頁上的圖示
L1=30;
L2=26;
L3=19;
theta1=-90;
theta2=-45;
theta3=-30;

% 繪圖用的角度
p0=linspace(0.5*pi,2.5*pi,13);
p1=linspace(0.5*pi,1.5*pi,7);
p2=linspace(1.5*pi,2.5*pi,7);
p3=linspace(1.5*pi,1.75*pi,10);
p4=linspace(1.75*pi,2.75*pi,7);

% 假設肩膀寬10公分、手肘寬7公分、手腕厚4公分、手指粗2公分
D1=10;
D2=7;
D3=4;
D4=2;

% 手臂形狀
arm1=[(D1/4)*cos(p0) 0 (D1/2)*cos(p1) L1 L1+(D2/2)*cos(p2) L1 L1+(D2/4)*cos(p0) L1 0 0 ;...
(D1/4)*sin(p0) (D1/2) (D1/2)*sin(p1) (-D2/2) (D2/2)*sin(p2) (D2/4) (D2/4)*sin(p0) (D2/2) (D1/2) (D1/4)];
% 手肘形狀
arm2=[ 0 (D2/2)*cos(p1) L2 L2+(D3/2)*cos(p2) L2 0 ;...
(D2/2) (D2/2)*sin(p1) (-D3/2) (D3/2)*sin(p2) (D3/2) (D2/2)];
% 手掌形狀(含上彎的手指)
palm=[L3/2 L3/2+(D4/2)*cos(p2) L3/2 L3/2+(D4/4)*cos(p0) L3/2 0 0 (D3/4)*cos(p0) 0 (D3/2)*cos(p1) L3/2 ...
L3/2+(D4/2)*cos(p3) L3/2+(D4/2)*cosd(315)+(L3/2)*cosd(45) L3/2+(L3/2)*cosd(45)+(D4/2)*cos(p4) L3/2 ;...
(-D4/2) (D4/2)*sin(p2) (D4/4) (D4/4)*sin(p0) (D4/2) (D3/2) (D3/4) (D3/4)*sin(p0) (D3/2) (D3/2)*sin(p1) (-D4/2) ...
(D4/2)*sin(p3) (D4/2)*sind(315)+(L3/2)*sind(45) (L3/2)*sind(45)+(D4/2)*sin(p4) D4/2];

% 把相對夾角換成絕對角度
phi1=-theta1;
phi2=phi1+(theta2-180);
phi3=phi2+(theta3-180);

% 手肘、手臂、手掌的旋轉矩陣
rotateArm1=[cosd(phi1) -sind(phi1); sind(phi1) cosd(phi1)];
rotateArm2=[cosd(phi2) -sind(phi2); sind(phi2) cosd(phi2)];
rotatePalm=[cosd(phi3) -sind(phi3); sind(phi3) cosd(phi3)];

% 執行旋轉動作
arm1=rotateArm1*arm1;
arm2=rotateArm2*arm2;
palm=rotatePalm*palm;

% 求出手臂和手肘、手肘和手掌之連接點(bearing)位置
bearing12=[L1*cosd(phi1) ; L1*sind(phi1)];
bearing23=[L1*cosd(phi1)+L2*cosd(phi2) ; L1*sind(phi1)+L2*sind(phi2)];

% 將手肘及手掌平移,把bearings連接好,並存到畫圖專用的暫存變數內
tempArm1=arm1;
tempArm2=arm2;
tempPalm=palm;
tempArm2(1,:)=tempArm2(1,:)+bearing12(1,1);
tempArm2(2,:)=tempArm2(2,:)+bearing12(2,1);
tempPalm(1,:)=tempPalm(1,:)+bearing23(1,1);
tempPalm(2,:)=tempPalm(2,:)+bearing23(2,1);

% 轉置成x座標&y座標為column vector
tempArm1=tempArm1';
tempArm2=tempArm2';
tempPalm=tempPalm';

% 存進handle並繪圖
axis equal;
arm1Fig=line(tempArm1(:,1),tempArm1(:,2),'color','b','erasemode','xor');
arm2Fig=line(tempArm2(:,1),tempArm2(:,2),'color','b','erasemode','xor');
arm3Fig=line(tempPalm(:,1),tempPalm(:,2),'color','b','erasemode','xor');
drawnow;
pause;
axis equal;

% 進入for迴圈
for k=1:1:10

% 手肘、手臂、手掌的旋轉矩陣(重新定義rotateArm矩陣)
rotateArm1=[cosd(-1.5) -sind(-1.5); sind(-1.5) cosd(-1.5)]; %theta1一次變+1.5度,由line 30知應乘負號
rotateArm2=[cosd(-1.5+1) -sind(-1.5+1); sind(-1.5+1) cosd(-1.5+1)]; %theta2一次變+1度,由line 31知應乘正號
rotatePalm=[cosd(-1.5+1+2) -sind(-1.5+1+2); sind(-1.5+1+2) cosd(-1.5+1+2)]; %theta3一次變+2度,由line 32知應乘正號

% 執行旋轉動作
arm1=rotateArm1*arm1;
arm2=rotateArm2*arm2;
palm=rotatePalm*palm;

% 求出手臂和手肘、手肘和手掌之連接點(bearing)位置(重新定義bearing矩陣)
bearing12=[L1*cosd(phi1-1.5*k) ; L1*sind(phi1-1.5*k)];
bearing23=[L1*cosd(phi1-1.5*k)+L2*cosd(phi2+(-1.5+1)*k) ; L1*sind(phi1-1.5*k)+L2*sind(phi2+(-1.5+1)*k)];

% 將手肘及手掌平移,把bearings連接好,並存到畫圖專用的暫存變數內
tempArm1=arm1;
tempArm2=arm2;
tempPalm=palm;
tempArm2(1,:)=tempArm2(1,:)+bearing12(1,1);
tempArm2(2,:)=tempArm2(2,:)+bearing12(2,1);
tempPalm(1,:)=tempPalm(1,:)+bearing23(1,1);
tempPalm(2,:)=tempPalm(2,:)+bearing23(2,1);

% 轉置成x座標&y座標為column vector
tempArm1=tempArm1';
tempArm2=tempArm2';
tempPalm=tempPalm';

% 重新設定handle並繪圖
axis equal;
set(arm1Fig,'xdata',tempArm1(:,1),'ydata',tempArm1(:,2));
set(arm2Fig,'xdata',tempArm2(:,1),'ydata',tempArm2(:,2));
set(arm3Fig,'xdata',tempPalm(:,1),'ydata',tempPalm(:,2));
drawnow;
pause(1);
axis equal;

end;

% 由圖可知:手腕彎曲角度過大,實際上人手無法彎到如此地步。


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

程式homework5_1_4New(用rotate指令重寫過的)
-------------------------------------------------------------------------------------------------

axis equal;
axis([-10,40,-10,50]);

% 人正面朝向+x軸
% 手臂長L1=30公分、手肘長L2=26公分、手掌長L3=19公分、角度算法詳見機動學作業網頁上的圖示
L1=30;
L2=26;
L3=19;
theta1=-90;
theta2=-45;
theta3=-30;


% 繪圖用的角度
p0=linspace(0.5*pi,2.5*pi,13);
p1=linspace(0.5*pi,1.5*pi,7);
p2=linspace(1.5*pi,2.5*pi,7);
p3=linspace(1.5*pi,1.75*pi,10);
p4=linspace(1.75*pi,2.75*pi,7);


% 假設肩膀寬10公分、手肘寬7公分、手腕厚4公分、手指粗2公分
D1=10;
D2=7;
D3=4;
D4=2;


% 把相對夾角換成絕對角度
phi1=-theta1;
phi2=phi1+(theta2-180);
phi3=phi2+(theta3-180);


% 求出手臂和手肘、手肘和手掌之連接點(bearing)位置
bearing12=[L1*cosd(phi1) L1*sind(phi1)];
bearing23=[L1*cosd(phi1)+L2*cosd(phi2) L1*sind(phi1)+L2*sind(phi2)];


% 手臂形狀
arm1=[(D1/4)*cos(p0) 0 (D1/2)*cos(p1) L1 L1+(D2/2)*cos(p2) L1 L1+(D2/4)*cos(p0) L1 0 0 ;...
(D1/4)*sin(p0) (D1/2) (D1/2)*sin(p1) (-D2/2) (D2/2)*sin(p2) (D2/4) (D2/4)*sin(p0) (D2/2) (D1/2) (D1/4)];
% 將圖形存到handle裡
arm1=arm1';
arm1Fig=line(arm1(:,1),arm1(:,2),'color','b','linewidth',3);


% 手肘形狀
arm2=[ 0 (D2/2)*cos(p1) L2 L2+(D3/2)*cos(p2) L2 0 ;...
(D2/2) (D2/2)*sin(p1) (-D3/2) (D3/2)*sin(p2) (D3/2) (D2/2)];
% 把手肘放到連接點上
arm2(1,:)=arm2(1,:)+bearing12(1,1);
arm2(2,:)=arm2(2,:)+bearing12(1,2);
% 將圖形存到handle裡
arm2=arm2';
arm2Fig=line(arm2(:,1),arm2(:,2),'color','b','linewidth',2);


% 手掌形狀(含上彎的手指)
palm=[L3/2 L3/2+(D4/2)*cos(p2) L3/2 L3/2+(D4/4)*cos(p0) L3/2 0 0 (D3/4)*cos(p0) 0 (D3/2)*cos(p1) L3/2 ...
L3/2+(D4/2)*cos(p3) L3/2+(D4/2)*cosd(315)+(L3/2)*cosd(45) L3/2+(L3/2)*cosd(45)+(D4/2)*cos(p4) L3/2 ;...
(-D4/2) (D4/2)*sin(p2) (D4/4) (D4/4)*sin(p0) (D4/2) (D3/2) (D3/4) (D3/4)*sin(p0) (D3/2) (D3/2)*sin(p1) (-D4/2) ...
(D4/2)*sin(p3) (D4/2)*sind(315)+(L3/2)*sind(45) (L3/2)*sind(45)+(D4/2)*sin(p4) D4/2];
% 把手掌放到連接點上
palm(1,:)=palm(1,:)+bearing23(1,1);
palm(2,:)=palm(2,:)+bearing23(1,2);
% 將圖形存到handle裡
palm=palm';
palmFig=line(palm(:,1),palm(:,2),'color','b','linewidth',1);


axis off;
axis equal;

% 旋轉手肘以接在一起
rotate(arm1Fig,[0 0 1],phi1,[0 0 0]);
rotate(arm2Fig,[0 0 1],phi2,[bearing12 0]);
rotate(palmFig,[0 0 1],phi3,[bearing23 0]);
axis equal;
pause;

for k=1:1:10

axis equal;

% 求出新的手臂和手肘、手肘和手掌之連接點(bearing)位置
bearing12=[L1*cosd(phi1-1.5*k) L1*sind(phi1-1.5*k)];
bearing23=[L1*cosd(phi1-1.5*k)+L2*cosd(phi2+(-1.5+1)*k) L1*sind(phi1-1.5*k)+L2*sind(phi2+(-1.5+1)*k)]; % -1.5+1是因為角度要等於自己和所有之前的連桿角度相加


% 先動手臂(手肘手掌一起動)
rotate(arm1Fig,[0 0 1],(-1.5),[0 0 0]);
rotate(arm2Fig,[0 0 1],(-1.5),[0 0 0]);
rotate(palmFig,[0 0 1],(-1.5),[0 0 0]);

% 再動手肘(手臂已就定位,手掌一起動)
rotate(arm2Fig,[0 0 1],(1),[bearing12 0]);
rotate(palmFig,[0 0 1],(1),[bearing12 0]);

% 最後動手掌(手臂手肘都已就定位)
rotate(palmFig,[0 0 1],(2),[bearing23 0]);

pause(0.5);

end;

% 由圖可知:手腕彎曲角度過大,實際上人手無法彎到如此地步。



-----------------------------------------------------------------------------------------------------------------------
用rotate指令的優點是:可以使程式碼更簡潔,同時避免掉用handle畫圖時因為erasemode為'xor'產生的圖形抵銷。
----------------------------------------------------------------------------------------------------------------------
2.1~2.2:

程式limitOfFinger(有關題目的描述、分析、解釋,皆已寫入下列的程式碼中)
-------------------------------------------------------------------------------------------------
圖一

圖二


圖三


% 手指第一節固定在手掌上,故只有旋轉的自由度,自由度為1。
% 第二節跟第一節的銜接處可視為旋轉結,因旋轉節拘束度為2,故整個系統自由度加1,變成2。
% 第三節與第二節的情況亦同,故整個系統自由度再加1,變成3。
% 自由度為3告訴我們:手指頭可以移動到任意位置!且手指有3節恰好是構成自由度大於等於3的最少節數!
% 但實際上手指各節皆不是真正的旋轉結,無法作360度的旋轉。
% 手掌與第一節的旋轉結約可旋轉110度;第一節與第二節的旋轉節約可旋轉130度;第二節與第三節的旋轉節約可旋轉90度。(以我自己的手指作為測量物)
% 且手指有一定長度,故其只能在長度能到達且與手掌同向(與手背反向)的範圍內運動。
% 除了大拇指,其餘四指的情況皆可以上述模型與限制模擬之。
% 以上皆只考慮手指在平面上的運動,左右的移動不討論。

% 以圖一為初位置,圖二為末位置。
% 以指節間向量夾角為角度,逆時針為正。(第一節則取與x軸夾角)
% (定義:向量起點為該指節與前一指節的bearing,向量終點為該指節與下一指節的bearing)
% 我的手指長度:
% [第一節長度, 第二節長度, 第三節長度, 第一節初角度/末角度, 第二節初角度/末角度, 第三節初角度/末角度](長度:公分 / 角度:度)
% 食指:[6, 3.5, 2.5, -10/100, -110/20, -90/0]
% 中指:[7, 4, 2.5, -10/100, -110/20, -90/0]
% 無名指:[6, 3, 2.5, -10/100, -110/20, -90/0]
% 小指:[4.5, 2.5, 2, -10/100, -110/20, -90/0]

% 以下為手指極限位置程式
function limitOfFinger(L1,L2,L3,THETAi1,THETAi2,THETAi3,THETAf1,THETAf2,THETAf3)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 繪出手指頭能到達的區域 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 指頭最多能到多遠:手指總長度
L=L1+L2+L3;
% 手指全部伸直時可以到達的末角度:三節末角度加總
THETAf=THETAf1+THETAf2+THETAf3;
% 手指全部伸直時無法向下完全貼合在手掌,最遠情況如圖三:第一節初角度+第二節初角度+0度
THETAi=THETAi1+THETAi2;
% 做出指頭最遠距離的點
phi0=(THETAi+THETAi3):1:THETAi;
phi1=THETAi:1:THETAi1;
phi2=THETAi1:1:THETAf1;
phi3=THETAf1:1:THETAf;
phi0=phi0*(pi/180);
phi1=phi1*(pi/180);
phi2=phi2*(pi/180);
phi3=phi3*(pi/180);
temppts0=L3*exp(i*phi0);
temppts0(:)=temppts0(:)+L1*exp(i*THETAi1*(pi/180))+L2*exp(i*THETAi*(pi/180));
temppts1=(L2+L3)*exp(i*phi1);
temppts1(:)=temppts1(:)+L1*exp(i*THETAi1*(pi/180));
temppts2=(L2+L3)*exp(i*phi3);
temppts2(:)=temppts2(:)+L1*exp(i*THETAf1*(pi/180));
fingerTip=[0 temppts0 temppts1 L*exp(i*phi2) temppts2 0];
% 把點從極座標換成直角座標
rFinger=abs(fingerTip);
thetaFinger=angle(fingerTip);
[X,Y]=pol2cart(thetaFinger,rFinger);
% 填上黃色處即為手指頭可以到達的地方
fill(X',Y','Y');
axis equal;
grid on;
pause;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 繪出手指頭能到達的區域 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 沿著極限位置的運動情形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 求出連接點(bearing)位置
bearing12=[L1*cosd(THETAi1) L1*sind(THETAi1)];
bearing23=[L1*cosd(THETAi1)+L2*cosd(THETAi) L1*sind(THETAi1)+L2*sind(THETAi)];

% 將手指圖形存在handle裡

finger1=linkpoints([0 0],[L1 0], 1);
finger1=finger1';
finger1Fig=line(finger1(:,1),finger1(:,2),'color','b','linewidth',1);

finger2=linkpoints([0 0],[L2 0], 1);
finger2(1,:)=finger2(1,:)+bearing12(1,1);
finger2(2,:)=finger2(2,:)+bearing12(1,2);
finger2=finger2';
finger2Fig=line(finger2(:,1),finger2(:,2),'color','b','linewidth',1);

finger3=linkpoints([0 0],[L3 0], 1);
finger3(1,:)=finger3(1,:)+bearing23(1,1);
finger3(2,:)=finger3(2,:)+bearing23(1,2);
finger3=finger3';
finger3Fig=line(finger3(:,1),finger3(:,2),'color','b','linewidth',1);

% 旋轉手肘以接在一起
rotate(finger1Fig,[0 0 1],THETAi1,[0 0 0]);
rotate(finger2Fig,[0 0 1],(THETAi1+THETAi2),[bearing12 0]);
rotate(finger3Fig,[0 0 1],(THETAi1+THETAi2+THETAi3),[bearing23 0]);


% 開始運動
% 轉第三節
for k=1:1:20
deltaTHETA3=(THETAf3-THETAi3)*0.05;
rotate(finger3Fig,[0 0 1],deltaTHETA3,[bearing23 0]);
pause(0.1);
end;
pause;

% 轉第二加第三節
for k=1:1:50
deltaTHETA2=(0-THETAi2)*0.02;
% 求出新的連接點(bearing)位置
bearing12=[L1*cosd(THETAi1) L1*sind(THETAi1)];
% 一起動第二第三節(第一節已就定位)
rotate(finger2Fig,[0 0 1],deltaTHETA2,[bearing12 0]);
rotate(finger3Fig,[0 0 1],deltaTHETA2,[bearing12 0]);
pause(0.05);
end;
pause;

% 三節一起轉
for k=1:1:50

deltaTHETA1=(THETAf1-THETAi1)*0.02;
% 三節一起動
rotate(finger1Fig,[0 0 1],deltaTHETA1,[0 0 0]);
rotate(finger2Fig,[0 0 1],deltaTHETA1,[0 0 0]);
rotate(finger3Fig,[0 0 1],deltaTHETA1,[0 0 0]);
pause(0.1);
end;
pause;

% 最後第二第三節一起轉
for k=1:1:10

deltaTHETA2=(THETAf2-0)*0.1;
% 求出新的連接點(bearing)位置
bearing12=[L1*cosd(THETAf1) L1*sind(THETAf1)];
% 一起動第二第三節(第一節已就定位)
rotate(finger2Fig,[0 0 1],deltaTHETA2,[bearing12 0]);
rotate(finger3Fig,[0 0 1],deltaTHETA2,[bearing12 0]);
pause(0.1);

end;
pause;
% 運動結束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 沿著極限位置的運動情形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 模擬手握拳張開時手指的運動情形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 求出連接點(bearing)位置
bearing12=[L1*cosd(THETAi1) L1*sind(THETAi1)];
bearing23=[L1*cosd(THETAi1)+L2*cosd(THETAi) L1*sind(THETAi1)+L2*sind(THETAi)];

% 將手指圖形存在handle裡

finger1=linkpoints([0 0],[L1 0], 1);
finger1=finger1';
finger1Fig=line(finger1(:,1),finger1(:,2),'color','b','linewidth',1);


finger2=linkpoints([0 0],[L2 0], 1);
finger2(1,:)=finger2(1,:)+bearing12(1,1);
finger2(2,:)=finger2(2,:)+bearing12(1,2);
finger2=finger2';
finger2Fig=line(finger2(:,1),finger2(:,2),'color','b','linewidth',1);


finger3=linkpoints([0 0],[L3 0], 1);
finger3(1,:)=finger3(1,:)+bearing23(1,1);
finger3(2,:)=finger3(2,:)+bearing23(1,2);
finger3=finger3';
finger3Fig=line(finger3(:,1),finger3(:,2),'color','b','linewidth',1);


% 旋轉手肘以接在一起
rotate(finger1Fig,[0 0 1],THETAi1,[0 0 0]);
rotate(finger2Fig,[0 0 1],(THETAi1+THETAi2),[bearing12 0]);
rotate(finger3Fig,[0 0 1],(THETAi1+THETAi2+THETAi3),[bearing23 0]);

for k=1:1:100

deltaTHETA1=(THETAf1-THETAi1)*0.01;
deltaTHETA2=(THETAf2-THETAi2)*0.01;
deltaTHETA3=(THETAf3-THETAi3)*0.01;
% 求出新的連接點(bearing)位置
bearing12=[L1*cosd(THETAi1+deltaTHETA1*k) L1*sind(THETAi1+deltaTHETA1*k)];
bearing23=[L1*cosd(THETAi1+deltaTHETA1*k)+L2*cosd(THETAi+(deltaTHETA1+deltaTHETA2)*k) ...
L1*sind(THETAi1+deltaTHETA1*k)+L2*sind(THETAi+(deltaTHETA1+deltaTHETA2)*k)];
% 先動第一節(第二第三節一起動)
rotate(finger1Fig,[0 0 1],deltaTHETA1,[0 0 0]);
rotate(finger2Fig,[0 0 1],deltaTHETA1,[0 0 0]);
rotate(finger3Fig,[0 0 1],deltaTHETA1,[0 0 0]);
% 再動第二節(第一節已就定位,第三節一起動)
rotate(finger2Fig,[0 0 1],deltaTHETA2,[bearing12 0]);
rotate(finger3Fig,[0 0 1],deltaTHETA2,[bearing12 0]);
% 最後動第三節(第一第二節都已就定位)
rotate(finger3Fig,[0 0 1],deltaTHETA3,[bearing23 0]);
pause(0.1);
end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 模擬手握拳張開時手指的運動情形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 可看出兩次畫圖,最後手指頭會重合在一起!



% linkpoints(之前的作業,可以用來輸出畫link的點,對於這次把手指當成link是很有用的工具)

% Input the positions of the two ends & width , output points of the link.
function y=linkpoints(A,B,d) % A=[x1 y1] B=[x2 y2]

L=((B(1,1)-A(1,1))^2+(B(1,2)-A(1,2))^2)^0.5;
COStheta=(B(1,1)-A(1,1))/L;
SINtheta=(B(1,2)-A(1,2))/L;
rotationMatrix=[COStheta -SINtheta; SINtheta COStheta];

p0=linspace(0.5*pi,2.5*pi,12);
p1=linspace(0.5*pi,1.5*pi,6);
p2=linspace(1.5*pi,2.5*pi,6);
X=[(d/4)*cos(p0) 0 (d/2)*cos(p1) L L+(d/2)*cos(p2) L L+(d/4)*cos(p0) L 0 0 ];
Y=[(d/4)*sin(p0) (d/2) (d/2)*sin(p1) (-d/2) (d/2)*sin(p2) (d/4) (d/4)*sin(p0) (d/2) (d/2) (d/4)];
positions=[X;Y];
positions=rotationMatrix*positions;
X=positions(1,:)+A(1,1);
Y=positions(2,:)+A(1,2);
y=[X;Y];



-------------------------------------------------------------------------------------------------
2.3:

程式velocityAndAcceletrationOfFinger(有關題目的描述、分析、解釋,皆已寫入下列的程式碼中)
-------------------------------------------------------------------------------------------------
圖四


圖五



圖六





% 為了跟第一及第二小題使用相通的convention,我定義張開手時是final,握拳是initial,故程式中角度變化都是從final變成initial。
% 以指節間向量夾角為角度,逆時針為正。(第一節則取與x軸夾角)
% (定義:向量起點為該指節與前一指節的bearing,向量終點為該指節與下一指節的bearing)
% [L1第一節長度, L2第二節長度, L3第三節長度, THETAi1第一節初角度/THETAf1末角度,
% THETAi2第二節初角度/THETAf2末角度, THETAi3第三節初角度/THETAf3末角度, T手指下扣需要的時間](長度:公分 / 角度:度)

function velocityAndAccelerationOfFinger(L1,L2,L3,THETAi1,THETAi2,THETAi3,THETAf1,THETAf2,THETAf3,T)

% 我的手指從張開到握起來大約需要1/8秒,假設王建民需要1/10秒。
% 伸卡球的握法如圖3,只有食指、中指會往下扣,又投伸卡球時是食指比中指用力,故假設王建民的食指下扣需要9/100秒、中指需要1/10秒。
% 使球旋轉主要是靠手指頭的運動,假設下扣動作中,手指頭轉動初位置及末位置如圖五&圖六。
% 圖五&圖六中:THETAf1=90;THETAf2=-30;THETAf3=-20;THETAi1=0;THETAi2=-90;THETAi3=-90;
% 手指長度:我舉自己的中指為例:L1=7;L2=4;L3=2.5;
% 時間:用王建民的中指假設:1/10;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 模擬張開的手握拳時手指的運動情形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
axis equal;
axis([-20 20 -20 20]);
axis manual;


% 求出連接點(bearing)位置
bearing12=[L1*cosd(THETAf1) L1*sind(THETAf1)];
bearing23=[L1*cosd(THETAf1)+L2*cosd(THETAf1+THETAf2) L1*sind(THETAf1)+L2*sind(THETAf1+THETAf2)];

% 將手指圖形存在handle裡

finger1=linkpoints([0 0],[L1 0], 1);
finger1=finger1';
finger1Fig=line(finger1(:,1),finger1(:,2),'color','b','linewidth',1);

finger2=linkpoints([0 0],[L2 0], 1);
finger2(1,:)=finger2(1,:)+bearing12(1,1);
finger2(2,:)=finger2(2,:)+bearing12(1,2);
finger2=finger2';
finger2Fig=line(finger2(:,1),finger2(:,2),'color','b','linewidth',1);

finger3=linkpoints([0 0],[L3 0], 1);
finger3(1,:)=finger3(1,:)+bearing23(1,1);
finger3(2,:)=finger3(2,:)+bearing23(1,2);
finger3=finger3';
finger3Fig=line(finger3(:,1),finger3(:,2),'color','b','linewidth',1);

% 旋轉手肘以接在一起
rotate(finger1Fig,[0 0 1],THETAf1,[0 0 0]);
rotate(finger2Fig,[0 0 1],(THETAf1+THETAf2),[bearing12 0]);
rotate(finger3Fig,[0 0 1],(THETAf1+THETAf2+THETAf3),[bearing23 0]);
pause;

% 算出w1、w2、w3
w1=(THETAf1-THETAi1)*(pi/180)*(1/T);
w2=(THETAf2-THETAi2)*(pi/180)*(1/T);
w3=(THETAf3-THETAi3)*(pi/180)*(1/T);
% 設第一節與第二節間的bearing(稱作A點)的位置向量為r1,第二節與第三節間的bearing(稱作B點)的位置向量為r1+r2,手指頭的位置向量(稱作C點)為r1+r2+r3。
r1=L1*exp(i*(THETAf1*(pi/180)));
r2=L2*exp(i*((THETAf1+THETAf2)*(pi/180)));
r3=L3*exp(i*((THETAf1+THETAf2+THETAf3)*(pi/180)));
% 對r1、r1+r2、r1+r2+r3作微分得到ABC三點的速度向量
v1=i*(-w1)*r1;
v2=i*(-w1)*r1+i*(-w1-w2)*r2;
v3=i*(-w1)*r1+i*(-w1-w2)*r2+i*(-w1-w2-w3)*r3;
% 對v1、v1+v2、v1+v2+v3作微分得到ABC三點的加速度向量(在此題中我假設角加速度為0)
a1=-((w1)^2)*r1;
a2=-((w1)^2)*r1-((w1+w2)^2)*r2;
a3=-((w1)^2)*r1-((w1+w2)^2)*r2-((w1+w2+w3)^2)*r3;
% 將複數平面轉成xy座標
r1=[real(r1) imag(r1)];
r2=[real(r2) imag(r2)];
r3=[real(r3) imag(r3)];
v1=[real(v1) imag(v1)];
v2=[real(v2) imag(v2)];
v3=[real(v3) imag(v3)];
a1=[real(a1) imag(a1)];
a2=[real(a2) imag(a2)];
a3=[real(a3) imag(a3)];
% 將速度及加速度線存成handle(速度為綠線、加速度為紅線)
v1handle=line([r1(1,1);r1(1,1)+v1(1,1)],[r1(1,2);r1(1,2)+v1(1,2)],'color','G','linewidth',1);
v2handle=line([r1(1,1)+r2(1,1);r1(1,1)+r2(1,1)+v2(1,1)],[r1(1,2)+r2(1,2);r1(1,2)+r2(1,2)+v2(1,2)],'color','G','linewidth',1);
v3handle=line([r1(1,1)+r2(1,1)+r3(1,1);r1(1,1)+r2(1,1)+r3(1,1)+v3(1,1)],[r1(1,2)+r2(1,2)+r3(1,2);r1(1,2)+r2(1,2)+r3(1,2)+v3(1,2)],'color','G','linewidth',1);
a1handle=line([r1(1,1);r1(1,1)+a1(1,1)],[r1(1,2);r1(1,2)+a1(1,2)],'color','R','linewidth',1);
a2handle=line([r1(1,1)+r2(1,1);r1(1,1)+r2(1,1)+a2(1,1)],[r1(1,2)+r2(1,2);r1(1,2)+r2(1,2)+a2(1,2)],'color','R','linewidth',1);
a3handle=line([r1(1,1)+r2(1,1)+r3(1,1);r1(1,1)+r2(1,1)+r3(1,1)+a3(1,1)],[r1(1,2)+r2(1,2)+r3(1,2);r1(1,2)+r2(1,2)+r3(1,2)+a3(1,2)],'color','R','linewidth',1);

% 開始動作
for t=0.001:(0.001):T

% A點更新速度及加速度線
r1=L1*exp(i*(-w1*t+THETAf1*(pi/180)));
v1=i*(-w1)*r1;
a1=-((w1)^2)*r1;
r1=[real(r1) imag(r1)];
v1=[real(v1) imag(v1)];
a1=[real(a1) imag(a1)];
set(v1handle,'xdata',[r1(1,1);v1(1,1)],'ydata',[r1(1,2);v1(1,2)]);
set(a1handle,'xdata',[r1(1,1);a1(1,1)],'ydata',[r1(1,2);a1(1,2)]);

% B點更新速度及加速度線
r2=L2*exp(i*(-(w1+w2)*t+(THETAf1+THETAf2)*(pi/180)));
v2=i*(-w1)*r1+i*(-w1-w2)*r2;
a2=-((w1)^2)*r1-((w1+w2)^2)*r2;
r2=[real(r2) imag(r2)];
v2=[real(v2) imag(v2)];
a2=[real(a2) imag(a2)];
set(v2handle,'xdata',[r1(1,1)+r2(1,1);v2(1,1)],'ydata',[r1(1,2)+r2(1,2);v2(1,2)]);
set(a2handle,'xdata',[r1(1,1)+r2(1,1);a2(1,1)],'ydata',[r1(1,2)+r2(1,2);a2(1,2)]);

% C點更新速度及加速度線
r3=L3*exp(i*(-(w1+w2+w3)*t+(THETAf1+THETAf2+THETAf3)*(pi/180)));
v3=i*(-w1)*r1+i*(-w1-w2)*r2+i*(-w1-w2-w3)*r3;
a3=-((w1)^2)*r1-((w1+w2)^2)*r2-((w1+w2+w3)^2)*r3;
r3=[real(r3) imag(r3)];
v3=[real(v3) imag(v3)];
a3=[real(a3) imag(a3)];
set(v3handle,'xdata',[r1(1,1)+r2(1,1)+r3(1,1);v3(1,1)],'ydata',[r1(1,2)+r2(1,2)+r3(1,2);v3(1,2)]);
set(a3handle,'xdata',[r1(1,1)+r2(1,1)+r3(1,1);a3(1,1)],'ydata',[r1(1,2)+r2(1,2)+r3(1,2);a3(1,2)]);

% 更新圖
refresh;

deltaTHETA1=w1*(180/pi);
deltaTHETA2=w2*(180/pi);
deltaTHETA3=w3*(180/pi);
% 求出新的連接點(bearing)位置
bearing12=[L1*cosd(THETAf1-deltaTHETA1*t) L1*sind(THETAf1-deltaTHETA1*t)];
bearing23=[L1*cosd(THETAf1-deltaTHETA1*t)+L2*cosd((THETAf1+THETAf2)-(deltaTHETA1+deltaTHETA2)*t) ...
L1*sind(THETAf1-deltaTHETA1*t)+L2*sind((THETAf1+THETAf2)-(deltaTHETA1+deltaTHETA2)*t)];
% 先動第一節(第二第三節一起動)
rotate(finger1Fig,[0 0 1],-deltaTHETA1*0.001,[0 0 0]);
rotate(finger2Fig,[0 0 1],-deltaTHETA1*0.001,[0 0 0]);
rotate(finger3Fig,[0 0 1],-deltaTHETA1*0.001,[0 0 0]);
% 再動第二節(第一節已就定位,第三節一起動)
rotate(finger2Fig,[0 0 1],-deltaTHETA2*0.001,[bearing12 0]);
rotate(finger3Fig,[0 0 1],-deltaTHETA2*0.001,[bearing12 0]);
% 最後動第三節(第一第二節都已就定位)
rotate(finger3Fig,[0 0 1],-deltaTHETA3*0.001,[bearing23 0]);
pause(0.2);

end;
% 結束動作
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 模擬張開的手握拳時手指的運動情形 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% linkpoints(之前的作業,可以用來輸出畫link的點,對於這次把手指當成link是很有用的工具)

% Input the positions of the two ends & width , output points of the link.
function y=linkpoints(A,B,d) % A=[x1 y1] B=[x2 y2]

L=((B(1,1)-A(1,1))^2+(B(1,2)-A(1,2))^2)^0.5;
COStheta=(B(1,1)-A(1,1))/L;
SINtheta=(B(1,2)-A(1,2))/L;
rotationMatrix=[COStheta -SINtheta; SINtheta COStheta];

p0=linspace(0.5*pi,2.5*pi,12);
p1=linspace(0.5*pi,1.5*pi,6);
p2=linspace(1.5*pi,2.5*pi,6);
X=[(d/4)*cos(p0) 0 (d/2)*cos(p1) L L+(d/2)*cos(p2) L L+(d/4)*cos(p0) L 0 0 ];
Y=[(d/4)*sin(p0) (d/2) (d/2)*sin(p1) (-d/2) (d/2)*sin(p2) (d/4) (d/4)*sin(p0) (d/2) (d/2) (d/4)];
positions=[X;Y];
positions=rotationMatrix*positions;
X=positions(1,:)+A(1,1);
Y=positions(2,:)+A(1,2);
y=[X;Y];