function simulate(DM, GP)

% verificação de parametros

if(size(DM.q,1)<=1)
    return
end

%
    DM.fase = 1;
    q       = DM.q;
    duracao = DM.duracao;
    pe      = DM.pe;
    XYZRef  = DM.XYZRef;
    tetaPe  = DM.tetaPe;
    
    def  = GP.def;
    
%     axes(robo_visual)
%     [AZ,EL] = view;
%     tupfg = figure(1); view(AZ,EL); 
%     set(tupfg, 'Renderer', 'OpenGl');
  

  %------------------------------------------------------------------------------------
  % Planeamento de trajectorias nas juntas (funçoes polinomiais)
  %------------------------------------------------------------------------------------
   
   for k=1:size(q,1)-1,       %-- Movimento dividido em "i" fases --------------------#1 
       Texe = duracao(k); Ts = Texe/5; %-- Periodo de amostragem e tempo de execuçao ------------
       tp = 0:Ts:Texe;           %-- Vector tempo virtual ---------------------------------
       Tsim = 0;                 %-- Tempo de simulaçao (inicializaçao) -------------------

       %__ Matriz tempo de simulaçao ------------------------------------------------------
        t(k,:) = tp+Tsim; Tsim = Tsim+Texe;
       %__ Velocidade e acelaraçao inicial e final ----------------------------------------
        for n=1:length(q), VEL(n,:) = [0 0]; ACE(n,:) = [0 0]; end 
        [Q_legs,dQ_legs,ddQ_legs] = PlaneamentoJuntas( tp,q(k,:),q(k+1,:),VEL,ACE );     
       %__ Vector das juntas --------------------------------------------------------------
        Q(:,:,k) = Q_legs;
        
   end%-----------------------------------------------------------------------------#1
  %------------------------------------------------------------------------------------
  %-- Coordenadas Cartesianas do robo completo
  %------------------------------------------------------------------------------------
   for i=1:size(Q,3), %-- Movimento dividido em "i" fases -----------------------------
   for k=1:size(Q,2), %-- ... ao longo do tempo "k" -----------------------------------
    
    %-- Posiçoes angulares em funçao do tempo -----------------------------------------
     Q_t = [ Q(1,k,i)   Q(2,k,i)   Q(3,k,i)   Q(4,k,i)    Q(5,k,i)   Q(6,k,i) ...
             Q(7,k,i)   Q(8,k,i)   Q(9,k,i)   Q(10,k,i)   Q(11,k,i)  Q(12,k,i)... 
             Q(13,k,i)  Q(14,k,i)  Q(15,k,i)  Q(16,k,i) ...   
             Q(17,k,i)  Q(18,k,i) Q(19,k,i)  Q(20,k,i) ];
     DM.q = Q_t;
     DM.pe = pe(i+1,:);
     DM.XYZRef = XYZRef(i+1,:);
     DM.tetaPe = tetaPe(i+1);
     
    %-- Coordenadas Cartesianas do sistema --------------------------------------------      
     Ai = CinDir20dof( DM );   %-- SupLeg = 1 -> RL
     def(i,k) = CoordJuntas( Ai,DM, GP.def );
     def(i,k) = RobCOG(Ai, DM, GP.COG_0, def(i,k));

   end
   end

  %------------------------------------------------------------------------------------

  %------------------------------------------------------------------------------------
  % Evolução temporal das juntas ao longo das varias fases
  %------------------------------------------------------------------------------------
%      PlotJuntas( t,Q )
%      PlotCCarts( t,P_x,P_y,P_z )
%      PlotCOG( t,COG )
  %------------------------------------------------------------------------------------

  %------------------------------------------------------------------------------------
  % Animaçao do movimento
  %------------------------------------------------------------------------------------
  %------------------------------------------------------------------------------------
  %-- Simulaçao da 1ª fase (preparaçao para marcha): flectir joelho e recuar pe livre 
  %------------------------------------------------------------------------------------

  for i=1:size(Q,3), %-- Movimento dividido em "i" fases -----------------------------
   for k=1:size(Q,2), %-- ... ao longo do tempo ---------------------------------------
       GP.def = def(i,k);
       ActualizaRobo(GP) 
       pause(1/5)
   end
   end  
%--------------------------------------------------------------------------------------
return