【MATLAB】铰链四杆机构运动分析(GUI设计)

机械原理MATLAB辅助分析

平面机构运动分析,就是按照已知的起始构建运动规律来确定机构中其他构件的运动,具体任务如下:

1、求构件的位置

2、求构件的速度

3、求构件的加速度

一、数学模型的建立

平面连杆机构属于闭环机构,在用解析法进行机构运动分析时,采用封闭矢量多边形法求解较为方便,首先建立机构封闭矢量方程式,然后对时间进行求导得到速度方程,对时间求二阶导数得到加速度方程。

二、程序设计

子函数的任务是求解机构在某一位置时,各构件的位移、速度和加速度;主程序的任务是求机构在一个工作循环内各构件的位移、速度和加速度的变化规律,并用线图表示出来。同时进行机构运动仿真。

三、数学解析式的分析

(参考书籍《机械原理MATLAB辅助分析》)

四、例题分析

四杆的图形如上图片,假设杆1的长度为101.6mm,杆2的长度为254mm,杆3的长度为177.8mm,杆4的长度为304.8mm,原动件1以匀角速度w1 = 250 rad/s 逆时针转动,进行分析:

子程序的分析如下:

function [theta,omega,alpha] = analysis_data(theta1,omega1,alpha1,length1,length2,length3,length4)
% analysis_data 通过现有的数据,计算得出杆的位移、速度、加速度
% Author by Mat丶
% theta 角位移
% omega 角速度
% alpha 加速度
% theta1 主动杆1和x轴方向的夹角
% omega1 主动杆的 匀角速度
% length1 杆1的长度
% length2 杆2的长度
% length3 杆3的长度
% length4 杆4的长度


%%
%计算角位移 theta2 和 theta3
%构建辅助线 guide_line
guide_line = sqrt((length1^2)+(length4^2)-(2*length1*length4*(cos(theta1))));
%构建辅助角
guide_angle_1 = asin((length1./guide_line)*sin(theta1));
guide_angle_2 = acos(((guide_line^2)+(length3^2)-(length2^2))/(2*guide_line*length3));
if guide_angle_2 < 0
    guide_angle_2 = guide_angle_2 + pi;
end
theta3 = pi - guide_angle_1 - guide_angle_2;
theta2 = asin((length3*sin(theta3)-length1*sin(theta1))/length2);
%可得到角位移
theta = [theta2;theta3];

%%
%计算角速度 omega
A = [-length2*sin(theta2),length3*sin(theta3);
      length2*cos(theta2),-length3*cos(theta3)];
B = [length1*sin(theta1);
    -length1*cos(theta1)];
omega = A\(omega1*B);  %修改
%经计算可分别得到 杆2的角速度 omega2,和杆3的角速度 omega3
omega2 = omega(1); 
omega3 = omega(2);

%%
%计算从动件的角加速度 alpha
A = [-length2*sin(theta2),length3*sin(theta3);
      length2*cos(theta2),-length3*cos(theta3)];
At = [-1*omega2*length2*cos(theta2),omega3*length3*cos(theta3);
      -1*omega2*length2*sin(theta2),omega3*length3*sin(theta3)];
B = [length1*sin(theta1);
    -length1*cos(theta1)];      %机构原动件参数
Bt = [omega1*length1*cos(theta1);
      omega1*length1*sin(theta1)];
alpha = A\(-At*omega+omega1*Bt+alpha1*B);  %修改

创建的GUI界面如下:

因为是要创建GUI,在这里我们考虑以下情况

1、对 edit 获取的内容进行判断(是否为数字)

2、能否构建四杆运动机构

四杆机构又分为曲柄摇杆机构、双曲柄摇杆机构、双摇杆机构,对于双摇杆机构,需要考虑多种情况,在这里就不进行分析讨论了,有兴趣的可以参考该文献。

刘庆, 李春明, 刘晓, 等. 曲柄摇杆机构和双摇杆机构的瞬心线解析法研究 [J]. 应用科技, 2021, 48(1): 93–97.
LIU Qing, LI Chun-ming, LIU Xiao, et al. Analytic method for instantaneous velocity center line of a crank-rocker and birocker
mechanism[J]. Applied science and technology, 2021, 48(1): 93–97.

 

针对1,我们做出以下措施:

if(isempty(temp1)||isempty(temp2)||isempty(temp3)||isempty(temp4)||isempty(temp5))
    set(handles.edit6,'String','Error!请输入完整的数据!');
    clearAxes(handles);
    return;
