public ThrustCommand limit (ThrustCommand input)
		{
			ThrustCommand output = new ThrustCommand ();
			output.header = input.header;
			output.thrust = (float) thrust.limit ( input.thrust );
			return output;
		}
		public YawRateCommand limit (YawRateCommand input)
		{
			YawRateCommand output = new YawRateCommand ();
			output.header = input.header;
			output.turnrate = (float) turnrate.limit ( input.turnrate );
			return output;
		}
		public Vector3 limit (Vector3 input)
		{
			Vector3 output = new Vector3 ();
			output.x = x.limit ( input.x );
			output.y = y.limit ( input.y );
			output.z = z.limit ( input.z );

			double absolute_value_xy = System.Math.Sqrt ( output.x * output.x + output.y * output.y );
			if ( absolute_value_xy > absolute_maximum_xy )
			{
				output.x *= absolute_maximum_xy / absolute_value_xy;
				output.y *= absolute_maximum_xy / absolute_value_xy;
				output.z *= absolute_maximum_xy / absolute_value_xy;
			}

			double absolute_value = System.Math.Sqrt ( output.x * output.x + output.y * output.y + output.z * output.z );
			if ( absolute_value > absolute_maximum )
			{
				output.x *= absolute_maximum / absolute_value;
				output.y *= absolute_maximum / absolute_value;
				output.z *= absolute_maximum / absolute_value;
			}

			return output;
		}
		public Point limit (Point input)
		{
			Point output = new Point ();
			output.x = x.limit ( input.x );
			output.y = y.limit ( input.y );
			output.z = z.limit ( input.z );
			return output;
		}
		public AttitudeCommand limit (AttitudeCommand input)
		{
			AttitudeCommand output = new AttitudeCommand ();
			output.header = input.header;
			output.roll = (float) roll.limit ( input.roll );
			output.pitch = (float) pitch.limit ( input.pitch );

			double absolute_value = System.Math.Sqrt ( output.roll * output.roll + output.pitch * output.pitch );
			if ( absolute_value > absolute_max )
			{
				output.roll *= (float) ( absolute_max / absolute_value );
				output.pitch *= (float) ( absolute_max / absolute_value );
			}

			return output;
		}