Dynamic-Calibration/ur10_idntfcn_smltn.m

493 lines
16 KiB
Mathematica
Raw Normal View History

% ---------------------------------------------------------------------
% 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
% 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);
% add noise to data
noiseVariance = 0.1;
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
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]';
% 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];
taui_uldd = Ybi_uldd*ur10.pi_base + sqrt(noiseVariance)*rand(6,1);
Wb_uldd = vertcat(Wb_uldd, Ybi_uldd);
I_uldd = vertcat(I_uldd, diag(diag(K_drv)\taui_uldd));
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];
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
Wb_ldd = vertcat(Wb_ldd, Ybi_ldd);
Wl = vertcat(Wl, Yli);
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;
end
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
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
%% 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]
% Find weighting matrix
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
% Weight data with weighting matrix
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)
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
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
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
% 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;
end