2007年4月25日 星期三

作業7

本人(4/19)有上課


利用機動學講義的dyad和dyad_draw程式及運動學基本定理分析桿在各時間的對應位置,角速度及角加速度,以下是我的程式碼

%此程式是將機動學上課講義第三章後面之dyad及dyad_draw加以
%其目的是為了計算出各桿利用加速度,速度計算之對應位置



a=8+10; %第一桿長為我的學號末一碼+10

%運用dyad_draw來計算及跑出各桿的位置,角速度,角加速度

%利用迴圈跑出t=1,2,3,4,5時的圖形
for t=1:1:5
clf;
axis equal;
axis([-200 200 -200 200]);
dyad_draw([a,a+5,a-5],[0.2*t,0.5*t+0.5*0.1*t^2,0.3*t+0.5*0.2*t^2],[0.2,0.5+t*0.1,0.3+t*0.2],[0,0.1,0.2]);
%第一項輸入為各桿的桿長由a值決定
%第二項輸入為各桿的角度,是利用公式theta=theta0+omega*t+0.5*alfa*t^2
%第三項輸入為各桿的角速度,是利用公式omega=omega0+alfa*t
pause(2)

end;






由程式執行結果可以看出各桿之對應位置,角速度,角加速度
其中圖中之紅色為各桿之加速度,藍色為速度,綠色為合速度

2007年4月16日 星期一

作業6-1

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

1

如圖


















共有12個連桿和16個結


2

此為平面組合機構,故M=3(N-J-1)+Σfi
M=3(12-16-1)+1*14+2*2=3



3

檢驗如下

>>gruebler (12,[12,2,2])

df =

3




4

滑塊在平面空間可視為稜柱對,無法轉動,僅能在一特定方向上相互滑動,故自由度為1。而滑槽在平面空間則視為複式結,除了可以轉動外也可以行移動,故自由度為2。故在計算可動度時,於滑槽項需要注意連結度f要以2計算

作業6-2

6.2

其中球結的自由度為3(各方向的轉動),旋轉結的自由度和平面的一樣為1,而筒結則因為可以繞軸轉動及沿軸移動其自由度為2


由於題目為空間機構組合
故我們計算自由度的時候應該將公式改為M=6(N-J-1)+Σfi
帶入數值,M=6(7-7-1)+3*3+2*1+1*3=8>0
故機構可動


檢驗如下

>>gruebler (7,[3,0,0,3,1])

df =

8



4

有惰性自由度
如圖,















標示箭頭之連桿表示其連結之連桿可以行自轉運動,故惰性自由度為2
所以整體之自由度應為 8-2=6

作業6-3

6-3
一 何謂葛拉索機構及非葛拉索機構?
在一四連桿當中,令四桿的桿長為
g:最長桿的長度
s:最短桿的長度
p,q:中間長度之兩桿的長度

則當s+g<p+q時,為葛拉索第一類型
s+g>p+q,為葛拉索第二類型
s+g=p+q,為葛拉索第三類型

其中第一類型又稱為葛拉索機構,根據接地桿的不同可以有下列情況:
1當鄰近最短桿之桿為接地桿時,屬於曲柄搖桿型
2若最短桿為接地桿時,則屬於雙曲柄型
3若與最短桿為相對應桿之桿為接地桿時,則屬於雙搖桿機構

第二類型則稱為非葛拉索型機構,所有活動連桿均屬搖桿

第三類型則為葛拉索機構的特殊型,稱為中立連桿組或暫態連桿組,其有個變換點,其運動是否向前或往後,成為不可預測的情況


二 假設有三組四連桿,設第一桿為固定桿,各桿長度分別如下:
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

• 試問各組應屬何種機構?其迴轉情況會如何?
• 試用grashof()函數檢驗上述三組的連桿組合。
• 上述三組連桿若要成為葛拉索機構,則應如何改善?


第一組
s+g=7+4=11
p+q=6+5=11
s+g=p+q
其為葛拉索機構的特殊型,有一變換點,其搖桿的運動不可預測
因為是以鄰近最短桿之桿為接地桿(7),故為曲柄搖桿機構
當較短的側桿旋轉時,另一側桿會行擺動

