//---------------------------------------------------------------------------
#ifndef ManipulatorModel_H
#define ManipulatorModel_H
//---------------------------------------------------------------------------
#include "..\Transform\Transformation.h" 


class ManipulatorException {};


/****************************************************************************
 * ManipulatorModel - template interface for a manipulator class
 *     Responsibility: Manipulator is a layer between the real-world 
 *         coordinates and the robot controller. It calculates inverse
 *         kinematics for desired end-effector pose and returns a set 
 *         of coordinates in actuator space.
 *         Robrot's actuators should be commanded to move to the resulting
 *         coordinates, bringing robot's end-effector to desired pose.
 *     Arguments: class ActuatorSpace, any set of values in actuator space.
 *         i.e. for SCARA that would be a set of angles, for a Stewart
 *         Platform that would be 6 actuator elongations...
 *
 */
template <class ActuatorSpace>
class ManipulatorModel{
	public:
		virtual ActuatorSpace							// returns positions of actuators
			inv(										// inverse kinematics
				const TransformationMatrix& worldSpace	// desired pose
			) 
				throw(ManipulatorException)
			= 0;										// pure virtual function
};


#endif // ManipulatorModel_H