end
    %如果用户在获取数据的图框内输入了非数字类型的数据,则提示用户输入正常的 数字类型的数据
    %根据输入是 ‘字符’,则str2double()函数返回NaN
    % 在利用isnana()函数,进行判断即可
    % isnan() 函数:查询目标元素中是否包含NaN值,
if(isnan(length1)||isnan(length2)||isnan(length3)||isnan(length4)||isnan(omega1))
    set(handles.edit7,'String','Error!请输入非字符的数值!');
    clearAxes(handles);
    return;
end

针对2,我们做出以下措施:

function num = isEstablish(length1,length2,length3,length4)
% 周转副存在的条件
% Author by Mat丶
% 最短杆长度+最短杆长度 <= 其余两杆的长度之和

find_min = length1;
find_max = length1;
len = [length1,length2,length3,length4];	%将各杆的长度打包成数组
mark_max = 1;
mark_min = 1;
for n=2:4
	if(find_max<len(n))	%找出四个杆中的最大值,以及当前杆的位置
		find_max = len(n);
		mark_max = n;
	end
	if(find_min>len(n))	%找出四个杆中的最小值,以及当前杆的位置
		find_min = len(n);
		mark_min = n;
	end
end

%判断该杆是否能成立
sum_other = 0;
sum_bestvalue = find_max + find_min;
for m=1:4
	if(m==mark_max||m==mark_min)    %跳过最值
		continue;
	else
		sum_other = sum_other + len(m);
	end
end
%打印测试
% disp(sum_other)
% disp(sum_bestvalue)

if(sum_bestvalue<=sum_other)
% 	fprintf('成立');
%在改条件成立的前提下
	%满足连架杆和机架中必有一杆是最短杆,则可以构建“曲柄摇杆机构”和“双曲柄摇杆机构”
	%若不满足上条件,则会构建一个”双摇杆机构“
	% num 值为0,报错
	% num 值为1,曲柄摇杆机构”和“双曲柄摇杆机构”
	% num 值为2,双摇杆机构
	if(mark_min==2)	%最短杆是2号杆,双摇杆机构
		num = 2;
	else
		num = 1;
	end
else
% 	fprintf('构建失败!');
    num = 0;    % 返回0代表不成立,不能构建四杆运动机构
end

其中自定义函数clearAxes.m为清除当前图窗内图像的函数

function clearAxes(handles)
%清空绘图区域
	cla(handles.axes1,'reset');
    cla(handles.axes2,'reset');
    cla(handles.axes3,'reset');
    cla(handles.axes4,'reset');
    cla(handles.axes5,'reset');
end
	

绘制前四个图像的函数drawFigure1.m

function drawFigure1(handles,theta,omega,alpha,length)
%绘制前四个图形
%handles:gui界面句柄
%axes1:角位移图像
%axes2:角速度图形
%axes3:角加速度图像
%axes4:连杆未运动时的图像
%theta\omega\alpha\是以元胞数组的形式传入该函数,因此使用时要用cell2mat()函数,将其转换为普通数组

n1 = 1:361;
hd = pi/180;	%方便角度转弧度
du = 180/pi;	%方便弧度转角度
%取数
theta2 = cell2mat(theta(1));
theta3 = cell2mat(theta(2));
omega2 = cell2mat(omega(1));
omega3 = cell2mat(omega(2));
alpha2 = cell2mat(alpha(1));
alpha3 = cell2mat(alpha(2));
length1 = length.a;
length2 = length.b;
length3 = length.c;
length4 = length.d;
% length1 = length(1);
% length2 = length(2);
% length3 = length(3);
% length4 = length(4);
%角位移图像
axes(handles.axes1);					%当前操作的图像界面是axes1
plot(n1,theta2*du,n1,theta3*du,'k');	%杆2和杆3随角度变化所产生的位移图
xlabel('曲柄转角 \theta1/\circ');		% x坐标轴的标签是”曲柄转角“
ylabel('角位移/\circ');					% y坐标轴的标签是”角位移“
legend('theta2','theta3');				% 表明曲线所代表的是什么内容
grid on;								%开启网格线

%绘制角速度线图
axes(handles.axes2);					%以下注释内容同上
plot(n1,omega2,n1,omega3,'k');
xlabel('曲柄转角 \theta1/\circ');
ylabel('角速度/ rad\cdots^{-1}');
legend('omega2','omega3');
grid on;

