2007年4月27日

4/25-第七次作業

作業七 廖婉婷 B94611040


*本人(4/19)有上課*


7-1

本題使用之函式:
function linkshape(A,B,dd)
% 繪出連桿外形
% 輸入參數為起始點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 [vec,dyadata] = dyad(rho,theta,td,tdd)
%由輸入參數:長度rho,起始角度theta,角速度td,角加速度tdd
%算出之vec為位置,速度及加速度之絕對值
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];
vec=[abs(sum(dyadata));angle(sum(dyadata))/d2g];





function dyad_draw(rho,theta,td,tdd)
%經function dyad算出速度/加速度對應值後
%以下為繪出各節速度/加速度之對應方位
clf;
[vec,data] = dyad(rho,theta,td,tdd);
x=[0;cumsum(real(data(:,1)))];y=[0;cumsum(imag(data(:,1)))];
for i=1:length(x)-1
linkshape([x(i) y(i)],[x(i+1) y(i+1)],1);
end
for k=1:length(rho)
x0=x(k+1);y0=y(k+1);
vx=x0+real(data(k,2));vy=y0+imag(data(k,2));
ax=x0+real(data(k,3));ay=y0+imag(data(k,3));
line([x0 vx],[y0 vy],'marker','s','linewidth',2);
line([x0 ax],[y0 ay],'marker','s','color','r','linewidth',3)
end
sdata=sum(data);
ss=[real(sdata(1)) imag(sdata(1))];
vv=[real(sdata(2)) imag(sdata(2))];
aa=[real(sdata(3)) imag(sdata(3))];
line([0 ss(1)],[0 ss(2)],'linestyle',':','linewidth',2)
axis equal;grid on
%繪出之圖紅色為各桿之加速度,藍色為速度,綠色為合速度



題目要求各桿之對應長度rho=[a, a+5, a-5]cm,a=(學號末一碼)+10;
對應起始角度theta=[0, 0, 0]度;
對應角速度為td=[0.2, 0.5, 0 .3]rad/s;
對應角加速度為tdd=[0, 0.1, 0.2]rad/s^2;

因此取a = 0+10 = 10
rho=[10,15,5]


以下為當t=[1 2 3 4 5]秒時,此端桿之對應方位
以迴圈跑時間t=1~5
並計算出隨時間變化之位置/速度/加速度變化量以表示其相對位置
也就是將位置,速度,加速度表示成時間函數
clear; clf;
% clean up environment before starting
a = 0+10;
LENGTH = [a, a+5, a-5];
ANGLE = [0 0 0];
VELOCITY = [0.2, 0.5, 0.3];
ACCEL = [0 0.1 0.2];

% initial state
dyad_draw(LENGTH, ANGLE, VELOCITY, ACCEL);
axis([-1 35 -1 30]);
text(3, 27, 'INITIAL STATE');
pause(1);

% start moving from 1s to 5s
for t = 1:5,
% redraw the graph each time
clf;
dyad_draw(LENGTH, ANGLE + (VELOCITY.*t) + (ACCEL.*0.5.*t^2), VELOCITY + (ACCEL.*t), ACCEL);
axis([-1 35 -1 30]);
text(3, 27, ['AFTER ' num2str(t) ' SECONDS']);
pause(1);
end;



<圖一>最初端桿之對應方位(點圖可看原圖)






<圖二>t=1s時端桿之對應方位(點圖可看原圖)






<圖三>t=2s時端桿之對應方位(點圖可看原圖)






<圖四>t=3s時端桿之對應方位(點圖可看原圖)






<圖五>t=4s時端桿之對應方位(點圖可看原圖)






<圖六>t=5s時端桿之對應方位(點圖可看原圖)





7-2

function ANS = angle_velocity(INITIAL, ACCEL, TIME)
for i = 1:length(TIME),
ANS(i,:) = INITIAL + (ACCEL .* TIME(i));
end;


clear; clf;
VELOCITY = [0.2, 0.5, 0.3];
ACCEL = [0 0.1 0.2];
for i = 1:3,
T(i,:) = 0:0.1:5;
end;

