docs: public static <T extends ImageGray<T>,Desc extends TupleDesc>
  	StereoVisualOdometry<T> stereoQuadPnP( double inlierPixelTol ,
  										   double epipolarPixelTol ,
  										   double maxDistanceF2F,
  										   double maxAssociationError,
  										   int ransacIterations ,
  										   int refineIterations ,
  										   DetectDescribeMulti<T,Desc> detector,
  										   Class<T> imageType )
  	{
  		EstimateNofPnP pnp = FactoryMultiView.pnp_N(EnumPNP.P3P_FINSTERWALDER, -1);
  		DistanceFromModelMultiView<Se3_F64,Point2D3D> distanceMono = new PnPDistanceReprojectionSq();
  		PnPStereoDistanceReprojectionSq distanceStereo = new PnPStereoDistanceReprojectionSq();
  		PnPStereoEstimator pnpStereo = new PnPStereoEstimator(pnp,distanceMono,0);
  
  		ModelManagerSe3_F64 manager = new ModelManagerSe3_F64();
  		EstimatorToGenerator<Se3_F64,Stereo2D3D> generator = new EstimatorToGenerator<>(pnpStereo);
  
  		// euclidean error squared from left + right images
  		double ransacTOL = 2*inlierPixelTol * inlierPixelTol;
  
  		ModelMatcher<Se3_F64, Stereo2D3D> motion =
  				new Ransac<>(2323, manager, generator, distanceStereo, ransacIterations, ransacTOL);
  
  		RefinePnPStereo refinePnP = null;
  
  		if( refineIterations > 0 ) {
  			refinePnP = new PnPStereoRefineRodrigues(1e-12,refineIterations);
  		}
  		Class<Desc> descType = detector.getDescriptionType();
  
  		ScoreAssociation<Desc> scorer = FactoryAssociation.defaultScore(descType);
  
  		// TODO need a better way to keep track of what error is squared and not
  		AssociateDescription2D<Desc> assocSame;
  		if( maxDistanceF2F > 0 ) {
  			AssociateMaxDistanceNaive<Desc> a = new AssociateMaxDistanceNaive<>(scorer, true, maxAssociationError);
  			a.setSquaredDistance(true);
  			a.setMaxDistance(maxDistanceF2F);
  			assocSame = a;
  		} else {
  			assocSame = new AssociateDescTo2D<>(FactoryAssociation.greedy(scorer, maxAssociationError, true));
  		}
  
  		AssociateStereo2D<Desc> associateStereo = new AssociateStereo2D<>(scorer, epipolarPixelTol, descType);
  		Triangulate2ViewsMetric triangulate = FactoryMultiView.triangulate2ViewMetric(
  				new ConfigTriangulation(ConfigTriangulation.Type.GEOMETRIC));
  
  		associateStereo.setMaxScoreThreshold(maxAssociationError);
  
  		VisOdomQuadPnP<T,Desc> alg = new VisOdomQuadPnP<>(
  				detector, assocSame, associateStereo, triangulate, motion, refinePnP);
  
  		return new WrapVisOdomQuadPnP<>(alg, refinePnP, associateStereo, distanceStereo, distanceMono, imageType);
  	}