% Definições da estrutura do Robô Humanóide
function robo = data_struct()

    % Pé
        % Dimensões do pé
        robo.foot.comp=20.0;     % Comprimento do pé
        robo.foot.larg=8.00;     % Largura do pé

        % Dimensões de cada placa de acrílico
        robo.foot.chapa.comp=6.00;
        robo.foot.chapa.larg=1.50;

        % Localização relativa no pé de cada placa (a partir de um extremo)
        robo.foot.chapa.locdy = 0.80;
        robo.foot.chapa.locdx = 0.10;

        % Localização relativa de cada sensor no pé (parafuso)
        robo.foot.sensor.locdy = [3.80 3.80 3.75 3.75];
        robo.foot.sensor.locdx = [0.85 0.80 0.50 0.60];

        % Localização absoluta de cada sensor
        robo.foot.sensor.locy=[robo.foot.comp/2-robo.foot.sensor.locdy(1:2)     -robo.foot.comp/2+robo.foot.sensor.locdy(3:4)];
        robo.foot.sensor.locx=[-robo.foot.larg/2+robo.foot.sensor.locdx(1)      robo.foot.larg/2-robo.foot.sensor.locdx(2)      -robo.foot.larg/2+robo.foot.sensor.locdx(3)     robo.foot.larg/2-robo.foot.sensor.locdx(4)];

        % Localização absoluta de cada placa no pé
        locy_abs=robo.foot.comp/2-robo.foot.chapa.locdy-robo.foot.chapa.comp/2;
        locx_abs=robo.foot.larg/2-robo.foot.chapa.locdx-robo.foot.chapa.larg/2;
        robo.foot.chapa.locy=[locy_abs locy_abs -locy_abs -locy_abs];
        robo.foot.chapa.locx=[-locx_abs locx_abs -locx_abs locx_abs];

        
