41 #include <opencv2/core/version.hpp>
42 #include <pcl/pcl_config.h>
43 #include <opencv2/opencv_modules.hpp>
45 #include <vtkVersion.h>
77 UFATAL(
"Can't get the HOME variable environment!");
84 return RTABMAP_VERSION;
95 std::stringstream output;
96 for(ParametersMap::const_iterator
iter=parameters.begin();
iter!=parameters.end(); ++
iter)
98 if(
iter != parameters.begin())
105 UDEBUG(
"output=%s", output.str().c_str());
111 UDEBUG(
"parameters=%s", parameters.c_str());
113 std::list<std::string> tuplets =
uSplit(parameters,
';');
114 for(std::list<std::string>::iterator
iter=tuplets.begin();
iter!=tuplets.end(); ++
iter)
119 std::string
key =
p.front();
120 std::string
value =
p.back();
123 bool addParameter =
true;
127 addParameter = oldIter->second.first;
130 key = oldIter->second.second;
131 UWARN(
"Parameter migration from \"%s\" to \"%s\" (value=%s).",
132 oldIter->first.c_str(), oldIter->second.second.c_str(),
value.c_str());
134 else if(oldIter->second.second.empty())
136 UWARN(
"Parameter \"%s\" doesn't exist anymore.",
137 oldIter->first.c_str());
141 UWARN(
"Parameter \"%s\" doesn't exist anymore, you may want to use this similar parameter \"%s\":\"%s\".",
150 UWARN(
"Unknown parameter \"%s\"=\"%s\"! The parameter is still added to output map.",
key.c_str(),
value.c_str());
160 std::string group =
uSplit(parameter,
'/').front();
161 return group.compare(
"SURF") == 0 ||
162 group.compare(
"SIFT") == 0 ||
163 group.compare(
"ORB") == 0 ||
164 group.compare(
"FAST") == 0 ||
165 group.compare(
"FREAK") == 0 ||
166 group.compare(
"BRIEF") == 0 ||
167 group.compare(
"GFTT") == 0 ||
168 group.compare(
"BRISK") == 0 ||
169 group.compare(
"KAZE") == 0 ||
170 group.compare(
"SuperPoint") == 0 ||
171 group.compare(
"PyDetector") == 0;
178 for(rtabmap::ParametersMap::iterator
iter=defaultParameters.begin();
iter!=defaultParameters.end(); ++
iter)
180 std::string group =
uSplit(
iter->first,
'/').front();
182 (stereo && group.compare(
"Stereo") == 0) ||
183 (
icp && group.compare(
"Icp") == 0) ||
185 group.compare(
"Reg") == 0 ||
186 group.compare(
"Optimizer") == 0 ||
187 group.compare(
"g2o") == 0 ||
188 group.compare(
"GTSAM") == 0 ||
189 (vis && (group.compare(
"Vis") == 0 || group.compare(
"PyMatcher") == 0 || group.compare(
"GMS") == 0)) ||
190 iter->first.compare(kRtabmapPublishRAMUsage())==0 ||
191 iter->first.compare(kRtabmapImagesAlreadyRectified())==0 ||
192 iter->first.compare(kKpByteToFloat())==0)
194 odomParameters.insert(*
iter);
197 return odomParameters;
204 for(rtabmap::ParametersMap::const_iterator
iter=defaultParameters.begin();
iter!=defaultParameters.end(); ++
iter)
207 std::string group =
uSplit(
iter->first,
'/').front();
208 if(group.compare(groupIn) == 0)
210 parameters.insert(*
iter);
213 UASSERT_MSG(parameters.size(),
uFormat(
"No parameters found for group %s!", groupIn.c_str()).c_str());
220 for(rtabmap::ParametersMap::const_iterator
iter=parameters.begin();
iter!=parameters.end(); ++
iter)
223 std::string group =
uSplit(
iter->first,
'/').front();
224 bool sameGroup = group.compare(groupIn) == 0;
225 if((!remove && sameGroup) || (remove && !sameGroup))
227 output.insert(*
iter);
240 removedParameters_.insert(std::make_pair(
"Vis/ForwardEstOnly", std::make_pair(
false,
"")));
243 removedParameters_.insert(std::make_pair(
"SIFT/NFeatures", std::make_pair(
false,
"")));
246 removedParameters_.insert(std::make_pair(
"GridGlobal/FullUpdate", std::make_pair(
false,
"")));
249 removedParameters_.insert(std::make_pair(
"Grid/FromDepth", std::make_pair(
true, Parameters::kGridSensor())));
252 removedParameters_.insert(std::make_pair(
"OdomORBSLAM2/VocPath", std::make_pair(
true, Parameters::kOdomORBSLAMVocPath())));
253 removedParameters_.insert(std::make_pair(
"OdomORBSLAM2/Bf", std::make_pair(
true, Parameters::kOdomORBSLAMBf())));
254 removedParameters_.insert(std::make_pair(
"OdomORBSLAM2/ThDepth", std::make_pair(
true, Parameters::kOdomORBSLAMThDepth())));
255 removedParameters_.insert(std::make_pair(
"OdomORBSLAM2/Fps", std::make_pair(
true, Parameters::kOdomORBSLAMFps())));
256 removedParameters_.insert(std::make_pair(
"OdomORBSLAM2/MaxFeatures", std::make_pair(
true, Parameters::kOdomORBSLAMMaxFeatures())));
257 removedParameters_.insert(std::make_pair(
"OdomORBSLAM2/MapSize", std::make_pair(
true, Parameters::kOdomORBSLAMMapSize())));
259 removedParameters_.insert(std::make_pair(
"RGBD/SavedLocalizationIgnored", std::make_pair(
true, Parameters::kRGBDStartAtOrigin())));
261 removedParameters_.insert(std::make_pair(
"Icp/PMForce4DoF", std::make_pair(
true, Parameters::kIcpForce4DoF())));
262 removedParameters_.insert(std::make_pair(
"Icp/PM", std::make_pair(
true, Parameters::kIcpStrategy())));
263 removedParameters_.insert(std::make_pair(
"Icp/PMOutlierRatio", std::make_pair(
true, Parameters::kIcpOutlierRatio())));
266 removedParameters_.insert(std::make_pair(
"SuperGlue/Path", std::make_pair(
true, Parameters::kPyMatcherPath())));
267 removedParameters_.insert(std::make_pair(
"SuperGlue/Iterations", std::make_pair(
true, Parameters::kPyMatcherIterations())));
268 removedParameters_.insert(std::make_pair(
"SuperGlue/MatchThreshold", std::make_pair(
true, Parameters::kPyMatcherThreshold())));
269 removedParameters_.insert(std::make_pair(
"SuperGlue/Cuda", std::make_pair(
true, Parameters::kPyMatcherCuda())));
270 removedParameters_.insert(std::make_pair(
"SuperGlue/Indoor", std::make_pair(
false, Parameters::kPyMatcherModel())));
272 removedParameters_.insert(std::make_pair(
"Vis/CorCrossCheck", std::make_pair(
false, Parameters::kVisCorNNType())));
273 removedParameters_.insert(std::make_pair(
"SPTorch/ModelPath", std::make_pair(
true, Parameters::kSuperPointModelPath())));
274 removedParameters_.insert(std::make_pair(
"SPTorch/Threshold", std::make_pair(
true, Parameters::kSuperPointThreshold())));
275 removedParameters_.insert(std::make_pair(
"SPTorch/NMS", std::make_pair(
true, Parameters::kSuperPointNMS())));
276 removedParameters_.insert(std::make_pair(
"SPTorch/MinDistance", std::make_pair(
true, Parameters::kSuperPointNMSRadius())));
277 removedParameters_.insert(std::make_pair(
"SPTorch/Cuda", std::make_pair(
true, Parameters::kSuperPointCuda())));
280 removedParameters_.insert(std::make_pair(
"RGBD/MaxLocalizationDistance", std::make_pair(
true, Parameters::kRGBDMaxLoopClosureDistance())));
283 removedParameters_.insert(std::make_pair(
"Aruco/Dictionary", std::make_pair(
true, Parameters::kMarkerDictionary())));
284 removedParameters_.insert(std::make_pair(
"Aruco/MarkerLength", std::make_pair(
true, Parameters::kMarkerLength())));
285 removedParameters_.insert(std::make_pair(
"Aruco/MaxDepthError", std::make_pair(
true, Parameters::kMarkerMaxDepthError())));
286 removedParameters_.insert(std::make_pair(
"Aruco/VarianceLinear", std::make_pair(
true, Parameters::kMarkerVarianceLinear())));
287 removedParameters_.insert(std::make_pair(
"Aruco/VarianceAngular", std::make_pair(
true, Parameters::kMarkerVarianceAngular())));
288 removedParameters_.insert(std::make_pair(
"Aruco/CornerRefinementMethod", std::make_pair(
true, Parameters::kMarkerCornerRefinementMethod())));
291 removedParameters_.insert(std::make_pair(
"Grid/OctoMapOccupancyThr", std::make_pair(
true, Parameters::kGridGlobalOccupancyThr())));
294 removedParameters_.insert(std::make_pair(
"Grid/Scan2dMaxFilledRange", std::make_pair(
false, Parameters::kGridRangeMax())));
297 removedParameters_.insert(std::make_pair(
"Grid/ProjRayTracing", std::make_pair(
true, Parameters::kGridRayTracing())));
298 removedParameters_.insert(std::make_pair(
"Grid/DepthMin", std::make_pair(
true, Parameters::kGridRangeMin())));
299 removedParameters_.insert(std::make_pair(
"Grid/DepthMax", std::make_pair(
true, Parameters::kGridRangeMax())));
302 removedParameters_.insert(std::make_pair(
"Reg/VarianceFromInliersCount", std::make_pair(
false,
"")));
303 removedParameters_.insert(std::make_pair(
"Reg/VarianceNormalized", std::make_pair(
false,
"")));
306 removedParameters_.insert(std::make_pair(
"Icp/PointToPlaneNormalNeighbors", std::make_pair(
true, Parameters::kIcpPointToPlaneK())));
310 removedParameters_.insert(std::make_pair(
"Rtabmap/VhStrategy", std::make_pair(
true, Parameters::kVhEpEnabled())));
313 removedParameters_.insert(std::make_pair(
"Grid/FullUpdate", std::make_pair(
false,
"")));
316 removedParameters_.insert(std::make_pair(
"Grid/3DGroundIsObstacle", std::make_pair(
true, Parameters::kGridGroundIsObstacle())));
319 removedParameters_.insert(std::make_pair(
"Optimizer/Slam2D", std::make_pair(
true, Parameters::kRegForce3DoF())));
320 removedParameters_.insert(std::make_pair(
"OdomF2M/FixedMapPath", std::make_pair(
false,
"")));
323 removedParameters_.insert(std::make_pair(
"Grid/FlatObstaclesDetected", std::make_pair(
true, Parameters::kGridFlatObstacleDetected())));
326 removedParameters_.insert(std::make_pair(
"Reg/Force2D", std::make_pair(
true, Parameters::kRegForce3DoF())));
327 removedParameters_.insert(std::make_pair(
"OdomF2M/ScanSubstractRadius", std::make_pair(
true, Parameters::kOdomF2MScanSubtractRadius())));
330 removedParameters_.insert(std::make_pair(
"RGBD/ProximityPathScansMerged", std::make_pair(
false,
"")));
333 removedParameters_.insert(std::make_pair(
"Mem/ImageDecimation", std::make_pair(
true, Parameters::kMemImagePostDecimation())));
336 removedParameters_.insert(std::make_pair(
"OdomLocalMap/HistorySize", std::make_pair(
true, Parameters::kOdomF2MMaxSize())));
337 removedParameters_.insert(std::make_pair(
"OdomLocalMap/FixedMapPath", std::make_pair(
false,
"")));
338 removedParameters_.insert(std::make_pair(
"OdomF2F/GuessMotion", std::make_pair(
true, Parameters::kOdomGuessMotion())));
339 removedParameters_.insert(std::make_pair(
"OdomF2F/KeyFrameThr", std::make_pair(
false, Parameters::kOdomKeyFrameThr())));
342 removedParameters_.insert(std::make_pair(
"OdomBow/LocalHistorySize", std::make_pair(
true, Parameters::kOdomF2MMaxSize())));
343 removedParameters_.insert(std::make_pair(
"OdomBow/FixedLocalMapPath", std::make_pair(
false,
"")));
344 removedParameters_.insert(std::make_pair(
"OdomFlow/KeyFrameThr", std::make_pair(
false, Parameters::kOdomKeyFrameThr())));
345 removedParameters_.insert(std::make_pair(
"OdomFlow/GuessMotion", std::make_pair(
true, Parameters::kOdomGuessMotion())));
347 removedParameters_.insert(std::make_pair(
"Kp/WordsPerImage", std::make_pair(
true, Parameters::kKpMaxFeatures())));
349 removedParameters_.insert(std::make_pair(
"Mem/LocalSpaceLinksKeptInWM", std::make_pair(
false,
"")));
351 removedParameters_.insert(std::make_pair(
"RGBD/PoseScanMatching", std::make_pair(
true, Parameters::kRGBDNeighborLinkRefining())));
353 removedParameters_.insert(std::make_pair(
"Odom/ParticleFiltering", std::make_pair(
false, Parameters::kOdomFilteringStrategy())));
354 removedParameters_.insert(std::make_pair(
"Odom/FeatureType", std::make_pair(
true, Parameters::kVisFeatureType())));
355 removedParameters_.insert(std::make_pair(
"Odom/EstimationType", std::make_pair(
true, Parameters::kVisEstimationType())));
356 removedParameters_.insert(std::make_pair(
"Odom/MaxFeatures", std::make_pair(
true, Parameters::kVisMaxFeatures())));
357 removedParameters_.insert(std::make_pair(
"Odom/InlierDistance", std::make_pair(
true, Parameters::kVisInlierDistance())));
358 removedParameters_.insert(std::make_pair(
"Odom/MinInliers", std::make_pair(
true, Parameters::kVisMinInliers())));
359 removedParameters_.insert(std::make_pair(
"Odom/Iterations", std::make_pair(
true, Parameters::kVisIterations())));
360 removedParameters_.insert(std::make_pair(
"Odom/RefineIterations", std::make_pair(
true, Parameters::kVisRefineIterations())));
361 removedParameters_.insert(std::make_pair(
"Odom/MaxDepth", std::make_pair(
true, Parameters::kVisMaxDepth())));
362 removedParameters_.insert(std::make_pair(
"Odom/RoiRatios", std::make_pair(
true, Parameters::kVisRoiRatios())));
363 removedParameters_.insert(std::make_pair(
"Odom/Force2D", std::make_pair(
true, Parameters::kRegForce3DoF())));
364 removedParameters_.insert(std::make_pair(
"Odom/VarianceFromInliersCount", std::make_pair(
false,
"")));
365 removedParameters_.insert(std::make_pair(
"Odom/PnPReprojError", std::make_pair(
true, Parameters::kVisPnPReprojError())));
366 removedParameters_.insert(std::make_pair(
"Odom/PnPFlags", std::make_pair(
true, Parameters::kVisPnPFlags())));
368 removedParameters_.insert(std::make_pair(
"OdomBow/NNType", std::make_pair(
true, Parameters::kVisCorNNType())));
369 removedParameters_.insert(std::make_pair(
"OdomBow/NNDR", std::make_pair(
true, Parameters::kVisCorNNDR())));
371 removedParameters_.insert(std::make_pair(
"OdomFlow/WinSize", std::make_pair(
true, Parameters::kVisCorFlowWinSize())));
372 removedParameters_.insert(std::make_pair(
"OdomFlow/Iterations", std::make_pair(
true, Parameters::kVisCorFlowIterations())));
373 removedParameters_.insert(std::make_pair(
"OdomFlow/Eps", std::make_pair(
true, Parameters::kVisCorFlowEps())));
374 removedParameters_.insert(std::make_pair(
"OdomFlow/MaxLevel", std::make_pair(
true, Parameters::kVisCorFlowMaxLevel())));
376 removedParameters_.insert(std::make_pair(
"OdomSubPix/WinSize", std::make_pair(
true, Parameters::kVisSubPixWinSize())));
377 removedParameters_.insert(std::make_pair(
"OdomSubPix/Iterations", std::make_pair(
true, Parameters::kVisSubPixIterations())));
378 removedParameters_.insert(std::make_pair(
"OdomSubPix/Eps", std::make_pair(
true, Parameters::kVisSubPixEps())));
380 removedParameters_.insert(std::make_pair(
"LccReextract/Activated", std::make_pair(
true, Parameters::kRGBDLoopClosureReextractFeatures())));
381 removedParameters_.insert(std::make_pair(
"LccReextract/FeatureType", std::make_pair(
false, Parameters::kVisFeatureType())));
382 removedParameters_.insert(std::make_pair(
"LccReextract/MaxWords", std::make_pair(
false, Parameters::kVisMaxFeatures())));
383 removedParameters_.insert(std::make_pair(
"LccReextract/MaxDepth", std::make_pair(
false, Parameters::kVisMaxDepth())));
384 removedParameters_.insert(std::make_pair(
"LccReextract/RoiRatios", std::make_pair(
false, Parameters::kVisRoiRatios())));
385 removedParameters_.insert(std::make_pair(
"LccReextract/NNType", std::make_pair(
false, Parameters::kVisCorNNType())));
386 removedParameters_.insert(std::make_pair(
"LccReextract/NNDR", std::make_pair(
false, Parameters::kVisCorNNDR())));
388 removedParameters_.insert(std::make_pair(
"LccBow/EstimationType", std::make_pair(
false, Parameters::kVisEstimationType())));
389 removedParameters_.insert(std::make_pair(
"LccBow/InlierDistance", std::make_pair(
false, Parameters::kVisInlierDistance())));
390 removedParameters_.insert(std::make_pair(
"LccBow/MinInliers", std::make_pair(
false, Parameters::kVisMinInliers())));
391 removedParameters_.insert(std::make_pair(
"LccBow/Iterations", std::make_pair(
false, Parameters::kVisIterations())));
392 removedParameters_.insert(std::make_pair(
"LccBow/RefineIterations", std::make_pair(
false, Parameters::kVisRefineIterations())));
393 removedParameters_.insert(std::make_pair(
"LccBow/Force2D", std::make_pair(
false, Parameters::kRegForce3DoF())));
394 removedParameters_.insert(std::make_pair(
"LccBow/VarianceFromInliersCount", std::make_pair(
false,
"")));
395 removedParameters_.insert(std::make_pair(
"LccBow/PnPReprojError", std::make_pair(
false, Parameters::kVisPnPReprojError())));
396 removedParameters_.insert(std::make_pair(
"LccBow/PnPFlags", std::make_pair(
false, Parameters::kVisPnPFlags())));
397 removedParameters_.insert(std::make_pair(
"LccBow/EpipolarGeometryVar", std::make_pair(
true, Parameters::kVisEpipolarGeometryVar())));
399 removedParameters_.insert(std::make_pair(
"LccIcp/Type", std::make_pair(
false, Parameters::kRegStrategy())));
401 removedParameters_.insert(std::make_pair(
"LccIcp3/Decimation", std::make_pair(
false,
"")));
402 removedParameters_.insert(std::make_pair(
"LccIcp3/MaxDepth", std::make_pair(
false,
"")));
403 removedParameters_.insert(std::make_pair(
"LccIcp3/VoxelSize", std::make_pair(
false, Parameters::kIcpVoxelSize())));
404 removedParameters_.insert(std::make_pair(
"LccIcp3/Samples", std::make_pair(
false, Parameters::kIcpDownsamplingStep())));
405 removedParameters_.insert(std::make_pair(
"LccIcp3/MaxCorrespondenceDistance", std::make_pair(
false, Parameters::kIcpMaxCorrespondenceDistance())));
406 removedParameters_.insert(std::make_pair(
"LccIcp3/Iterations", std::make_pair(
false, Parameters::kIcpIterations())));
407 removedParameters_.insert(std::make_pair(
"LccIcp3/CorrespondenceRatio", std::make_pair(
false, Parameters::kIcpCorrespondenceRatio())));
408 removedParameters_.insert(std::make_pair(
"LccIcp3/PointToPlane", std::make_pair(
true, Parameters::kIcpPointToPlane())));
409 removedParameters_.insert(std::make_pair(
"LccIcp3/PointToPlaneNormalNeighbors", std::make_pair(
true, Parameters::kIcpPointToPlaneK())));
411 removedParameters_.insert(std::make_pair(
"LccIcp2/MaxCorrespondenceDistance", std::make_pair(
true, Parameters::kIcpMaxCorrespondenceDistance())));
412 removedParameters_.insert(std::make_pair(
"LccIcp2/Iterations", std::make_pair(
true, Parameters::kIcpIterations())));
413 removedParameters_.insert(std::make_pair(
"LccIcp2/CorrespondenceRatio", std::make_pair(
true, Parameters::kIcpCorrespondenceRatio())));
414 removedParameters_.insert(std::make_pair(
"LccIcp2/VoxelSize", std::make_pair(
true, Parameters::kIcpVoxelSize())));
416 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionByTime", std::make_pair(
true, Parameters::kRGBDProximityByTime())));
417 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionBySpace", std::make_pair(
true, Parameters::kRGBDProximityBySpace())));
418 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionTime", std::make_pair(
true, Parameters::kRGBDProximityByTime())));
419 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionSpace", std::make_pair(
true, Parameters::kRGBDProximityBySpace())));
420 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionPathScansMerged", std::make_pair(
false,
"")));
421 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionMaxGraphDepth", std::make_pair(
true, Parameters::kRGBDProximityMaxGraphDepth())));
422 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionPathFilteringRadius", std::make_pair(
true, Parameters::kRGBDProximityPathFilteringRadius())));
423 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionPathRawPosesUsed", std::make_pair(
true, Parameters::kRGBDProximityPathRawPosesUsed())));
425 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeStrategy", std::make_pair(
true, Parameters::kOptimizerStrategy())));
426 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeEpsilon", std::make_pair(
true, Parameters::kOptimizerEpsilon())));
427 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeIterations", std::make_pair(
true, Parameters::kOptimizerIterations())));
428 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeRobust", std::make_pair(
true, Parameters::kOptimizerRobust())));
429 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeSlam2D", std::make_pair(
true, Parameters::kRegForce3DoF())));
430 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeSlam2d", std::make_pair(
true, Parameters::kRegForce3DoF())));
431 removedParameters_.insert(std::make_pair(
"RGBD/OptimizeVarianceIgnored", std::make_pair(
true, Parameters::kOptimizerVarianceIgnored())));
433 removedParameters_.insert(std::make_pair(
"Stereo/WinSize", std::make_pair(
true, Parameters::kStereoWinWidth())));
436 removedParameters_.insert(std::make_pair(
"GFTT/MaxCorners", std::make_pair(
true, Parameters::kVisMaxFeatures())));
437 removedParameters_.insert(std::make_pair(
"LccBow/MaxDepth", std::make_pair(
true, Parameters::kVisMaxDepth())));
438 removedParameters_.insert(std::make_pair(
"LccReextract/LoopClosureFeatures", std::make_pair(
true, Parameters::kRGBDLoopClosureReextractFeatures())));
439 removedParameters_.insert(std::make_pair(
"Rtabmap/DetectorStrategy", std::make_pair(
true, Parameters::kKpDetectorStrategy())));
440 removedParameters_.insert(std::make_pair(
"RGBD/ScanMatchingSize", std::make_pair(
true, Parameters::kRGBDNeighborLinkRefining())));
441 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionRadius", std::make_pair(
true, Parameters::kRGBDLocalRadius())));
442 removedParameters_.insert(std::make_pair(
"RGBD/ToroIterations", std::make_pair(
true, Parameters::kOptimizerIterations())));
443 removedParameters_.insert(std::make_pair(
"Mem/RehearsedNodesKept", std::make_pair(
true, Parameters::kMemNotLinkedNodesKept())));
444 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionMaxDiffID", std::make_pair(
true, Parameters::kRGBDProximityMaxGraphDepth())));
445 removedParameters_.insert(std::make_pair(
"RGBD/PlanVirtualLinksMaxDiffID", std::make_pair(
false,
"")));
446 removedParameters_.insert(std::make_pair(
"RGBD/LocalLoopDetectionMaxDiffID", std::make_pair(
false,
"")));
447 removedParameters_.insert(std::make_pair(
"Odom/Type", std::make_pair(
true, Parameters::kVisFeatureType())));
448 removedParameters_.insert(std::make_pair(
"Odom/MaxWords", std::make_pair(
true, Parameters::kVisMaxFeatures())));
449 removedParameters_.insert(std::make_pair(
"Odom/LocalHistory", std::make_pair(
true, Parameters::kOdomF2MMaxSize())));
450 removedParameters_.insert(std::make_pair(
"Odom/NearestNeighbor", std::make_pair(
true, Parameters::kVisCorNNType())));
451 removedParameters_.insert(std::make_pair(
"Odom/NNDR", std::make_pair(
true, Parameters::kVisCorNNDR())));
467 if(
iter->second.first)
486 UERROR(
"Parameters \"%s\" doesn't exist!", paramKey.c_str());
501 UERROR(
"Parameters \"%s\" doesn't exist!", paramKey.c_str());
508 ParametersMap::const_iterator
iter = parameters.find(
key);
509 if(
iter != parameters.end())
518 ParametersMap::const_iterator
iter = parameters.find(
key);
519 if(
iter != parameters.end())
528 ParametersMap::const_iterator
iter = parameters.find(
key);
529 if(
iter != parameters.end())
538 ParametersMap::const_iterator
iter = parameters.find(
key);
539 if(
iter != parameters.end())
548 ParametersMap::const_iterator
iter = parameters.find(
key);
549 if(
iter != parameters.end())
558 ParametersMap::const_iterator
iter = parameters.find(
key);
559 if(
iter != parameters.end())
568 for(ParametersMap::iterator
iter=parametersOut.begin();
iter!=parametersOut.end(); ++
iter)
570 ParametersMap::const_iterator jter = parameters.find(
iter->first);
571 if(jter != parameters.end())
573 iter->second = jter->second;
580 return "RTAB-Map options:\n"
581 " --help Show usage.\n"
582 " --version Show version of rtabmap and its dependencies.\n"
583 " --params Show all parameters with their default value and description. \n"
584 " If a database path is set as last argument, the parameters in the \n"
585 " database will be shown in INI format.\n"
586 " --\"parameter name\" \"value\" Overwrite a specific RTAB-Map's parameter :\n"
587 " --SURF/HessianThreshold 150\n"
588 " For parameters in table format, add ',' between values :\n"
589 " --Kp/RoiRatios 0,0,0.1,0\n"
591 " --nolog Disable logger\n"
592 " --logconsole Set logger console type\n"
593 " --logfile \"path\" Set logger file type\n"
594 " --logfilea \"path\" Set logger file type with appending mode if the file already exists\n"
595 " --udebug Set logger level to debug\n"
596 " --uinfo Set logger level to info\n"
597 " --uwarn Set logger level to warn\n"
598 " --uerror Set logger level to error\n"
599 " --logtime \"bool\" Print time when logging\n"
600 " --logwhere \"bool\" Print where when logging\n"
601 " --logthread \"bool\" Print thread id when logging\n"
609 const std::map<std::string, std::pair<bool, std::string> > & removedParams =
getRemovedParameters();
610 for(
int i=0;
i<argc;++
i)
612 bool checkParameters = onlyParameters;
615 if(strcmp(
argv[
i],
"--help") == 0)
620 else if(strcmp(
argv[
i],
"--version") == 0)
622 std::string
str =
"RTAB-Map:";
625 std::cout <<
str << std::setw(spacing -
str.size()) << RTABMAP_VERSION << std::endl;
627 std::cout <<
str << std::setw(spacing -
str.size()) << PCL_VERSION_PRETTY << std::endl;
630 std::cout <<
str << std::setw(spacing -
str.size()) << vtkVersion::GetVTKVersion() << std::endl;
632 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
635 std::cout <<
str << std::setw(spacing -
str.size()) << CV_VERSION << std::endl;
636 #if CV_MAJOR_VERSION >= 3
637 str =
"With OpenCV xfeatures2d:";
638 #ifdef HAVE_OPENCV_XFEATURES2D
639 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
641 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
644 str =
"With OpenCV nonfree:";
645 #ifdef RTABMAP_NONFREE
646 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
648 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
650 str =
"With ORB OcTree:";
651 #ifdef RTABMAP_ORB_OCTREE
652 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
654 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
656 str =
"With SuperPoint Torch:";
658 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
660 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
662 str =
"With Python3:";
663 #ifdef RTABMAP_PYTHON
664 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
666 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
668 str =
"With FastCV:";
669 #ifdef RTABMAP_FASTCV
670 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
672 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
674 str =
"With OpenGV:";
675 #ifdef RTABMAP_OPENGV
676 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
678 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
680 str =
"With Madgwick:";
681 #ifdef RTABMAP_MADGWICK
682 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
684 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
688 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
690 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
692 str =
"With libLAS:";
693 #ifdef RTABMAP_LIBLAS
694 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
696 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
698 str =
"With CudaSift:";
699 #ifdef RTABMAP_CUDASIFT
700 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
702 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
706 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
708 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
712 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
714 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
718 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
720 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
722 str =
"With Vertigo:";
723 #ifdef RTABMAP_VERTIGO
724 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
726 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
730 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
732 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
736 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
738 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
740 str =
"With OpenNI:";
741 #ifdef RTABMAP_OPENNI
742 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
744 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
746 str =
"With OpenNI2:";
747 #ifdef RTABMAP_OPENNI2
748 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
750 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
752 str =
"With Freenect:";
753 #ifdef RTABMAP_FREENECT
754 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
756 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
758 str =
"With Freenect2:";
759 #ifdef RTABMAP_FREENECT2
760 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
762 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
766 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
768 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
772 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
774 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
776 str =
"With DC1394:";
777 #ifdef RTABMAP_DC1394
778 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
780 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
782 str =
"With FlyCapture2:";
783 #ifdef RTABMAP_FLYCAPTURE2
784 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
786 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
790 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
792 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
794 str =
"With ZED Open Capture:";
796 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
798 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
800 str =
"With RealSense:";
801 #ifdef RTABMAP_REALSENSE
802 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
804 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
806 str =
"With RealSense SLAM:";
807 #ifdef RTABMAP_REALSENSE_SLAM
808 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
810 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
812 str =
"With RealSense2:";
813 #ifdef RTABMAP_REALSENSE2
814 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
816 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
818 str =
"With MYNT EYE S:";
819 #ifdef RTABMAP_MYNTEYE
820 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
822 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
824 str =
"With DepthAI:";
825 #ifdef RTABMAP_DEPTHAI
826 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
828 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
830 str =
"With XVisio SDK:";
832 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
834 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
836 str =
"With libpointmatcher:";
837 #ifdef RTABMAP_POINTMATCHER
838 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
840 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
842 str =
"With CCCoreLib:";
843 #ifdef RTABMAP_CCCORELIB
844 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
846 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
848 str =
"With Open3D:";
849 #ifdef RTABMAP_OPEN3D
850 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
852 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
854 str =
"With OctoMap:";
855 #ifdef RTABMAP_OCTOMAP
856 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
858 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
860 str =
"With GridMap:";
861 #ifdef RTABMAP_GRIDMAP
862 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
864 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
866 str =
"With cpu-tsdf:";
867 #ifdef RTABMAP_CPUTSDF
868 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
870 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
872 str =
"With open chisel:";
873 #ifdef RTABMAP_OPENCHISEL
874 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
876 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
878 str =
"With Alice Vision:";
879 #ifdef RTABMAP_ALICE_VISION
880 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
882 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
886 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
888 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
892 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
894 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
898 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
900 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
904 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
906 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
910 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
912 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
914 #if RTABMAP_ORB_SLAM == 3
915 str =
"With ORB_SLAM3:";
916 #elif RTABMAP_ORB_SLAM == 2
917 str =
"With ORB_SLAM2:";
919 str =
"With ORB_SLAM:";
921 #ifdef RTABMAP_ORB_SLAM
922 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
924 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
928 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
930 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
932 str =
"With MSCKF_VIO:";
933 #ifdef RTABMAP_MSCKF_VIO
934 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
936 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
938 str =
"With VINS-Fusion:";
940 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
942 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
944 str =
"With OpenVINS:";
945 #ifdef RTABMAP_OPENVINS
946 std::cout <<
str << std::setw(spacing -
str.size()) <<
"true" << std::endl;
948 std::cout <<
str << std::setw(spacing -
str.size()) <<
"false" << std::endl;
952 else if(strcmp(
argv[
i],
"--nolog") == 0)
956 else if(strcmp(
argv[
i],
"--logconsole") == 0)
960 else if(strcmp(
argv[
i],
"--logfile") == 0)
969 UERROR(
"\"--logfile\" argument requires following file path");
972 else if(strcmp(
argv[
i],
"--logfilea") == 0)
981 UERROR(
"\"--logfilea\" argument requires following file path");
984 else if(strcmp(
argv[
i],
"--udebug") == 0)
988 else if(strcmp(
argv[
i],
"--uinfo") == 0)
992 else if(strcmp(
argv[
i],
"--uwarn") == 0)
996 else if(strcmp(
argv[
i],
"--uerror") == 0)
1000 else if(strcmp(
argv[
i],
"--ulogtime") == 0)
1009 UERROR(
"\"--ulogtime\" argument requires a following boolean value");
1012 else if(strcmp(
argv[
i],
"--ulogwhere") == 0)
1021 UERROR(
"\"--ulogwhere\" argument requires a following boolean value");
1024 else if(strcmp(
argv[
i],
"--ulogthread") == 0)
1033 UERROR(
"\"--ulogthread\" argument requires a following boolean value");
1038 checkParameters =
true;
1044 if(strcmp(
argv[
i],
"--params") == 0)
1049 std::string dbName =
argv[argc - 1];
1057 if (!dbParameters.empty())
1059 std::cout <<
"[Core]" << std::endl;
1060 std::cout <<
"Version = " << RTABMAP_VERSION << std::endl;
1061 for (ParametersMap::const_iterator
iter = dbParameters.begin();
iter != dbParameters.end(); ++
iter)
1063 std::string
key =
iter->first;
1066 std::string
value =
iter->second.c_str();
1069 std::cout <<
key <<
" = " <<
value << std::endl;
1083 for(rtabmap::ParametersMap::const_iterator
iter=parameters.begin();
iter!=parameters.end(); ++
iter)
1085 bool ignore =
false;
1087 std::string group =
uSplit(
iter->first,
'/').front();
1088 #ifndef RTABMAP_GTSAM
1089 if(group.compare(
"GTSAM") == 0)
1095 if(group.compare(
"g2o") == 0)
1100 #ifndef RTABMAP_FOVIS
1101 if(group.compare(
"OdomFovis") == 0)
1106 #ifndef RTABMAP_VISO2
1107 if(group.compare(
"OdomViso2") == 0)
1112 #ifndef RTABMAP_ORBSLAM2
1113 if(group.compare(
"OdomORBSLAM2") == 0)
1118 #ifndef RTABMAP_OKVIS
1119 if(group.compare(
"OdomOKVIS") == 0)
1124 #if not defined(RTABMAP_LOAM) and not defined(RTABMAP_FLOAM)
1125 if(group.compare(
"OdomLOAM") == 0)
1130 #ifndef RTABMAP_MSCKF_VIO
1131 if(group.compare(
"OdomMSCKF") == 0)
1138 std::string
str =
"Param: " +
iter->first +
" = \"" +
iter->second +
"\"";
1141 std::setw(60 -
str.size()) <<
1153 ParametersMap::const_iterator
iter = parameters.find(
key);
1154 if(
iter != parameters.end())
1160 UINFO(
"Parsed parameter \"%s\"=\"%s\"",
iter->first.c_str(),
argv[
i]);
1166 std::map<std::string, std::pair<bool, std::string> >::const_iterator jter = removedParams.find(
key);
1167 if(jter!=removedParams.end())
1169 if(jter->second.first)
1178 key = jter->second.second;
1179 UWARN(
"Parameter migration from \"%s\" to \"%s\" (value=%s).",
1180 jter->first.c_str(), jter->second.second.c_str(),
value.c_str());
1186 UERROR(
"Value missing for argument \"%s\"",
argv[
i-1]);
1189 else if(jter->second.second.empty())
1191 UERROR(
"Parameter \"%s\" doesn't exist anymore.", jter->first.c_str());
1195 UERROR(
"Parameter \"%s\" doesn't exist anymore, check this similar parameter \"%s\".", jter->first.c_str(), jter->second.second.c_str());
1210 for(CSimpleIniA::TKeyVal::const_iterator
iter=keyValMap->begin();
iter!=keyValMap->end(); ++
iter)
1212 std::string
key = (*iter).first.pItem;
1213 if(
key.compare(
"Version") == 0)
1221 if(configFilePath.find(
".rtabmap") != std::string::npos)
1223 UWARN(
"Version in the config file \"%s\" is more recent (\"%s\") than "
1224 "current RTAB-Map version used (\"%s\"). The config file will be upgraded "
1226 configFilePath.c_str(),
1232 UERROR(
"Version in the config file \"%s\" is more recent (\"%s\") than "
1233 "current RTAB-Map version used (\"%s\"). New parameters (if there are some) will "
1235 configFilePath.c_str(),
1250 if(oldIter->second.first)
1252 if(parameters.find(oldIter->second.second) == parameters.end())
1254 key = oldIter->second.second;
1255 UINFO(
"Parameter migration from \"%s\" to \"%s\" (value=%s, default=%s).",
1259 else if(oldIter->second.second.empty())
1261 UWARN(
"Parameter \"%s\" doesn't exist anymore.",
1262 oldIter->first.c_str());
1264 else if(parameters.find(oldIter->second.second) == parameters.end())
1266 UWARN(
"Parameter \"%s\" (value=%s) doesn't exist anymore, you may want to use this similar parameter \"%s (default=%s): %s\".",
1284 ULOGGER_WARN(
"Section \"Core\" in %s doesn't exist... "
1285 "Ignore this warning if the ini file does not exist yet. "
1286 "The ini file will be automatically created when rtabmap will close.", configFilePath.c_str());
1295 readINIImpl(ini, configFile, parameters, modifiedOnly);
1311 ini.
SetValue(
"Core",
"Version", RTABMAP_VERSION,
NULL,
true);
1313 for(ParametersMap::const_iterator
iter=parameters.begin();
iter!=parameters.end(); ++
iter)
1315 std::string
key =
iter->first;
1318 std::string
value =
iter->second.c_str();
1327 for(std::map<std::string, std::pair<bool, std::string> >::const_iterator
iter =
removedParameters_.begin();
1331 std::string
key =
iter->first;
1336 if(ini.
Delete(
"Core",
key.c_str(),
true))
1338 if(
iter->second.first && parameters.find(
iter->second.second) != parameters.end())
1340 UWARN(
"Removed deprecated parameter %s=%s (replaced by %s=%s) from \"%s\".",
iter->first.c_str(),
value.c_str(),
iter->second.second.c_str(), parameters.at(
iter->second.second).c_str(), configFile.c_str());
1344 UWARN(
"Removed deprecated parameter %s=%s from \"%s\".",
iter->first.c_str(),
value.c_str(), configFile.c_str());