
	June 22, 1987					John Lloyd


	      SOME BENCHMARKS FOR ROBOT KINEMATIC CALCULATIONS


	The following routines are used:
	
	inverseKinematics() -- Inverse PUMA kinematics.
	forwardKinematics() -- Forward PUMA kinematics.
		   jacobT() -- Jacobian transpose computation.
		   invert() -- 4X4 transform inversion.
		   trmult() -- 4X4 transform multiply.
		   SINCOS() -- computation of sine and cosine.
	
	Each routine involves the following:

	inverseKinematics() -- 47 mults, 27 adds, 8 atan2(), 4 sin(), 4 cos()
				+ range reduction and checking.

	forwardKinematics() -- 43 mults, 29 adds, 7 sin(), 7 cos().
				+ some data moving

		   jacobT() -- 31 mults, 22 adds

		   invert() --  9 mults,  6 adds
				+ some data moving

		   trmult() -- 36 mults, 27 adds

		   SINCOS() --  1 sin(), 1 cos()
	

	All tests include call overhead. Tests were done with all
	computation in either single or double precision. This is 
	indicated as (single) or (double).

	SUN 3/280 using FPA board, single precision.

	inverseKinematics() --  902.0
	forwardKinematics() --  650.0
		   jacobT() --   93.2
		   invert() --   28.2
		   trmult() --   88.0
		   SINCOS() --   40.8

	SUN 3/280 using FPA board, double precision.

	inverseKinematics() --  940.0
	forwardKinematics() --  700.0
		   jacobT() --  166.0
		   invert() --   50.0
		   trmult() --  128.0
		   SINCOS() --   48.0

	uVAX II, using table-lookup trig functions written in assembly,
	   single precision.

	inverseKinematics() -- 1740.00
	forwardKinematics() -- 1200.00
		   jacobT() --  276.0
		   invert() --  105.0
		   trmult() --  310.0
		   SINCOS() --   60.0

	uVAX II, using table-lookup trig functions written in C,
	   single precision.

	inverseKinematics() -- 2480.0
	forwardKinematics() -- 1530.0
		   SINCOS() --  114.0

	uVAX II, using library trig functions, single precision.

	inverseKinematics() -- 4009.0
	forwardKinematics() -- 3409.0
		   SINCOS() --  341.0

	SUN 3/280 using 68881, single precision.

	inverseKinematics() -- 1860.0
	forwardKinematics() -- 1500.0
		   jacobT() --  378.0
		   invert() --  116.0
		   trmult() --  442.0
		   SINCOS() --   64.0

	SUN 3/280 using 68881 and table-lookup trig functions written
	   in C, single precision.	

	inverseKinematics() -- 2160.0
	forwardKinematics() -- 1440.0
		   SINCOS() --   82.0

	SUN 3/280 using 68881, double precision.

	inverseKinematics() -- 1640.0
	forwardKinematics() -- 1380.0
		   jacobT() --  386.0
		   invert() --  126.0
		   trmult() --  460.0
		   SINCOS() --   66.0

	SUN 3/180 using 68881, single precision

	inverseKinematics() -- 2300.0
	forwardKinematics() -- 1820.0
		   jacobT() --  464.0
		   invert() --  136.0
		   trmult() --  542.0
		   SINCOS() --   78.0

	SUN 3/180 using 68881, double precision

	inverseKinematics() -- 2040.0
	forwardKinematics() -- 1660.0
		   jacobT() --  494.0
		   invert() --  156.0
		   trmult() --  564.0
		   SINCOS() --   84.0


	CONCLUSIONS: 

	The sun 3/280 with FPA is the obvious winner.

	The floating point processor 68881 seems to be a bottleneck
	for the suns otherwise. Note that 68881 calculations on the 
	3/280 are still only as fast as the uVAX calculations, despite
	the fact that the machine is much faster than the VAX for non
	floating point work.

	Table lookup seems to be a waste of time on the suns, since both
	the 68881 and FPA seem to do the necessary computations as
	quickly. I did not try hand crafting lookup tables in assembly,
	however, as was done on the VAX.
