% IDYNACT      Inverzna dinamika kompletnog modela robota 
%
%  u = IDYNACT (DYN, ACTDYN, Q, QD, QDD)
%  u = IDYNACT (DYN, ACTDYN, [Q QD QDD])
%
%  Racuna potrebne pogonske napone da bi se postigla zadata pozicija, brzina i ubrzanje
%
%  Pretpostavalja se da gravitacija deluje u negativnom smeru Z ose sa 9.81 m/s^2, ali se moze
%  zadati proizvoljna gravitacija pomocu gravitacionog vektora [gx gy gz].
%
%  u = IDYNACT (DYN, ACTDYN, Q, QD, QDD, GRAV)
%  u = IDYNACT (DYN, ACTDYN, [Q QD QDD], GRAV)
%
%  Spoljasnje opterecenje sila/moment koji deluju na hvataljci se mogu zadati pomocu
%  sestokomponentnog vektora [Fx Fy Fz Mx My Mz]
%
%  u = IDYNACT (DYN, ACTDYN, Q, QD, QDD, GRAV, FEXT)
%  u = IDYNACT (DYN, ACTDYN, [Q QD QDD], GRAV, FEXT)
%
%  gde su Q, QD, QDD vektori vrste pozicije brzine i ubraznja manipulatora
%
%  vidi : RNE, FDYNACT2, INERTIA
%
%  (C) 1996 Rasic Milan

function u= idynact(dh_dyn, actdyn, a1, a2, a3, a4, a5)
	z0 = [0;0;1];
	grav = 9.81*z0;

	n = numrows(dh_dyn);
	if numcols(a1) == 3*n,
		Q = a1(:,1:n);
		Qd = a1(:,n+1:2*n);
		Qdd = a1(:,2*n+1:3*n);
		np = numrows(Q);
		if nargin >= 4,	
			grav = a2;
		end
		if nargin == 4,
			fext = a3;
		end
	else
		np = numrows(a1);
		Q = a1;
		Qd = a2;
		Qdd = a3;
		if numcols(a1) ~= n | numcols(Qd) ~= n | numcols(Qdd) ~= n | ...
			numrows(Qd) ~= np | numrows(Qdd) ~= np,
			error('bad data');
		end
		if nargin >= 6,	
			grav = a4;
		end
		if nargin == 7,
			fext = a5;
		end
	end
	
	% Glavna vremenska petlja
	for p=1:np,

      	%  sracunavanje dinamickog modela manipulatora
	   H = inertia(dh_dyn, Q(p,:));	
	   h = rne(dh_dyn, Q(p,:), Qd(p,:), zeros(1,numcols(Q)));

        %  ukljucivanje aktuatora u dinamicki model
           a= actdyn(:,5).*actdyn(:,2)./actdyn(:,1);
           c= actdyn(:,2).*actdyn(:,3).*(actdyn(:,5).^2)./actdyn(:,1);

           H1 = H./(a*ones(1,n));
           h1 = (h+c'.*Qd(p,:))./a';
	
        %  izracunavanje pogonskih napona
           u(p,:)= (H1*Qdd(p,:)' + h1')';
        
        end;
        % Kraj vremenske petlje