% v-t graph
VELOCITY_POINT = angle_velocity(VELOCITY, ACCEL, 0:0.1:5);
subplot(2,1,1), plot(T',VELOCITY_POINT);
axis([0 5 0 1.5]);
title('速度與時間關係');
xlabel('time');
ylabel('velocity');
legend('10cm', '15cm', '5cm', 'Location', 'Best');

% a-t graph
subplot(2,1,2), plot([0 0 0; 5 5 5], [0 0.1 0.2; 0 0.1 0.2]);
axis([0 5 -0.3 0.3]);
title('加速度與時間關係');
xlabel('time');
ylabel('acceleration');
legend('10cm', '15cm', '5cm', 'Location', 'Best');



速度/加速度與時間t之關係圖(點圖可看原圖):




7-3

4/25-第六次作業



作業六 廖婉婷 b94611040


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

6.1-1

(點圖可看原圖)
桿--桿號可見圖上標示,共13桿,其中需留意的是:
兩個接地桿視為同一桿(桿1)
右上角與地接觸之滑塊也算一桿(桿8)
需小心槽中梢(桿13)部份,由於其兩端也與結點連接,故也算作是一桿

結--要注意圖上標示MNPQRST的部份為共結之情形,分別為:
M處與桿2 3 4連接,故為(3-1)=2結
N處與桿3 5 6連接,故為(3-1)=2結
P處與桿4 5 10連接,故為(3-1)=2結
Q處與桿6 7 9連接,故為(3-1)=2結
R處與桿10 11 12連接,故為(3-1)=2結
S處與桿9 11 13連接,故為(3-1)=2結
T處與桿1 12 13連接,故為(3-1)=2結

桿8部分有一滑塊,屬稜柱結,連結度為1
而S處槽中梢,連結度為2
故總結數J = 2(正常結) + 2*7(MNPQRST七處,每處分別為2) + 1(滑塊) = 17

由古魯伯公式--M = 3(N-J-1) + fi = 3(13-17-1) + 18 = 3
(M = 可動度,即系統自由度; N = 連桿總數; J = 運動結總數; fi = 第i運動結之連結度)



6.1-2
function [df] = gruebler(nlink,jointype)
%輸入參數為總桿數nlink及各結數量jointype
%輸出函數為計算後之可動度值
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(13,[15 1 1 ])

df =

3
%由函式跑出的可動度數值



6.1-3
左邊M處之滑塊因未與地面接觸,因此可視為一般旋轉結,與圖中其他正常結(旋轉結)一樣連結度為1,也就是只能作旋轉
而右上角之滑塊因為與地面接觸,視為一滑塊結,連結度為2,亦即可同時作軸旋轉及滑塊移動
而其中因滑塊部份有與地面接觸,故總結數須增加1
至於S部份之槽中梢,因運動結在滑槽中可同時移動和旋轉,因此連結度為2





6.2-1

(點圖可看原圖)
由圖上可以看到總共有三個球結(N,Q,R),兩個旋轉結(M,P)及一個圓柱結(S),
每個球結之自由度為3
每個旋轉結自由度為1
每個圓柱結自由度為2
因此總自由度我們可以得到3*3 + 1*2 + 2 = 13


6.2-2
於本圖中,我們得到總桿數N = 6 (需注意左下角接地觸與桿1視為同一桿)
總結數J = 6
總自由度f = 13

在三度空間運動中,每一連桿有六個自由度
故由古魯伯公式: M = 6(6-6-1) + 13 = 7 整個機構可以動


6.2-3
>> df = gruebler(6,[2 0 0 3 1])

df =

7

%由函式跑出之可動度,值與古魯伯計算出來者相同




6.2-4
但要注意的是,由於球結存在,部份連桿會有自轉運動,因此各須減掉一個自由度(此稱惰性自由度)
此處共有兩桿會自轉(如下圖橘色箭頭標示)也就是實際之可動度需減2 =>M = 7-2 = 5
由於惰性自由度為該桿之自轉運動,對整個機構的運動行為並未有幫助
因此在計算自由度時須將其減去

(點圖可看原圖)
經過比較,我們可以發現由於各結之旋轉方位產生共線之緣故,產生了惰性自由度,
但是此考量並未納入在公式中,因此需另外用觀察法以補公式計算自由度之不足



6.3-1
在一四連桿組中,若依其桿長可設定標示如:
g=最長桿之長度, s=最短桿之長度, p.q中間長度桿之長度

當最短桿與最長桿之和小於其他兩桿之和,則至少有一桿可為旋轉桿
此稱為葛拉索第一類型(葛拉索型機構) : s+g < p+q

若最短桿與最長桿之和大於其他兩桿之和,則所有三個活動連桿必屬搖桿或稱為參搖桿機構
此稱葛拉索第二類型(非葛拉索型機構) : s+g > p+q

葛拉索型之特殊狀況(或稱第三型)--即最短桿與最長桿之和等於其他兩桿之和
s+g = p+q



6.3-2
1. 7+4 = 6+5 : 第三型

>>ans = grashof(1,[4 5 6 7])
ans = Neutral Linkage

2. 8+3.6 > 5.1+4.1 : 非葛拉索型

>>ans = grashof(1,[3.6 4.1 5.1 8])
ans = Non-Grashof Linkage

3. 6.6+3.1 <>>ans = grashof(1,[3.1 4.7 5.4 6.6])
ans = Double-Crank Linkage



6.3-3
葛拉索型:
1 若鄰近最短桿之桿為基桿時,則此四連桿屬曲柄搖桿型。
2 若最短桿為基桿時,則基桿兩端之連桿為雙曲柄型。此時輸入桿若為等轉速,
輸出雖然與輸入同方向,但其速率將會因角位移而產生變化。
3 若與最短桿相對應之桿為基桿時,可以得到雙搖桿機構。

非葛拉索型
無論哪一桿作為基桿,此四連桿系均屬於雙搖桿型,因為任何桿均無法產生完整的迴轉運動。


若要將三組連桿皆改為葛拉索型,改變他們的長度以符合葛拉索機構之要求即可。



6.3-4
function ans=grashof(ground_no,linkage)

ground=linkage(ground_no);
link=sort(linkage);% sorting the links
ig=find(linkage==link(1));
if link(1)+link(4)>link(3)+link(2),
ans='Non-Grashof Linkage';
elseif link(1)+link(4)==link(3)+link(2)
ans='Neutral Linkage';
elseif link(1)==ground,
ans='Double-Crank Linkage';
else
switch ig
case 1
im=3;
case 2
im=4;
case 3
im=1;
case 4
im=2;
end
if ground==linkage(im)
ans='Double-Rocker Linkage';
else
ans='Crank-Rocker Linkage';
end
end



6.3-5
上述三組不是葛拉索機構者為第一和第二組,可以由縮短其最長/最小桿之長度,
亦或是增長中間兩桿之長度,使最長最短桿之和小於其他兩桿之和即可,則就至少有一桿可作旋轉桿

2007年4月12日

4/11-第五次作業

作業五 b94611040 廖婉婷

5-1-1
以下為繪製上下手臂外形之函式:
參考講義上連桿之linkshape函式
joint處修正為僅畫外圓
function arm(A,B,d)
d=abs(d);
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 d>0,
P=[Cout;Cout(1:10);D+Cout(11:20);D+Cout;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;

以下為繪製手掌外形之函式:
參考之前講義linkshape函式
手指的部份另外繪出
故手指長度需為其中一項input
function draw_palm(A,B,d,f)
d=abs(d);
AB=(B(1)+j*B(2))-(A(1)+j*A(2));
D=abs(AB);th=angle(AB);
t=linspace(pi/2,2.5*pi,17);
Cout=max(d/2,0.2)*exp(j*t');Cin=Cout/2;
if d>0,
P=[Cout;Cout(1:9);
D+Cout(9);D+Cout(9)+f;D+Cout(9);D+Cout(9:11);
D+Cout(11);D+Cout(11)+f;D+Cout(11);D+Cout(11:13);
D+Cout(13);D+Cout(13)+f;D+Cout(13);D+Cout(13:15);
D+Cout(15);D+Cout(15)+f;D+Cout(15);D+Cout(15:17);
D+Cout(17);D+Cout(17)+f;D+Cout(17);
D+Cout;D+Cout(9);D+Cout(17);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([0 100 -50 50]);
axis equal;
L1 = 30; %假設上手臂,下手臂,手掌長為30cm,25cm,15cm
L2 = 25;
L3 = 15;
theta1 = 45; %假設手臂,手掌間角度之值
theta2 = 235;
theta3 = 200;
a = L1*cosd(theta1);
b = -L1*sind(theta1);
c = a+L2*cosd(theta2-theta1-180);
d = b+L2*sind(theta2-theta1-180);
theta4 = theta3+theta2-theta1-360;
e = c+L3*cosd(theta4)/2;
f = d+L3*sind(theta4)/2;
arm1 = [0 0;a b]; %上手臂之座標組合
arm2 = [a b;c d]; %下手臂之座標組合
palm = [c d;e f]; %手掌之座標組合
arm(arm1(1,:), arm1(2,:), 7); %繪出上手臂
arm(arm2(1,:), arm2(2,:), 5); %繪出下手臂
finger =L3/2;
%由於function draw_palm是將手掌/手指長度分別採用繪出
%故需另外計算手指長度
%此處假設手指長約等於整個手掌的一半
draw_palm(palm(1,:), palm(2,:), 8,finger);
%繪出整個手掌


<圖>以自己尺寸輸入之手臂圖




5-1-2
此題是將上一小題之主繪圖指令置於function body中:
function body(L1,L2,L3,theta1,theta2,theta3)
axis equal;
a = L1*cosd(theta1);
b = -L1*sind(theta1);
c = a+L2*cosd(theta2-theta1-180);
d = b+L2*sind(theta2-theta1-180);
theta4 = theta3+theta2-theta1-360;
e = c+L3*cosd(theta4)/2;
f = d+L3*sind(theta4)/2;
%由輸入之手臂手掌尺寸,計算出各端點座標位置
arm1 = [0 0;a b]; %手臂之座標連結
arm2 = [a b;c d];
palm = [c d;e f]; %手掌之座標連結
arm(arm1(1,:), arm1(2,:), 7);
arm(arm2(1,:), arm2(2,:), 5);
%呼叫前一小題function arm繪出手臂
finger =L3/2;
draw_palm(palm(1,:), palm(2,:), 8,finger);
%呼掉函式繪出手掌
%繪出整支手臂之function結束




5-1-3
axis([0 100 -50 50]);
body(30,25,15,90,-45,-30);


<圖>由給定長度,角度繪出之手臂位置




5-1-4
for i = 1:6,        % 動畫重複六次
for k = 1:1:10,
clf; %清除畫面,繼續指令
theta1i = -90 + 1.5*k;
%theta1i在-90~-75度間分十等分運動 因此每次動1.5度
theta2i = -45 + k;
%theta2i在-45~-35度間分十等分運動 因此每次動1度
theta3i = -30 + 4*k;
%theta3i在-30~10度間分十等分運動 因此每次動4度
body(30, 25, 15, theta1i, theta2i, theta3i);
%分別繪出每一等份之手臂位置
pause(0.2);
end;
end;


<動畫>由給定範圍手臂運動之情形



5-2-1
首先,手指的三個關節可視為旋轉節,連接相當於連桿之手指及手掌
其中指尖部份沒有再作連接動作,因此整個手指可視為一開放型運動結
至於自由度部份,平面上每個運動物體最多會有3個自由度
由於每個旋轉節會造成兩個拘束度
因此總自由度為3*3-2*3 = 3
以古魯伯公式計算M = 3(4-1)-(3*3-3) = 3 結果相同
此三個自由度分別代表三個關節的旋轉





5-2-2
手指採用與前面function arm的繪製方法相同
但為了固定住顯示範圍
故另外複製成fingerpart函式作修改
function finger_part(A,B,d)
d=abs(d);
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 d>0,
P=[Cout;Cout(1:10);D+Cout(11:20);D+Cout;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([-1 12 -12 12]);
%axis equal;


由於手指四指之運動方式皆相同
故以一指作代表,以下為繪出手指外形之函式:
function finger(L1,L2,L3,theta1,theta2,theta3)
axis equal;
a = L1*cosd(theta1-90); %計算出每一指間joint的座標位置
b = L1*sind(theta1-90);
c = a + L2*sind(360-theta2-theta1);
d = b + L2*cosd(360-theta2-theta1);
e = c + L3*sind(theta3-360+theta2+theta1);
f = d - L3*cosd(theta3-360+theta2+theta1);
finger_part([0 0],[a b],1); %分別繪出每一節指頭
finger_part([a b],[c,d],1);
finger_part([c d],[e f],1);

以下為展示手指極限位置之方程式:
L1 = 4; L2 = 2.5; L3 = 2; %假設各節長度以自己尺寸輸入
for i = 0:5:90,
clf;
finger(L1, L2, L3, 180-i, 180, 180);
%第一關節先作轉動 為極限範圍180~90度
pause(0.05);
end;
for i = 0:5:90,
clf;
finger(L1, L2, L3, 90, 180-i, 180);
%再換第二關節轉動 範圍同樣180~90度
pause(0.05);
end;
for i = 0:5:90,
clf;
finger(L1, L2, L3, 90, 90, 180-i);
%第三關節轉動 範圍180~90度
pause(0.05);
end;


<動畫>依照指定角度範圍做運動之手臂



5-2-3
以下為繪出手指各節速度/加速度之函式:
function [vec,dyadata] = dyad(rho,theta,td,tdd)
theta=theta(:);rho=rho(:);
n=length(rho);
if nargin<4, tdd="zeros(size(rho));" nargin="=" td="ones(size(rho));" td="ones(size(rho))*td;end;" tdd="ones(size(rho))*tdd;end;" td="td(:);tdd=" d2g="pi/180;" tt="exp(i*theta*d2g);" pp="rho.*tt;vv=" aa="-pp.*td.^2+i*pp.*tdd;" dyadata="[pp" vec="[abs(sum(dyadata));angle(sum(dyadata))/d2g];">

以下為繪出手指各節速度/加速度之函式:
function dyad_draw(rho,theta,td,tdd)
% Inputs: rho:length of links
% theta:incling angles, deg.
% td:angular velocity, rad/s
% tdd:angular acceleration, rad/s^2

clf;
[vec,data] = dyad(rho,theta,td,tdd);
x=[0;cumsum(real(data(:,1)))];y=[0;cumsum(imag(data(:,1)))];
for i=1:length(x)-1
linkshape([x(i) y(i)],[x(i+1) y(i+1)],1);
end
for k=1:length(rho)
x0=x(k+1);y0=y(k+1);
vx=x0+real(data(k,2));vy=y0+imag(data(k,2));
ax=x0+real(data(k,3));ay=y0+imag(data(k,3));
line([x0 vx],[y0 vy],'marker','s','linewidth',2);
line([x0 ax],[y0 ay],'marker','s','color','r','linewidth',3)
end
sdata=sum(data);
ss=[real(sdata(1)) imag(sdata(1))];
vv=[real(sdata(2)) imag(sdata(2))];
aa=[real(sdata(3)) imag(sdata(3))];
line([0 ss(1)],[0 ss(2)],'linestyle',':','linewidth',2)
axis equal;grid on

dyad_draw([4 2.5 2],[90 135 160],[.5 .5 .5],0)
%此處手指長度以自己尺寸為輸入
%設每一角度與座標軸(逆時鐘為正)呈90,135,160度,且角速度相等

一物體作曲線運動時,與其路徑相切會有切線速度/加速度,改變其運動快慢
同樣在與路徑垂直方向上會有法線速度/加速度,用於改變其運動方向
由於手指自由度為3,只能作旋轉運動,故只存在法線速度/加速度
由圖上即可見紅色為各桿之法線加速度,藍色為法線速度


<圖>手臂運動之速度,加速度分析圖