%     % Tibia
%         robo.tibia.comp = 9.5;
%         robo.tibia.comp = 9.5;
% 
%         
%     % Fémur
%         robo.femur.comp = 9.5;
%         
%         
%     % Tronco
%         robo.tronco.comp = 9.5;
        
        
        
    %---------------------------------------------------------------------%
    % Slave 1
    %
    % - Slave que controla a perna direita
    % - Junta 1 - Controla o movimento lateral do pé
    % - Junta 2 - Controloa o movimento longitudinal do pé
    % - Junta 3 - Controla o movimento de flexão do joelho
    %---------------------------------------------------------------------%
    
        % Relação de transmissão
            robo.slave(1).servo(1).transm = 2.5;
            robo.slave(1).servo(2).transm = 2.5;
            robo.slave(1).servo(3).transm = 2.5;
        
        % Definição da posição inicial das servos
            robo.slave(1).servo(1).pos = 0;
            robo.slave(1).servo(2).pos = 0;
            robo.slave(1).servo(3).pos = -70;
            
        % Definição da velocidade inicial das servos
            robo.slave(1).servo(1).vel = 50;
            robo.slave(1).servo(2).vel = 50;
            robo.slave(1).servo(3).vel = 50;    
        
        % Definição do controlador
            robo.slave(1).servo(1).control = 0;
            robo.slave(1).servo(1).ki = 0;
            robo.slave(1).servo(1).kp = 0;
            robo.slave(1).servo(1).kd = 0;
            
            robo.slave(1).servo(2).control = 0;
            robo.slave(1).servo(2).ki = 0;
            robo.slave(1).servo(2).kp = 0;
            robo.slave(1).servo(2).kd = 0;

            robo.slave(1).servo(3).control = 0;
            robo.slave(1).servo(3).ki = 0;
            robo.slave(1).servo(3).kp = 0;
            robo.slave(1).servo(3).kd = 0;
    
        % Limitações e desvios
            robo.slave(1).servo(1).lim_sup = 90;
            robo.slave(1).servo(1).lim_inf = -90;
            robo.slave(1).servo(1).offset = 0;
            
            robo.slave(1).servo(2).lim_sup = 90;
            robo.slave(1).servo(2).lim_inf = 90;
            robo.slave(1).servo(2).offset = 0;
            
            robo.slave(1).servo(3).lim_sup = 90;
            robo.slave(1).servo(3).lim_inf = 90;
            robo.slave(1).servo(3).offset = 0;
            
            
        % Limitações e desvios
            robo.slave(1).sensor(1) = 0;
            robo.slave(1).sensor(2) = 0;
            robo.slave(1).sensor(3) = 0;
            robo.slave(1).sensor(4) = 0;

            
            
    %---------------------------------------------------------------------%
    % Slave 2
    %
    % - Slave que controla a perna esquerda
    % - Junta 1 - Controla o movimento lateral do pé
    % - Junta 2 - Controloa o movimento longitudinal do pé
    % - Junta 3 - Controla o movimento de flexão do joelho
    %---------------------------------------------------------------------%
    
        % Relação de transmissão            
            robo.slave(2).servo(1).transm = 2.5;
            robo.slave(2).servo(2).transm = 2.5;
            robo.slave(2).servo(3).transm = 2.5;
        
        % Definição da posição inicial das servos
            robo.slave(2).servo(1).pos = 0;
            robo.slave(2).servo(2).pos = 0;
            robo.slave(2).servo(3).pos = 70;
            
        % Definição da velocidade inicial das servos
            robo.slave(2).servo(1).vel = 50;
            robo.slave(2).servo(2).vel = 50;
            robo.slave(2).servo(3).vel = 50;    
        
        % Definição do controlador
            robo.slave(2).servo(1).control = 0;
            robo.slave(2).servo(1).ki = 0;
            robo.slave(2).servo(1).kp = 0;
            robo.slave(2).servo(1).kd = 0;

            robo.slave(2).servo(2).control = 0;
            robo.slave(2).servo(2).ki = 0;
            robo.slave(2).servo(2).kp = 0;
            robo.slave(2).servo(2).kd = 0;

            robo.slave(2).servo(3).control = 0;
            robo.slave(2).servo(3).ki = 0;
            robo.slave(2).servo(3).kp = 0;
            robo.slave(2).servo(3).kd = 0;            
            
        % Limitações e desvios
            robo.slave(2).servo(1).lim_sup = 90;
            robo.slave(2).servo(1).lim_inf = -90;       % DEPENDE DA JUNTA 2 J2=70 => J1=-30
            robo.slave(2).servo(1).offset = 0;
            
            robo.slave(2).servo(2).lim_sup = 70;
            robo.slave(2).servo(2).lim_inf = -90;
            robo.slave(2).servo(2).offset = 0;
            
            robo.slave(2).servo(3).lim_sup = 0;
            robo.slave(2).servo(3).lim_inf = -50;
            robo.slave(2).servo(3).offset = 0;
            
        % Limitações e desvios
            robo.slave(2).sensor(1) = 0;
            robo.slave(2).sensor(2) = 0;
            robo.slave(2).sensor(3) = 0;
            robo.slave(2).sensor(4) = 0;
            
    %---------------------------------------------------------------------%
    % Slave 3
    %
    % - Slave que controla a anca direita
    % - Junta 1 - Controla o movimento de inclinação da anca
    % - Junta 2 - Controla o movimento lateral da perna direita
    % - Junta 3 - Controla o movimento de rotação da perna direita
    %---------------------------------------------------------------------%
    
        % Relação de transmissão            
            robo.slave(3).servo(1).transm = 2.5;
            robo.slave(3).servo(2).transm = 3;
            robo.slave(3).servo(3).transm = 2.5;
            
        % Definição da posição inicial das servos
            robo.slave(3).servo(1).pos = 0;
            robo.slave(3).servo(2).pos = 0;
            robo.slave(3).servo(3).pos = 0;
            
        % Definição da velocidade inicial das servos
            robo.slave(3).servo(1).vel = 50;
            robo.slave(3).servo(2).vel = 50;
            robo.slave(3).servo(3).vel = 50;
        
        % Definição do controlador
            robo.slave(3).servo(1).control = 0;
            robo.slave(3).servo(1).ki = 0;
            robo.slave(3).servo(1).kp = 0;
            robo.slave(3).servo(1).kd = 0;

            robo.slave(3).servo(2).control = 0;
            robo.slave(3).servo(2).ki = 0;
            robo.slave(3).servo(2).kp = 0;
            robo.slave(3).servo(2).kd = 0;

            robo.slave(3).servo(3).control = 0;
            robo.slave(3).servo(3).ki = 0;
            robo.slave(3).servo(3).kp = 0;
            robo.slave(3).servo(3).kd = 0;

            
        % Limitações e desvios
            robo.slave(3).servo(1).lim_sup = 90;
            robo.slave(3).servo(1).lim_inf = 90;
            robo.slave(3).servo(1).offset = 0;
            
            robo.slave(3).servo(2).lim_sup = 90;
            robo.slave(3).servo(2).lim_inf = 90;
            robo.slave(3).servo(2).offset = 0;
            
            robo.slave(3).servo(3).lim_sup = 90;
            robo.slave(3).servo(3).lim_inf = 90;
            robo.slave(3).servo(3).offset = 0;
            
            
    %---------------------------------------------------------------------%
    % Slave 3
    %
    % - Slave que controla a anca esquerad
    % - Junta 1 - Controla o movimento de inclinação da anca
    % - Junta 2 - Controla o movimento lateral da perna esquerda
    % - Junta 3 - Controla o movimento de rotação da perna esquerda
    %---------------------------------------------------------------------%
    
        % Relação de transmissão            
            robo.slave(4).servo(1).transm = 2.5;
            robo.slave(4).servo(2).transm = 3;
            robo.slave(4).servo(3).transm = 2.5;
            
        % Definição da posição inicial das servos
            robo.slave(4).servo(1).pos = 0;
            robo.slave(4).servo(2).pos = 0;
            robo.slave(4).servo(3).pos = 0;
            
        % Definição da velocidade inicial das servos
            robo.slave(4).servo(1).vel = 50;
            robo.slave(4).servo(2).vel = 50;
            robo.slave(4).servo(3).vel = 50;
        
        % Definição do controlador
            robo.slave(4).servo(1).control = 0;
            robo.slave(4).servo(1).ki = 0;
            robo.slave(4).servo(1).kp = 0;
            robo.slave(4).servo(1).kd = 0;

            robo.slave(4).servo(2).control = 0;
            robo.slave(4).servo(2).ki = 0;
            robo.slave(4).servo(2).kp = 0;
            robo.slave(4).servo(2).kd = 0;

            robo.slave(4).servo(3).control = 0;
            robo.slave(4).servo(3).ki = 0;
            robo.slave(4).servo(3).kp = 0;
            robo.slave(4).servo(3).kd = 0;

            
        % Limitações e desvios
            robo.slave(4).servo(1).lim_sup = 90;
            robo.slave(4).servo(1).lim_inf = 90;
            robo.slave(4).servo(1).offset = 0;
            
            robo.slave(4).servo(2).lim_sup = 90;
            robo.slave(4).servo(2).lim_inf = 90;
            robo.slave(4).servo(2).offset = 0;
            
            robo.slave(4).servo(3).lim_sup = 90;
            robo.slave(4).servo(3).lim_inf = 90;
            robo.slave(4).servo(3).offset = 0;
            
    
    %---------------------------------------------------------------------%
    % Slave 5
    %
    % - Slave que controla o tronco
    % - Junta 1 - Controla o movimento de inclinação longitudinal do tronco
    % - Junta 2 - Controla o movimento de inclinação lateral do tronco
    %---------------------------------------------------------------------%
        
        % Relação de transmissão            
            robo.slave(5).servo(1).transm = 2.5;
            robo.slave(5).servo(2).transm = 3;
            
        % Definição da posição inicial das servos
            robo.slave(5).servo(1).pos = 0;
            robo.slave(5).servo(2).pos = 0;
            
        % Definição da velocidade inicial das servos
            robo.slave(5).servo(1).vel = 50;
            robo.slave(5).servo(2).vel = 50;
        
        % Definição do controlador
            robo.slave(5).servo(1).control = 0;
            robo.slave(5).servo(1).ki = 0;
            robo.slave(5).servo(1).kp = 0;
            robo.slave(5).servo(1).kd = 0;

            robo.slave(5).servo(2).control = 0;
            robo.slave(5).servo(2).ki = 0;
            robo.slave(5).servo(2).kp = 0;
            robo.slave(5).servo(2).kd = 0;

            
        % Limitações e desvios
            robo.slave(5).servo(1).lim_sup = 90;
            robo.slave(5).servo(1).lim_inf = 90;
            robo.slave(5).servo(1).offset = 0;
            
            robo.slave(5).servo(2).lim_sup = 90;
            robo.slave(5).servo(2).lim_inf = 90;
            robo.slave(5).servo(2).offset = 0;
    
    
    %---------------------------------------------------------------------%
    % Slave 6
    %
    % - Slave que controla o braço direito
    % - Junta 1 - Controla o movimento de flexão do cotovelo
    % - Junta 2 - Controla o movimento lateral do braço direito
    % - Junta 3 - Controla o movimento longitudinal do ombro
    %---------------------------------------------------------------------%
    
        % Relação de transmissão            
            robo.slave(6).servo(1).transm = 1;
            robo.slave(6).servo(2).transm = 1;
            robo.slave(6).servo(3).transm = 1;
            
        % Definição da posição inicial das servos
            robo.slave(6).servo(1).pos = 0;
            robo.slave(6).servo(2).pos = 0;
            robo.slave(6).servo(3).pos = 0;
            
        % Definição da velocidade inicial das servos
            robo.slave(6).servo(1).vel = 50;
            robo.slave(6).servo(2).vel = 50;
            robo.slave(6).servo(3).vel = 50;
        
        % Definição do controlador
            robo.slave(6).servo(1).control = 0;
            robo.slave(6).servo(1).ki = 0;
            robo.slave(6).servo(1).kp = 0;
            robo.slave(6).servo(1).kd = 0;

            robo.slave(6).servo(2).control = 0;
            robo.slave(6).servo(2).ki = 0;
            robo.slave(6).servo(2).kp = 0;
            robo.slave(6).servo(2).kd = 0;

            robo.slave(6).servo(3).control = 0;
            robo.slave(6).servo(3).ki = 0;
            robo.slave(6).servo(3).kp = 0;
            robo.slave(6).servo(3).kd = 0;

            
        % Limitações e desvios
            robo.slave(6).servo(1).lim_sup = 90;
            robo.slave(6).servo(1).lim_inf = 90;
            robo.slave(6).servo(1).offset = 0;
            
            robo.slave(6).servo(2).lim_sup = 90;
            robo.slave(6).servo(2).lim_inf = 90;
            robo.slave(6).servo(2).offset = 0;
            
            robo.slave(6).servo(3).lim_sup = 90;
            robo.slave(6).servo(3).lim_inf = 90;
            robo.slave(6).servo(3).offset = 0;
    
    %---------------------------------------------------------------------%
    % Slave 7
    %
    % - Slave que controla o braço esquerdo
    % - Junta 1 - Controla o movimento de flexão do cotovelo
    % - Junta 2 - Controla o movimento lateral do braço esquerdo
    % - Junta 3 - Controla o movimento longitudinal do ombro
    %---------------------------------------------------------------------%
    
        % Relação de transmissão            
            robo.slave(7).servo(1).transm = 1;
            robo.slave(7).servo(2).transm = 1;
            robo.slave(7).servo(3).transm = 1;
            
        % Definição da posição inicial das servos
            robo.slave(7).servo(1).pos = 0;
            robo.slave(7).servo(2).pos = 0;
            robo.slave(7).servo(3).pos = 0;
            
        % Definição da velocidade inicial das servos
            robo.slave(7).servo(1).vel = 50;
            robo.slave(7).servo(2).vel = 50;
            robo.slave(7).servo(3).vel = 50;
        
        % Definição do controlador
            robo.slave(7).servo(1).control = 0;
            robo.slave(7).servo(1).ki = 0;
            robo.slave(7).servo(1).kp = 0;
            robo.slave(7).servo(1).kd = 0;

            robo.slave(7).servo(2).control = 0;
            robo.slave(7).servo(2).ki = 0;
            robo.slave(7).servo(2).kp = 0;
            robo.slave(7).servo(2).kd = 0;

            robo.slave(7).servo(3).control = 0;
            robo.slave(7).servo(3).ki = 0;
            robo.slave(7).servo(3).kp = 0;
            robo.slave(7).servo(3).kd = 0;

            
        % Limitações e desvios
            robo.slave(7).servo(1).lim_sup = 90;
            robo.slave(7).servo(1).lim_inf = 90;
            robo.slave(7).servo(1).offset = 0;
            
            robo.slave(7).servo(2).lim_sup = 90;
            robo.slave(7).servo(2).lim_inf = 90;
            robo.slave(7).servo(2).offset = 0;
            
            robo.slave(7).servo(3).lim_sup = 90;
            robo.slave(7).servo(3).lim_inf = 90;
            robo.slave(7).servo(3).offset = 0;
    
    %---------------------------------------------------------------------%
    % Slave 8
    %
    % - Slave que controla a cabeça
    % - Junta 1 - Controla o movimento de elevação da cabeça
    % - Junta 2 - Controla o movimento lateral da cabeça
    %---------------------------------------------------------------------%
    
        % Relação de transmissão            
            robo.slave(8).servo(1).transm = 1;
            robo.slave(8).servo(2).transm = 1;
            
        % Definição da posição inicial das servos
            robo.slave(8).servo(1).pos = 0;
            robo.slave(8).servo(2).pos = 0;
            
        % Definição da velocidade inicial das servos
            robo.slave(8).servo(1).vel = 50;
            robo.slave(8).servo(2).vel = 50;
        
        % Definição do controlador
            robo.slave(8).servo(1).control = 0;
            robo.slave(8).servo(1).ki = 0;
            robo.slave(8).servo(1).kp = 0;
            robo.slave(8).servo(1).kd = 0;

            robo.slave(8).servo(2).control = 0;
            robo.slave(8).servo(2).ki = 0;
            robo.slave(8).servo(2).kp = 0;
            robo.slave(8).servo(2).kd = 0;

            
        % Limitações e desvios
            robo.slave(8).servo(1).lim_sup = 90;
            robo.slave(8).servo(1).lim_inf = 90;
            robo.slave(8).servo(1).offset = 0;
            
            robo.slave(8).servo(2).lim_sup = 90;
            robo.slave(8).servo(2).lim_inf = 90;
            robo.slave(8).servo(2).offset = 0;