曲柄滑块¶
机构具备多个内容
slider 函数¶
slider.m¶
% slider.m
function yd=slider(L1,L2)
%pkg load symbolic
% pkg install -forge symbolic
% 函数封装
Rx = @(r1, r2)[r1; r2]; % 位置变量
qx = @(R, a)[R; a]; % 构型变量
Ax = @(a)[cos(a) -sin(a); sin(a) cos(a)];
ux = @(L, factor)[factor * L; 0];
Ux = @(R, A, L, factor)R + A * ux(L, factor);
syms r11 r12 a1 r21 r22 a2 r31 r32 a3 L1 L2
syms dr11 dr12 da1 dr21 dr22 da2 dr31 dr32 da3
syms ddr11 ddr12 dda1 ddr21 ddr22 dda2 ddr31 ddr32 dda3
R1 = Rx(r11, r12);
A1 = Ax(a1);
fun1 = Ux(R1, A1, L1, 0.5);
R2 = Rx(r21, r22);
R3 = Rx(r31, r32);
A2 = Ax(a2);
A3 = Ax(a3);
fun2 = Ux(R1, A1, L1, 0.5) - Ux(R2, A2, L2, -0.5);
dR1 = Rx(dr11, dr12);
dR2 = Rx(dr21, dr22);
dR3 = Rx(dr31, dr32);
q1 = qx(R1, a1);
q2 = qx(R2, a2);
q3 = qx(R3, a3);
q = [q1; q2; q3];
U2b = Ux(R2, A2, L2, 0.5);
U3b = Ux(R3, A3, 0, 0);
fun3=U2b-U3b;
fun4=[r32;a3];
fun_c=[fun1;fun2;fun3;fun4]
qi=a1;
qd=[R1;R2;a2;R3;a3];
dqi=da1;
dqd=[dR1;dR2;da2;dR3;da3];
qn=[qi;qd];
dqn=[dqi;dqd];
ddqi=dda1;
yd1=solve(fun_c,qd);
%{
r11=yd1.r11
r12=yd1.r12
r21=yd1.r21
r22=yd1.r22
a2=yd1.a2
r31=yd1.r31
r32=yd1.r32
a3=yd1.a3
%}
Cqd=jacobian(fun_c,qd);
Cqi=jacobian(fun_c,qi);
Qc =jacobian(jacobian(fun_c,qn)*dqn, qn)*dqn;
Qdi=-simplify(inv(Cqd)*Cqi);
yd2=Cqi*dqi;
yd3=Cqi*ddqi+inv(Cqd)*Qc;
%yd={yd1;yd2;yd3};
yd=yd1;
end
slider2.m¶
function yd=slider(L1,L2)
% clear
% clc
syms r11 r12 a1 r21 r22 a2 r31 r32 a3
R1=[r11;r12];R2=[r21;r22];R3=[r31;r32];
q1=[R1;a1];q2=[R2;a2];q3=[R3;a3];
q=[q1;q2;q3];
A1=[cos(a1) -sin(a1);sin(a1) cos(a1)];
A2=[cos(a2) -sin(a2);sin(a2) cos(a2)];
A3=[cos(a3) -sin(a3);sin(a3) cos(a3)];
u1_o=[-0.5*L1;0];
u10=R1+A1*u1_o;
fun1=R1+A1*u1_o;
u1_a=[0.5*L1;0];
u2_a=[-0.5*L2;0];
u1a=R1+A1*u1_a;
u2a=R2+A2*u2_a;
fun2=u1a-u2a;
u2_b=[0.5*L2;0];
u3_b=[0;0];
u2b=R2+A2*u2_b;
u3b=R3+A3*u3_b;
fun3=u2b-u3b;
fun4=[r32;a3];
fun_c=[fun1;fun2;fun3;fun4];
qi=a1;
qd=[R1;R2;a2;R3;a3];
% dqi=da1;
% dqd=[dR1;dR2;da2;dR3;da3];
% qn=[qi;qd];
% dqn=[dqi;dqd];
% ddqi=dda1;
%% 位置正解
yd1=solve(fun_c,qd);
% r11=yd1.r11;
% r12=yd1.r12;
% r21=yd1.r21;
% r22=yd1.r22;
% a2=yd1.a2;
% r31=yd1.r31;
% r32=yd1.r32;
% a3=yd1.a3
yd=yd1;
end
主函数¶
ms.m¶
clear all
clc
pkg load symbolic
% pkg install -forge symbolic
syms r11 r12 a1 r21 r22 a2 r31 r32 a3
syms dr11 dr12 da1 dr21 dr22 da2 dr31 dr32 da3
syms ddr11 ddr12 dda1 ddr21 ddr22 dda2 ddr31 ddr32 dda3
L1=0.5; L2=1.5;
yd=slider(L1,L2);
% 位移
qd1=yd{1,1};
qd1=qd1{1,1};
r11=qd1.r11
r12=qd1.r12
a1=qd1.a1
r21=qd1.r21
r22=qd1.r22
a2=qd1.a2
r31=qd1.r32
r32=qd1.r32
R1=[r11;r12];
R2=[r21;r22];
R3=[r31;r32];
%velocity
dr11=diff(r11,a1)*da1;
dr12=diff(r12,a1)*da1;
dr21=diff(r21,a1)*da1;
dr22=diff(r22,a1)*da1;
dr31=diff(r31,a1)*da1;
dr32=diff(r32,a1)*da1;
da3=diff(a3,a1)*da1;
% acceleration
function ddd=ddiff(dr11,a1,da1,dda1)
ddd=diff(dr11,a1)*da1+diff(dr11,da1)*dda1;
end
ddr11=ddiff(r11,a1,da1,dda1);
ddr12=ddiff(r12,a1,da1,dda1);
dda2=ddiff(a2,a1,da1,dda1);
ddr21=ddiff(r21,a1,da1,dda1);
ddr22=ddiff(r22,a1,da1,dda1);
ddr31=ddiff(r31,a1,da1,dda1);
ddr32=ddiff(r32,a1,da1,dda1);
dda3=ddiff(a3,a1,da1,dda1);