顯示具有 滑塊運動分析 標籤的文章。 顯示所有文章
顯示具有 滑塊運動分析 標籤的文章。 顯示所有文章

2007年5月18日 星期五

Homework 10

作業10
本週(5/17)有來上課
b94611001 歐陽太閒

一,速度與加速度



本次作業需要分析速度與加速度,故可參考網路講義第三章和第六章,講義中有三種作法化成向量:
1.複數法
R=r*e^(jθ)
2.尤拉法
R=r*(cosθ+jsinθ)
以下採用較易在直角座標系分析的尤拉法進行分析

1.1位置


當一桿R以某特定點M等角速度ω迴轉時,其端點P之速度方向
我們可考慮一桿R,有水平角度θ,
θ=ω*t + 0.5*α*t^2 +a
其尤拉向量式如下

R = r*cosθ + j*r*sinθ

因此我們可以寫出下列程式碼:

M=[0 0];
x=M(1)+ r*cos(theta) %求出R位置的x,y分量
y=M(2)+ r*sin(theta)
plot([M(1) x],[M(2) y]) %畫出

例如:角度=60,r=5

d2r=pi/180;
theta=60;
r=5;
M=[0 0];
x=M(1)+ r*cos(theta); %求出R位置的x,y分量
y=M(2)+ r*sin(theta);
plot([M(1) x],[M(2) y]); %畫出位置
%或者
%linkshape([M(1) M(2)],[x y]);

或者使用1.4的函數

>>mec_alys(5,60,0,0,[0 0])

x =
2.5000

y =
4.3301


結果如圖




1.2速度(以下微分假設r長不變)



令α=0,a=0而求桿端速度則需將向量微分(ds/dt),即可得
v = -r*ω*sinθ + j*r*ω*cosθ
微積分厲害之處在此顯現,速度的水平分量其中即已包含逆時針旋轉時和桿水平向量相反的符號,不必進行額外的處理,
只需要平移即可,因此其方向為:

u=-sinθ + jcosθ

因此我們可以寫出以下的程式碼:
omg為角速度,
例如:角度=60,r=5,角速度=1

theta=60*d2r
r=5
omg=1
vx= -r*sin(theta)*omg %將位置向量微分算出速度向量
vy= r*cos(theta)*omg
u= -sin(theta)+i*cos(theta) %速度方向
plot([M(1) x],[M(2) y])
%或者
%linkshape([M(1) M(2)],[x y]);
plot([x x+vx],[y y+vy],'color','r') %平移後繪出
text(x+vx,y+vy,['u=' num2str(-1*sin(theta),'%6.1f') '+i' num2str(cos(theta),'%6.1f')]) %顯示


或者使用1.4的函數

>>mec_alys(5,60,1,0,[0 0])
x =
2.5000
y =
4.3301
vx =
-4.3301
vy =
2.5000
u =
-0.8660 + 0.5000i %方向



1.3加速度



我們要求加速度則需將速度微分(dv/dt)並整理後可得

a=(-rωcosθ+rαsinθ)+j(-rωsinθ+rαcosθ)

因此可寫出以下程式

ax=-1*r*(omg^2)*cos(theta) + r*alpha*sin(theta)
ay=-1*r*(omg^2)*sin(theta) + r*alpha*cos(theta)
plot([x+vx x+vx+ax],[y+vy y+vy+ay],'color','r') %平移後繪出
if ax<0.001; %防止除零
ax=0.001;
end;
dir=atan(ay/ax); %求方向
au=cos(dir) + i*sin(dir);

例如:角度=60,r=5,角速度=1,角加速度=1.2

>>mec_alys(5,60,1,1.2,[0 0])
x =
2.5000
y =
4.3301
vx =
-4.3301
vy =
2.5000
u =
-0.8660 + 0.5000i %角速度方向
ax =
2.6962
ay =
-1.3301
au =
0.8968 - 0.4424i %角加速度方向


結果如圖



1.4化成函數


因此我們得到

R = r*cosθ + j*r*sinθ
v = -r*ω*sinθ + j*r*ω*cosθ
a = (-rω2cosθ+rαsinθ)+j(-rω2sinθ+rαcosθ)

而其方向為

uv=-sinθ + jcosθ
av= cos(atan((-rω2sinθ+rαcosθ)/-rω2cosθ+rαsinθ))+sin(atan((-rω2sinθ+rαcosθ)/-rω2cosθ+rαsinθ))

故我們可以合併以上分析(1.1,1.2,1.3)寫出以下函數:


程式架構:
1.資訊
2.求位置
求速度,計算方向
求加速度,計算方向
3.繪製

