Example #1
0
float mmf::OptSO3MMFvMF::conjugateGradientCUDA_impl(Matrix3f& R, float res0,
    uint32_t n, uint32_t maxIter) {
  float f = 0;

  std::cout << this->cld_.xSums() << std::endl;
  for (uint32_t k=0; k<K(); ++k) {
    Eigen::Matrix3f N = Eigen::Matrix3f::Zero();
    for (uint32_t j=k*6; j<6*(k+1); ++j) { 
      Eigen::Vector3f m = Eigen::Vector3f::Zero();
      m((j%6)/2) = (j%6)%2==0?-1.:1.;
      N += m*this->cld_.xSums().col(j).transpose();
    }
    Eigen::JacobiSVD<Eigen::Matrix3f> svd(N,Eigen::ComputeThinU|Eigen::ComputeThinV);
    Rs_[k] = svd.matrixV()*svd.matrixU().transpose();
    if (Rs_[k].determinant() < 0.) Rs_[k] *= -1.;
    f += (N*R).trace();
    std::cout << N << std::endl;
    std::cout << Rs_[k] << std::endl;
  }

  Eigen::VectorXf mfCounts = Eigen::VectorXf::Zero(K());
  for (uint32_t k=0; k<K()*6; ++k) {
    mfCounts(k/6) += this->cld_.counts()(k);
  }
  cout<<"counts: "<<endl<<this->cld_.counts().transpose()<<endl;
  std::cout << " mf counts: " << mfCounts.transpose() << std::endl;
  uint32_t iMax = 0;
  mfCounts.maxCoeff(&iMax);
  R = Rs_[iMax];
//  std::cout << "N" << std::endl << N << std::endl;
//  std::cout << "R" << std::endl << R << std::endl;
  return f;
}
Example #2
0
///////////////////////
/////  Inference  /////
///////////////////////
void expAndNormalize ( Eigen::MatrixXf & out, const Eigen::MatrixXf & in ) {
	out.resize( in.rows(), in.cols() );
	for( int i=0; i<out.cols(); i++ ){
		Eigen::VectorXf b = in.col(i);
		b.array() -= b.maxCoeff();
		b = b.array().exp();
		out.col(i) = b / b.array().sum();
	}
}
Example #3
0
Eigen::MatrixXf
powerspectrum::from_pcm(const Eigen::VectorXf& pcm_samples)
{
    MINILOG(logTRACE) << "Powerspectrum computation. input samples="
            << pcm_samples.size();
    // check if inputs are sane
    if ((pcm_samples.size() < win_size) || (hop_size > win_size)) {
        return Eigen::MatrixXf(0, 0);
    }
    size_t frames = (pcm_samples.size() - (win_size-hop_size)) / hop_size;
    size_t freq_bins = win_size/2 + 1;

    // initialize power spectrum
    Eigen::MatrixXf ps(freq_bins, frames);

    // peak normalization value
    float pcm_scale = std::max(fabs(pcm_samples.minCoeff()),
            fabs(pcm_samples.maxCoeff()));

    // scale signal to 96db (16bit)
    pcm_scale =  std::pow(10.0f, 96.0f/20.0f) / pcm_scale;

    // compute the power spectrum
    for (size_t i = 0; i < frames; i++) {

        // fill pcm
        for (int j = 0; j < win_size; j++) {
            kiss_pcm[j] = pcm_samples(i*hop_size+j) * pcm_scale * win_funct(j);
        }

        // fft
        kiss_fftr(kiss_status, kiss_pcm, kiss_freq);

        // save powerspectrum frame
        Eigen::MatrixXf::ColXpr psc(ps.col(i));
        for (int j = 0; j < win_size/2+1; j++) {
            psc(j) =
                    std::pow(kiss_freq[j].r, 2) + std::pow(kiss_freq[j].i, 2);
        }
    }

    MINILOG(logTRACE) << "Powerspectrum finished. size=" << ps.rows() << "x"
            << ps.cols();
    return ps;
}
Example #4
0
int main(int argc, char **argv) {
	std::vector<color_keyframe::Ptr> frames;

	util U;
	U.load("http://localhost/corridor_map2", frames);
	timestamp_t t0 = get_timestamp();
	std::vector<std::pair<int, int> > overlapping_keyframes;
	int size;
	int workers = argc - 1;
	ros::init(argc, argv, "panorama");

	std::vector<
			actionlib::SimpleActionClient<rm_multi_mapper::WorkerSlamAction>*> ac_list;
	for (int i = 0; i < workers; i++) {
		actionlib::SimpleActionClient<rm_multi_mapper::WorkerSlamAction>* ac =
				new actionlib::SimpleActionClient<
						rm_multi_mapper::WorkerSlamAction>(
						std::string(argv[i + 1]), true);
		ac_list.push_back(ac);
	}

	sql::ResultSet *res;

	size = frames.size();
	get_pairs(overlapping_keyframes);
	std::vector<rm_multi_mapper::WorkerSlamGoal> goals;
	int keyframes_size = (int) overlapping_keyframes.size();

	for (int k = 0; k < workers; k++) {
		rm_multi_mapper::WorkerSlamGoal goal;

		int last_elem = (keyframes_size / workers) * (k + 1);
		if (k == workers - 1)
			last_elem = keyframes_size;

		for (int i = (keyframes_size / workers) * k; i < last_elem; i++) {
			rm_multi_mapper::KeyframePair keyframe;

			keyframe.first = overlapping_keyframes[i].first;
			keyframe.second = overlapping_keyframes[i].second;
			goal.Overlap.push_back(keyframe);
		}
		goals.push_back(goal);
	}

	ROS_INFO("Waiting for action server to start.");
	for (int i = 0; i < workers; i++) {
		ac_list[i]->waitForServer();
	}

	ROS_INFO("Action server started, sending goal.");

	// send a goal to the action
	for (int i = 0; i < workers; i++) {
		ac_list[i]->sendGoal(goals[i]);
	}

	//wait for the action to return
	std::vector<bool> finished;
	for (int i = 0; i < workers; i++) {
		bool finished_before_timeout = ac_list[i]->waitForResult(
				ros::Duration(30.0));
		finished.push_back(finished_before_timeout);
	}

	bool success = true;
	for (int i = 0; i < workers; i++) {
		success = finished[i] && success;
	}

	Eigen::MatrixXf acc_JtJ;
	acc_JtJ.setZero(size * 6, size * 6);
	Eigen::VectorXf acc_Jte;
	acc_Jte.setZero(size * 6);

	if (success) {

		for (int i = 0; i < workers; i++) {
			Eigen::MatrixXf JtJ;
			JtJ.setZero(size * 6, size * 6);
			Eigen::VectorXf Jte;
			Jte.setZero(size * 6);

			rm_multi_mapper::Vector rosJte = ac_list[i]->getResult()->Jte;
			rm_multi_mapper::Matrix rosJtJ = ac_list[i]->getResult()->JtJ;

			vector2eigen(rosJte, Jte);

			matrix2eigen(rosJtJ, JtJ);

			acc_JtJ += JtJ;
			acc_Jte += Jte;

		}

	} else {
		ROS_INFO("Action did not finish before the time out.");
		std::exit(0);
	}

	Eigen::VectorXf update = -acc_JtJ.ldlt().solve(acc_Jte);

	float iteration_max_update = std::max(std::abs(update.maxCoeff()),
			std::abs(update.minCoeff()));

	ROS_INFO("Max update %f", iteration_max_update);

	/*for (int i = 0; i < (int)frames.size(); i++) {

	 frames[i]->get_pos() = Sophus::SE3f::exp(update.segment<6>(i))
	 * frames[i]->get_pos();

	 std::string query = "UPDATE `positions` SET `q0` = " + 
	 boost::lexical_cast<std::string>(frames[i]->get_pos().so3().data()[0]) +
	 ", `q1` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_pos().so3().data()[1]) +
	 ", `q2` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_pos().so3().data()[2]) +
	 ", `q3` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_pos().so3().data()[3]) +
	 ", `t0` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_pos().translation()[0]) +
	 ", `t1` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_pos().translation()[1]) +
	 ", `t2` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_pos().translation()[2]) +
	 ", `int0` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_intrinsics().array()[0]) +
	 ", `int1` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_intrinsics().array()[1]) +
	 ", `int2` = " +
	 boost::lexical_cast<std::string>(frames[i]->get_intrinsics().array()[2]) +
	 " WHERE `id` = " +
	 boost::lexical_cast<std::string>(i) +
	 ";";

	 res = U.sql_query(query);
	 delete res;
	 

	 }*/
	timestamp_t t1 = get_timestamp();

	double secs = (t1 - t0) / 1000000.0L;
	std::cout << secs << std::endl;
	return 0;

}
Example #5
0
int main(int argc, char *argv[])
{

  // Load a mesh
  igl::readOBJ(TUTORIAL_SHARED_PATH "/inspired_mesh.obj", V, F);

  printf("--Initialization--\n");
  V_border = igl::is_border_vertex(V,F);
  igl::adjacency_list(F, VV);
  igl::vertex_triangle_adjacency(V,F,VF,VFi);
  igl::triangle_triangle_adjacency(F,TT,TTi);
  igl::edge_topology(V,F,E,F2E,E2F);

  // Generate "subdivided" mesh for visualization of curl terms
  igl::false_barycentric_subdivision(V, F, Vbs, Fbs);

  // Compute scale for visualizing fields
  global_scale =  .2*igl::avg_edge_length(V, F);

  //Compute scale for visualizing texture
  uv_scale = 0.6/igl::avg_edge_length(V, F);

  // Compute face barycenters
  igl::barycenter(V, F, B);

  // Compute local basis for faces
  igl::local_basis(V,F,B1,B2,B3);

  //Generate random vectors for constraints
  generate_constraints();

  // Interpolate a 2-PolyVector field to be used as the original field
  printf("--Initial solution--\n");
  igl::n_polyvector(V, F, b, bc, two_pv_ori);

  // Post process original field
  // Compute curl_minimizing matchings and curl
  Eigen::MatrixXi match_ab, match_ba;  // matchings across interior edges
  printf("--Matchings and curl--\n");
  double avgCurl = igl::polyvector_field_matchings(two_pv_ori, V, F, true, match_ab, match_ba, curl_ori);
  double maxCurl = curl_ori.maxCoeff();
  printf("original curl -- max: %.5g, avg: %.5g\n", maxCurl,  avgCurl);

  printf("--Singularities--\n");
  // Compute singularities
  igl::polyvector_field_singularities_from_matchings(V, F, V_border, VF, TT, E2F, F2E, match_ab, match_ba, singularities_ori);
  printf("original #singularities: %ld\n", singularities.rows());

  printf("--Cuts--\n");
 // Get mesh cuts based on singularities
  igl::polyvector_field_cut_mesh_with_singularities(V, F, VF, VV, TT, TTi, singularities_ori, cuts_ori);

  printf("--Combing--\n");
// Comb field
  Eigen::MatrixXd combed;
  igl::polyvector_field_comb_from_matchings_and_cuts(V, F, TT, E2F, F2E, two_pv_ori, match_ab, match_ba, cuts_ori, combed);

  printf("--Cut mesh--\n");
  // Reconstruct integrable vector fields from combed field
  igl::cut_mesh(V, F, VF, VFi, TT, TTi, V_border, cuts_ori, Vcut_ori, Fcut_ori);

  printf("--Poisson--\n");
  double avgPoisson = igl::polyvector_field_poisson_reconstruction(Vcut_ori, Fcut_ori, combed, scalars_ori, two_pv_poisson_ori, poisson_error_ori);
  double maxPoisson = poisson_error_ori.maxCoeff();
  printf("poisson error -- max: %.5g, avg: %.5g\n", maxPoisson, avgPoisson);


  // Set the curl-free 2-PolyVector to equal the original field
  two_pv = two_pv_ori;
  singularities = singularities_ori;
  curl = curl_ori;
  cuts = cuts_ori;
  two_pv_poisson = two_pv_poisson_ori;
  poisson_error = poisson_error_ori;
  Vcut = Vcut_ori;
  Fcut = Fcut_ori;
  scalars = scalars_ori;

  printf("--Integrable - Precomputation--\n");
  // Precompute stuff for solver
  igl::integrable_polyvector_fields_precompute(V, F, b, bc, blevel, two_pv_ori, ipfdata);

  cerr<<"Done. Press keys 1-0 for various visualizations, 'A' to improve integrability." <<endl;

  igl::viewer::Viewer viewer;
  viewer.callback_key_down = &key_down;
  viewer.core.show_lines = false;
  key_down(viewer,'2',0);

  // Replace the standard texture with an integer shift invariant texture
  line_texture(texture_R, texture_G, texture_B);

  viewer.launch();

  return 0;
}
Example #6
0
bool key_down(igl::viewer::Viewer& viewer, unsigned char key, int modifier)
{

  if (key == '1')
  {
    display_mode = 1;
    update_display(viewer);
  }

  if (key == '2')
  {
    display_mode = 2;
    update_display(viewer);
  }

  if (key == '3')
  {
    display_mode = 3;
    update_display(viewer);
  }

  if (key == '4')
  {
    display_mode = 4;
    update_display(viewer);
  }

  if (key == '5')
  {
    display_mode = 5;
    update_display(viewer);
  }

  if (key == '6')
  {
    display_mode = 6;
    update_display(viewer);
  }

  if (key == '7')
  {
    display_mode = 7;
    update_display(viewer);
  }

  if (key == '8')
  {
    display_mode = 8;
    update_display(viewer);
  }

  if (key == '9')
  {
    display_mode = 9;
    update_display(viewer);
  }

  if (key == '0')
  {
    display_mode = 0;
    update_display(viewer);
  }

  if (key == 'A')
  {
    //do a batch of iterations
    printf("--Improving Curl--\n");
    for (int bi = 0; bi<5; ++bi)
    {
      printf("\n\n **** Batch %d ****\n", iter);
      igl::integrable_polyvector_fields_solve(ipfdata, params, two_pv, iter ==0);
      iter++;
      params.wSmooth *= params.redFactor_wsmooth;
    }
    // Post process current field
    // Compute curl_minimizing matchings and curl
    printf("--Matchings and curl--\n");
    Eigen::MatrixXi match_ab, match_ba;  // matchings across interior edges
    double avgCurl = igl::polyvector_field_matchings(two_pv, V, F, true, match_ab, match_ba, curl);
    double maxCurl = curl.maxCoeff();
    printf("curl -- max: %.5g, avg: %.5g\n", maxCurl,  avgCurl);
    // Compute singularities
    printf("--Singularities--\n");
    igl::polyvector_field_singularities_from_matchings(V, F, match_ab, match_ba, singularities);
    printf("#singularities: %ld\n", singularities.rows());
    // Get mesh cuts based on singularities
    printf("--Cuts--\n");
    igl::polyvector_field_cut_mesh_with_singularities(V, F, singularities, cuts);
    // Comb field
    printf("--Combing--\n");
    Eigen::MatrixXd combed;
    igl::polyvector_field_comb_from_matchings_and_cuts(V, F, two_pv, match_ab, match_ba, cuts, combed);
    // Reconstruct integrable vector fields from combed field
    printf("--Cut mesh--\n");
    igl::cut_mesh(V, F, cuts, Vcut, Fcut);
    printf("--Poisson--\n");
    double avgPoisson = igl::polyvector_field_poisson_reconstruction(Vcut, Fcut, combed, scalars, two_pv_poisson, poisson_error);
    double maxPoisson = poisson_error.maxCoeff();
    printf("poisson error -- max: %.5g, avg: %.5g\n", maxPoisson, avgPoisson);

    update_display(viewer);
  }

  return false;
}