2019-12-26 09:09:57 +00:00
|
|
|
% ---------------------------------------------------------------------
|
|
|
|
|
% In this script identification of dynamic parameters as well as
|
|
|
|
|
% drive gains are performed on ideal trajectory found from
|
|
|
|
|
% optimization procedure.
|
|
|
|
|
% ---------------------------------------------------------------------
|
|
|
|
|
clc; clear all; close all;
|
2019-12-18 11:25:45 +00:00
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
% get robot parameters from urdf
|
|
|
|
|
run('main_ur.m');
|
|
|
|
|
|
|
|
|
|
% add reflected rotor inertia to parameters
|
|
|
|
|
reflectedRotorInertia = rand([1,6]);
|
|
|
|
|
ur10.pi = [ur10.pi; reflectedRotorInertia];
|
|
|
|
|
ur10.pi = reshape(ur10.pi,[size(ur10.pi,1)*size(ur10.pi,2), 1]);
|
|
|
|
|
|
|
|
|
|
% get base parameters
|
|
|
|
|
load('baseQR.mat');
|
|
|
|
|
E1 = baseQR.permutationMatrix(:,1:baseQR.numberOfBaseParameters);
|
|
|
|
|
ur10.pi_base = [eye(baseQR.numberOfBaseParameters) baseQR.beta]*...
|
|
|
|
|
baseQR.permutationMatrix'*ur10.pi;
|
|
|
|
|
|
|
|
|
|
% add friction parmeters to the vector of base parameters
|
|
|
|
|
frictionParameters = rand([18,1]);
|
|
|
|
|
ur10.pi_base = [ur10.pi_base; frictionParameters];
|
|
|
|
|
|
|
|
|
|
% optimized trajectory
|
|
|
|
|
load('ptrnSrch_N5T20QR.mat');
|
2019-12-18 11:25:45 +00:00
|
|
|
traj_par.t_smp = 1e-1; % sampling time
|
|
|
|
|
traj_par.t = 0:traj_par.t_smp:traj_par.T; % time
|
|
|
|
|
|
|
|
|
|
% generilized corrdinates, velocities and acelerations of the trajectory
|
|
|
|
|
[q,qd,q2d] = mixed_traj(traj_par.t,c_pol,a,b,traj_par.wf,traj_par.N);
|
|
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
% add noise to data
|
2020-01-16 07:48:37 +00:00
|
|
|
noiseVariance = 0.1;
|
2019-12-26 09:09:57 +00:00
|
|
|
q = q + sqrt(noiseVariance)*rand(size(q));
|
|
|
|
|
qd = qd + sqrt(noiseVariance)*rand(size(qd));
|
|
|
|
|
q2d = q2d + sqrt(2*noiseVariance)*rand(size(q2d));
|
|
|
|
|
|
|
|
|
|
% load and drive paramters
|
2020-01-16 07:48:37 +00:00
|
|
|
m_load = 5;
|
|
|
|
|
pi_load = [0.2,0.05,0.07,0.15,0.01,0.4, 0.05, 0, 0, m_load]';
|
|
|
|
|
K_drv = [20 16 13 10 9 8]';
|
2019-12-26 09:09:57 +00:00
|
|
|
|
|
|
|
|
% Constracting regressor matrix for unloaded case
|
|
|
|
|
Wb_uldd = []; I_uldd = [];
|
|
|
|
|
for i = 1:1:length(traj_par.t)
|
|
|
|
|
Y_ulddi = regressorWithMotorDynamics(q(:,i),qd(:,i),q2d(:,i));
|
|
|
|
|
Yfrctni = frictionRegressor(qd(:,i));
|
|
|
|
|
Ybi_uldd = [Y_ulddi*E1, Yfrctni];
|
2020-01-16 07:48:37 +00:00
|
|
|
taui_uldd = Ybi_uldd*ur10.pi_base + sqrt(noiseVariance)*rand(6,1);
|
2019-12-26 09:09:57 +00:00
|
|
|
|
|
|
|
|
Wb_uldd = vertcat(Wb_uldd, Ybi_uldd);
|
2020-01-16 07:48:37 +00:00
|
|
|
I_uldd = vertcat(I_uldd, diag(diag(K_drv)\taui_uldd));
|
2019-12-26 09:09:57 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
% Constracting regressor matrix for loaded case
|
|
|
|
|
Wb_ldd = []; Wl = []; I_ldd = [];
|
|
|
|
|
for i = 1:1:length(traj_par.t)
|
|
|
|
|
Y_lddi = regressorWithMotorDynamics(q(:,i),qd(:,i),q2d(:,i));
|
|
|
|
|
Yfrctni = frictionRegressor(qd(:,i));
|
|
|
|
|
Ybi_ldd = [Y_lddi*E1, Yfrctni];
|
2020-01-16 07:48:37 +00:00
|
|
|
Yli = load_regressor_UR10E(q(:,i),qd(:,i),q2d(:,i));
|
|
|
|
|
taui_ldd = [Ybi_ldd Yli]*[ur10.pi_base; pi_load] + ...
|
|
|
|
|
sqrt(noiseVariance)*rand(6,1);
|
2019-12-18 11:25:45 +00:00
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
Wb_ldd = vertcat(Wb_ldd, Ybi_ldd);
|
|
|
|
|
Wl = vertcat(Wl, Yli);
|
2020-01-16 07:48:37 +00:00
|
|
|
I_ldd = vertcat(I_ldd, diag(diag(K_drv)\taui_ldd));
|
|
|
|
|
end
|
|
|
|
|
Wl_uknown = Wl(:,1:9); % regressor matrix of the unknown load params
|
|
|
|
|
Wl_known = Wl(:,10); % regressor matrix of the known load params
|
|
|
|
|
nmbrRwsUnldd = size(Wb_uldd,1);
|
|
|
|
|
nmbrRwsLdd = size(Wb_ldd,1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%% Using total least squares
|
|
|
|
|
Wb_tls = [I_uldd -Wb_uldd zeros(size(I_uldd,1), size(Wl,2));
|
|
|
|
|
I_ldd -Wb_ldd -Wl_uknown -Wl_known*m_load];
|
|
|
|
|
|
|
|
|
|
% SVD decompostion of Wb_tls to solve total least squares
|
|
|
|
|
[~,~,V] = svd(Wb_tls,'econ');
|
|
|
|
|
% Scaling of the solution
|
|
|
|
|
lmda = 1/V(end,end);
|
|
|
|
|
pi_tls = lmda*V(:,end);
|
|
|
|
|
% drive gains
|
|
|
|
|
drvGains = [pi_tls(1:6) K_drv]
|
|
|
|
|
|
|
|
|
|
% Finding weighting matrix, joint by joint
|
|
|
|
|
G = zeros(6);
|
|
|
|
|
for i = 1:6
|
|
|
|
|
Wib_tls = Wb_tls(i:6:end,:);
|
|
|
|
|
[~,Si,Vi] = svd(Wib_tls,'econ');
|
|
|
|
|
sgmai = Si(end,end)/sqrt((size(Wib_tls,1)-rank(Wib_tls))); %size(Wib_tls,2)));
|
|
|
|
|
G(i,i) = 1/sgmai^2;
|
2019-12-26 09:09:57 +00:00
|
|
|
end
|
|
|
|
|
|
2020-01-16 07:48:37 +00:00
|
|
|
for i = 1:6:size(Wb_tls,1)
|
|
|
|
|
Wb_tls(i:i+5,:) = G*Wb_tls(i:i+5,:);
|
|
|
|
|
end
|
|
|
|
|
[~,~,V] = svd(Wb_tls,'econ');
|
|
|
|
|
lmda = 1/V(end,end);
|
|
|
|
|
pi_tls = lmda*V(:,end);
|
|
|
|
|
drvGains = pi_tls(1:6)
|
|
|
|
|
|
|
|
|
|
% Finding weighting matrix, joint by joint
|
|
|
|
|
G = zeros(6);
|
|
|
|
|
for i = 1:6
|
|
|
|
|
Wib_tls = Wb_tls(i:6:end,:);
|
|
|
|
|
[~,Si,Vi] = svd(Wib_tls,'econ');
|
|
|
|
|
sgmai = Si(end,end)/sqrt((size(Wib_tls,1)-rank(Wib_tls))); %size(Wib_tls,2)));
|
|
|
|
|
G(i,i) = 1/sgmai^2;
|
|
|
|
|
end
|
2019-12-26 09:09:57 +00:00
|
|
|
|
2020-01-16 07:48:37 +00:00
|
|
|
for i = 1:6:size(Wb_tls,1)
|
|
|
|
|
Wb_tls(i:i+5,:) = G*Wb_tls(i:i+5,:);
|
|
|
|
|
end
|
|
|
|
|
[~,~,V] = svd(Wb_tls,'econ');
|
|
|
|
|
lmda = 1/V(end,end);
|
|
|
|
|
pi_tls = lmda*V(:,end);
|
|
|
|
|
drvGains = pi_tls(1:6)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return
|
2019-12-26 09:09:57 +00:00
|
|
|
%% Identification of parameters including drive gains
|
|
|
|
|
Wb_ls = [I_uldd -Wb_uldd zeros(size(I_uldd,1), size(Wl_uknown,2));
|
|
|
|
|
I_ldd -Wb_ldd -Wl_uknown];
|
|
|
|
|
|
|
|
|
|
Yb_ts = [zeros(size(I_uldd,1),1); Wl_known*m_load];
|
|
|
|
|
|
|
|
|
|
% Compute least squares solution
|
|
|
|
|
pi_ls = ((Wb_ls'*Wb_ls)\Wb_ls')*Yb_ts;
|
|
|
|
|
drvGains = [pi_ls(1:6) K_drv]
|
|
|
|
|
|
2020-01-16 07:48:37 +00:00
|
|
|
|
|
|
|
|
% Find weighting matrix
|
2019-12-26 09:09:57 +00:00
|
|
|
G = zeros(6);
|
|
|
|
|
for i = 1:6
|
|
|
|
|
Wib_ls = Wb_ls(i:6:end,:);
|
|
|
|
|
Yib_ls = Yb_ts(i:6:end);
|
|
|
|
|
sgmai_sqrd = norm(Yib_ls - Wib_ls*pi_ls,2)^2/(size(Wib_ls,1)-size(Wib_ls,2));
|
|
|
|
|
G(i,i) = 1/sqrt(sgmai_sqrd);
|
|
|
|
|
end
|
|
|
|
|
|
2020-01-16 07:48:37 +00:00
|
|
|
% Weight data with weighting matrix
|
2019-12-26 09:09:57 +00:00
|
|
|
for i = 1:6:size(Wb_ls,1)
|
|
|
|
|
Wb_ls(i:i+5,:) = G*Wb_ls(i:i+5,:);
|
|
|
|
|
Yb_ts(i:i+5) = G*Yb_ts(i:i+5);
|
|
|
|
|
end
|
|
|
|
|
pi_tot = ((Wb_ls'*Wb_ls)\Wb_ls')*Yb_ts;
|
|
|
|
|
drvGains = pi_tot(1:6)
|
|
|
|
|
|
|
|
|
|
|
2020-01-16 07:48:37 +00:00
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
G_uldd = zeros(6);
|
|
|
|
|
G_ldd = zeros(6);
|
|
|
|
|
for i = 1:6
|
|
|
|
|
Wib_uldd = Wb_ls(i:6:nmbrRwsUnldd,:);
|
|
|
|
|
Yib_uldd = Yb_ts(i:6:nmbrRwsUnldd);
|
|
|
|
|
sgmai_sqrd = norm(Yib_uldd - Wib_uldd*pi_ls,2)^2/(size(Wib_uldd,1)-rank(Wib_uldd));
|
|
|
|
|
G_uldd(i,i) = 1/sqrt(sgmai_sqrd);
|
2019-12-18 11:25:45 +00:00
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
Wib_ldd = Wb_ls(nmbrRwsUnldd+i:6:end,:);
|
|
|
|
|
Yib_ldd = Yb_ts(nmbrRwsUnldd+i:6:end);
|
|
|
|
|
sgmai_sqrd = norm(Yib_ldd - Wib_ldd*pi_ls,2)^2/(size(Wib_ldd,1)-rank(Wib_ldd));
|
|
|
|
|
G_ldd(i,i) = 1/sqrt(sgmai_sqrd);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i = 1:6:size(Wb_uldd,1)
|
|
|
|
|
Wb_ls(i:i+5,:) = G_uldd*Wb_ls(i:i+5,:);
|
|
|
|
|
Yb_ts(i:i+5) = G_uldd*Yb_ts(i:i+5);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i = nmbrRwsUnldd+1:6:nmbrRwsUnldd+size(Wb_ldd,1)
|
|
|
|
|
Wb_ls(i:i+5,:) = G_ldd*Wb_ls(i:i+5,:);
|
|
|
|
|
Yb_ts(i:i+5) = G_ldd*Yb_ts(i:i+5);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
pi_tot = ((Wb_ls'*Wb_ls)\Wb_ls')*Yb_ts;
|
|
|
|
|
drvGains = pi_tot(1:6)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
%% Set-up SDP optimization procedure
|
|
|
|
|
drv_gns = sdpvar(6,1); % variables for base paramters
|
|
|
|
|
pi_load_unknw = sdpvar(9,1); % varaibles for unknown load paramters
|
|
|
|
|
pi_frctn = sdpvar(18,1);
|
|
|
|
|
pi_b = sdpvar(baseQR.numberOfBaseParameters,1); % variables for base paramters
|
|
|
|
|
pi_d = sdpvar(26,1); % variables for dependent paramters
|
|
|
|
|
|
|
|
|
|
% Bijective mapping from [pi_b; pi_d] to standard parameters pi
|
|
|
|
|
pii = baseQR.permutationMatrix*[ eye(baseQR.numberOfBaseParameters), ...
|
|
|
|
|
-baseQR.beta; ...
|
|
|
|
|
zeros(26,baseQR.numberOfBaseParameters), ...
|
|
|
|
|
eye(26) ]*[pi_b; pi_d];
|
|
|
|
|
|
|
|
|
|
% Feasibility contrraints of the link paramteres and rotor inertia
|
|
|
|
|
cnstr = diag(drv_gns)>0;
|
|
|
|
|
for i = 1:11:66
|
|
|
|
|
link_inertia_i = [pii(i), pii(i+1), pii(i+2); ...
|
|
|
|
|
pii(i+1), pii(i+3), pii(i+4); ...
|
|
|
|
|
pii(i+2), pii(i+4), pii(i+5)];
|
|
|
|
|
|
|
|
|
|
frst_mmnt_i = vec2skewSymMat(pii(i+6:i+8));
|
2019-12-18 11:25:45 +00:00
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
Di = [link_inertia_i, frst_mmnt_i'; frst_mmnt_i, pii(i+9)*eye(3)];
|
|
|
|
|
cnstr = [cnstr, Di>0, pii(i+10)>0];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
% Feasibility constraints on the load paramters
|
|
|
|
|
load_inertia = [pi_load_unknw(1), pi_load_unknw(2), pi_load_unknw(3); ...
|
|
|
|
|
pi_load_unknw(2), pi_load_unknw(4), pi_load_unknw(5); ...
|
|
|
|
|
pi_load_unknw(3), pi_load_unknw(5), pi_load_unknw(6)];
|
|
|
|
|
load_frst_mmnt = vec2skewSymMat(pi_load_unknw(7:9));
|
|
|
|
|
Dl = [load_inertia, load_frst_mmnt'; load_frst_mmnt, m_load*eye(3)];
|
|
|
|
|
|
|
|
|
|
cnstr = [cnstr, Dl>0];
|
|
|
|
|
|
|
|
|
|
% Feasibility constraints on the friction prameters
|
|
|
|
|
for i = 1:6
|
|
|
|
|
cnstr = [cnstr, pi_frctn(3*i-2)>0, pi_frctn(3*i-1)>0];
|
2019-12-18 11:25:45 +00:00
|
|
|
end
|
|
|
|
|
|
2019-12-26 09:09:57 +00:00
|
|
|
% Defining pbjective function
|
|
|
|
|
t1 = [zeros(size(I_uldd,1),1); -Wl(:,end)*m_load];
|
|
|
|
|
|
|
|
|
|
t2 = [-I_uldd, Wb_uldd, zeros(size(Wb_uldd,1), size(Wl,2)-1); ...
|
|
|
|
|
-I_ldd, Wb_ldd, Wl(:,1:9) ];
|
|
|
|
|
|
|
|
|
|
obj = norm(t1 - t2*[drv_gns; pi_b; pi_frctn; pi_load_unknw]);
|
|
|
|
|
|
|
|
|
|
% Solving sdp problem
|
|
|
|
|
sol = optimize(cnstr,obj,sdpsettings('solver','sdpt3'));
|
|
|
|
|
|
|
|
|
|
% Getting values of the estimated patamters
|
|
|
|
|
drv_gns = [value(drv_gns) K_drv]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return
|
2019-12-18 11:25:45 +00:00
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% Using SDP to find load parmeters along with drive gains
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
%{
|
|
|
|
|
drv_gns = sdpvar(6,1); % variables for base paramters
|
|
|
|
|
pi_load_unknw = sdpvar(9,1); % varaibles for unknown load paramters
|
|
|
|
|
% u = sdpvar(1,1); % variable for cost
|
|
|
|
|
%
|
|
|
|
|
% % Writing |Tau - W*pi_b| using Schur compliment
|
|
|
|
|
% U1 = [u, (-Wl(:,end)*m_load - [-(I_ldd-I_uldd) Wl(:,1:9)]*[drv_gns;pi_load_unknw])'; ...
|
|
|
|
|
% -Wl(:,end)*m_load - [-(I_ldd-I_uldd) Wl(:,1:9)]*[drv_gns;pi_load_unknw], sparse(eye(size(Wl,1)))];
|
|
|
|
|
|
|
|
|
|
% Feasibility contrraints
|
|
|
|
|
% U2 = diag(drv_gns);
|
|
|
|
|
load_inertia = [pi_load_unknw(1), pi_load_unknw(2), pi_load_unknw(3); ...
|
|
|
|
|
pi_load_unknw(2), pi_load_unknw(4), pi_load_unknw(5); ...
|
|
|
|
|
pi_load_unknw(3), pi_load_unknw(5), pi_load_unknw(6)];
|
|
|
|
|
|
|
|
|
|
load_frst_mmnt = vec2skewSymMat(pi_load_unknw(7:9));
|
|
|
|
|
|
|
|
|
|
D = [load_inertia, load_frst_mmnt'; load_frst_mmnt, m_load*eye(3)];
|
|
|
|
|
% U2 = blkdiag(U2,D);
|
|
|
|
|
% Overall constraints
|
|
|
|
|
% cnstr = blkdiag(U1,U2)>0;
|
|
|
|
|
cnstr = [drv_gns>0, D>0];
|
|
|
|
|
|
|
|
|
|
% Objective function
|
|
|
|
|
obj = norm(-Wl(:,end)*m_load - [-(I_ldd-I_uldd) Wl(:,1:9)]*[drv_gns;pi_load_unknw]);
|
|
|
|
|
|
|
|
|
|
% Solving sdp problem
|
|
|
|
|
sol = optimize(cnstr,obj,sdpsettings('solver','sdpt3'));
|
|
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% Computing drive gains using second method
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
drv_gns = sdpvar(6,1); % variables for base paramters
|
|
|
|
|
pi_load_unknw = sdpvar(9,1); % varaibles for unknown load paramters
|
|
|
|
|
pi_b = sdpvar(36,1); % variables for base paramters
|
|
|
|
|
pi_d = sdpvar(24,1); % variables for dependent paramters
|
|
|
|
|
|
|
|
|
|
% Bijective mapping from [pi_b; pi_d] to standard parameters pi
|
|
|
|
|
pii = [Pb' Pd']*[ eye(36) -double(Kd); zeros(24,36) eye(24)]*[pi_b; pi_d];
|
|
|
|
|
|
|
|
|
|
% Feasibility contrraints
|
|
|
|
|
cnstr = drv_gns>0;
|
|
|
|
|
for i = 1:10:60
|
|
|
|
|
link_inertia_i = [pii(i), pii(i+1), pii(i+2); ...
|
|
|
|
|
pii(i+1), pii(i+3), pii(i+4); ...
|
|
|
|
|
pii(i+2), pii(i+4), pii(i+5)];
|
|
|
|
|
|
|
|
|
|
frst_mmnt_i = vec2skewSymMat(pii(i+6:i+8));
|
|
|
|
|
|
|
|
|
|
Di = [link_inertia_i, frst_mmnt_i'; frst_mmnt_i, pii(i+9)*eye(3)];
|
|
|
|
|
cnstr = [cnstr, Di>0];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
load_inertia = [pi_load_unknw(1), pi_load_unknw(2), pi_load_unknw(3); ...
|
|
|
|
|
pi_load_unknw(2), pi_load_unknw(4), pi_load_unknw(5); ...
|
|
|
|
|
pi_load_unknw(3), pi_load_unknw(5), pi_load_unknw(6)];
|
|
|
|
|
|
|
|
|
|
load_frst_mmnt = vec2skewSymMat(pi_load_unknw(7:9));
|
|
|
|
|
|
|
|
|
|
Dl = [load_inertia, load_frst_mmnt'; load_frst_mmnt, m_load*eye(3)];
|
|
|
|
|
cnstr = [cnstr, Dl>0];
|
|
|
|
|
|
|
|
|
|
t1 = [zeros(size(I_uldd,1),1); -Wl(:,end)*m_load];
|
|
|
|
|
t2 = [-I_uldd, W, zeros(size(W,1), size(Wl,2)-1); ...
|
|
|
|
|
-I_ldd, W, Wl(:,1:9) ];
|
|
|
|
|
obj = norm(t1 - t2*[drv_gns;pi_b;pi_load_unknw]);
|
|
|
|
|
|
|
|
|
|
% Solving sdp problem
|
|
|
|
|
sol = optimize(cnstr,obj,sdpsettings('solver','sdpt3'));
|
|
|
|
|
return
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% Least square
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
pir_hat = (W'*W)\(W'*Tau);
|
|
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% Ridge regression
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% pi_hat = mldivide(W'*W + 0.001*eye(size(W'*W)),W'*tau);
|
|
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% Using SDP to find inertial parameters
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
pi_b = sdpvar(36,1); % variables for base paramters
|
|
|
|
|
pi_d = sdpvar(24,1); % variables for dependent paramters
|
|
|
|
|
u = sdpvar(1,1); % variable for cost
|
|
|
|
|
|
|
|
|
|
% Writing |Tau - W*pi_b| using Schur compliment
|
|
|
|
|
U1 = [u, (Tau - W*pi_b)'; Tau - W*pi_b, eye(size(W,1))];
|
|
|
|
|
|
|
|
|
|
% Bijective mapping from [pi_b; pi_d] to standard parameters pi
|
|
|
|
|
pii = [Pb' Pd']*[ eye(36) -double(Kd); zeros(24,36) eye(24)]*[pi_b; pi_d];
|
|
|
|
|
|
|
|
|
|
% Feasibility contrraints
|
|
|
|
|
U2 = [];
|
|
|
|
|
for i = 1:10:60
|
|
|
|
|
link_inertia_i = [pii(i), pii(i+1), pii(i+2); ...
|
|
|
|
|
pii(i+1), pii(i+3), pii(i+4); ...
|
|
|
|
|
pii(i+2), pii(i+4), pii(i+5)];
|
|
|
|
|
|
|
|
|
|
frst_mmnt_i = vec2skewSymMat(pii(i+6:i+8));
|
|
|
|
|
|
|
|
|
|
Di = [link_inertia_i, frst_mmnt_i'; frst_mmnt_i, pii(i+9)*eye(3)];
|
|
|
|
|
U2 = blkdiag(U2,Di);
|
|
|
|
|
end
|
|
|
|
|
% Overall constraints
|
|
|
|
|
cnstr = blkdiag(U1,U2)>0;
|
|
|
|
|
|
|
|
|
|
% Objective function
|
|
|
|
|
obj = u;
|
|
|
|
|
|
|
|
|
|
% Solving sdp problem
|
|
|
|
|
sol = optimize(cnstr,obj,sdpsettings('solver','sdpt3'));
|
|
|
|
|
|
|
|
|
|
% Getting numerical values of optimization paramters
|
|
|
|
|
base_prms = value(pi_b);
|
|
|
|
|
dpndn_prms = value(pi_d);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% DREM
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
alpha = [1, 1.3, 1.6, 1.3, 1.15, 1.5];
|
|
|
|
|
beta = [1, 1.25, 1.5, 1.75, 2, 2.25];
|
|
|
|
|
dly = [3, 6, 9, 12, 15];
|
|
|
|
|
|
|
|
|
|
% tau(:,1) = base_regressor(q(:,1),qd(:,1),q2d(:,1))*pir_base_vctr;
|
|
|
|
|
% tau_f1(:,1) = tau(:,1); tau_f2(:,1) = tau(:,1); tau_f3(:,1) = tau(:,1);
|
|
|
|
|
% tau_f4(:,1) = tau(:,1); tau_f5(:,1) = tau(:,1); tau_f6(:,1) = tau(:,1);
|
|
|
|
|
%
|
|
|
|
|
% for i = 2:length(traj_par.t)
|
|
|
|
|
% tau(:,i) = base_regressor(q(:,i),qd(:,i),q2d(:,i))*pir_base_vctr;
|
|
|
|
|
% for j = 1:6
|
|
|
|
|
% tau_f1(j,i) = low_pass_filter(tau(j,i),tau_f1(j,i-1),alpha(1),beta(1),dt);
|
|
|
|
|
% tau_f2(j,i) = low_pass_filter(tau(j,i),tau_f2(j,i-1),alpha(2),beta(2),dt);
|
|
|
|
|
% tau_f3(j,i) = low_pass_filter(tau(j,i),tau_f3(j,i-1),alpha(3),beta(3),dt);
|
|
|
|
|
% tau_f4(j,i) = low_pass_filter(tau(j,i),tau_f4(j,i-1),alpha(4),beta(4),dt);
|
|
|
|
|
% tau_f5(j,i) = low_pass_filter(tau(j,i),tau_f5(j,i-1),alpha(5),beta(5),dt);
|
|
|
|
|
% end
|
|
|
|
|
% end
|
|
|
|
|
% tau_e1 = vertcat(tau,tau_f1,tau_f2,tau_f3,tau_f4,tau_f5);
|
|
|
|
|
|
|
|
|
|
for i = 1:length(traj_par.t)
|
|
|
|
|
tau(:,i) = base_regressor(q(:,i),qd(:,i),q2d(:,i))*pir_base_vctr;
|
|
|
|
|
if i>dly(1); tau_f1(:,i) = tau(:,i-dly(1)); else; tau_f1(:,i) = zeros(6,1); end
|
|
|
|
|
if i>dly(2); tau_f2(:,i) = tau(:,i-dly(2)); else; tau_f2(:,i) = zeros(6,1); end
|
|
|
|
|
if i>dly(3); tau_f3(:,i) = tau(:,i-dly(3)); else; tau_f3(:,i) = zeros(6,1); end
|
|
|
|
|
if i>dly(4); tau_f4(:,i) = tau(:,i-dly(4)); else; tau_f4(:,i) = zeros(6,1); end
|
|
|
|
|
if i>dly(5); tau_f5(:,i) = tau(:,i-dly(5)); else; tau_f5(:,i) = zeros(6,1); end
|
|
|
|
|
end
|
|
|
|
|
tau_e2 = vertcat(tau,tau_f1,tau_f2,tau_f3,tau_f4,tau_f5);
|
|
|
|
|
|
|
|
|
|
%{
|
|
|
|
|
jnt = 4;
|
|
|
|
|
figure
|
|
|
|
|
plot(traj_par.t,tau(jnt,:))
|
|
|
|
|
hold on
|
|
|
|
|
plot(traj_par.t,tau_f1(jnt,:))
|
|
|
|
|
plot(traj_par.t,tau_f2(jnt,:))
|
|
|
|
|
plot(traj_par.t,tau_f3(jnt,:))
|
|
|
|
|
plot(traj_par.t,tau_f4(jnt,:))
|
|
|
|
|
plot(traj_par.t,tau_f5(jnt,:))
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
|
|
% Y(:,:,1) = base_regressor(q(:,1),qd(:,1),q2d(:,1));
|
|
|
|
|
% Y_f1(:,:,1) = Y(:,:,1); Y_f2(:,:,1) = Y(:,:,1); Y_f3(:,:,1) = Y(:,:,1);
|
|
|
|
|
% Y_f4(:,:,1) = Y(:,:,1); Y_f5(:,:,1) = Y(:,:,1); Y_f6(:,:,1) = Y(:,:,1);
|
|
|
|
|
% for i = 2:length(traj_par.t)
|
|
|
|
|
% Y(:,:,i) = base_regressor(q(:,i),qd(:,i),q2d(:,i));
|
|
|
|
|
% for j = 1:6
|
|
|
|
|
% for k = 1:36
|
|
|
|
|
% Y_f1(j,k,i) = low_pass_filter(Y(j,k,i),Y_f1(j,k,i-1),alpha(1),beta(1),dt);
|
|
|
|
|
% Y_f2(j,k,i) = low_pass_filter(Y(j,k,i),Y_f2(j,k,i-1),alpha(2),beta(2),dt);
|
|
|
|
|
% Y_f3(j,k,i) = low_pass_filter(Y(j,k,i),Y_f3(j,k,i-1),alpha(3),beta(3),dt);
|
|
|
|
|
% Y_f4(j,k,i) = low_pass_filter(Y(j,k,i),Y_f4(j,k,i-1),alpha(4),beta(4),dt);
|
|
|
|
|
% Y_f5(j,k,i) = low_pass_filter(Y(j,k,i),Y_f5(j,k,i-1),alpha(5),beta(5),dt);
|
|
|
|
|
% end
|
|
|
|
|
% end
|
|
|
|
|
%
|
|
|
|
|
% end
|
|
|
|
|
% Y_e1 = vertcat(Y, Y_f1, Y_f2, Y_f3, Y_f4, Y_f5);
|
|
|
|
|
|
|
|
|
|
for i = 1:length(traj_par.t)
|
|
|
|
|
Y(:,:,i) = base_regressor(q(:,i),qd(:,i),q2d(:,i));
|
|
|
|
|
if i>dly(1); Y_f1(:,:,i) = Y(:,:,i-dly(1)); else; Y_f1(:,:,i) = zeros(6,36); end
|
|
|
|
|
if i>dly(2); Y_f2(:,:,i) = Y(:,:,i-dly(2)); else; Y_f2(:,:,i) = zeros(6,36); end
|
|
|
|
|
if i>dly(3); Y_f3(:,:,i) = Y(:,:,i-dly(3)); else; Y_f3(:,:,i) = zeros(6,36); end
|
|
|
|
|
if i>dly(4); Y_f4(:,:,i) = Y(:,:,i-dly(4)); else; Y_f4(:,:,i) = zeros(6,36); end
|
|
|
|
|
if i>dly(5); Y_f5(:,:,i) = Y(:,:,i-dly(5)); else; Y_f5(:,:,i) = zeros(6,36); end
|
|
|
|
|
end
|
|
|
|
|
Y_e2 = vertcat(Y, Y_f1, Y_f2, Y_f3, Y_f4, Y_f5);
|
|
|
|
|
|
|
|
|
|
%{
|
|
|
|
|
row_Y = 1;
|
|
|
|
|
column_Y = 8;
|
|
|
|
|
figure
|
|
|
|
|
plot(traj_par.t, reshape(Y(row_Y,column_Y,:),[size(Y,3),1]))
|
|
|
|
|
hold on
|
|
|
|
|
plot(traj_par.t, reshape(Y_f1(row_Y,column_Y,:),[size(Y_f1,3),1]))
|
|
|
|
|
plot(traj_par.t, reshape(Y_f2(row_Y,column_Y,:),[size(Y_f2,3),1]))
|
|
|
|
|
plot(traj_par.t, reshape(Y_f3(row_Y,column_Y,:),[size(Y_f3,3),1]))
|
|
|
|
|
plot(traj_par.t, reshape(Y_f4(row_Y,column_Y,:),[size(Y_f4,3),1]))
|
|
|
|
|
plot(traj_par.t, reshape(Y_f5(row_Y,column_Y,:),[size(Y_f5,3),1]))
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
|
|
gma1 = 1e-2;
|
|
|
|
|
pi_drem(:,1) = zeros(36,1);
|
|
|
|
|
for i = 2:length(traj_par.t)
|
|
|
|
|
Yei = Y_e2(:,:,i);
|
|
|
|
|
tauei = tau_e2(:,i);
|
|
|
|
|
|
|
|
|
|
adjYei = adjoint(Yei);
|
|
|
|
|
detYei = det(Yei);
|
|
|
|
|
YYi = adjYei*tauei;
|
|
|
|
|
erri = YYi - detYei*pi_drem(:,i-1);
|
|
|
|
|
gradi = detYei/(gma1 + detYei^2)*erri;
|
|
|
|
|
pi_drem(:,i) = pi_drem(:,i-1) + gma1*gradi;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
figure
|
|
|
|
|
hold on
|
|
|
|
|
for i = 1:5
|
|
|
|
|
plot(traj_par.t,pi_drem(i,1:end))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
% Low pass filter for DREM
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
|
|
|
function y_cur = low_pass_filter(u_cur,y_prev,alpha,beta,T)
|
|
|
|
|
t1 = 1+beta*T;
|
|
|
|
|
t2 = alpha*T;
|
|
|
|
|
y_cur = 1/t1*y_prev + t2/t1*u_cur;
|
2020-01-16 07:48:37 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|