docs: void estimateTranslation( DMatrixRMaj R , List<AssociatedPair> points , Vector3D_F64 T )
  	{
  		final int N = points.size();
  		W.reshape(N*2,3);
  		y.reshape(N*2,1);
  		Wty.reshape(3,1);
  
  		DMatrix3x3 Rtmp = new DMatrix3x3();
  		ConvertDMatrixStruct.convert(R,Rtmp);
  
  		int indexY = 0,indexW = 0;
  		for (int i = 0; i < N; i++) {
  			AssociatedPair p = points.get(i);
  
  			// rotate into camera frame
  			double u1 = Rtmp.a11*p.p1.x + Rtmp.a12*p.p1.y;
  			double u2 = Rtmp.a21*p.p1.x + Rtmp.a22*p.p1.y;
  			double u3 = Rtmp.a31*p.p1.x + Rtmp.a32*p.p1.y;
  
  			W.data[indexW++] = 1;
  			W.data[indexW++] = 0;
  			W.data[indexW++] = -p.p2.x;
  			W.data[indexW++] = 0;
  			W.data[indexW++] = 1;
  			W.data[indexW++] = -p.p2.y;
  
  			y.data[indexY++] = p.p2.x*u3 - u1;
  			y.data[indexY++] = p.p2.y*u3 - u2;
  		}
  
  		//======= Compute Pseudo Inverse
  		// WW = inv(W^T*W)
  		CommonOps_DDRM.multTransA(W,W,WW);
  		CommonOps_DDRM.invert(WW);
  
  		// W^T*y
  		CommonOps_DDRM.multTransA(W,y,Wty);
  
  		// translation = inv(W^T*W)*W^T*y
  		W.reshape(3,1);
  		CommonOps_DDRM.mult(WW,Wty,W);
  
  		T.x = W.data[0];
  		T.y = W.data[1];
  		T.z = W.data[2];
  	}