BIRDy/Utils/SymbolicModelData/getStandardParameterVector.m

57 lines
3.0 KiB
Mathematica
Raw Permalink Normal View History

2021-04-29 09:42:38 +00:00
function [Xhi, numParam, Xhi_aug] = getStandardParameterVector(InertiaDH, Moment, Mass, Ia, frictionModel, frictionParameters, varargin)
% Authors: Quentin Leboutet, Julien Roux, Alexandre Janot and Gordon Cheng
%
% This function generates the vector of standard parameters Xhi of a robot
% from its separated dynamic and friction parameters
% Check dimentionality
if (size(InertiaDH,3) == size(Moment,2)) && (size(InertiaDH,3) == length(Mass)) && (size(InertiaDH,3) == length(Ia))
nbDOF = size(InertiaDH,3);
numParam = zeros(nbDOF,1);
else
error('getStandardParameterVector(): Error in parameter dimentionality !');
end
for i=1:nbDOF
XXi = InertiaDH(1,1,i);
XYi = InertiaDH(1,2,i);
XZi = InertiaDH(1,3,i);
YYi = InertiaDH(2,2,i);
YZi = InertiaDH(2,3,i);
ZZi = InertiaDH(3,3,i);
Mi = Mass(i);
MXi = Moment(1,i);
MYi = Moment(2,i);
MZi = Moment(3,i);
switch frictionModel
% Only Coulomb and viscous frictions are linear and can be identified simultaneously with the other parameters.
% Nonlinear friction models require state dependant parameter identification
case 'no'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Tau_off(i)];
case 'Viscous'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Fv(i); frictionParameters.Tau_off(i)];
case 'Coulomb'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Fc(i); frictionParameters.Tau_off(i)];
case 'ViscousCoulomb'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Fv(i); frictionParameters.Fc(i)];
case 'ViscousCoulombOff'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Fv(i); frictionParameters.Fc(i); frictionParameters.Tau_off(i)];
case 'Stribeck'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Tau_off(i)];
case 'LuGre'
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Tau_off(i)];
otherwise
Xhi_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Tau_off(i)];
end
numParam(i) = numel(Xhi_block);
Xhi((i-1)*numel(Xhi_block)+1:i*numel(Xhi_block),1)=Xhi_block;
% Total Dynamic parameters vector:
Xhi_tot_block = [XXi; XYi; XZi; YYi; YZi; ZZi; MXi; MYi; MZi; Mi; Ia(i); frictionParameters.Fv(i); frictionParameters.Fc(i); frictionParameters.Fs(i); frictionParameters.Vs(i); frictionParameters.Es(i); frictionParameters.Sigma_0(i); frictionParameters.Sigma_1(i); frictionParameters.Sigma_2(i); frictionParameters.Z0(i)]; % Only Coulomb and viscous frictions are linear and can be identified simultaneously with the other parameters...
Xhi_aug((i-1)*numel(Xhi_tot_block)+1:i*numel(Xhi_tot_block),1) = Xhi_tot_block;
end
end