Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "pointmatcher/PointMatcher.h"
00037 #include "pointmatcher/IO.h"
00038 #include <cassert>
00039 #include <iostream>
00040 #include <fstream>
00041 #include <boost/format.hpp>
00042 #include <boost/filesystem/path.hpp>
00043 #include <boost/filesystem/operations.hpp>
00044
00045
00046 using namespace std;
00047 using namespace PointMatcherSupport;
00048
00049 void validateArgs(int argc, char *argv[]);
00050
00057 int main(int argc, char *argv[])
00058 {
00059 validateArgs(argc, argv);
00060
00061 typedef PointMatcher<float> PM;
00062 typedef PointMatcherIO<float> PMIO;
00063 typedef PM::TransformationParameters TP;
00064 typedef PM::DataPoints DP;
00065
00066 string outputFileName(argv[0]);
00067
00068
00069 std::shared_ptr<PM::Transformation> rigidTrans;
00070 rigidTrans = PM::get().REG(Transformation).create("RigidTransformation");
00071
00072
00073 std::shared_ptr<PM::DataPointsFilter> densityFilter =
00074 PM::get().DataPointsFilterRegistrar.create(
00075 "SurfaceNormalDataPointsFilter",
00076 {
00077 {"knn", "10"},
00078 {"epsilon", "5"},
00079 {"keepNormals", "0"},
00080 {"keepDensities", "1"}
00081 }
00082 );
00083
00084 std::shared_ptr<PM::DataPointsFilter> maxDensitySubsample =
00085 PM::get().DataPointsFilterRegistrar.create(
00086 "MaxDensityDataPointsFilter",
00087 {{"maxDensity", toParam(30)}}
00088 );
00089
00090 PM::ICP icp;
00091
00092
00093 ifstream ifs(argv[1]);
00094 validateFile(argv[1]);
00095 icp.loadFromYaml(ifs);
00096
00097 PMIO::FileInfoVector list(argv[2]);
00098
00099 PM::DataPoints mapPointCloud, newCloud;
00100 TP T_to_map_from_new = TP::Identity(4,4);
00101
00102 for(unsigned i=0; i < list.size(); i++)
00103 {
00104 cout << "---------------------\nLoading: " << list[i].readingFileName << endl;
00105
00106
00107 newCloud = DP::load(list[i].readingFileName);
00108
00109 if(mapPointCloud.getNbPoints() == 0)
00110 {
00111 mapPointCloud = newCloud;
00112 continue;
00113 }
00114
00115
00116 try
00117 {
00118
00119
00120
00121 const TP prior = T_to_map_from_new;
00122
00123 T_to_map_from_new = icp(newCloud, mapPointCloud, prior);
00124 }
00125 catch (PM::ConvergenceError& error)
00126 {
00127 cout << "ERROR PM::ICP failed to converge: " << endl;
00128 cout << " " << error.what() << endl;
00129 continue;
00130 }
00131
00132
00133
00134 T_to_map_from_new = rigidTrans->correctParameters(T_to_map_from_new);
00135
00136
00137 newCloud = rigidTrans->compute(newCloud, T_to_map_from_new);
00138
00139
00140 mapPointCloud.concatenate(newCloud);
00141
00142
00143 mapPointCloud = densityFilter->filter(mapPointCloud);
00144 mapPointCloud = maxDensitySubsample->filter(mapPointCloud);
00145
00146
00147 stringstream outputFileNameIter;
00148 outputFileNameIter << outputFileName << "_" << i << ".vtk";
00149
00150 cout << "outputFileName: " << outputFileNameIter.str() << endl;
00151 mapPointCloud.save(outputFileNameIter.str());
00152 }
00153
00154 return 0;
00155 }
00156
00157 void validateArgs(int argc, char *argv[])
00158 {
00159 if (!(argc == 3))
00160 {
00161 cerr << "Error in command line, usage " << argv[0] << " icpConfiguration.yaml listOfFiles.csv" << endl;
00162 cerr << endl << "Example:" << endl;
00163 cerr << argv[0] << " ../examples/data/default.yaml ../examples/data/carCloudList.csv" << endl;
00164 cerr << endl << " - or - " << endl << endl;
00165 cerr << argv[0] << " ../examples/data/default.yaml ../examples/data/cloudList.csv" << endl << endl;
00166
00167 abort();
00168 }
00169 }
00170
00171