65 lines
2.6 KiB
Plaintext
65 lines
2.6 KiB
Plaintext
|
|
function robot = get_regressor(robot, opt)
|
||
|
|
% Create symbolic generilized coordiates, their first and second deriatives
|
||
|
|
ndof = robot.ndof;
|
||
|
|
q_sym = sym('q%d',[ndof+1,1],'real');
|
||
|
|
qd_sym = sym('qd%d',[ndof+1,1],'real');
|
||
|
|
q2d_sym = sym('q2d%d',[ndof+1,1],'real');
|
||
|
|
% init regressor
|
||
|
|
robot.regressor.m = sym('m%d',[ndof,1],'real');
|
||
|
|
robot.regressor.com = sym('com%d',[ndof,1],'real');
|
||
|
|
robot.regressor.I = sym('I%d',[ndof,1],'real');
|
||
|
|
robot.regressor.I_vec = inertiaMatrix2Vector(robot.regressor.I);
|
||
|
|
robot.regressor.mc = robot.regressor.m.*robot.regressor.com;
|
||
|
|
robot.regressor.pi = [robot.I_vec(:,i); robot.mc(:,i); robot.m(i)];
|
||
|
|
% init matrix
|
||
|
|
R = robot.R;
|
||
|
|
P = robot.t;
|
||
|
|
w = robot.vel.w ;
|
||
|
|
dw = robot.vel.dw ;
|
||
|
|
dv = robot.vel.dv ;
|
||
|
|
switch opt.LD_method
|
||
|
|
case 'Direct'
|
||
|
|
switch opt.KM_method
|
||
|
|
case 'MDH'
|
||
|
|
for i = 2:ndof+1
|
||
|
|
p_skew(:,:,i) = vec2skewSymMat(P(:,:,i));
|
||
|
|
w_skew(:,:,i) = vec2skewSymMat(w(:,i));
|
||
|
|
dw_skew(:,:,i) = vec2skewSymMat(dw(:,i));
|
||
|
|
dv_skew(:,:,i) = vec2skewSymMat(dv(:,i));
|
||
|
|
w_l(:,:,i) = vec2linearSymMat(w(:,i));
|
||
|
|
dw_l(:,:,i) = vec2linearSymMat(dw(:,i));
|
||
|
|
% size of matrix A is 6*10, need to -1
|
||
|
|
robot.regressor.A(:,:,i-1) = [dv(:,i),dw_skew(:,:,i)+w_skew(:,:,i)*w_skew(:,:,i),zeros(3,6); ...
|
||
|
|
zeros(3,1),-dv_skew(:,:,i),dw_l(:,:,i)+w_skew(:,:,i)*w_l(:,:,i)];
|
||
|
|
end
|
||
|
|
% construct matrix U, size: [6*n,10*n]
|
||
|
|
% U_ = sym(zeros([6*ndof,10*ndof]));
|
||
|
|
U_ = [];
|
||
|
|
for i = 1:ndof
|
||
|
|
% tricky
|
||
|
|
for j = i:ndof
|
||
|
|
if(j == i)
|
||
|
|
TT = eye(6,6);
|
||
|
|
U_row = TT*robot.regressor.A(:,:,j);
|
||
|
|
else
|
||
|
|
TT = TT*Adjoint(RpToTrans(R(:,:,j),P(:,:,j)));
|
||
|
|
U_row = [U_row,TT*robot.regressor.A(:,:,j)];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
U_ = [U_;zeros(6,(i-1)*10),U_row];
|
||
|
|
end
|
||
|
|
robot.regressor.U = U_;
|
||
|
|
if(opt.debug)
|
||
|
|
sprintf('size of U_=%dx%d.',size(robot.regressor.U));
|
||
|
|
end
|
||
|
|
robot.regressor.K = [zeros(1,3),Z0]*;
|
||
|
|
end
|
||
|
|
% matlabFunction(Y_f,'File','autogen/standard_regressor_Two_bar',...
|
||
|
|
% 'Vars',{q_sym,qd_sym,q2d_sym});
|
||
|
|
case 'Lagrange'
|
||
|
|
disp('TODO opt.LD_method Lagrange!')
|
||
|
|
return;
|
||
|
|
otherwise
|
||
|
|
disp('Bad opt.KM_method!')
|
||
|
|
return;
|
||
|
|
end
|