基于matlab GUI的平面四杆机构的运动分析一、目的通过matlab对平面四杆机构进行运动仿真,并以GUI界面方式实现输入输出的参数化,对平面四杆机构进行位置分析、速度分析、加速度分析和静力学分析。
此外,通过动画演示,更加形象直观地观察机构的运动过程。
最后,将程序编译成.exe独立可执行文件,可以在其它没有安装matlab的机器上运行。
二、设计思路通过matlab的GUI功能模块,创建一个图形用户界面,在自动生成的代码框架中对初始化函数和回调函数等进行编辑,建立与控件相关联的程序:控件属性、位置分析、速度分析、加速度分析、静力学分析、动画演示等。
图1是平面四杆机构的示意图,输入角q的运动规律为q=pi/50*t^2+q0,r1、r2是从动角。
对t时刻沿着杆长距离原点A的任意一点进行分析。
注意:输入输出角的单位为度,时间t的取值范围为0:0.05:10,任意点lx的取值范围为0~a1+a2+a3,估算的从动角r1、r2的迭代初始值不能偏离平衡位置太大。
图1、平面四杆机构示意图三、设计流程1、通过GUI模块创建图形用户界面命令方式:在Matlab命令窗口键入>>guide;菜单方式:在Matlab的主窗口中,选择File>New>GUI命令,就会显示GUI的设计模板。
如图1所示。
图2、创建图形界面2、设计图形界面在创建之后的图形界面中插入坐标轴axes,静态文本框static text,编辑文本框edit text,按钮push button等等。
如图所示。
图3、图形界面设计3、编辑回调函数1)位置分析:输入角的函数为:q=pi/50*t^2+q0。
在时间t=0~10s内,每一个时间点估算两个初始从动角,根据牛顿-拉普森迭代得到准确的机构位置。
10s刚好主动角经历了360度,记录每一时刻的位置,便可以动画演示。
2)速度分析:输入角速度为:dq=pi/25*t。
选择杆件上的任意一点(坐标表示为质点沿着杆件到原点A的距离)做分析,正确表达出角速度系数和速度系数,便可以求出质点的速度。
3)加速度分析:输入角加速度为:ddq=pi/25。
正确表达出向心系数和角加速度系数,便可以求出质点的加速度。
4)静力学分析:由虚功原理可知,当广义力Q(V,H)=0(或近似为零)时机构达到平衡,记录该平衡条件下的位置数据。
四、结果演示1、机构杆长条件判断1)不符合杆长条件。
如图4所示。
图4、不符合杆长条件2)符合杆长条件,输出参数。
如图5所示。
图5、符合杆长条件2、机构运动动画演示。
图6、机构动画演示五、生成.exe文件1、安装编译器。
可有多种选择,本机安装的是matlab自带的Lcc-win32;2、设置编译器。
在matlab命令行输入mbuild –setup,选择安装的lcc编译器;3、调用编译器。
输入mcc –m sgjg,这里sgjg为要转成exe的m文件;4、安装<Matlab path>\toolbox\compiler\deploy\win32目录下的MCRInstaller。
MCR是matlab的运行环境,在程序打包时,最好将相应版本的MCR一起打包。
在其它机器上运行exe文件前,首先安装matlab的运行环境MCRInstaller.exe。
六、附录(程序)function varargout = sgjg(varargin)% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @sgjg_OpeningFcn, ...'gui_OutputFcn', @sgjg_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before sgjg is made visible.function sgjg_OpeningFcn(hObject, eventdata, handles, varargin)% Choose default command line output for sgjghandles.output = hObject;handles.gx=[];handles.gy=[];axis(handles.motion);imshow('tt.bmp'); % 机构示意图% Update handles structureguidata(hObject, handles);% --- Outputs from this function are returned to the command line. function varargout = sgjg_OutputFcn(hObject, eventdata, handles) % Get default command line output from handles structurevarargout{1} = handles.output;function a1_Callback(hObject, eventdata, handles)function a1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction a2_Callback(hObject, eventdata, handles)function a2_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction a3_Callback(hObject, eventdata, handles)function a3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction a4_Callback(hObject, eventdata, handles)function a4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction q0_Callback(hObject, eventdata, handles)function q0_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction ftol_Callback(hObject, eventdata, handles)function ftol_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction r1_Callback(hObject, eventdata, handles)function r1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction r2_Callback(hObject, eventdata, handles)function r2_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction t_Callback(hObject, eventdata, handles)function t_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction lx_Callback(hObject, eventdata, handles)function lx_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction lx2_Callback(hObject, eventdata, handles)function lx2_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction lx3_Callback(hObject, eventdata, handles)function lx3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction H_Callback(hObject, eventdata, handles)function H_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction V_Callback(hObject, eventdata, handles)function V_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction Calculation_Callback(hObject, eventdata, handles)% hObject handle to Calculation (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)a1=str2num(get(handles.a1,'String'));a2=str2num(get(handles.a2,'String'));a3=str2num(get(handles.a3,'String'));a4=str2num(get(handles.a4,'String'));q0=str2num(get(handles.q0,'String'));ftol=str2num(get(handles.ftol,'String'));r1=str2num(get(handles.r1,'String'));r2=str2num(get(handles.r2,'String'));V=str2num(get(handles.V,'String'));H=str2num(get(handles.H,'String'));q0=q0*pi/180;r1=r1*pi/180;r2=r2*pi/180;ly1=0;ly2=0;ly3=0;%局部坐标系的第二坐标为0lx1=a1;lx2=a2;lx3=a3;%局部坐标系的第一坐标设一初始值lx=str2num(get(handles.lx,'String'));%杆上选择一个数据分析的质点if (lx<=a1)lx1=lx;elseif (lx>=a1+a2)lx3=lx;elselx2=lx;endgr1=[];gr2=[];gdx1=[];gdx2=[];gdx3=[];gdy1=[];gdy2=[];gdy3=[];gddx1=[];gddx2=[];gddx3=[];gddy1=[];gddy2=[];gddy3=[];k=[a1 a2 a3 a4];lmin=min(k);lmax=max(k);if((lmin+lmax)>(a1+a2+a3+a4)-lmin-lmax)errordlg('不符合杆长条件!','Tip')elsefor t=0:0.05:10k=0;q=pi/50*t^2+q0;f=[a1*cos(q)+a2*cos(r1)+a3*cos(r2)-a4a1*sin(q)+a2*sin(r1)+a3*sin(r2)]';while(norm(f)>ftol)A=[-a2*sin(r1) -a3*sin(r2);a2*cos(r1) a3*cos(r2)]; dr=-A\f;r1=r1+dr(1);r2=r2+dr(2);f=[a1*cos(q)+a2*cos(r1)+a3*cos(r2)-a4a1*sin(q)+a2*sin(r1)+a3*sin(r2)]';k=k+1;%记录迭代次数endxa=0;ya=0;xb=a1*cos(q);yb=a1*sin(q);xc=a1*cos(q)+a2*cos(r1);yc=a1*sin(q)+a2*sin(r1);xd=a1*cos(q)+a2*cos(r1)+a3*cos(r2);yd=a1*sin(q)+a2*sin(r1)+a3*sin(r2);x=[xa xb xc xd]';y=[ya yb yc yd]';handles.gx=[handles.gx x];%记录机构每一时刻的位置,用于动画演示handles.gy=[handles.gy y];%------------------速度分析----------------dq=pi/25*t;w1=1;w2=a1*sin(r2-q)/(a2*sin(r1-r2));w3=a1*sin(r1-q)/(a3*sin(r2-r1));u1=(-lx1*sin(q)-ly1*cos(q))*w1;v1=(lx1*cos(q)-ly1*sin(q))*w1;u2=-a1*sin(q)-(lx2*sin(r1)+ly2*cos(r1))*w2;v2=a1*cos(q)+(lx2*cos(r1)-ly2*sin(r1))*w2;u3=(-lx3*sin(r2)-ly3*cos(r2)+a3*sin(r2))*w3;v3=(lx3*cos(r2)-ly3*sin(r2)-a3*cos(r2))*w3;dx1=u1*dq;dy1=v1*dq; %¹¹¼þ1ÉÏÖʵãµÄËÙ¶Èdx2=u2*dq;dy2=v2*dq;dx3=u3*dq;dy3=v3*dq;%-------------------加速度分析-----------------------ddq=pi/25;dw1=0;dw2=w2*((w3-1)*atan(r2-q)-(w2-w3)*atan(r1-r2));dw3=w3*((w2-1)*atan(r1-q)-(w3-w2)*atan(r2-r1));du1=(-lx1*sin(q)-ly1*cos(q))*dw1+(-lx1*cos(q)+ly1*sin(q))*w1^2;dv1=(lx1*cos(q)-ly1*sin(q))*dw1+(-lx1*sin(q)-ly1*cos(q))*w1^2;du2=-a1*sin(q)*dw1-a1*cos(q)*w1^2-(lx2*sin(r1)+ly2*cos(r1))*dw2-(lx2*cos(r1)-ly2*sin(r1))*w2^2;dv2=a1*cos(q)*dw1-a1*sin(q)*w1^2+(lx2*cos(r1)-ly2*sin(r1))*dw2-(lx2*sin(r1)+ly2*cos(r1))*w2^2;du3=-(lx3*sin(r2)+ly3*cos(r2)-a3*sin(r2))*dw3-(lx3*cos(r2)-ly3*sin(r2)-a3*cos(r2))*w3^2;dv3=(lx3*cos(r2)-ly3*sin(r2)-a3*cos(r2))*dw3-(lx3*sin(r2)+ly3*cos(r2)-a3*sin(r2))*w3^2;ddx1=u1*ddq+du1*dq^2;ddy1=v1*ddq+dv1*dq^2; %杆1上质点的加速度ddx2=u2*ddq+du2*dq^2;ddy2=v2*ddq+dv2*dq^2;ddx3=u3*ddq+du3*dq^2;ddy3=v3*ddq+dv3*dq^2;%--------------------静力学分析----------------------------- Q=a1*(V*cos(q)+H*sin(r2)*sin(q-r1)/sin(r1-r2));if Q<ftolqe=q;re1=r1;re2=r2;endgr1=[gr1 r1];gr2=[gr2 r2];%记录机构每一时刻的位置、速度、加速度 gdx1=[gdx1 dx1];gdx2=[gdx2 dx2];gdx3=[gdx3 dx3];gdy1=[gdy1 dy1];gdy2=[gdy2 dy2];gdy3=[gdy3 dy3];gddx1=[gddx1 ddx1];gddx2=[gddx2 ddx2];gddx3=[gddx3 ddx3]; gddy1=[gddy1 ddy1];gddy2=[gddy2 ddy2];gddy3=[gddy3 ddy3];endt=str2num(get(handles.t,'String'));n=20*t+1;r1=gr1(n);r2=gr2(n);r1=r1*180/pi;r2=r2*180/pi;qe=qe*180/pi;re1=re1*180/pi;re2=re2*180/pi;dx1=gdx1(n);dx2=gdx2(n);dx3=gdx3(n);dy1=gdy1(n);dy2=gdy2(n);dy3=gdy3(n);ddx1=gddx1(n);ddx2=gddx2(n);ddx3=gddx3(n);ddy1=gddy1(n);ddy2=gddy2(n);ddy3=gddy3(n);set(handles.dispr1,'String',num2str(r1));set(handles.dispr2,'String',num2str(r2));if (lx<=a1)set(handles.dispdx,'String',num2str(dx1));set(handles.dispdy,'String',num2str(dy1));set(handles.dispddx,'String',num2str(ddx1));set(handles.dispddy,'String',num2str(ddy1));elseif (lx>=a1+a2)set(handles.dispdx,'String',num2str(dx3));set(handles.dispdy,'String',num2str(dy3));set(handles.dispddx,'String',num2str(ddx3));set(handles.dispddy,'String',num2str(ddy3));elseset(handles.dispdx,'String',num2str(dx2));set(handles.dispdy,'String',num2str(dy2));set(handles.dispddx,'String',num2str(ddx2));set(handles.dispddy,'String',num2str(ddy2));endset(handles.dispre1,'String',num2str(qe));set(handles.dispqe,'String',num2str(re1));set(handles.dispre2,'String',num2str(re2));endguidata(hObject, handles);% --- Executes on button press in Show.function Show_Callback(hObject, eventdata, handles)i=1;n=length(handles.gx);while 1h=plot(handles.motion,handles.gx(:,i),handles.gy(:,i)); a1=str2num(get(handles.a1,'String'));a2=str2num(get(handles.a2,'String'));a3=str2num(get(handles.a3,'String'));a4=str2num(get(handles.a4,'String'));axis([-a1-2 a1+a4 -a1-2 a3+2]);set(h,'EraseMode','normal','LineWidth',5)set(gcf,'DoubleBuffer','on')drawnow;i=i+1;if i>ni=1;endend% --- Executes on button press in close.function close_Callback(hObject, eventdata, handles)close。