2/4/07

6.9 四連桿軌跡繪製

四連桿中各點的軌跡可以依其可能的運動範圍繪出其運動軌跡。在四桿之中,除第一桿固定外,其餘均有相對運動,而第二桿與第四桿因其運動係以固定點為圓心,故其運動軌跡均為圓形或弧形。其最大不同或不可預測者則屬聯結桿或聯結桿延伸後其上某點之運動路徑。其路徑之複雜度常以圖形層次(degree)表示。複雜的圖其表現之層次愈高,甚至有許多交叉的情況發生,變成方程式的根。簡單梢接的四連桿,其軌跡層次可達第六級;而滑塊連桿則有四級。其桿數增加級數也會增加,依據翁德利基(Wunderlich)的計算,其公式如下:

m = 2 * (3)(n/2-1)

因此四連桿、六連桿及八連桿分別為6、18及54級。在聯結桿上的點也有些可以產生簡單層級的路徑,如一般的圓形軌跡等。而平行四邊形的四連桿則可以產生完全是圓的軌跡。聯結桿上某一特定點的軌跡稱為聯結桿圖。利用這種圖形可以產生許多機械設計時所需的運動路徑,這些包括部份直徑行進及以某一點為圓心之迴轉運動。因此可以利用聯結圖的特性作為設計特定路徑的參考,成為路徑合成的重要工具。

除產生不同的路徑外,有時尚需要瞭解產生該路徑點之速度與加速度。這些可以經由f4bar.m之函數程式進行計算。這部份功能在前一節均已詳細討論過,不在此地賛述。

在進行繪製軌跡時,必須考慮到前面所介紹的各項函數,其中包括:
  • 1. 角度限制函數fb_angle_limits.m,以求得連桿組成後,其可能之運動角度範圍。
  • 2. f4bar.m 函數以進行計算各點之位置、速度與加速度。
  • 3. body.m函數以計算在聯結桿上特定點之位置、速度與加速度。
  • 4. drawlinks.m函數以繪出各組連桿之相關位置。


四連桿軌跡程式draw4paths


將四連桿之座標及特定點之軌跡繪出並繪出特定點速度與加速度變化,這是draw_4barpaths()之功能。第一及第二程式為四連桿但不同畫法,最後一項為滑塊四連桿之畫法,其特定點僅能應用於聯結桿上,故不能選擇其他桿上的點,其型式及參數如下:

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

輸入參數:


  • r : 四連桿之長度,一列向量表示。
  • th1: 第一桿的水平角度(通常為零)。
  • th2: 驅動桿或聯結桿的水平角度。
  • td2, tdd2:驅動桿之角速度及角加速度。
  • Sigma:連桿之組合模式選擇(需為+1或-1)
  • Driver:驅動桿之設定( 0 表示苗桿驅動,1 表示由聯結桿驅動)。
  • Npts: 設定分割的點數或位置。
  • r6,rh6,nlink:桿上特定點之位置,包括桿長,與桿之夾角及附於何桿。
  • Mode:mode=0,畫簡單位置圖;=1 畫所有圖表;=2畫簡單位置圖+速度圖;=3 畫所有圖表,但用簡單位置圖。


程式內容



function draw_4paths(r6,th6,nlink,r,th1,theta,td2,tdd2,sigma,npts,driver,mode)
%
%function draw_4paths(r6,th6,nlink,r,th1,theta,td2,tdd2,sigma,npts,driver)
%Designed by D. S. Fon, BIME, NTU. Dated April 11, 2003
%draw the positions of four-bar links
%call f4bar.m,drawlinks.m,fb_angle_limits.m, body.m
%
%Inputs:
% r: row vector for four links
% th1,theta: frame and driving-link angles, deg.
% td2,tdd2:angular velocity and acceleration of the driving link.
% sigma: assembly mode
% driver: 0 for crank, 1 for coupler
% npts: number of points divided
% r6,rh6,nlink:extension pt to the nlink link.
% mode=0 simple position graph only.
% =1 all graphs.
%example:
% draw_4paths(2,-30,3,[4 2 3 4],0,45,10,10,1,100,0,0)
%
%clf;
figure(1);
r(abs(r)<eps)=eps;npts=npts+10;
[Qstart, Qstop]=fb_angle_limits(r,th1,driver);
npoint=abs(npts);
th2=linspace(Qstart,Qstop,npoint);
val=zeros(7,npoint);
for i=1:npoint,
[vr b]=f4bar(r,th1,th2(i),td2,tdd2,sigma,driver);
[pa]=body(r6,th6,vr,nlink);
val(1:4,i)=[pa(3);pa(1);pa(2);vr(4,2)];
val(5:7,i)=[pa(4);pa(5);vr(4,3)];
%3-Pa;4-theta-p;5-Va;6-Aa;7-Wp
end
x=real(val);y=imag(val);
range=1.2*([min(min(x)) max(max(x)) min(min(y)) max(max(y))]);
axis(range);axis equal;
h=f4limits(r,th1,sigma,driver);
line(x(1,:)',y(1,:)','color','r','linestyle',':','linewidth',1.5);
line(x(2,:)',y(2,:)','color','b','linestyle','-.','linewidth',1.5);
line(x(3,:)',y(3,:)','color','k','linestyle',':','linewidth',1.5);
nn=length(theta);
for k=1:nn,
[vr b]=f4bar(r,th1,theta(k),td2,tdd2,sigma,driver);
h=draw4link(vr,driver);
%x=real(vr(:,1));y=imag(vr(:,1));
[pa]=body(r6,th6,vr,nlink);
patch('xdata',real(pa(1:3)), 'ydata',imag(pa(1:3)),...
'facecolor','r','facealpha',0.6,'marker','o');
text(real(pa(2)),imag(pa(2)),' A');
end
axis equal
grid on;
if mode==0, return; end;
figure(2);
valz=abs(val);
th2=th2(3:end-3);valz=valz(:,3:end-3);
%3-Pa;4-theta-p;5-Va;6-Aa;7-Wp
subplot(2,2,1);plot(th2,valz(4,:),'r-');grid on;
ylabel('Rocker Angles');xlabel('Crank Angle');
subplot(2,2,2);plot(th2,valz(5,:),'k-');grid on;
ylabel('Velocity at A');xlabel('Crank Angle');
subplot(2,2,3);plot(th2,valz(6,:),'b-');grid on;
ylabel('Acceleration at A');xlabel('Crank Angle');
subplot(2,2,4);
plot(th2,valz(7,:),'b-');grid on;
xlabel('Crank Angle');ylabel('Omega at P');

執行例



>> draw_4paths(2,-30,3,[4 2 3 2],0,45,10,10,0,100,0,0)
Qstart =
-108.21
Qstop =
108.21





>> draw_4paths(2,-30,3,[4 2 3 4],0,45,10,10,1,100,0,3)
Qstart =
3.6e-006
Qstop =
360











>> draw_4paths(1.33,10,3,[2.22 0.86 1.85 0.86],0,-30,2,5,1,100,0,1)
Qstart =
-116.04
Qstop =
116.04