第二組則是
s+g=8+3.6=11.6
p+q=5.1+4.1=9.2
s+g>p+q
其為非葛拉索機構
所有活動連桿均屬搖桿,任何桿均無法產生完整的迴轉運動

第三組則是
s+g=6.6+3.1=9.7
p+q=4.7+5.4=10.1
s+g<p+q
其為葛拉索機構
因為是以鄰近最短桿之桿為接地桿(5.4),故為曲柄搖桿機構
當較短的側桿旋轉時,另一側桿會行擺動


檢驗如下

>> granshof(7,[7,4,6,5])
link =
4 5 6 7
ans =
crank-Rocker linkage


>> granshof(8,[8,3.6,5.1,4.1])
link =
3.6000 4.1000 5.1000 8.0000
ans =
Non-granshof linkage


>> granshof(5.4,[5.4,3.1,6.6,4.7])
link =
3.1000 4.7000 5.4000 6.6000
ans =
crank-Rocker linkage

若要將上述非葛拉索機構便成葛拉索機構,可以將最長桿的長度增大,或是將最短桿的長度增大(但是注意不可以比中間長度兩桿長),使得s+g<p+q,則連桿組即可成為葛拉索機構

2007年4月10日 星期二

作業5-2-1

由於我們是探討指節在同一平面的運動情況
故可以設定各關節之連結點皆為旋轉對,僅能旋轉不能平移(DOF=1)
各指間之運動鏈形式可以課本p3-5之圖3-3-a表示
是屬於開放式的機構


使用古魯伯公式
由於連結點均是低對
故m=3(N-1)-2J

其中
N=3(連桿之總數)
J=2(運動節之總數)
==>m=2(可動度)

m>1為多項輸入,需利用與可動度等量之輸入控制項,使機構產生相對運動

作業5-2-2

第二小題