% 绘制角加速度图
axes(handles.axes3);
plot(n1,alpha2,n1,alpha3,'k');
xlabel('曲柄转角 \theta1/\circ');
ylabel('角加速度/rad\cdots^{-2}');
legend('alpha2','alpha3');
grid on;

%绘制铰链四杆机构图形输出
axes(handles.axes4);
xt(1)=0;			% 指明杆1的坐标位置
yt(1)=0;
xt(2)= length1*cos(70* hd);		%指明杆2其顺序相连点的坐标位置
yt(2)= length1*sin(70* hd);
xt(3)= length4+length3*cos( theta3(70));	%指明杆3其顺序相连点的坐标位置
yt(3)= length3*sin( theta3(70));
xt(4)=length4;					%指明杆4其顺序相连点的坐标位置
yt(4)=0;
xt(5)=0;						%构成闭环
yt(5)=0;
hold on;
plot(xt(1),yt(1),'o');			%将这四个点用”圆圈“的形式绘制出来
plot(xt(2),yt(2),'o');
plot(xt(3),yt(3),' o');
plot(xt(4),yt(4),'o');
plot(xt,yt);					%连接这五个点,构成闭环图形
xlabel('mm');
ylabel('mm');
set(handles.axes4,'XLim',[-50 350]);	%设置x轴和y轴的坐标范围
set(handles.axes4,'YLim',[-20 200]);
grid on;

主函数如下:(pushbutton1_callback)

(这里的意思是按下按钮后,执行回调函数)

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

temp1 = get(handles.edit1,'String');
temp2 = get(handles.edit2,'String');
temp3 = get(handles.edit3,'String');
temp4 = get(handles.edit4,'String');
temp5 = get(handles.edit5,'String');    %匀角速度
%从控制图窗获取各杆的长度
length1 = str2double(temp1);
length2 = str2double(temp2);
length3 = str2double(temp3);
length4 = str2double(temp4);
omega1 = str2double(temp5);
%将length杆长打包成结构体的形式,方便使用函数调用
length.a = length1;
length.b = length2;
length.c = length3;
length.d = length4;
%初始数据
% length1 = 101.6;
% length2 = 254;
% length3 = 177.8;
% length4 = 304.8;
% omega1 = 250;
alpha1 = 0;
hd = pi/180;
du = 180/pi;

%判断该四杆机构能否成功构建
    %1、判断是否有输入,或者输入错误、
%清空坐标区域
clearAxes(handles);
    %如果需要用户输入的地方有为空,则不能正确而分析,返回错误
if(isempty(temp1)||isempty(temp2)||isempty(temp3)||isempty(temp4)||isempty(temp5))
    set(handles.edit6,'String','Error!请输入完整的数据!');
    clearAxes(handles);
    return;
end
    %如果用户在获取数据的图框内输入了非数字类型的数据,则提示用户输入正常的 数字类型的数据
    %根据输入是 ‘字符’,则str2double()函数返回NaN
    % 在利用isnana()函数,进行判断即可
    % isnan() 函数:查询目标元素中是否包含NaN值,
if(isnan(length1)||isnan(length2)||isnan(length3)||isnan(length4)||isnan(omega1))
    set(handles.edit6,'String','Error!请输入非字符的数值!');
    clearAxes(handles);
    return;
end
    %根据输入的杆长来进一步判断能否正确构建运动系
	%根据自定义判断函数isEstablish() 的返回数值来做出不同的响应
	%返回0:杆长不符合四杆机构的要求,不能构建
	%返回1:可以成功构建曲柄摇杆、双曲柄摇杆
	%返回2:可以构建一个双摇杆机构,但本程序为设计相关计算模块,不做分析
if (isEstablish(length1,length2,length3,length4)==1)
    set(handles.edit6,'String','能成功构建,正在分析....');
elseif (isEstablish(length1,length2,length3,length4)==2)
	 set(handles.edit6,'String','该用例为双摇杆机构,本程序不做分析!');
	 clearAxes(handles);
	 return;
else
    set(handles.edit7,'String','Error!当前杆长不能构建四杆机构!');
    clearAxes(handles);
    return;
end

