机械原理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.https://github.com/PlumDuff/motion-analysis三年前的一次无心之举,没想到能让诸多网友关注,受宠若惊,几经搜索已找到源码,遂开源。
水平有限,但还是希望能帮助到学习路上的诸位。
禁止售卖!喜欢就留个赞吧(* ̄3 ̄)╭