通用matlab设计一个曲柄摇杆机构,该程序主要依据机械原理解析法中的直角坐标法设计,(位移矩阵法还在研究,感觉更难),并作出运动仿真效果图。
给定设计参数:
需要实现的动画效果大致如下:
曲柄摇杆设计参数
其中A,D处为固定铰链,初始Lab与水平为60°(pi/3)夹角。点A位置设定为(0,0),点D位置设定为(80,0),运动方向为Lab绕着A点匀速转动。各杆长度如图所示,且符合杆长条件(最短杆+最长杆=<中间两杆长),Lab为曲柄,Lcd为摇杆。
设计思路:
通过机械原理对机构设计的解析法里面的直角坐标法为设计方法。
已知A的坐标和D的坐标,且不发生改变,需求B的坐标(Xb,Yb),和C的坐标(Xc,Yc)
通过A点坐标以及Lab杆长不变,列出B点关于A点的位置方程。
Xb(i)=Xa+Lab*cos(M(i));//其中Xb(i)代表绕A点转动过程中到不同位置的坐标
Yb(i)=Ya+Lab*sin(M(i)); //其中Yb(i)代表绕A点转动过程中到不同位置的坐标
再通过Lbc杆长不变和Lcd杆长不变列出C的两个独立方程(两个方程两个未知数(Xc,Yc))
eq1=(a-Xd).^2+(b-Yd).^2-Lcd.^2;
eq2=(a-Xb(q)).^2+(b-Yb(q)).^2-Lbc.^2;
其中a,b为设定的两个未知数,代表在某一确定位置下,C点的位置信息,但具体C点坐标的确定还要进行其他一些操作,因为C是不断变化的,总的位置信息通过一个矩阵记录。还不排除方程得出多解的情况,要在进行分析处理。
最后得到相关全部的位置信息后,进行绘图处理,通过clf;getframe;moviein;将画面每一帧连续的播放后删除再播放,实现动画效果,具体见编程。
具体编程:
syms a b;
Xa=0;
Ya=0;
Xb=zeros(1,126);
Yb=zeros(1,126);
Xc=zeros(1,126);
Yc=zeros(1,126);
Xd=80;
Yd=0;
Lab=40;
Lbc=70;
Lcd=60;
Wa=0.05;
theatA=pi/3;
f=1:1:126;
M=zeros(1,126);
M(f)=theatA+Wa*(f-1);
上述代码中设定了具体的参数,并且将B,C的位置信息提前设定为1×126的零矩阵(126是因为设定Lab转动角速度为0.05rad/s,经过试验转一圈会有126个解,提前设定为1×126的零矩阵是因为可以提高迭代的运行效率,具体原因有待研究)。M(f)是记录Lab转动时不同位置的角度信息。
for i=1:1:126
Xb(i)=Xa+Lab*cos(M(i));
Yb(i)=Ya+Lab*sin(M(i));
end
上述代码通过for循环,求解出转动到这126个位置时,B的位置信息,并依次带入到B的位置矩阵中,实现对B位置信息的确定。且方程没有多解情况。
for q=1:1:126
eq1=(a-Xd).^2+(b-Yd).^2-Lcd.^2;
eq2=(a-Xb(q)).^2+(b-Yb(q)).^2-Lbc.^2;
[A,B]=solve([eq1==0,eq2==0],[a,b]);
Xc(q)=real(A(2));
Yc(q)=real(B(2));
end
上述代码通过设定a,b两个未知数,来记录一个位置中的C的位置信息,使用solve来进行求解,后将a,b的信息依次带入C的位移矩阵之中。需要注意的是,也是困扰了我很久的是,联立方程进行求解时,得到a,b会有多解的情况,数学上理解是因为有平方存在,求解时会有正和负两种情况,在机械四杆机构中理解,则是会出现BC杆位于AD下方的情况。
figure(1)
v=moviein(100);
for w=1:1:126
clf;
hold on
plot(Xa,Ya,'*r',Xb(w),Yb(w),'*g')
line([Xa,Xb(w)],[Ya ,Yb(w)]);
plot(Xb(w),Yb(w),'*',Xc(w),Yc(w),'*')
line([Xb(w),Xc(w)],[Yb(w),Yc(w)]);
plot(Xd,Yd,'*r',Xc(w),Yc(w),'*g')
line([Xd,Xc(w)],[Yd ,Yc(w)]);
axis([-80 160 -80 160])
v(w)=getframe;
end
grid
movie(v)
hold off
上述代码为绘图具体程序,不做具体分析,可通过查询函数用法自行领悟
运行结果:
实现给定的设计要求,并成功得到运动仿真动画。
曲柄摇杆机构运动仿真
拓展思考:
通过改变设定的参数,包括各杆长信息,初始角度,角速度,A,D位置,以及选取a,b中另一组解作为C点坐标等等,此程序也可以设计为其他参数的曲柄摇杆机构,但如果想以此设计其他如双曲柄机构,貌似会出现一些点连续失效甚至突变的情况,暂时没有解决方法,需要后续研究。
是否可以通过matlab的gui设计成一个曲柄摇杆生成器,貌似也可行,有待后续研究,若有成果,再与大家交流。
本人学习MATLAB时间较短,许多程序还不清楚具体注意事项,肯定存在比我所写的程序更方便效率更高的程序,如果读者对此有兴趣,欢迎对我所写的代码提出建议与优化步骤,感谢