利用教學講義上面的兩個函式
function linkshape_n(A,B,dd)
if nargin==2,dd=1;
end;
d=abs(dd);
AB=(B(1)+j*B(2))-(A(1)+j*A(2));
D=abs(AB);
th=angle(AB);
t=linspace(pi/2,2.5*pi,20);
Cout=max(d/2,0.2)*exp(j*t');
Cin=Cout/2;
if dd>0, P=[0;Cin;Cout(1:10);D+Cout(11:20);
D+Cin;D+Cout(20);Cout(1)];
else P=[Cin;0;D;D+Cin];
end
xx=real(P);yy=imag(P);x=xx*cos(th)-yy*sin(th)+A(1);
y=xx*sin(th)+yy*cos(th)+A(2);
line(x,y)
axis equal

function link_angle(lens,angle,start,w)
if nargin<4,w=1;end;
if nargin<3,start=[0 0];
end
lens=lens(:);
angle=angle(:);
th=angle*pi/180;
x=cumsum([start(1);
lens.*cos(th)]);
y=cumsum([start(2);
lens.*sin(th)]);
for i=1:length(x)-1
linkshape([x(i) y(i)],[x(i+1) y(i+1)],w);
end

%用來繪出手指運動情形的函式
function drawfingers(L1,th1,th2,th3)
d1=L1; %手掌長為輸入之L1
d2=1/3*L1; %第三指間長
d3=8*d2/9; %第二指間長
d4=3*d2/5; %第一指間長
%以迴圈來跑旋轉
for n=0:5:100,
clf;
axis equal;
%計算各個水平角度以便旋轉公式使用
if n<=th1,
theta1=n;
else
theta1=th1;
end;
if n<=th2;
theta2=theta1+n;
else
theta2=theta1+th2;
end;
if n<=th3;
theta3=theta2+n;
else
theta3=theta2+th3;
end;

lens=[d1,d2,d3,d4];
angle=[0,theta1,theta2,theta3];

link_angle(lens,angle,[0,0],2.5)%呼叫link_angle函式
pause(0.05);
end;

以手掌長為10,極限角分別為90,92,98
>> drawfingers(10,90,92,98)
執行結果如下

作業5-2-3

利用教學講義的function
可以計算出各個手指之長度,角度,及速度

function [vec,dyadata] = dyad(rho,theta,td,tdd)
theta=theta(:);
rho=rho(:);
n=length(rho);
if nargin<4,
tdd=zeros(size(rho));
if nargin==2,
td=ones(size(rho));
end
end
if length(td)==1,
td=ones(size(rho))*td;
end
if length(tdd)==1,
tdd=ones(size(rho))*tdd;
end
td=td(:);tdd=tdd(:);d2g=pi/180;
tt=exp(i*theta*d2g);pp=rho.*tt;vv=i*td.*pp;
aa=-pp.*td.^2+i*pp.*tdd;
dyadata=[pp vv aa]
vect=[abs(sum(dyadata));
angle(sum(dyadata))/d2g]


若以rho1=12,rho2=4,rho3=3,rho4=2(手掌及各指節長度)
theta1=0,theta2=45,theta3=60,theta4=90
td1=0,td2=0.5,td3=0.75,td4=1.15代入
則執行結果為
>> dyad([12,4,3,2],[0,45,60,90],[0,0.5,0.75,1.15])
dyadata =

12.0000 0 0
2.8284 + 2.8284i -1.4142 + 1.4142i -0.7071 - 0.7071i
1.5000 + 2.5981i -1.9486 + 1.1250i -0.8438 - 1.4614i
0.0000 + 2.0000i -2.3000 + 0.0000i -0.0000 - 2.6450i

上述四列分別代表手掌及各指節的的位置,速度,角速度(由左至右)

作業5-1-1

第一小題

%設定各個連結點直徑

dA1=10;dA2=6;
dB1=6;dB2=4;
dC1=4;
dfinger=0.5;%用來繪製手指圖形的直徑
t=linspace(pi/2,2.5*pi,20);
Cfinger=dfinger*exp(j*t');
dthumb=0.8; %用來繪製姆指圖形的直徑
tt=linspace(0,2*pi,20);
Cthumb=dthumb*exp(j*tt');

L1=31;L2=33;L3=14; %上手臂,下手臂,手掌的長
th2=0;th1=-pi/2;th3=-pi/6; %各個連桿與水平之夾角

%連桿圖形之連結點內外圓座標換算
CoutA1=max(dA1/2,0.2)*exp(j*t');
CinA1=CoutA1/2;
CoutA2=max(dA2/2,0.2)*exp(j*t');
CinA2=CoutA2/2;
CoutB1=max(dB1/2,0.2)*exp(j*t');
CinB1=CoutB1/2;
CoutB2=max(dB2/2,0.2)*exp(j*t');
CinB2=CoutB2/2;
CoutC1=max(dC1/2,0.2)*exp(j*t');
CinC1=CoutC1/2;

%各個連桿之座標設定,旋轉平移及繪出
arm1=[0;CinA1;CoutA1(1:10);L1+CoutA2(11:20);
L1+CinA2;L1+CoutA2(20);CoutA1(1)];
xx1=real(arm1);
yy1=imag(arm1);
x1=xx1*cos(th1)-yy1*sin(th1);
y1=xx1*sin(th1)+yy1*cos(th1);
line(x1,y1)
axis equal

arm2=[0;CinB1;CoutB1(1:10);L2+CoutB2(11:20);
L2+CinB2;L2+CoutB2(20);CoutB1(1)];
xx2=real(arm2);
yy2=imag(arm2);
x2=xx2*cos(th2)-yy2*sin(th2);
y2=xx2*sin(th2)+yy2*cos(th2)-L1;
line(x2,y2)
axis equal

arm3=[0;CinC1;CoutC1(1:10);L3/2-3i;
L3-2-2.5i+Cfinger(11:20);L3-7-2.2i+Cfinger(20);
L3-1-i+Cfinger(11:20);L3-6-0.2i+Cfinger(20);
L3+1.5i+Cfinger(11:20);L3-6+1.7i+Cfinger(20);
L3-1+3.5i+Cfinger(11:20);L3-9+3i+Cfinger(20);
L3-9+7.5i+Cthumb(1:10);L3-11+3i+Cthumb(10);
CoutC1(1)];
xx3=real(arm3);
yy3=imag(arm3);
x3=xx3*cos(th3)-yy3*sin(th3)+L2;
y3=xx3*sin(th3)+yy3*cos(th3)-L1;
line(x3,y3)
axis equal;
執行結果如下

作業5-1-2

第二小題
function body(L1,L2,L3,theta1,theta2,theta3)
%設定一個函數可以輸入並繪出手臂位置
%L1為上手臂長,L2為下手臂長,L3為手掌(含手指)長

dA1=10;dA2=6;dB1=6;dB2=4;dC1=4;dfinger=0.5;
t=linspace(pi/2,2.5*pi,20);
Cfinger=dfinger*exp(j*t');
dthumb=0.8;tt=linspace(0,2*pi,20);Cthumb=dthumb*exp(j*tt');
L1x=L1;L1y=0;L2x=L2;L2y=0;
%以上為各個連結點的直徑設定及座標轉換(以linkeshape的形式修改)
th1=-theta1;
th2=theta2-theta1+180;
th3=theta2-theta1+theta3;
%計算各個水平角度

CoutA1=max(dA1/2,0.2)*exp(j*t');
CinA1=CoutA1/2;
CoutA2=max(dA2/2,0.2)*exp(j*t');
CinA2=CoutA2/2;
CoutB1=max(dB1/2,0.2)*exp(j*t');
CinB1=CoutB1/2;
CoutB2=max(dB2/2,0.2)*exp(j*t');
CinB2=CoutB2/2;
CoutC1=max(dC1/2,0.2)*exp(j*t');
CinC1=CoutC1/2;
%轉換成複數座標

%各個連桿之座標設定,並以轉動平移公式計算,繪出圖形

arm1=[0;CinA1;CoutA1(1:10);L1+CoutA2(11:20);
L1+CinA2;L1+CoutA2(20);CoutA1(1)];
xx1=real(arm1);
yy1=imag(arm1);
x1=xx1*cosd(th1)-yy1*sind(th1);
y1=xx1*sind(th1)+yy1*cosd(th1);

arm1px=L1x*cosd(th1)-L1y*sind(th1);
arm1py=L1x*sind(th1)+L1y*cosd(th1);
line(x1,y1)
axis equal

arm2=[0;CinB1;CoutB1(1:10);L2+CoutB2(11:20);
L2+CinB2;L2+CoutB2(20);CoutB1(1)];
xx2=real(arm2);
yy2=imag(arm2);
x2=xx2*cosd(th2)-yy2*sind(th2)+arm1px;
y2=xx2*sind(th2)+yy2*cosd(th2)+arm1py;

arm2px=L2x*cosd(th2)-L2y*sind(th2)+arm1px;
arm2py=L2x*sind(th2)+L2y*cosd(th2)+arm1py;
line(x2,y2)
axis equal

arm3=[0;CinC1;CoutC1(1:10);L3/2-3i;
L3*4/5-2.5i+Cfinger(11:20);L3/2-2.2i+Cfinger(20);
L3*15/16-i+Cfinger(11:20);L3/2-0.2i+Cfinger(20);
L3+1.5i+Cfinger(11:20);L3/2+1.7i+Cfinger(20);
L3*9/10+3.5i+Cfinger(11:20);L3/3+3i+Cfinger(20);
L3*2/5+7.5i+Cthumb(1:10);L3/4+3i+Cthumb(10);
CoutC1(1)];
xx3=real(arm3);
yy3=imag(arm3);

x3=xx3*cosd(th3)-yy3*sind(th3)+arm2px;
y3=xx3*sind(th3)+yy3*cosd(th3)+arm2py;

line(x3,y3)
axis equal

作業5-1-3

第三小題

我的上手臂長33公分,下手臂長31公分,手掌長15公分

題目之theta1=90,theta2=-45,theta3=-30

>>body(33,31,15,90,-45,-30);

作業5-1-4

第四小題

%修改function body內容後如下

L1=33;L2=31;L3=15; %上手臂,下手臂,手掌的長度
theta1=-90; theta2=-45;theta3=-30; %題目圖示之角度輸入
dA1=10; %用以設定各個連桿連結點的直徑
dA2=6;
dB1=6;
dB2=4;
dC1=4;
dfinger=0.5; %用來繪製手指形狀
t=linspace(pi/2,2.5*pi,20);
Cfinger=dfinger*exp(j*t');
dthumb=0.8; %用來繪製拇指形狀
tt=linspace(0,2*pi,20);
Cthumb=dthumb*exp(j*tt');
L1x=L1; %設定連桿連結中心的初始座標
L1y=0;
L2x=L2;
L2y=0;
CoutA1=max(dA1/2,0.2)*exp(j*t'); %用來計算各連桿中心內外圓的直徑
CinA1=CoutA1/2;
CoutA2=max(dA2/2,0.2)*exp(j*t');
CinA2=CoutA2/2;
CoutB1=max(dB1/2,0.2)*exp(j*t');
CinB1=CoutB1/2;
CoutB2=max(dB2/2,0.2)*exp(j*t');
CinB2=CoutB2/2;
CoutC1=max(dC1/2,0.2)*exp(j*t');
CinC1=CoutC1/2;

x1=zeros(1,11);y1=zeros(1,11); %用來放置旋轉後之座標的矩陣
x2=zeros(1,11);y2=zeros(1,11);
x3=zeros(1,11);y3=zeros(1,11);
%各個連桿座標設定並設定以擦式模式之線繪出
arm1=[0;CinA1;CoutA1(1:10);L1+CoutA2(11:20);
L1+CinA2;L1+CoutA2(20);CoutA1(1)];
xx1=real(arm1);
yy1=imag(arm1);
h1=line(x1,y1,'erasemode','xor','color','r','linewidth',2);
x1=get(h1,'xdata');y1=get(h1,'ydata');
arm2=[0;CinB1;CoutB1(1:10);L2+CoutB2(11:20);
L2+CinB2;L2+CoutB2(20);CoutB1(1)];
xx2=real(arm2);
yy2=imag(arm2);
h2=line(x2,y2,'erasemode','xor','color','r','linewidth',2);
x2=get(h2,'xdata');y2=get(h2,'ydata');

arm3=[0;CinC1;CoutC1(1:10);L3/2-3i;
L3*4/5-2.5i+Cfinger(11:20);L3/2-2.2i+Cfinger(20);
L3*15/16-i+Cfinger(11:20);L3/2-0.2i+Cfinger(20);
L3+1.5i+Cfinger(11:20);L3/2+1.7i+Cfinger(20);
L3*9/10+3.5i+Cfinger(11:20);L3/3+3i+Cfinger(20);
L3*2/5+7.5i+Cthumb(1:10);L3/4+3i+Cthumb(10);
CoutC1(1)];
xx3=real(arm3);
yy3=imag(arm3);
h3=line(x3,y3,'erasemode','xor','color','r','linewidth',2);
x3=get(h3,'xdata');y3=get(h3,'ydata');
%以迴圈來進行旋轉
for n=0:1:10
th1=0;th2=0;th3=0; %清空,使各初始值為0
th1=theta1+n*2.5; %計算旋轉後的圖式角度
th2=theta2+n;
th3=theta3+n*2;

th1p=-th1; %計算旋轉後各水平角
th2p=th2-th1+180;
th3p=th2-th1+th3;

%各個連桿的旋轉平移
x1=xx1*cosd(th1p)-yy1*sind(th1p);
y1=xx1*sind(th1p)+yy1*cosd(th1p);
arm1px=L1x*cosd(th1p)-L1y*sind(th1p);
arm1py=L1x*sind(th1p)+L1y*cosd(th1p);

x2=xx2*cosd(th2p)-yy2*sind(th2p)+arm1px;
y2=xx2*sind(th2p)+yy2*cosd(th2p)+arm1py;
arm2px=L2x*cosd(th2p)-L2y*sind(th2p)+arm1px;
arm2py=L2x*sind(th2p)+L2y*cosd(th2p)+arm1py;

x3=xx3*cosd(th3p)-yy3*sind(th3p)+arm2px;
y3=xx3*sind(th3p)+yy3*cosd(th3p)+arm2py;

%輸出並繪製連桿
axis equal

axis([-25,25,-10,40]);
set(h1,'xdata',x1,'ydata',y1);
set(h2,'xdata',x2,'ydata',y2);
set(h3,'xdata',x3,'ydata',y3);

pause(0.01);

end;
%跳出迴圈
執行結果如下(畫面要等久一點才會出現動畫)