%调用函数计算四杆机构的位移、速度、加速度
for n1 = 1:361
	theta1 = (n1-1)*hd;		% 将角度转换为弧度制
	[theta,omega,alpha] = analysis_data(theta1,omega1,alpha1,length1,length2,length3,length4);
	theta2(n1) = theta(1);		% 杆2的角位移
	theta3(n1) = theta(2);		% 杆3的角位移
	
	omega2(n1) = omega(1);		% 杆2的角速度
	omega3(n1) = omega(2);		% 杆3的角速度
	alpha2(n1) = alpha(1);	% 杆2的角加速度
	alpha3(n1) = alpha(2);	% 杆3的角加速度
end
thetaArr = {theta2,theta3}; %将theta2和theta3打包成元胞数组的形式
omegaArr = {omega2,omega3}; %将omega2和omega3打包成元胞数组的形式
alphaArr = {alpha2,alpha3}; %将alpha2和alpha3打包成元胞数组的形式

%%
% 绘制图形
%对于前四个图像,有以下两种处理方法
%方案1:使用自己定义的函数
drawFigure1(handles,thetaArr,omegaArr,alphaArr,length);
%方案2:直接绘图,详细代码见底部
 
% 4、铰链四杆机构运动仿真
m = moviein(20) ;
j=0;
axes(handles.axes5);
for n1= 1:5 :360
    cla(handles.axes5);
    j=j+1;
    x(1)=0;
    y(1)=0;
    x(2)=length1* cos((n1 - 1)*hd);
    y(2)=length1* sin((n1 - 1)*hd);
    x(3)=length4+length3 * cos(theta3(n1));
    y(3)= length3* sin( theta3(n1));
    x(4)=length4;
    y(4)=0;
    x(5)=0;
    y(5)=0;
    plot(handles.axes5,x,y);
    grid on;hold on;
    plot(x(1),y(1),'o');
    plot(x(2),y(2),'o');
    plot(x(3),y(3),'o');
    plot(x(4),y(4),'o');
    axis([-150 350   -150 200]);
    xlabel('mm');
    ylabel('mm');
    m(j) = getframe;		%getframe函数的作用是捕获坐标区或图窗作为影片帧。
end
set(handles.edit6,'String','分析成功,图形如下');
movie(handles.axes5,m,1);		%movie() 函数,播放动画
return;


%%
%方案二,绘制前四个图像
% n1 = 1:361;
% % 绘制位移线图
% axes(handles.axes1);
% plot(n1,theta2*du,n1,theta3*du,'k');	% 杆2和杆3随角度变化所产生的位移图
% xlabel('曲柄转角 \theta1/\circ');
% ylabel('角位移/\circ');
% grid on;
% hold on;
% 
% %绘制角速度线图
% axes(handles.axes2);
% plot(n1,omega2,n1,omega3,'k');
% xlabel('曲柄转角 \theta1/\circ');
% ylabel('角速度/ rad\cdots^{-1}');
% grid on;
% hold on;
%     
% % 绘制角加速度图
% axes(handles.axes3);
% plot(n1,alpha2,n1,alpha3,'k');
% xlabel('曲柄转角 \theta1/\circ');
% ylabel('角加速度/rad\cdots^{-2}');
% grid on;
% hold on;
%  
% %绘制铰链四杆机构图形输出
% 
% xt(1)=0;
% yt(1)=0;
% xt(2)= length1*cos(70* hd);
% yt(2)= length1*sin(70* hd);
% xt(3)= length4+length3*cos( theta3(70));
% yt(3)= length3*sin( theta3(70));
% xt(4)=length4;
% yt(4)=0;
% xt(5)=0;
% yt(5)=0;
% axes(handles.axes4);
% hold on;
% plot(xt(1),yt(1),'o');
% plot(xt(2),yt(2),'o');
% plot(xt(3),yt(3),' o');
% plot(xt(4),yt(4),'o');
% plot(xt,yt);
% xlabel('mm');
% ylabel('mm');
% set(handles.axes4,'XLim',[-50 350]);
% set(handles.axes4,'YLim',[-20 200]);
% grid on;

运行后所展现的图像如下:(测试用例)

 更新

2024.4.21更新——公开源码

GitHub - PlumDuff/motion-analysis: 【MATLAB】铰链四杆机构运动分析(GUI设计)【MATLAB】铰链四杆机构运动分析(GUI设计). Contribute to PlumDuff/motion-analysis development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/PlumDuff/motion-analysis三年前的一次无心之举,没想到能让诸多网友关注,受宠若惊,几经搜索已找到源码,遂开源。

水平有限,但还是希望能帮助到学习路上的诸位。

禁止售卖!喜欢就留个赞吧(* ̄3 ̄)╭

  • 68
    点赞
  • 326
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值