Giter Site home page Giter Site logo

mit-acl / clipper Goto Github PK

View Code? Open in Web Editor NEW
218.0 6.0 37.0 312 KB

graph-theoretic framework for robust pairwise data association

Home Page: https://arxiv.org/abs/2011.10202

License: MIT License

CMake 18.18% C++ 77.66% C 0.16% MATLAB 4.00%
data-association point-cloud-registration robotics loop-closure sensor-calibration maximum-clique optimization

clipper's People

Contributors

ash-aldujaili avatar plusk01 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

clipper's Issues

Could not open the PLY file

Hi, Thanks for opening great work. I tried to run the python example but I got the error "[Open3D WARNING] Read PLY failed: unable to open file: ../data/bun1k.ply" and the number of points in the point cloud was zero. I tested with another irrelevant PLY file and open3d just worked fine. Are there any suggestions to fix the problem?

Setting diagonal values in the affinity matrix

Hi,

Thanks a lot for your great work! I have a question regarding the diagonal values in the affinity matrix. The function CLIPPER::setMatrixData sets to zero all of the values in the diagonal entries of M and C matrices. However, in the paper it is explicated that those values measure the similarity of the data points that association. As I have that information, I'd like to be able to use it.

I have tried commenting those lines and making clipper work with my forced values in M_ and C_. However, I'm getting wrong results. Could you please let me know how should I set those values? Thanks in advance!

Plane correspondences

Hi,

My goal is to find plane correspondences from two sets of planes that are extracted from two different lidar sensors. Is there some maximum rotation that Clipper cannot handle. In my case rotation around z axis is about 90 degrees between lidar sensors

Invariant choices

Hi,

Thanks for your great work! I have a question regarding the invariant choices. I am using the python API and cannot find a documentation that list different invariant choices.

Right now I am using this clipper.invariants.EuclideanDistanceParams() as in the tutorial. Is there any other already implemented invariant? I know we can implement ourselves.

How to uninstall clipper safely

Hi, I would like to know how to uninstall clipper safely. I have installed the python bindings and I would like to uninstall it.

make error with matlab bindings

Thanks for the good work. Very interesting and impressive!

I want to compile with Matlab bindings, and have the issue as follows,

cmake .. -DBUILD_BINDINGS_MATLAB=ON is succeed

image

but after that, make has an error

image

about setting weights for M_{ii} based on descriptor similarity

Hello there,

Many thanks for open-soure this very nice work. I really enjoy reading your papers.

I am wondering whether the current version of CLIPPER in this repository supports setting weights for M_{ii} based on descriptor similarity instead of setting as "1". I try to simply add such weights (range: [0,1]) by the following code (but it works pretty bad, resulting in many repeated items in the clique):

void CLIPPER::scorePairwiseConsistency_withweight(const invariants::Data& D1,const invariants::Data& D2,const std::vector<double>& weights, const Association& A)
{
  if (A.size() == 0) A_ = utils::createAllToAll(D1.cols(), D2.cols());
  else A_ = A;
  
  const size_t m = A_.rows();
  
  Eigen::MatrixXd M = Eigen::MatrixXd::Zero(m, m);
  
  #pragma omp parallel for shared(A_, D1, D2, M_, C_) if(parallelize_)
  for (size_t k=0; k<m*(m-1)/2; ++k) {
    size_t i, j; std::tie(i, j) = utils::k2ij(k, m);
  
    if (A_(i,0) == A_(j,0) || A_(i,1) == A_(j,1)) {
      // violates distinctness constraint
      continue;
    }

  //
  // Evaluate the consistency of geometric invariants associated with ei, ej
  //

  // points to extract invariant from in D1
  const auto& d1i = D1.col(A_(i,0));
  const auto& d1j = D1.col(A_(j,0));

  // points to extract invariant from in D2
  const auto& d2i = D2.col(A_(i,1));
  const auto& d2j = D2.col(A_(j,1));

  const double scr = (*invariant_)(d1i, d1j, d2i, d2j);
  if (scr > params_.affinityeps) { // does not violate inconsistency constraint
    M(i,j) = scr;
  }
  }
  
  //**************** for diagonal weights
  for (int i = 0; i < weights.size(); ++i)
  {
    M(i,i) = weights[i];
    // std::cout<<"weights["<<i<<"] = "<<weights[i]<<std::endl;
  }
 //****************
    
  // Identity on diagonal is taken care of implicitly in findDenseClique()
  // M += Eigen::MatrixXd::Identity(m, m);
  
  M_ = M.sparseView();
  
  C_ = M_;
  C_.coeffs() = 1;
}


int main(int argc, char **argv){
  clipper::invariants::EuclideanDistancePtr invariant =
            std::make_shared<clipper::invariants::EuclideanDistance>(iparams);

  clipper::Params params;
  clipper::CLIPPER clipper(invariant, params);

  //
  // Identify data association
  //

  clipper::Association A = clipper::Association(association_num, 2);
  for (int i = 0; i < association_num; i++) {
    A(i, 0) = i;
    A(i, 1) = i;
  }


  //get model, data, weights
  ... 

 clipper.scorePairwiseConsistency_withweight(model, data,weights, A);  

  // find the densest clique of the previously constructed consistency graph
  clipper.solve();
}

Could you please give me some suggestions about how to correctly set weights for diagonal weights? Considering such diagonal weights are quite different from non-diagonal weights (EuclideanDistance based in CLIPPER), do we need to scale the diagonal weights to handel such difference?

Thanks and regards,

weixin

Orthogonal projected gradient ascent

Hello~Thanks for your open source work.

You mentioned in your paper, orthogonal projected gradient ascent are applied. However, in this code

gradF = (1 + d) * u - d * ones * u.sum() + M_.selfadjointView<Eigen::Upper>() * u + C_.selfadjointView<Eigen::Upper>() * u * d;
, it seems to be standard gradient ascent. Am I right?

How to get the RT Matrix?

From the C++ code, I don’t seem to see how to get the rotation and translation matrix. How can I get this correspondence ?
Thank you so much!

Error building MATLAB Bindings

Hello,

I'm trying to compile the MATLAB binaries on Ubuntu 22.04 and I get the following errors:

clipper/bindings/matlab/finddensecluster_mex.cpp:65:37: error: ‘clipper::utils’ has not been declared
   65 |   if (u0.size() == 0) u0 = clipper::utils::randvec(m);
      |                                     ^~~~~
clipper/bindings/matlab/finddensecluster_mex.cpp:74:21: error: ‘findDenseCluster’ is not a member of ‘clipper’
   74 |     soln = clipper::findDenseCluster(Ms, Cs, u0, params);
      |                     ^~~~~~~~~~~~~~~~
clipper/bindings/matlab/finddensecluster_mex.cpp:76:21: error: ‘findDenseCluster’ is not a member of ‘clipper’
   76 |     soln = clipper::findDenseCluster(M, C, u0, params);
      |                     ^~~~~~~~~~~~~~~~

On inspection, it seems findDenseCluster is not a declared function in the C++ code. Am I missing something? How did you compile the MATLAB binaries?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.