108 lines
4.0 KiB
Mathematica
108 lines
4.0 KiB
Mathematica
% ---------------------------------------------------------------------
|
|
% In this script trajectory optimization otherwise called experiment
|
|
% design for dynamic paramters identification is carried out.
|
|
% ---------------------------------------------------------------------
|
|
run('main_ur.m'); % get robot description
|
|
|
|
% Choose optimization algorithm: 'patternsearch', 'ga'
|
|
optmznAlgorithm = 'patternsearch';
|
|
|
|
% Getting limits on posistion and velocities. Moreover we get some
|
|
% constant parmeters of the robot that allow us to accelerate computation
|
|
% of the robot regressor.
|
|
q_min = zeros(6,1); q_max = zeros(6,1); qd_max = zeros(6,1);
|
|
for i = 1:6
|
|
rot_axes(:,i) = str2num(ur10.robot.joint{i}.axis.Attributes.xyz)';
|
|
R_pj = RPY(str2num(ur10.robot.joint{i}.origin.Attributes.rpy));
|
|
p_pj = str2num(ur10.robot.joint{i}.origin.Attributes.xyz)';
|
|
T_pj(:,:,i) = [R_pj, p_pj; zeros(1,3), 1];
|
|
r_com(:,i) = str2num(ur10.robot.link{i+1}.inertial.origin.Attributes.xyz)';
|
|
|
|
q_min(i) = str2double(ur10.robot.joint{i}.limit.Attributes.lower);
|
|
q_max(i) = str2double(ur10.robot.joint{i}.limit.Attributes.upper);
|
|
qd_max(i) = str2double(ur10.robot.joint{i}.limit.Attributes.velocity);
|
|
end
|
|
|
|
ur10.rot_axes = rot_axes; % axis of rotation of each joint
|
|
ur10.T_pj = T_pj;
|
|
ur10.r_com = r_com;
|
|
ur10.qd_max = qd_max;
|
|
ur10.q2d_max = 2*ones(6,1);
|
|
% Use different limit for positions for safety
|
|
ur10.q_min = deg2rad([-180 -180 -90 -180 -90 -90]');
|
|
ur10.q_max = deg2rad([180 0 90 0 90 90]');
|
|
ur10.q0 = deg2rad([0 -90 0 -90 0 0 ]');
|
|
|
|
% Trajectory parameters
|
|
traj_par.T = 20; % period of signal
|
|
traj_par.wf = 2*pi/traj_par.T; % fundamental frequency
|
|
traj_par.t_smp = 1e-1; % sampling time
|
|
traj_par.t = 0:traj_par.t_smp:traj_par.T; % time
|
|
traj_par.N = 5; % number of harmonics
|
|
|
|
|
|
% ----------------------------------------------------------------------
|
|
% Otimization
|
|
% -----------------------------------------------------------------------
|
|
A = []; b = [];
|
|
Aeq = []; beq = [];
|
|
lb = []; ub = [];
|
|
|
|
if strcmp(optmznAlgorithm, 'patternsearch')
|
|
x0 = rand(6*2*traj_par.N,1);
|
|
optns_pttrnSrch = optimoptions('patternsearch');
|
|
optns_pttrnSrch.Display = 'iter';
|
|
optns_pttrnSrch.StepTolerance = 1e-3;
|
|
|
|
[x,fval] = patternsearch(@(x)traj_cost_lgr(x,traj_par,ur10), x0, ...
|
|
A, b, Aeq, beq, lb, ub, ...
|
|
@(x)traj_cnstr(x,traj_par,ur10), optns_pttrnSrch);
|
|
|
|
elseif strcmp(optmznAlgorithm, 'ga')
|
|
optns_ga = optimoptions('ga');
|
|
optns_ga.Display = 'iter';
|
|
optns_ga.PlotFcn = 'gaplotbestf'; % {'gaplotbestf', 'gaplotscores'}
|
|
optns_ga.MaxGenerations = 50;
|
|
optns_ga.PopulationSize = 1e+3; % in each generation.
|
|
optns_ga.InitialPopulationRange = [-100; 100];
|
|
optns_ga.SelectionFcn = 'selectionroulette';
|
|
|
|
[x,fval] = ga(@(x)traj_cost_lgr(x,traj_par,ur10), 6*2*traj_par.N,...
|
|
A, b, Aeq, beq, lb, ub, ...
|
|
@(x)traj_cnstr(x,traj_par,ur10),optns_ga);
|
|
else
|
|
error('Chosen algorithm is not found among implemented ones');
|
|
end
|
|
|
|
%% ------------------------------------------------------------------------
|
|
% Verifying obtained trajectory
|
|
% ------------------------------------------------------------------------
|
|
ab = reshape(x,[12,traj_par.N]);
|
|
a = ab(1:6,:); % sin coeffs
|
|
b = ab(7:12,:); % cos coeffs
|
|
c_pol = getPolCoeffs(traj_par.T, a, b, traj_par.wf, traj_par.N, ur10.q0);
|
|
[q,qd,q2d] = mixed_traj(traj_par.t, c_pol, a, b, traj_par.wf, traj_par.N);
|
|
|
|
|
|
if strcmp(optmznAlgorithm, 'patternsearch')
|
|
strcat('N',num2str(traj_par.N),'T',num2str(traj_par.T))
|
|
elseif strcmp(optmznAlgorithm, 'ga')
|
|
|
|
end
|
|
|
|
figure
|
|
subplot(3,1,1)
|
|
plot(traj_par.t,q)
|
|
ylabel('$q$','interpreter','latex')
|
|
grid on
|
|
legend('q1','q2','q3','q4','q5','q6')
|
|
subplot(3,1,2)
|
|
plot(traj_par.t,qd)
|
|
ylabel('$\dot{q}$','interpreter','latex')
|
|
grid on
|
|
legend('qd1','qd2','qd3','qd4','qd5','qd6')
|
|
subplot(3,1,3)
|
|
plot(traj_par.t,q2d)
|
|
ylabel('$\ddot{q}$','interpreter','latex')
|
|
grid on
|
|
legend('q2d1','q2d2','q2d3','q2d4','q2d5','q2d6') |