BIRDy/Utils/SymbolicModelData/RobotDescriptionFiles/RV2SQ.m

268 lines
21 KiB
Mathematica
Raw Normal View History

2021-04-29 09:42:38 +00:00
function [robot] = RV2SQ(options, varargin)
% Authors: Quentin Leboutet, Julien Roux, Alexandre Janot and Gordon Cheng
%
% The RV2SQ description function.
% Parameters of the Mitsubishi RV2SQ (DH parameters in proximal/modified convension):
% Kinematics theta [rad] a [m] d [m] alpha [rad] Dynamics Mass [kg] Center of Mass [m]
% Joint 1 0 0 d1 0 Link 1 4 [?,?,?]
% Joint 2 -π/2 0 0 -π/2 Link 2 4.5 [?,?,?]
% Joint 3 +π/2 a3 0 0 Link 3 4 [?,?,?]
% Joint 4 0 -a4 d4 +π/2 Link 4 3.5 [?,?,?]
% Joint 5 0 0 0 -π/2 Link 5 0.45 [?,?,?]
% Joint 6 0 0 d6 +π/2 Link 6 0.05 [?,?,?]
% General Informations:
robot.name = 'RV2SQ'; % Name of the robot
robot.nbDOF = 6; % Number of Degrees Of Freedom (DOF)
robot.rootFrame.name = 'world'; % Name of the world reference frame
robot.rootFrame.transform = sym(eye(4)); % Homogeneous transform between the world reference frame and the robot base frame
robot.rootFrame.transform(3,4) = 0;
robot.jointType = ['revol';'revol';'revol';'revol';'revol';'revol']; % Type of the robot joints: either 'revol' or 'prism'
% The idea behind 'frictionDatagenModel' and 'frictionIdentModel' is to be able to generate a robot model with linear or nonlinear friction and to identify it with several friction models in order to observe the biases
robot.frictionDatagenModel = 'ViscousCoulomb'; % Type of friction model used for robot data generation: 'no', 'Viscous', 'Coulomb', 'ViscousCoulomb', 'Stribeck', 'LuGre'
robot.frictionIdentModel = 'ViscousCoulomb'; % Type of friction model used for robot identification: 'no', 'Viscous', 'Coulomb', 'ViscousCoulomb', 'Stribeck', 'LuGre'
% Symbolic Parameters:
if options.loadSymbolic == true
robot.symbolicParameters = generateRobotSymbolicParameters(robot.nbDOF, robot.frictionIdentModel);
% Denavit-Hartenerg Symbolic Parameters:
robot.dhParameter.theta = [robot.symbolicParameters.Q(1); robot.symbolicParameters.Q(2)-pi/2; robot.symbolicParameters.Q(3)+pi/2; robot.symbolicParameters.Q(4); robot.symbolicParameters.Q(5); robot.symbolicParameters.Q(6)];
robot.dhParameter.d = [robot.symbolicParameters.Geometry(1,2); 0; 0; robot.symbolicParameters.Geometry(4,2); 0; robot.symbolicParameters.Geometry(6,2)];
robot.dhParameter.a = [0; 0; robot.symbolicParameters.Geometry(3,3); robot.symbolicParameters.Geometry(4,3); 0; 0];
robot.dhParameter.alpha = sym([0; -pi/2; 0; pi/2; -pi/2; pi/2]);
robot.dhConvention = 'proximal'; % Robot Denavit-Hartenerg convention: either 'proximal' or 'distal'
end
% Numerical Values of Dynamic Parameters:
robot.numericalParameters.Geometry = ...
[0 0.295 0 0;...
0 0 0 -pi/2;...
0 0 0.23 0;...
0 0.27 -0.05 pi/2;...
0 0 0 -pi/2;...
0 0.07 0 pi/2]; % Position of the robot DH links [m]
robot.numericalParameters.GeometryCOM = [[0; 0; -0.05] [0.06; -0.0076; 0] [0; -0.045; 0] [0.01; 0; -0.13] [-0.001; -0.001; 0.001] [0.001; 0; 0.0005]]; % Position of the links' center of mass w.r.t the link's DH frame[m]
robot.numericalParameters.Mass = [4; 5.3; 4.1; 2.8; 0.8; 0.7]; % Mass of the robot links [kg]
robot.numericalParameters.Gravity = [0;0;9.81]; % Gravity vector in world frame [m/s²]
robot.numericalParameters.Q0 = [0;0;pi/4;0;0;0]; % Robot initial joint angles
robot.numericalParameters.Moment = robot.numericalParameters.GeometryCOM*diag(robot.numericalParameters.Mass);
robot.numericalParameters.friction.Fv = [4.7618;13.4593;4.1019;1.3165;1.4242;0.9244]; % Viscous Friction
robot.numericalParameters.friction.Fc = [2.8503;7.7407;3.3459;1.6581;2.7170;2.0284]; % Coulomb Friction
robot.numericalParameters.friction.Fvm = zeros(robot.nbDOF,1); % Couping between joints.
robot.numericalParameters.friction.Fcm = zeros(robot.nbDOF,1); % Couping between joints.
robot.numericalParameters.friction.Fs = [4.78e0;7.97e0;5.81e0;2.15e0;0;0];% Static Friction: only in Stribeck and LuGre models
robot.numericalParameters.friction.Vs = [2.5e-2; 5e-2; 5e-2; 5e-2; 5e-2; 5e-2]; % Stribeck velocity: only in Stribeck and LuGre models
robot.numericalParameters.friction.Es = [2.09e0; 2.78e0; 2.72e0; 1.60e0; 2; 2]; % Exponent: only in Stribeck and LuGre models
robot.numericalParameters.friction.Sigma_0 = 0.1*ones(robot.nbDOF,1); % Contact stiffness: only in LuGre model
robot.numericalParameters.friction.Sigma_1 = 0.1*ones(robot.nbDOF,1); % Damping coefficient of the bristle: only in LuGre model
robot.numericalParameters.friction.Sigma_2 = 0.1*ones(robot.nbDOF,1); % Viscous friction coefficient of the bristle: only in LuGre model
robot.numericalParameters.friction.Z0 = zeros(robot.nbDOF,1); % Average deflection of the contacting asperities: only in LuGre model
robot.numericalParameters.friction.Tau_off = zeros(robot.nbDOF,1); % Friction torque parameter for nonlinear friction models (Stribeck and LuGre)
robot.numericalParameters.Ia = [1e-02; 5e-01; 0.3253; 0.0416; 0.0939; 0.0317];
robot.numericalParameters.InertiaCOM = zeros(3,3,robot.nbDOF); % Inertias are here provided manually...
robot.numericalParameters.InertiaCOM(:,:,1) = inertiaMatrix(0.0424, 0, 0, 0.0424, 0, 0.0152);
robot.numericalParameters.InertiaCOM(:,:,2) = inertiaMatrix(0.45, 2.03e-03, -2.03e-04, 5e-01, -5.56e-03, 0.85);
robot.numericalParameters.InertiaCOM(:,:,3) = inertiaMatrix(0.177, -0.017, 0.001, 0.105, 0.006, 0.239);
robot.numericalParameters.InertiaCOM(:,:,4) = inertiaMatrix(0.0492, -0.0013, 0.0042, 0.0424, 0.0003, 0.0457);
robot.numericalParameters.InertiaCOM(:,:,5) = inertiaMatrix(0.0676, 0.0001, 0, 0.0274, 0, 0.0718);
robot.numericalParameters.InertiaCOM(:,:,6) = inertiaMatrix(0.0076, 0, 0, 0.0074, 0, 0.0018);
robot.numericalParameters.InertiaDH = inertiaTensorCOM2DH(robot.numericalParameters.InertiaCOM, robot.numericalParameters.Mass, robot.numericalParameters.Moment);
[robot.numericalParameters.Xhi, ~,~,robot.numericalParameters.numParam] = aggregateNumericalParameters(robot.nbDOF, robot.frictionIdentModel, robot.numericalParameters);
% PID Control Gains:
robot.controlParameters.antiWindup = 5;
robot.controlParameters.controlFrequency = 5e3;
robot.controlParameters.samplingFrequency = 140; % Data acquisition can be done at a period of 7.1ms or 140 Hz
k = 1000*[100;300;100;100;50;50];
zeta = robot.numericalParameters.friction.Fv./(2*k.*(robot.numericalParameters.Mass).^(1/2));
omega = (k./robot.numericalParameters.Mass).^(1/2);
robot.controlParameters.Kp = diag(robot.numericalParameters.Mass.*omega.^2); % Proportional gains
robot.controlParameters.Ki = zeros(robot.nbDOF); % Integral Gains
robot.controlParameters.Kd = 1e5*diag(robot.numericalParameters.Mass.*zeta.*omega); % Derivative Gains
robot.controlParameters.Ktau = diag([0.0347;0.0845;0.0412;0.0165;0.0173;0.0145]); % Torque-loop gain (current loopgain times torque constant of the motor times gear ratio)
robot.controlParameters.Ktau_sign = [-1; -1; 1; -1; -1; -1];
% Noise parameters:
switch options.noiseLevel
case 'oldNoise'
robot.numericalParameters.sd_q = [0.057e-3; 0.057e-3; 0.122e-3; 0.114e-3; 0.122e-3; 0.172e-3].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = [0.0371;0.1105;0.0611;0.0149;0.0153;0.0211]; % Noise standard deviation
case 'lowPositionNoise'
% Standard
robot.numericalParameters.sd_q = [1e-4; 1e-4; 1e-4; 1e-4; 1e-4; 1e-4].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = 5*[1e-2; 1e-2; 1e-2; 1e-2; 1e-2; 1e-2]; % Noise standard deviation
case 'standardNoise'
% Standard
robot.numericalParameters.sd_q = [1e-3; 1e-3; 1e-3; 1e-3; 1e-3; 1e-3].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = 5*[1e-2; 1e-2; 1e-2; 1e-2; 1e-2; 1e-2]; % Noise standard deviation
case 'highTorqueNoise'
% High torque noise
robot.numericalParameters.sd_q = [1e-3; 1e-3; 1e-3; 1e-3; 1e-3; 1e-3].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = 10*[1e-2; 1e-2; 1e-2; 1e-2; 1e-2; 1e-2]; % Noise standard deviation
case 'highPositionNoise'
% High position noise
robot.numericalParameters.sd_q = 10*[1e-3; 1e-3; 1e-3; 1e-3; 1e-3; 1e-3].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = 5*[1e-2; 1e-2; 1e-2; 1e-2; 1e-2; 1e-2]; % Noise standard deviation
case 'highPositionTorqueNoise'
% High torque and position noise
robot.numericalParameters.sd_q = 10*[1e-3; 1e-3; 1e-3; 1e-3; 1e-3; 1e-3].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = 10*[1e-2; 1e-2; 1e-2; 1e-2; 1e-2; 1e-2]; % Noise standard deviation
otherwise
% Standard
robot.numericalParameters.sd_q = [1e-3; 1e-3; 1e-3; 1e-3; 1e-3; 1e-3].*pi/180; % Noise standard deviation
robot.numericalParameters.sd_tau = 5*[1e-2; 1e-2; 1e-2; 1e-2; 1e-2; 1e-2]; % Noise standard deviation
end
% Physical Constraints:
robot.physicalConstraints.limQ_U = [240;120;160;200;90;360].*pi/180; % Joint position upper limit [rad] ([240;120;160;200;120;360].*pi/180;)
robot.physicalConstraints.limQp_U = [225;150;275;412;450;720].*pi/180; % Joint velocity upper limit [rad/s]
robot.physicalConstraints.limQpp_U = 50*ones(robot.nbDOF,1); % Joint acceleration upper limit [rad/s^2]
robot.physicalConstraints.limTau_U = 10*[11.5;11.5;7.1;4.17;4.17;2.75]; % Joint torque upper limit [N.m]
robot.physicalConstraints.limQ_L = -[240;120;0;200;90;360].*pi/180; % Joint position lower limit [rad] (-[240;120;0;200;120;360].*pi/180;)
robot.physicalConstraints.limQp_L = -[225;150;275;412;450;720].*pi/180; % Joint velocity lower limit [rad/s]
robot.physicalConstraints.limQpp_L = -50*ones(robot.nbDOF,1); % Joint acceleration lower limit [rad/s^2]
robot.physicalConstraints.limTau_L = -10*[11.5;11.5;7.1;4.17;4.17;2.75]; % Joint torque lower limit [N.m]
robot.controlParameters.Kp = 1.0e+05 *diag([5 ; 10 ; 9 ; 8 ; 5 ; 5]);
robot.controlParameters.Kd = 1.0e+02 *diag([5 ; 10 ; 9 ; 8 ; 5 ; 5]);
robot.controlParameters.Kp*robot.controlParameters.Ktau
robot.controlParameters.Kd*robot.controlParameters.Ktau
end
% function [robot] = RV2SQ(options, varargin)
%
% % Authors: Quentin Leboutet, Julien Roux, Alexandre Janot and Gordon Cheng
% %
% % The RV2SQ description function.
%
% % Parameters of the Mitsubishi RV2SQ (DH parameters in proximal/modified convension):
% % Kinematics theta [rad] a [m] d [m] alpha [rad] Dynamics Mass [kg] Center of Mass [m]
% % Joint 1 0 0 d1 0 Link 1 4 [?,?,?]
% % Joint 2 -π/2 0 0 -π/2 Link 2 4.5 [?,?,?]
% % Joint 3 +π/2 a3 0 0 Link 3 4 [?,?,?]
% % Joint 4 0 -a4 d4 +π/2 Link 4 3.5 [?,?,?]
% % Joint 5 0 0 0 -π/2 Link 5 0.45 [?,?,?]
% % Joint 6 0 0 d6 +π/2 Link 6 0.05 [?,?,?]
%
% % General Informations:
% robot.name = 'RV2SQ'; % Name of the robot
% robot.nbDOF = 6; % Number of Degrees Of Freedom (DOF)
% robot.rootFrame.name = 'world'; % Name of the world reference frame
% robot.rootFrame.transform = sym(eye(4)); % Homogeneous transform between the world reference frame and the robot base frame
% robot.rootFrame.transform(3,4) = 0;
% robot.jointType = ['revol';'revol';'revol';'revol';'revol';'revol']; % Type of the robot joints: either 'revol' or 'prism'
%
% % The idea behind 'frictionDatagenModel' and 'frictionIdentModel' is to be able to generate a robot model with linear or nonlinear friction and to identify it with several friction models in order to observe the biases
% robot.frictionDatagenModel = 'ViscousCoulomb'; % Type of friction model used for robot data generation: 'no', 'Viscous', 'Coulomb', 'ViscousCoulomb', 'Stribeck', 'LuGre'
% robot.frictionIdentModel = 'ViscousCoulomb'; % Type of friction model used for robot identification: 'no', 'Viscous', 'Coulomb', 'ViscousCoulomb', 'Stribeck', 'LuGre'
%
% % Symbolic Parameters:
% if options.loadSymbolic == true
% robot.symbolicParameters = generateRobotSymbolicParameters(robot.nbDOF, robot.frictionIdentModel);
%
% % Denavit-Hartenerg Symbolic Parameters:
% robot.dhParameter.theta = [robot.symbolicParameters.Q(1); robot.symbolicParameters.Q(2)-pi/2; robot.symbolicParameters.Q(3)+pi/2; robot.symbolicParameters.Q(4); robot.symbolicParameters.Q(5); robot.symbolicParameters.Q(6)];
% robot.dhParameter.d = [robot.symbolicParameters.Geometry(1,2); 0; 0; robot.symbolicParameters.Geometry(4,2); 0; robot.symbolicParameters.Geometry(6,2)];
% robot.dhParameter.a = [0; 0; robot.symbolicParameters.Geometry(3,3); robot.symbolicParameters.Geometry(4,3); 0; 0];
% robot.dhParameter.alpha = sym([0; -pi/2; 0; pi/2; -pi/2; pi/2]);
% robot.dhConvention = 'proximal'; % Robot Denavit-Hartenerg convention: either 'proximal' or 'distal'
% end
%
% % Numerical Values of Dynamic Parameters:
% robot.numericalParameters.Geometry = ...
% [0 0.295 0 0;...
% 0 0 0 -pi/2;...
% 0 0 0.23 0;...
% 0 0.27 -0.05 pi/2;...
% 0 0 0 -pi/2;...
% 0 0.07 0 pi/2]; % Position of the robot DH links [m]
%
%
% robot.numericalParameters.GeometryCOM = [[0; 0; -0.05] [0.06; -0.0076; 0] [0; -0.045; 0] [0.01; 0; -0.13] [-0.001; -0.001; 0.001] [0.001; 0; 0.0005]]; % Position of the links' center of mass w.r.t the link's DH frame[m]
% robot.numericalParameters.Mass = [4; 5.3; 4.5; 2.8; 0.8; 0.7]; % Mass of the robot links [kg]
% robot.numericalParameters.Gravity = [0;0;9.81]; % Gravity vector in world frame [m/s²]
% robot.numericalParameters.Q0 = [0;0;pi/4;0;0;0]; % Robot initial joint angles
%
% robot.numericalParameters.friction.Fv = [8.36;11.3;3.6;1.3322;1.30;2.10]; % Viscous Friction
% robot.numericalParameters.friction.Fc = [5.61;7.7407;3.3459;1.6581;2.7170;5.25]; % Coulomb Friction
% robot.numericalParameters.friction.Fvm = zeros(robot.nbDOF,1); % Couping between joints.
% robot.numericalParameters.friction.Fcm = zeros(robot.nbDOF,1); % Couping between joints.
% robot.numericalParameters.friction.Fs = [4.78e0;7.97e0;5.81e0;2.15e0;0;0];% Static Friction: only in Stribeck and LuGre models
% robot.numericalParameters.friction.Vs = [2.5e-2; 5e-2; 5e-2; 5e-2; 5e-2; 5e-2]; % Stribeck velocity: only in Stribeck and LuGre models
% robot.numericalParameters.friction.Es = [2.09e0; 2.78e0; 2.72e0; 1.60e0; 2; 2]; % Exponent: only in Stribeck and LuGre models
% robot.numericalParameters.friction.Sigma_0 = 0.1*ones(robot.nbDOF,1); % Contact stiffness: only in LuGre model
% robot.numericalParameters.friction.Sigma_1 = 0.1*ones(robot.nbDOF,1); % Damping coefficient of the bristle: only in LuGre model
% robot.numericalParameters.friction.Sigma_2 = 0.1*ones(robot.nbDOF,1); % Viscous friction coefficient of the bristle: only in LuGre model
% robot.numericalParameters.friction.Z0 = zeros(robot.nbDOF,1); % Average deflection of the contacting asperities: only in LuGre model
% robot.numericalParameters.friction.Tau_off = zeros(robot.nbDOF,1); % Friction torque parameter for nonlinear friction models (Stribeck and LuGre)
%
% robot.numericalParameters.Ia = [0.2; 0.5; 0.43; 0.0416; 0.0939; 0.0317];
% robot.numericalParameters.InertiaCOM = zeros(3,3,robot.nbDOF); % Inertias are here provided manually...
% robot.numericalParameters.InertiaCOM(:,:,1) = inertiaMatrixDH2COM(inertiaMatrix(0.0424, 0, 0, 0.0424, 0, 0.752), robot.numericalParameters.Mass(1), robot.numericalParameters.Moment(:,1));
% robot.numericalParameters.InertiaCOM(:,:,2) = inertiaMatrixDH2COM(inertiaMatrix(0.01, 2.03e-03, -0.0149, 1e-03, 5.56e-03, 0.95), robot.numericalParameters.Mass(2), robot.numericalParameters.Moment(:,2));
% robot.numericalParameters.InertiaCOM(:,:,3) = inertiaMatrixDH2COM(inertiaMatrix(1.3e-2, -6.97e-03, 2.20e-03, 5e-03, 4.53e-03, 1.58e-01), robot.numericalParameters.Mass(3), robot.numericalParameters.Moment(:,3));
% robot.numericalParameters.InertiaCOM(:,:,4) = inertiaMatrixDH2COM(inertiaMatrix(5.60e-03, -3.66e-03, -2.60e-03, 4.08e-02, -6.64e-03, 3.78e-03), robot.numericalParameters.Mass(4), robot.numericalParameters.Moment(:,4));
% robot.numericalParameters.InertiaCOM(:,:,5) = inertiaMatrixDH2COM(inertiaMatrix(0.98e-02, -9.30e-04, -0.015, 7.00e-03, -0.0081, 3.93e-02), robot.numericalParameters.Mass(5), robot.numericalParameters.Moment(:,5));
% robot.numericalParameters.InertiaCOM(:,:,6) = inertiaMatrixDH2COM(inertiaMatrix(4.71e-03, 0.0026, -0.000070, 3.53e-02, -4.41e-05, 0.0148), robot.numericalParameters.Mass(6), robot.numericalParameters.Moment(:,6));
% robot.numericalParameters.InertiaDH = inertiaTensorCOM2DH(robot.numericalParameters.InertiaCOM, robot.numericalParameters.Mass, robot.numericalParameters.Moment);
% [robot.numericalParameters.Xhi, ~,~,~] = aggregateNumericalParameters(robot.nbDOF, robot.frictionIdentModel, robot.numericalParameters);
% % PID Control Gains:
% robot.controlParameters.antiWindup = 5;
% robot.controlParameters.controlFrequency = 5e3;
% robot.controlParameters.samplingFrequency = 140; % Data acquisition can be done at a period of 7.1ms or 140 Hz
% k = 5e3;
% zeta = robot.numericalParameters.friction.Fv./(2*k.*(robot.numericalParameters.Mass).^(1/2));
% omega = (k./robot.numericalParameters.Mass).^(1/2);
% robot.controlParameters.Kp = diag(robot.numericalParameters.Mass.*omega.^2); % Proportional gains
% robot.controlParameters.Ki = zeros(robot.nbDOF); % Integral Gains
% robot.controlParameters.Kd = 1e2*diag(robot.numericalParameters.Mass.*zeta.*omega); % Derivative Gains
% K = [0.0692;
% 0.0843;
% 0.0413;
% 0.0172;
% 0.0169;
% 0.0353];
% robot.controlParameters.Ktau = diag(K); %diag([0.0347;0.0845;0.0412;0.0165;0.0173;0.0145]); % Torque-loop gain (current loopgain times torque constant of the motor times gear ratio)
% robot.controlParameters.Ktau_sign = [-1; -1; 1; -1; -1; -1];
%
% % Noise parameters:
% robot.numericalParameters.sd_q = [0.057e-3; 0.057e-3; 0.122e-3; 0.114e-3; 0.122e-3; 0.172e-3].*pi/180; % Noise standard deviation
% robot.numericalParameters.sd_tau = [0.0371;0.1105;0.0611;0.0149;0.0153;0.0211]; % Noise standard deviation
%
% % Physical Constraints:
% robot.physicalConstraints.limQ_U = [240;120;160;200;90;360].*pi/180; % Joint position upper limit [rad] ([240;120;160;200;120;360].*pi/180;)
% robot.physicalConstraints.limQp_U = [225;150;275;412;450;720].*pi/180; % Joint velocity upper limit [rad/s]
% robot.physicalConstraints.limQpp_U = 50*ones(robot.nbDOF,1); % Joint acceleration upper limit [rad/s^2]
% robot.physicalConstraints.limTau_U = 10*[11.5;11.5;7.1;4.17;4.17;2.75]; % Joint torque upper limit [N.m]
% robot.physicalConstraints.limQ_L = -[240;120;0;200;90;360].*pi/180; % Joint position lower limit [rad] (-[240;120;0;200;120;360].*pi/180;)
% robot.physicalConstraints.limQp_L = -[225;150;275;412;450;720].*pi/180; % Joint velocity lower limit [rad/s]
% robot.physicalConstraints.limQpp_L = -50*ones(robot.nbDOF,1); % Joint acceleration lower limit [rad/s^2]
% robot.physicalConstraints.limTau_L = -10*[11.5;11.5;7.1;4.17;4.17;2.75]; % Joint torque lower limit [N.m]
%
% robot.controlParameters.Gains_L = zeros(2*robot.nbDOF,1);
% robot.controlParameters.Gains_U = [1e5*ones(robot.nbDOF,1);1e5*ones(robot.nbDOF,1)];
% % 9.3729 ; 8.5911 ; 8.0857 ; 7.8392 ; 9.9767 ; 4.6818 0.4386 ; 0.2527 ; 0.6410 ; 0.0429 ; 0.2493 ; 0.0766
% robot.controlParameters.Kp = diag(1.0e+04 *[9.3729 ; 8.5911 ; 8.0857 ; 7.8392 ; 9.9767 ; 4.6818]);
% robot.controlParameters.Kd = diag(1.0e+04 *[0.4386 ; 0.2527 ; 0.6410 ; 0.0429 ; 0.2493 ; 0.0766]);
% end