function l = SPInverse( model, R, T )
% SPInverse
% Stewart Platform Inverse - returns the lengths of a Stewart Platform actuators
%      for a given position and orientation of the platform
%  
%      Lengths = SPInverse( model, Rotation, Translation )
%	   or
%      Lengths = SPInverse( model, Homogeneous )
%
%      model - 3x12 vector containing coordinates of the Stewart platform
%	   joints. The first six columns represent coordinates of the base 
%	   joints and the next six columns correspond to the platform.  
%      Rotation    - 3x3 rotation matrix of the platform orientation
%      Translation - 3x1 translation vector of the platform position
%      Homogeneous = 4x4 homogeneous matrix, 
%	   Homogeneous = [ Rotation  Translation ; 0 0 0 1];
%      Lengths     - 1x6 vector of actuator lengths
%
%      For SPFA (Stewart Platform with Fixed Actuators), the model is 3x18 matrix
%
%      See also: SPModel
%   
%      REFERENCES: 
%      CC Nguyen, SS Antrazi, Z-L Zhou: Adaptive Control of a Stewart
%      Platform-Based Manipulator, Journal of Robotic Systems 10(5) 657-687 (1993)


if nargin == 3,
   R = [R T ; 0 0 0 1];
end;

if (size(model,2) >= 3*6),								% if the model is SPFA manipulator
	[b,p,l] = SPmodel2bp(model);
	q = R*p - b;

	h = q(3,:) - sqrt(l.^2 - q(1,:).^2 - q(2,:).^2);
else   														% if the model is SP manipulator
	[b,p] = SPmodel2bp(model);
	l = sqrt ( sum((R(1:3,1:4)*p - b).^2) );
end; 

return
