2007年4月7日 星期六

機動學hw5

part1








function body(L,theta,dd) %L=[L1 L2 L3] theta=[theta1 theta2 theta3]為一矩陣,dd為手臂寬度
L1xt=L(1)*cosd(-theta(1)); %以[0 0]為原點算出上臂的終點
L1yt=L(1)*sind(-theta(1));
L2xt=L1xt+L(2)*cosd(-theta(1)-180 + theta(2));%以上臂的終點算出下臂的終點
L2yt=L1yt+L(2)*sind(-theta(1)-180 + theta(2));
L3xt=L2xt+L(3)*cosd(-theta(1)-360 + theta(2)+theta(3));%以下臂的終點算出手掌的終點
L3yt=L2yt+L(3)*sind(-theta(1)-360 + theta(2)+theta(3));
X=[0 L1xt L2xt L3xt];%把所有的x點放入X矩陣
Y=[0 L1yt L2yt L3yt];%把所有的y點放入Y矩陣
clf;
for i=1:length(X)-1 %從i=1到第4個X的element減一
A=[X(i) Y(i)]; %把X和Y第i個element帶入
B=[X(i+1),Y(i+1)];
g=0.5+i/2; %上臂長為g=1 ,下臂g=0.5+2/2 手掌g=0.5+3/2
if nargin==2,dd=1;end; %如果只放入兩個elemet,則dd=1
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);%從pi/2到2.5*pi給予20個點
Cout=max(d/(2*g),0.2)*exp(j*t');Cin=Cout/2;%以複數形式畫圓cout畫大圓cin畫小圓
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
axis([-50 50 -10 50 ])%固定座標軸
end;


圖案製作



L1=35; %上臂長
L2=30; %下臂長
L3=10; %手掌長
theta1=-90; %角度
theta2=-45;
theta3=-30;
try1([L1 L2 L3],[theta1, theta2 ,theta3],10); %帶入function



動畫製作


主程式呼叫body function

for d=0:1:10 %d=0到10
theta1=-90+1.5*d;
theta2=-45+d;
theta3=-30+2*d;
body([35 30 10],[theta1 theta2 theta3],4);%呼叫body function
pause(0.5);%每0.5秒暫停依次
axis equal;
end;



part2
2-1
除了拇指以外,其它四指從手掌與指頭連接的地方算起有三個關節,因此有三個地方可以旋轉,但由於人體關節的受限,關節當指節與指節身直時,假設角度為一百八十度,彎曲時最小角度可以達 九十度,所以只能在九十度到一百八十度之間移動。但事手掌與指頭連接的第一個關節比較特殊, 你會發現第一節關節的手指頭可以做三百六十度的旋轉,當然關節上還是有所限制不可能無限度做大幅旋轉。由於要討論手指間關節的自由度,因此我們把手掌視為不可以動的連桿,但連接指頭的第一關節到第三關節都可以移動,根據古魯伯公式M=3(N-J-1)+total(f)=>M=3(4-3-1)+3=3,有四個連趕(包括手掌),有三個運動結,但我假設第一關節到第三關節都為旋轉(f=1),如果第一關節當球對的話(f=3),但假設都只能在平面運動的話都假設為旋對所以M=3有三個自由度,可以由三個指節做連桿運動。



2-2



把body function稍微改變一下,因為body function上臂、下臂、手掌有三個關節根手指一樣,因此只要稍微把主程式改過,就可以表現出手指最大的移動範圍 。


finger function 的主程式



f1j=linspace(-90,0, 20 ); %-90 到0設20個點
f1j2=linspace(180,90,20);
f1j3=linspace(180,90,20);
x=[1 -1 -1 1 1];
y=[0 0 -9 -9 0];
for t=1:1:4
if t==1 %當t==1執行食指的運動
for d=1:1:20
finger([2.5 2 3],[f1j(d) f1j2(d) f1j3(d)]);
patch(x,y,'r');
pause(0.1);
end;

elseif t==2%當t==2執行中指的運動
for d=1:1:20
finger([2.5 2.5 3],[f1j(d) f1j2(d) f1j3(d)]);
patch(x,y,'r');
pause(0.1);
end;

elseif t==3%當t==3執行無名指的運動
for d=1:1:20
finger([2 2 2.5],[f1j(d) f1j2(d) f1j3(d)]);
patch(x,y,'r');
pause(0.1);
end;

elseif t==4%當t==4執行小指的運動
for d=1:1:20
finger([2 1.5 2.5],[f1j(d) f1j2(d) f1j3(d)]);
patch(x,y,'r');
pause(0.1);
end;
end;
end;


2-3


根據手指的速度與加速度,假設手指速度固定而且手指的加速度是等加速度,因此可以較容易求出指頭的終端速度,由於每個人的手指長度不同,因此手指速度會不一樣,所以無法得知每個人投球時的指頭之間的速度,所以假設平均正常人能投時速一百公里的球,而且我們每個關節的相對速度和加速度會不一樣,因此我們考慮平均的速度和加速度,而且只考慮球真正被加速的時間,多餘的動作所花的時間應該排除,假設加速的時間為0.7秒,且投出時速100公里的球速。


速度   角速度   角加速度
食指  3.968kcm/s 529rad/s 755.7rad/s2
中指  3.968kcm/s 496rad/s 708.6rad/s2
無名指 3.968kcm/s 610rad/s 871.4rad/s2
小指  3.968kcm/s 661rad/s 994.2rad/s2

沒有留言: