IRDYn/R1000_Dynamics.m

93 lines
2.8 KiB
Mathematica
Raw Permalink Normal View History

2024-09-22 18:09:08 +00:00
%% R1000
N=9;
2024-09-22 18:57:34 +00:00
% traj
time = 0:0.01:2;
f=1;
q_J = sin(2*pi*f*time);
qd_J = (2*pi*f)*cos(2*pi*f*time);
qdd_J = -(2*pi*f)^2*sin(2*pi*f*time);
zero_ = zeros(1,length(q_J));
2024-09-22 18:09:08 +00:00
% Dynamics parameters
link_mass = robot.m;
com_pos = robot.com;
2024-09-22 18:57:34 +00:00
link_inertia = robot.I;
2024-09-22 18:09:08 +00:00
q_sym = sym('q%d',[N,1],'real');
qd_sym = sym('qd%d',[N,1],'real');
q2d_sym = sym('qdd%d',[N,1],'real');
thetalist = qd_sym(1:N);
dthetalist = qd_sym(1:N);
ddthetalist = q2d_sym(1:N);
% Get general mass matrix
Glist=[];
for i = 1:N
Gb= [link_inertia(:,:,i),zeros(3,3);zeros(3,3),link_mass(i)*diag([1,1,1])];
Glist = cat(3, Glist, Gb);
end
% Get the com pos transformation in each joint reference frame
2024-09-22 18:57:34 +00:00
Mlist_CG = [];
for i = 0:N-1
if i == 0
M = robot.T(:,:,i+1)*transl(com_pos(:,i+1));
else
M = TransInv(transl(com_pos(:,i)))*robot.T(:,:,i+1)*transl(com_pos(:,i+1));
end
Mlist_CG = cat(3, Mlist_CG, M);
end
M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
Mlist_CG = cat(3, Mlist_CG, M);
% Get the end efforce transformation in each joint reference frame
Mlist_ED = [];
2024-09-22 18:09:08 +00:00
for i = 1:N
2024-09-22 18:57:34 +00:00
M = robot.T(:,:,i);
Mlist_ED = cat(3, Mlist_ED, M);
2024-09-22 18:09:08 +00:00
end
M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
2024-09-22 18:57:34 +00:00
Mlist_ED = cat(3, Mlist_ED, M);
2024-09-22 18:09:08 +00:00
%TODO: Get Slist form DH table method
2024-09-22 18:57:34 +00:00
% RRRRRRRRP
2024-09-22 18:09:08 +00:00
Slist=[[0;0;1;0;0;0],...
[0;-1;0;cross(-[0;-1;0],[0.2;0;0])]...
[0;-1;0;cross(-[0;-1;0],[0.2+0.5;0;0])]...
[0;-1;0;cross(-[0;-1;0],[0.2+0.5+0.45;0;0])]...
[0;0;1;cross(-[0;0;1],[0.2+0.5+0.45+0.12;0;0])]...
[1;0;0;cross(-[1;0;0],[0.2+0.5+0.45+0.12+0.28;0;0])]...
[0;0;-1;cross(-[0;0;-1],[0.2+0.5+0.45+0.12+0.28;0;-0.4])]...
[0;-1;0;cross(-[0;-1;0],[0.2+0.5+0.45+0.12+0.28;0;-0.4])]...
2024-09-22 18:57:34 +00:00
[0;0;0;1;0;0]];
2024-09-22 18:09:08 +00:00
Vlinear=sym(zeros(3,3));
J=sym(zeros(6,N));
exf=[0;0;0;0;0;0];
[V1,Vd1,Adgab_mat,Fmat,tau_mat] ...
= InverseDynamics_sym(thetalist, dthetalist, ddthetalist, ...
2024-09-22 18:57:34 +00:00
[0;0;-9.8], exf, Mlist_CG, Glist, Slist);
% G = FKinSpaceExpand_Sym(Mlist_CG, Slist, thetalist);
% T=FKinSpaceExpand_Sym(Mlist_ED, Slist, thetalist);
% F_Simpack = getSimpackF_Sym(G,T,Mlist_ED,Fmat);
2024-09-22 18:09:08 +00:00
%Gen Files
2024-09-22 18:57:34 +00:00
matlabFunction(Fmat,'File',sprintf('autogen/standard_dynamics_%s',opt.robotName),...
2024-09-22 18:09:08 +00:00
'Vars',{q_sym,qd_sym,q2d_sym});
standard_dynamics_func = sprintf('standard_dynamics_%s',opt.robotName);
% traj
2024-09-22 18:57:34 +00:00
% time = 0:1:2;
% f=1;
% q_J = sin(2*pi*f*time);
% qd_J = (2*pi*f)*cos(2*pi*f*time);
% qdd_J = -(2*pi*f)^2*sin(2*pi*f*time);
% F_Simpack_list = feval(standard_dynamics_func, q_J',qd_J',qdd_J');
2024-09-22 18:09:08 +00:00
% Use Body Twist cal linear vel, but can't cal the end frame vel
% [V2] = InverseDynamics_sym(thetalist, dthetalist, ddthetalist, ...
% [0;0;0], exf, Mlist, Glist, Slist);
% j=1;
% Vlinear(:, j+1) = BodyVelToLinearVel(V2(:,j+1),G(:,:,j)*M12);
% j=2;
% Vlinear(:, j+1) = BodyVelToLinearVel(V2(:,j+1),G(:,:,j)*M23);