function mec_alys(l,theta,omega,alpha,Ori)
%作者 b94611001 歐陽太閒
%l=桿長,theta=角度,omega=角速度,ori=原點
title('作業10 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
axis equal;
d2g=pi/180; %角徑轉換
r=l; %桿長
M=Ori; %原點
omg=omega; %角速度
hold on;
theta=theta*d2g;
costh=cos(theta);
sinth=sin(theta);
x=M(1)+ r*costh
y=M(2)+ r*sinth
%求速度
nsinth=-1*sinth;
vx= r*nsinth*omg
vy= r*costh*omg
u=nsinth+i*costh %速度方向
%加速度
ax=-1*r*(omg^2)*costh + r*alpha*sinth
ay=-1*r*(omg^2)*sinth + r*alpha*costh
if ax<0.001; %防止除零
ax=0.001;
end;
dir=atan(ay/ax); %求方向
au=cos(dir) + i*sin(dir)
%繪出
linkshape([M(1) M(2)],[x y]); %畫桿
plot([x x+vx],[y y+vy],'color','r','marker','d'); %畫速度
plot([x+vx x+vx+ax],[y+vy y+vy+ay],'color','g','marker','d') %畫加速度
text(x+vx,y+vy,['u=' num2str(nsinth,'%6.1f') '+i' num2str(costh,'%6.1f')]);
text(x+vx+ax,y+vy+ay,['u=' num2str(cos(dir),'%6.1f') '+i' num2str(sin(dir),'%6.1f')]);
%

1.5原點以特定速度,加速度移動



即特定點M以等速水平運動,P速度與加速度方向,和M有加速度時P速度與加速度方向

令原點移動速度為vM=vmx+j*vmy,aM=amx=j*amy
即可利用之前得到的分析結果

Rm = r*cosθ+vmx*t + j*r*sinθ+vmy*t
vm = -r*ω*sinθ+vmx + j*r*ω*cosθ+vmy
am = (-rωcosθ+rαsinθ+amx) +j(-rω2sinθ+rαcosθ+amy)
因此其方向為
uvm=cos(atan((r*ω*cosθ+vmy)/(-r*ω*sinθ+vmx)))+sin(atan((r*ω*cosθ+vmy)/(-r*ω*sinθ+vmx)))
avm= cos(atan((-rωsinθ+rαcosθ)/-rωcosθ+rαsinθ))+j*sin(atan((-rωsinθ+rαcosθ)/-rωcosθ+rαsinθ))


因此我們可以改寫函數如下:
程式架構:
1.資訊
2.求位置
求速度,計算方向
求加速度,計算方向
3.繪製

function mec2_alys(l,theta,omega,alpha,Ori,Oriv,Oria) %分析含有原點移動的參數系統
%作者 b94611001 歐陽太閒
%l=桿長,theta=角度,omega=角速度,alp=角加速度,ori=原點,Oriv=M速度,Oria=M加速度
title('作業10 作者:歐陽太閒 b94611001'); %資訊
xlabel('x-axis cm');
ylabel('y-axis cm');
axis equal;
d2g=pi/180; %角徑轉換
r=l; %桿長
M=Ori; %原點
omg=omega; %角速度
hold on;
theta=theta*d2g;
costh=cos(theta);
sinth=sin(theta);
x=M(1)+ r*costh
y=M(2)+ r*sinth
%求速度
nsinth=-1*sinth;
vx= r*nsinth*omg +Oriv(1)
vy= r*costh*omg +Oriv(2)
dirv=atan(vy/vx); %求方向
vu=cos(dirv) + i*sin(dirv)
%加速度
ax=-1*r*(omg^2)*costh + r*alpha*sinth + Oria(1)
ay=-1*r*(omg^2)*sinth + r*alpha*costh + Oria(2)
if ax<0.001; %防止除零
ax=0.001;
end;
dira=atan(ay/ax); %求方向
au=cos(dira) + i*sin(dira)
%繪出
linkshape([M(1) M(2)],[x y]); %畫桿
plot([x x+vx],[y y+vy],'color','r','marker','d'); %畫速度
plot([x+vx x+vx+ax],[y+vy y+vy+ay],'color','g','marker','d') %畫加速度

例如角度=60,r=5,角速度=1,角加速度=1.2,vM=5+j5,aM=1+j1

mec2_alys(5,60,1,1.2,[0 0],[5 5],[1 1])

d2g =
0.0175
x =
2.5000
y =
4.3301
vx =
0.6699
vy =
7.5000
vu =
0.0890 + 0.9960i
ax =
3.6962
ay =
-0.3301
au =
0.9960 - 0.0890i

結果如圖




由此可知道結果(方向)和不考慮原點M移動有極大不同
以下為疊加vM=0,aM=0的圖形結果


1.6四連桿的運動點P與Q速度與加速度方向與固定桿MR之兩端點之關係
由於本次作業著重於相對速度及加速度的分析,因此同樣利用

[RM]= [AM]= [CM]=
-r3cosθ3 r4cosθ4 ω3 r2ω2cosθ2
-r3sinθ3 r4sinθ4 ω4 r2ω2sinθ2[RM][AM] = [CM]

之關係式求得各桿角速度ω1,ω2,ω3,ω4
注意:此處定義和講義的P,Q定義順序相反,如圖


而我們在前面的分析為M,P,Q,R,以本次分析為準


可求得點P、Q、R等之速度向量,即:

Vp=[r2'+jr2ω2]ejθ2
=jr2ω2(cosθ2+jsinθ2) (1)
Vq=[r2'+jr2ω2]ejθ2+[r3'+jr3ω3]ejθ3
=jr2ω2(cosθ2+jsinθ2)+jr3ω3(cosθ3+jsinθ3) (2)
Ap=[jr2α2-r2ω22]ejθ2
=[jr2α2-r2ω22](cosθ2+jsinθ2) (3)
Aq=[jr2α2-r2ω22]ejθ2 + [jr3α3-r3ω32]ejθ3
=[jr2α2-r2ω22](cosθ2+jsinθ2) + [jr3α3-r3ω32](cosθ3+jsinθ3) (4)

而本次的分析則為(標記上桿序):

桿OP即為1.2,1.3的原點M無速度,加速度桿
Vp=-r*ω*sinθ2 + j*r*ω*cosθ2 (5)
Ap=(-rω2cosθ2+rαsinθ2)+j(-rω2sinθ2+rαcosθ2) (6)
而桿PQ即為1.5的原點M有速度(即p的速度),加速度桿,因此
vm = -r*ω*sinθ+vmx + j*r*ω*cosθ+vmy (7)
Am = (-rωcosθ+rαsinθ+amx) +j(-rω2sinθ+rαcosθ+amy) (8)
將vmx,vmy,vax,vay以vpx,vpy,apx,apy帶入
vq = -r*ω*sinθ3+r*ω*sinθ2 + j*(r*ω*cosθ3+r*ω*cosθ2) (9)
Aq = (-rωcosθ3+rαsinθ3-rω2cosθ2+rαsinθ2) +j(-rω2sinθ3+rαcosθ3-rω2sinθ2+rαcosθ2) (10)


將其展開可以發現有以下關係:
(1)=(5)
(2)=(9)
(3)=(6)
(4)=(10)


Vp=-r*ω*sinθ2 + j*r*ω*cosθ2 (5)
Ap=(-rω2cosθ2+rαsinθ2)+j(-rω2sinθ2+rαcosθ2) (6)
vq = -r*ω*sinθ3+r*ω*sinθ2 + j*(r*ω*cosθ3+r*ω*cosθ2) (9)
Aq = (-rωcosθ3+rαsinθ3-rω2cosθ2+rαsinθ2) +j(-rω2sinθ3+rαcosθ3-rω2sinθ2+rαcosθ2) (10)

其方向即為P點對於M(V=0,A=0)的速度與加速度和我們之前所分析的作業8之f4bar.m之分析結果完全相同
故我們可以得知
本次作業和第八次作業有以下共通之處:
1.雖然分析路徑不同,作業八採用的f4bar乃為利用複數法一次將所有值算出,而本次做的則以極座標化為直角座標系的方法(尤拉),將其分析,但

其代數運算轉換後,可以知道兩者是殊途同歸,分析出來的Vp,ap,Vq,aq都是相同的,只是其中q是以相對運動座標系中的旋轉剛體分析出來.
2.其計算,繪圖結果皆同(程式碼計算結果)


pvx =
21.2132
pvy =
21.2132
qvx =
4.1101
qvy =
-24.4963
pax =
-212.1320
pay =
-212.1320
qax =
-1.8712e+003
qay =
-439.0737


二,曲柄滑塊連桿六點瞬心



以下程式利用老師的move4centros為基礎進行修改,可計算在不同曲柄角度時的各桿位置座標
並找尋六點瞬心與曲柄角間之關係.

瞬心之位置須用速度兩點連線之延伸線,可用於求系統上任意點的速度或角速度等,按講義的說法,需按其位置比例求出座標
其實即一個相似三角形求對應位置的程式如下:

因此瞬心分析如下:

function [P,ff]=Xsect(a1,a2,b1,b2)
a1x=real(a1);a1y=imag(a1);a2x=real(a2);a2y=imag(a2);
b1x=real(b1);b1y=imag(b1);b2x=real(b2);b2y=imag(b2);
A=[(a2y-a1y) -(a2x-a1x); (b2y-b1y) -(b2x-b1x)]; %相對座標
determinant=abs(det(A)); %行列式值
if determinant > 10^(-10) %if matrix is not singular %分別處理不同矩陣情況
B=[(a2y-a1y)*a1x-(a2x-a1x)*a1y;...
(b2y-b1y)*b1x-(b2x-b1x)*b1y];
s=A\B; P=complex(s(1),s(2));ff=0; %化為複數型
else % Locate the intersection when the matrix is singular
xx= 10^10;
angle = atan2((a2y-a1y),(a2x-a1x));
P=complex(xx,xx*tan(angle));ff=1;
end


因此可以利用此程式進行瞬心的找尋,
程式結構如下:
1.防呆裝置
2.找邊界
3.建立矩陣和分割點等前置工作
4.代入Xsect
5.找邊界並用sldlink產生資料存入draw4link
6.繪製瞬心軌跡
7.進入for-loop 實際從暫存器中取出資料繪圖

注意:
本程式修改自movef4centrosm,由於其中使用f4bar.m輸出之資料進行運算,但此輸出的矩陣和本次使用的sldlink有所不同,因此需修改輸出矩陣中取得的項位置.

因此測試

>>movesldcentros([0 100 100 0],0,1,0,1,0,5,100)
共可找到六個瞬心,曲桿及滑塊瞬心位於無窮遠.




function movesldcentros(r,th1,td2,tdd2,sigma,driver,ntimes,npts)
%本程式參考movef4centros(r,th1,td2,tdd2,sigma,driver,ntimes,npts)建立
%b94611001 歐陽太閒
%function movef4centros(r,th1,td2,tdd2,sigma,driver,ntimes,npts)
% r: row 滑塊桿資料
% th1: 座標角
% td2,tdd2:角速度
% sigma: 組合模式
% driver: 驅動桿
% ntimes: 迴圈次數
% npts: 分割細緻度

%
%-----------------------------------------------------
clf;
if nargin<10, ntimes=3;npts=100;end; %防呆
figure(1);
[Qstart, Qstop]=sld_angle_limits(r,th1,driver) %先找邊界
npoint=abs(npts);
th2=linspace(Qstart,Qstop,npoint);%分割
val=zeros(6,npoint); %6*npts建立矩陣以存值
for k=1:npoint,
if k>(npoint/2) %克服組合模式sigma=1,=-1的問題
[vr b]=sldlink(r,th1,th2(k),td2,tdd2,sigma,driver); %
else
[vr b]=sldlink(r,th1,th2(k),td2,tdd2,-1*sigma,driver); %
end
% | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
% I | r1 | t1 | td1 | tdd1 | r1' | Vq | |Vq|| ThVq |
% II | r2 | t2 | td2 | tdd2 | r1" | Vp | |Vp|| ThVp |
% III| r3 | t3 | td3 | tdd3 | Q2 | Aq | |Aq|| ThAq |
% IV | r4 | t4 | td4 | tdd4 | P3 | Ap | |Ap|| ThAp |
[pa1,f1]=Xsect(vr(1,1),vr(2,1),vr(4,1),vr(4,1)+10i); %代入Xsect計算瞬心
[pa2,f2]=Xsect(vr(4,1),vr(2,1),vr(1,1),vr(1,1)+10i);
val(1:3,k)=[vr(1,1);vr(2,1);vr(1,1)+vr(4,1)];
val(4:5,k)=[pa2;pa1];
end
%-----------------------------------------------------
x=real(val);y=imag(val); %加入邊界值計算,由於沒有sldlimis,故直接引入sld_angle_limits
[Qstart, Qstop]=sld_angle_limits(r,th1,driver)
[values b]=sldlink(r,th1,Qstart,0,0,1,driver)
if b==1, %可成功組合時
h=draw4link(values,driver); %存入draw4link
line(x(5,:)',y(5,:)','color','r','linestyle','-');
line(x(4,:)',y(4,:)','color','b','linestyle','-.');
range=([1.5*min(min(x(1:3,:))) 2*max(max(x(1:3,:))),...
1.5*min(min(y(1:3,:))) 2*max(max(y(1:3,:)))]);
%axis([-30 30 -30 30]);
axis equal;
grid off;
title('作業10 作者:歐陽太閒 b94611001'); %資訊
%-----------------------------------------------------
for i=2:4,set(h(i),'erasemode','xor','linewidth',6);end %繪圖
h0=line('xdata',[],'ydata',[],'erasemode','xor','color','k','marker','o','linestyle',':');
i=0;s=-1;axis off;
for m=1:ntimes %計算回圈數
s=-s;
if abs(Qstop-Qstart-360)<1,i=0;s=1;end;
while 1,
i=i+s;
if i>npoint|i==0,break;end;
set(h(2),'xdata',[0 x(2,i)], 'ydata',[0 y(2,i)]);%crank
set(h(3),'xdata',[x(2,i) x(3,i)], 'ydata',[y(2,i) y(3,i)]);%coupler
set(h(4),'xdata',[x(1,i) x(3,i)], 'ydata',[y(1,i) y(3,i)]);%Rocker
set(h0,'xdata',[0 x(5,i) x(3,i) x(4,i) x(1,i)],'ydata',[0 y(5,i) y(3,i) y(4,i) y(1,i)]);
drawnow; %自暫存器讀出
pause(0.1);
end
end % for m loop
%-----------------------------------------------------
end


心得:本次作業第一部份偏重於分析,因此我們有機會能深入的結合機動與動力和微積分的知識剖析多桿系統之運動資訊,而第二部份則利用製圖法求得瞬心,雖然其中為了調整輸出矩陣等問題花了很多時間,但其成果亦相當有趣.

2007年5月3日 星期四

Homework 9

Homework 9 b94611001 歐陽太閒
本週(5/3)有來上課,組別A

於題目中可得:
曲桿長Rcm , 連桿Lcm,滑塊之偏置量為10cm,R=10+1=11,L=R+5=16
無初始速度或加速度,
故可得以下參數:(單位cm)
r(1) =固定桿 =會自行改變設0
r(2) =曲桿 =11
r(3) =結合(連)桿=16
r(4) =垂直偏置量=10
theta1 =第一桿之水平角=0
theta2 = 驅動桿之水平夾角=於計算時代入
td2 = 驅動桿角速度=0
tdd2 = 驅動桿角加速度=0
sigma = 1 組合模數,其中組合模數之閉合或分枝會導致左右鏡像的結果.
driver = 0 驅動桿為第二桿
1 驅動桿為第三桿
2 滑塊驅動


權衡各種分析方法後,使用單純的三角函數處理(如課本)由於反三角函數定義的關系,可能會面臨需撰寫大量if判斷式,且除錯不易的窘境,而Euler化可以大幅簡化計算,就如同電工學的交流電多相合成,複數計算遠較和差化積有效率的多.
故以下作業都將利用老師的sldlink.m(複數計算),sld_angle_limits.m,進行分析
形式:
sldlink(r,theta1,theta2,td2,tdd2,sigma,driver)注解參考附件一
sld_angle_limits(r,theta1,linkdrive) 注解及修改參考附件二
drawsldlimits(r,th1,sigma,driver)
drawsldpaths(r6,th6,r,th1,theta,td2,tdd2,sigma,npts,driver,mode) 注解及修改參考附件三

其中sldlink有部分程式碼在matlab 6.5中運作有問題,即

%f=@(num,ndg);
%round(num*10^ndg)/10^ndg; %取整數
%arg=f(arg,5);

等,但加注解化後對運作無太大影響


一,運動的界限範圍


首先利用老師撰寫的sld_angle_limits代入以下參數進行分析:
1.桿2為驅動桿

r=[0 11 16 10];
theta1=0;
linkdrive=0;
sld_angle_limits(r,theta1,linkdrive);
得到:
Qstart =
3.6000e-006
Qstop =
360.0000
顯然不符,檢查sld_angle_limits程式碼後發現其中缺少了r3≧r4≧0,r3+r4≧r2(即講義7.4.2)之情況
故在其中加入以下程式碼

elseif r3+r4>=r2 & r3>=0 & r3>=r4
Qstart=asin((r4-r3)/r2)
Qstop=pi- asin((r4-r3)/r2)

才能得到:
θmin =θ1 + sin-1((r4-r3) / r2) =asin((10-16)/11)= -0.5769=-33
θmax =θ1 +π- sin-1((r4-r3) / r2) =pi-asin((10-16)/11)=3.7185=213

drawsldlimits([0 11 16 10],0,1,0)
Qstart = (起始角)
-33.0557
Qstop = (結束角)
213.0557
其中OP為桿2,PQ為桿3,QR為偏置量
結果如圖

亦可產生

動畫
for k=[-33:213] %簡化程式碼
pause(0.01);
clf;
dwsldshape([0 11 16 10],0,k,1,0)
axis([-16 30 -16 16]); %固定座標系
end



因此:

2.桿3為驅動桿時:
drawsldlimits([0 11 16 10],0,-1,1)
Qstart =
-3.5833
Qstop =
183.5833
結果如圖

3.滑塊為驅動桿時:
drawsldlimits([0 11 16 10],0,-1,2)
Qstart =
-25.0799
Qstop =
25.0799
結果如圖

二,位置分析



由於各點以連桿連結,故參考老師的drawsldlinks.m撰寫如下程式:
其架構如下:
1.資訊
2.將參數放入sldlink且傳回結果
3.複數化
4.若組合存在則繪制
1.接地桿
2.依參數繪桿
3.表示偏心量
4.繪滑塊
5.不能組合時訊息

function [values]=dwsldshape(r,th1,th2,sigma,driver)
%參考老師的drawsldlinks.m
%歐陽太閒 b94611001
%需用到linkshape.m,sldlink.m,sldbox.m
title('作業9.2 作者:歐陽太閒 b94611001');%資訊
xlabel('x-axis');
ylabel('y-axis');
axis equal
grid on
[values b]=sldlink(r,th1,th2,10,0,sigma,driver); %將參數放入sldlink且傳回分析結果
rr=values(:,1);
rr(3)=rr(3)+rr(2);
rx=real(rr);rx(4)=0;%複數化
ry=imag(rr);ry(4)=0;
if b==1
linkshape([0 0],[rx(1) 0]); %繪接地桿
hold on;
linkshape([0 0],[rx(1) ry(1)]); %繪桿2,驅動桿問題已有sldlink處理
linkshape([0 0],[rx(2) ry(2)]); %繪桿3
linkshape([rx(2) ry(2)],[rx(3) ry(3)]);
plot([rx(1) rx(3)],[ry(1) ry(3)],'r-'); % 偏心量,滑塊為重力外力閉合
plot(rx,ry,'bo');
text(0,0,' O');text(rx(1),ry(1),' R');
text(rx(2),ry(2),' P');text(rx(3),ry(3),' Q');
length=max(abs(values(2:3,1))); %產生滑塊用參數
len=.20*length;ww=.15*length;
[coords] = sldbox(len,ww,rx(3),ry(3),th1); %畫出滑塊
plot(coords(:,1),coords(:,2),'r-','LineWidth',2);
[coords] = sldbox(len*3,0,rx(3),ry(3)-ww/2,th1);
plot(coords(:,1),coords(:,2),'r:','LineWidth',1.5);
else
fprintf('無法組成,角度%6.1f\n',th2); %不能組成時訊息
end


1.桿2為驅動桿(以角度60度為例)

結果如圖


可解析如下
ans =

1.0e+003 *

Columns 1 through 4

桿1位 0.0215 桿1角 0 桿1角速度 0 桿1角加速度 0
桿2位 0.0055 + 0.0095i 桿2角 0.0600 桿2角速度 0.0100 桿2角加速度 0
桿3位 0.0160 + 0.0005i 桿3角 0.0017 桿3角速度 -0.0034 桿3角加速度 0.0599
桿4位 0.0000 + 0.0100i 桿4角 0.0900 桿4角速度 0 桿4角加速度 0

Columns 5 through 8

軸向速度 -0.0936 q速度 -0.0953 + 0.0550i(abs) 0.1100 q速度角度0.1500
軸向加速 -0.7675 p速度 -0.0936 (abs) 0.0936 p速度角度0.1800
Q位置向量 0.0055 + 0.0095i q加速度-0.5500 - 0.9526i(abs) 1.1000 q加速度角度-0.1200
P位置向量 0.0215 + 0.0100i p加速度-0.7675 (abs) 0.7675 p加速度角度 0.1800


2.桿3為驅動桿(以角度60度為例)

結果如圖
dwsldshape([0 11 16 10],0,60,1,1)

ans = (解析同9-二-1)
1.0e+003 *
Columns 1 through 4
0.0183 0 0 0
0.0103 - 0.0039i -0.0205 -0.0078 0.1119
0.0080 + 0.0139i 0.0600 0.0100 0
0.0000 + 0.0100i 0.0900 0 0
Columns 5 through 8
-0.1685 -0.0299 - 0.0800i 0.0854 -0.1105
-0.9896 -0.1685 - 0.0000i 0.1685 -0.1800
0.0103 - 0.0039i -0.1896 + 1.3856i 1.3986 0.0978
0.0183 + 0.0100i -0.9896 0.9896 0.1800

3.滑塊為驅動桿(以角度60度為例)
dwsldshape([0 11 16 10],0,60,1,2)

結果如圖
ans = (解析同9-二-1)
1.0e+002 *
Columns 1 through 4
0 0 0 0
-0.1086 - 0.0175i -1.7085 -0.0100 -0.0108
0.1086 + 0.1175i 0.4725 -0.0100 -0.0016
0.0000 + 0.1000i 0.9000 0 0
Columns 5 through 8
0.1000 -0.0175 + 0.1086i 0.1100 0.9915
0 0.1000 0.1000 0
-0.1086 - 0.0175i 0.0897 + 0.1350i 0.1621 0.5641
0 + 0.1000i 0 0 0

三,路徑分析



而講義7.5提到,可用drawsldpaths.m整合sldlink,body,fb_sld_linits及drawlinks
其中最重要的,便是其可輸出非常漂亮的速度,加速度,角速度,角加速度隨角度變化圖表
以及系統的連續運動路徑

drawsldpaths(r6,th6,r,th1,theta,td2,tdd2,sigma,npts,driver,mode)

r= [0 11 16 10] 各桿長
th1=0 第一桿角度
th2=0 驅動桿或聯結桿角度
td2=0 驅動桿之角速度
tdd2=0 角加速度。
sigma=1 組合模數
driver= 0 曲桿驅動
1 連桿驅動
2 滑塊驅動
Npts=50 分割點數
r6,rh6,nlink:桿上特定點之位置,包括桿長,與桿之夾角及附於何桿。
mode=1 畫所有圖表


由於程式在Matlab6.5下繪制alphapatch會導致畫面混亂,故修改程式,
去除在本分析中用不到的延伸部分,即:

patch('xdata',real(para(1:3)),'ydata',imag(para(1:3)),...
'facecolor','r','facealpha',0.6,'marker','o');hold on;
plot(para(2),'bo');

(請見附件三)

故可得:
1.桿2為驅動桿
drawsldpaths(0,0,[0 11 16 10],0,0.01,0.01,1,50,0,1)

結果如圖
結果如表

2.桿3為驅動桿
drawsldpaths(0,0,[0 11 16 10],0,0.01,0.01,1,50,1,1)

結果如圖
結果如表

3.滑塊為驅動桿
drawsldpaths(0,0,[0 11 16 10],0,0.01,0.01,2,50,2,1)

結果如圖
結果如表

心得:
本次作業為整體性的對一個系統進行分析,故所需用到的程式資源相當的大,且有許多部分需自行改寫,不過也操作的過程中體會MATLAB的強大.


附件一



function [data,form] = sldlink(r,theta1,theta2,td2,tdd2,sigma,driver)

%f=@(num,ndg) round(num*10^ndg)/10^ndg; %取整數,在6.5版會造成無法正確執行的問題
data=zeros(4,8); %生成一個4x8的零矩陣
if driver==1, r(2:3)=[r(3) r(2)];end %桿三為驅動桿時對換
rr=r.*r;d2g=pi/180; %數學運算部分
theta=[theta1 theta2 0 theta1+90]*d2g;
t1=theta(1);t4=theta(4);
[td,tdd,rd,rdd]=deal(zeros(4,1));
s1=sin(t1);c1=cos(t1); %轉成直角坐標系
s4=sin(t4);c4=cos(t4);
switch driver %驅動元件選擇
case 2 %滑塊驅動桿
rd(1)=td2; %傳入速度與加速度
rdd(1)=tdd2;
A=-2*r(1)*r(2)*c1-2*r(2)*r(4)*c4;
B=-2*r(1)*r(2)*s1-2*r(2)*r(4)*s4;
C=rr(1)+rr(2)+rr(4)-rr(3)+2*r(1)*r(4)*(c1*c4+s1*s4);
arg=B*B-C*C+A*A;
% arg=f(arg,5); %避免6.5出錯
if (arg>=0)
form=1; %assembly flag
t2=2*atan((-B+sigma*sqrt(arg))/(C-A));
s2=sin(t2); c2=cos(t2);
t3=atan2((r(1)*s1+r(4)*s4-r(2)*s2),(r(1)*c1+r(4)*c4-r(2)*c2));
theta(2)=t2; theta(3)=t3;
s3=sin(t3); c3=cos(t3);
%velocity calculation %速度計算
AM=[-r(2)*s2, -r(3)*s3; r(2)*c2, r(3)*c3];
BM=[rd(1)*c1;rd(1)*s1];
CM=AM\BM;
td(2)=CM(1); td(3)=CM(2);
%acceleration calculation %加速度計算
BM=[r(2)*td(2)*td(2)*c2+r(3)*td(3)*td(3)*c3+rdd(1)*c1;...
r(2)*td(2)*td(2)*s2+r(3)*td(3)*td(3)*s3+rdd(1)*s1];
CM=AM\BM;
tdd(2)=CM(1); tdd(3)=CM(2);
else
form=0; return; %無法連接時跳出
end
case {0,1} % for link 2 or 3 as a crank%桿2或桿3為曲桿
td(2)=td2; tdd(2)=tdd2; tx=theta(2);
sx=sin(tx); cx=cos(tx);
% position calculations %位置分析
A=2*r(4)*(c1*c4+s1*s4)-2*r(2)*(c1*cx+s1*sx);
B=rr(2)+rr(4)-rr(3)-2*r(2)*r(4)*(cx*c4+sx*s4);
arg=A*A-4*B;
%arg=f(arg,5); %避免6.5錯誤
if (arg>=0)
form=1; %assembly flag
r(1)=(-A+sigma*sqrt(arg))/2;
t3=atan2((r(1)*s1+r(4)*s4-r(2)*sx),(r(1)*c1+r(4)*c4-r(2)*cx));
theta(3)=t3;
s3=sin(t3); c3=cos(t3);
%velocity calculation %速度分析
AM=[c1, r(3)*s3; s1, -r(3)*c3];
BM=[-r(2)*td(2)*sx;r(2)*td(2)*cx];
CM=AM\BM;
rd(1)=CM(1); td(3)=CM(2);
%acceleration calculation %加速度分析
BM=[-r(2)*tdd(2)*sx-r(2)*td(2)*td(2)*cx-r(3)*td(3)*td(3)*c3;...
r(2)*tdd(2)*cx-r(2)*td(2)*td(2)*sx-r(3)*td(3)*td(3)*s3];
CM=AM\BM;
rdd(1)=CM(1); tdd(3)=CM(2);
else
form=0; %不能連接時
if driver==1, %處理曲桿為3
r(2:3)=[r(3) r(2)];
for j=1:4, data(j,1)=r(j).*exp(i*theta(j));end % position vectors
end
return;
end
if driver==1,
r(2:3)=[r(3) r(2)]; %桿2,3的資料交換
c2=c3;c3=cx;s2=s3;s3=sx;
td(2:3)=[td(3) td(2)];
tdd(2:3)=[tdd(3) tdd(2)];
theta(2:3)=[theta(3) theta(2)];
elseif driver==0
c2=cx;s2=sx;
end
end % end of switch %結束判斷

for j=1:4, %將所得資料格式化輸出
data(j,1)=r(j).*exp(i*theta(j));
data(j,2:4)=[theta(j)/d2g,td(j),tdd(j)];
end
data(:,5)=[rd(1);rdd(1);data(2,1);data(2,1)+data(3,1)];
data(1,6)=i*r(2)*td(2)*exp(i*theta(2));
data(2,6)=data(1,6)+i*r(3)*td(3)*exp(i*theta(3));
data(3,6)=r(2)*(i*tdd(2)-td(2)*td(2))*exp(i*theta(2));
data(4,6)=data(3,6)+r(3)*(i*tdd(3)-td(3)*td(3))*exp(i*theta(3));
%[Vq;Vp;Aq;Ap]
data(1:4,7)=abs(data(1:4,6));data(1:4,8)=angle(data(1:4,6))/d2g;


附件2



function [Qstart, Qstop]=sld_angle_limits(r,theta1,linkdrive)
r1=r(1);r2=r(2);r3=r(3);r4=r(4);
g2d=180/pi;
switch linkdrive
case 0 %crank %曲桿驅動時
if r3+r4=0 & r3>r4 %分別為講義7.4 RRRP的各種限制
Qstart=asin((r4-r3)/r2);
Qstop=asin((r4+r3)/r2);
elseif r3+r4>=r2 & r4>=r3 %講義程式碼缺少的部分
Qstart=asin((r4-r3)/r2); %r3≧r4≧0,r3+r4≧r2(即講義7.4.2)
Qstop=pi-asin((r4-r3)/r2);%
elseif r3-r4<=r2 & r4<0 & r3>=-r4
Qstart=asin((r4-r3)/r2);
Qstop=asin((r4+r3)/r2);
elseif r3-r4>=r2 & r3>=0 & -r4>=r3
Qstart=-pi-asin((r4+r3)/r2);
Qstop=asin((r4+r3)/r2);
elseif r3+r4>=r2 & r3>=0 & r3>=r4
Qstart=asin((r4-r3)/r2);
Qstop=pi- asin((r4-r3)/r2);
else
Qstart=0;Qstop=2*pi;
end
case 1 %coupler %連桿驅動時
if r2-r4<=r3 & r4>=0 & r2>=r4%分別為講義7.4 RRRP的各種限制
Qstart=asin((r4-r2)/r3)
Qstop=pi-asin((r4-r2)/r3)
elseif r2+r4=0
Qstart=asin((r4-r2)/r3)
Qstop=asin((r4+r2)/r3)
elseif r2+r4<=r3 & r4<=0 & r2+r4>=0
Qstart=-pi-asin((r4+r2)/r3)
Qstop=asin((r4+r2)/r3)
elseif r2-r4 Qstart=asin((r4-r2)/r3)
Qstop=asin((r4+r2)/r3)
else %r2>=(r3+abs(r4))
Qstart=0;Qstop=2*pi;
end
case 2 %slider displacement %滑塊驅動
Qstart=0;Qstop=0;
arg2=(r2+r3)^2-r4^2
if abs(r2-r3)>=r4
arg1=(r2-r3)^2-r4^2
if arg1>0,Qstart=sqrt(arg1);end;
Qstop=sqrt(arg2)
else
if arg2<0, return; end
Qstart=sqrt(arg2);Qstop=-sqrt(arg2)
end
theta1=0;g2d=1
end %case %各種情況分析結束
if Qstopadjust=(Qstop-Qstart)*1e-8; %避免為零
Qstart=theta1+(Qstart+adjust)*g2d %輸出
Qstop=theta1+(Qstop-adjust)*g2d

附件3



function drawsldpaths(r6,th6,r,th1,td2,tdd2,sigma,npts,driver,mode)

clf;
figure(1);
warning off;
r(abs(r)[Qstart, Qstop]=sld_angle_limits(r,th1,driver) %利用sld_angle_limits取得限制
npoint=abs(npts); %分割點數
th2=linspace(Qstart,Qstop,npoint); %產生點向量
val=zeros(11,npoint);
for i=1:npoint,
if driver==2, r(1)=th2(i);end
[vr b]=sldlink(r,th1,th2(i),td2,tdd2,sigma,driver); %利用sldlink分析
[para]=body(r6,th6,vr,3); %yongbody畫延伸物(本分析沒有用到)
if mod(i,5)==0|i==1|i==npoint,
drawsldlinks(r,th1,th2(i),sigma,driver); %繪桿及塊

end
val(1:3,i)=[vr(1,1)+vr(4,1);vr(2,1);para(2)];%Sq,Sp,Sa %找q,p,a
switch driver
case 0 %桿2驅動
val(4:7,i)=[abs(vr(1,1));vr(3,2);vr(3,3);vr(3,4)];
case 1 %桿3驅動
val(4:7,i)=[abs(vr(1,1));vr(2,2);vr(2,3);vr(2,4)];
case 2 %滑塊驅動
val(4:7,i)=[abs(vr(2,2));vr(3,2);vr(2,3);vr(3,3)];
end
val(8:11,i)=[vr(1,5);para(4);vr(4,6);para(5);]; %存入矩陣
%Vs, Va, As, Aa
end
warning on; %路徑繪制
plot(val(1,:),'k-','LineWidth',1.5,'linestyle',':');% path of Q
plot(val(2,:),'k-','LineWidth',1.5);% path of P
plot(val(3,:),'g-','LineWidth',1.5);% path of A
axis equal
if mode==0, return;end;
% %數據分析
th2=th2(3:end-3);val=val(:,3:end-3);
title0={'Crank Angle','Coupler Angle','Slider Pos'};
title1={'\Theta3(r) & r1(k)', '\Theta2(r) & r1(k)',...
'\Theta2(r) & \Theta3(k)' };
title2={'Vel of A (r) & Slider(k)',...
'Acc of A(r) & Slider(k)' };
title3={'\omega(r) & \alpha(b) of Coupler',...
'\omega(r) & \alpha(b) of Crank',...
'\omega of Crank(r) & Coupler(b)'};
intitle=title0(driver+1);
val(abs(val)>10e+5)=NaN;
val(8:11,:)=abs(val(8:11,:));
figure(2); %第二繪圖區
clf;
subplot(2,2,1);
plot(th2,val(4,:),'k-');%crank angle or r1曲桿角
hold on;fact=round(max(val(5,:))/max(val(4,:))*10)/10;
plot(th2,val(5,:)/fact,'r-');% crank or coupler angle
xlabel(intitle);ylabel(title1(driver+1));
grid on
%
subplot(2,2,2);
plot(th2,val(6,:),'r-');%Omega of crank 曲桿角速度
fact=round(max(val(7,:))/max(val(6,:))*10)/10;
hold on;plot(th2,val(7,:)/fact,'b-');%Omega of coupler
xlabel(intitle);ylabel(title3(driver+1));
grid on;
%
subplot(2,2,3);
plot(th2,val(8,:),'k-');% vel of slider 滑塊速度
hold on;plot(th2,val(9,:),'r-');% vel of A
xlabel(intitle);ylabel(title2(1));
grid on;
%
subplot(2,2,4);
plot(th2,val(10,:),'k-');%Acc of slider 滑塊加速度
hold on;plot(th2,val(11,:),'r-');% Acc of A
xlabel(intitle);ylabel(title2(2));
grid on;


第九次作業結束