31#include "rtabmap/core/rtabmap_core_export.h"
33#include "rtabmap/core/Parameters.h"
34#include "rtabmap/core/SensorData.h"
35#include "rtabmap/core/Statistics.h"
36#include "rtabmap/core/Link.h"
37#include "rtabmap/core/ProgressState.h"
38#include "rtabmap/core/Graph.h"
40#include <opencv2/core/core.hpp>
48class EpipolarGeometry;
226 const cv::Mat & odomCovariance = cv::Mat::eye(6,6,CV_64FC1),
227 const std::vector<float> & odomVelocity = std::vector<float>(),
228 const std::map<std::string, float> & externalStats = std::map<std::string, float>());
239 float odomLinearVariance,
240 float odomAngularVariance,
241 const std::vector<float> & odomVelocity = std::vector<float>(),
242 const std::map<std::string, float> & externalStats = std::map<std::string, float>());
254 const cv::Mat & image,
255 int id=0,
const std::map<std::string, float> & externalStats = std::map<std::string, float>());
271 void init(
const ParametersMap & parameters,
const std::string & databasePath =
"",
bool loadDatabaseParameters =
false);
282 void init(
const std::string & configFile =
"",
const std::string & databasePath =
"",
bool loadDatabaseParameters =
false);
294 void close(
bool databaseSaved =
true,
const std::string & ouputDatabasePath =
"");
504 const std::string & path,
568 void setOptimizedPoses(
const std::map<int, Transform> & poses,
const std::multimap<int, Link> & constraints);
576 Signature getSignatureCopy(
int id,
bool images,
bool scan,
bool userData,
bool occupancyGrid,
bool withWords,
bool withGlobalDescriptors)
const;
582 void get3DMap(std::map<int, Signature> & signatures,
583 std::map<int, Transform> & poses,
584 std::multimap<int, Link> & constraints,
604 std::multimap<int, Link> & constraints,
607 std::map<int, Signature> * signatures = 0,
608 bool withImages =
false,
609 bool withScan =
false,
610 bool withUserData =
false,
611 bool withGrid =
false,
612 bool withWords =
true,
613 bool withGlobalDescriptors =
true)
const;
635 std::map<int, Transform>
getNodesInRadius(
int nodeId,
float radius,
int k=0, std::map<int, float> * distsSqr=0);
664 float clusterRadiusMax = 0.5f,
665 float clusterAngle = M_PI/6.0f,
667 bool intraSession =
true,
668 bool interSession =
true,
670 float clusterRadiusMin = 0.0f,
671 int toFromMapId = -1);
685 int optimizerType = 1 ,
686 bool rematchFeatures =
true,
688 float pixelVariance = 0.0f);
698 const std::map<int, Transform> & mapPoses,
704 bool filterScans =
false);
805 const std::vector<std::pair<int, Transform> > &
getPath()
const {
return _path;}
843 std::map<int, Transform>
getForwardWMPoses(
int fromId,
int maxNearestNeighbors,
float radius,
int maxDiffID)
const;
879 std::map<int, std::map<int, Transform> >
getPaths(
const std::map<int, Transform> & poses,
const Transform & target,
int maxGraphDepth = 0)
const;
913 void optimizeCurrentMap(
int id,
915 std::map<int, Transform> & optimizedPoses,
916 cv::Mat & covariance,
917 std::multimap<int, Link> * constraints = 0,
919 int * iterationsDone = 0)
const;
920 std::map<int, Transform> optimizeGraph(
922 const std::set<int> & ids,
923 const std::map<int, Transform> & guessPoses,
925 cv::Mat & covariance,
926 std::multimap<int, Link> * constraints = 0,
928 int * iterationsDone = 0)
const;
929 std::list<std::pair<int, int> > repairGraph(
931 std::map<int, Transform> & poses,
932 std::multimap<int, Link> & constraints,
933 double & optimizationError,
934 int & optimizationIterations,
935 cv::Mat & optimizationCovariance);
936 void updateGoalIndex();
937 bool computePath(
int targetNode, std::map<int, Transform> nodes,
const std::multimap<int, rtabmap::Link> & constraints);
939 void createGlobalScanMap();
941 void setupLogFiles(
bool overwrite =
false);
942 void flushStatisticLogs();
947 bool _publishLastSignatureData;
949 bool _publishLikelihood;
950 bool _publishRAMUsage;
953 float _maxTimeAllowed;
954 unsigned int _maxMemoryAllowed;
957 float _aggressiveLoopThr;
958 int _virtualPlaceLikelihoodRatio;
959 float _maxLoopClosureDistance;
960 bool _verifyLoopClosureHypothesis;
961 unsigned int _maxRetrieved;
962 unsigned int _maxLocalRetrieved;
963 unsigned int _maxRepublished;
965 bool _statisticLogsBufferedInRAM;
966 bool _statisticLogged;
967 bool _statisticLoggedHeaders;
969 float _rgbdLinearUpdate;
970 float _rgbdAngularUpdate;
971 float _rgbdLinearSpeedUpdate;
972 float _rgbdAngularSpeedUpdate;
973 float _newMapOdomChangeDistance;
974 bool _neighborLinkRefining;
975 bool _proximityByTime;
976 bool _proximityBySpace;
977 bool _scanMatchingIdsSavedInLinks;
978 bool _loopClosureIdentityGuess;
980 float _localImmunizationRatio;
981 int _proximityMaxGraphDepth;
982 int _proximityMaxPaths;
983 int _proximityMaxNeighbors;
984 float _proximityFilteringRadius;
985 bool _proximityRawPosesUsed;
986 float _proximityAngle;
987 bool _proximityOdomGuess;
988 double _proximityMergedScanCovFactor;
989 std::string _databasePath;
990 bool _optimizeFromGraphEnd;
991 float _optimizationMaxError;
992 float _optimizationMaxErrorRepairRadius;
993 bool _startNewMapOnLoopClosure;
994 bool _startNewMapOnGoodSignature;
995 float _goalReachedRadius;
996 bool _goalsSavedInUserData;
997 int _pathStuckIterations;
998 float _pathLinearVelocity;
999 float _pathAngularVelocity;
1000 bool _forceOdom3doF;
1001 bool _restartAtOrigin;
1002 bool _loopCovLimited;
1004 int _maxOdomCacheSize;
1005 bool _localizationSmoothing;
1006 double _localizationPriorInf;
1007 bool _localizationSecondTryWithoutProximityLinks;
1008 bool _createGlobalScanMap;
1009 float _markerPriorsLinearVariance;
1010 float _markerPriorsAngularVariance;
1012 std::pair<int, float> _loopClosureHypothesis;
1013 std::pair<int, float> _highestHypothesis;
1014 double _lastProcessTime;
1015 bool _someNodesHaveBeenTransferred;
1016 float _distanceTravelled;
1017 float _distanceTravelledSinceLastLocalization;
1018 bool _optimizeFromGraphEndChanged;
1031 std::list<std::string> _bufferedLogsF;
1032 std::list<std::string> _bufferedLogsI;
1038 std::map<int, Transform> _optimizedPoses;
1039 std::multimap<int, Link> _constraints;
1043 int _lastLocalizationNodeId;
1044 cv::Mat _localizationCovariance;
1045 std::map<int, std::pair<cv::Point3d, Transform> > _gpsGeocentricCache;
1046 bool _currentSessionHasGPS;
1048 std::map<int, Transform> _globalScanMapPoses;
1049 std::map<int, Transform> _odomCachePoses;
1050 std::multimap<int, Link> _odomCacheConstraints;
1051 std::map<int, Transform> _markerPriors;
1052 std::pair<int, int> _lastRejectedLoopClosureIds;
1054 std::set<int> _nodesToRepublish;
1058 std::vector<std::pair<int,Transform> > _path;
1059 std::set<unsigned int> _pathUnreachableNodes;
1060 unsigned int _pathCurrentIndex;
1061 unsigned int _pathGoalIndex;
1063 int _pathStuckCount;
1064 float _pathStuckDistance;
1066 bool _dummyDictionary;
Recursive Bayesian filter for loop-closure hypothesis estimation in RTAB-Map.
Represents 2D or 3D laser scan data with support for multiple point data formats.
Directed constraint between two nodes in RTAB-Map's pose graph.
Three-tiered memory management (STM, WM, LTM) for RTAB-Map.
Abstract base for pose-graph and bundle-adjustment optimizers.
Top-level RTAB-Map SLAM pipeline (mapping, localization and loop closure).
bool setUserData(int id, const cv::Mat &data)
Attaches user data to signature id, compressing it on the fly if needed.
const Memory * getMemory() const
void addNodesToRepublish(const std::vector< int > &ids)
Marks node ids whose data should be re-emitted on the next process().
bool computePath(const Transform &targetPose, float tolerance=-1.0f)
Plans a path in the current optimized map toward a metric goal pose.
std::map< int, Transform > getNodesInRadius(const Transform &pose, float radius, int k=0, std::map< int, float > *distsSqr=0)
Returns optimized poses within a metric radius of pose.
void setWorkingDirectory(std::string path)
Sets the working directory used for dumps, logs and temporary files.
void init(const std::string &configFile="", const std::string &databasePath="", bool loadDatabaseParameters=false)
Initializes Rtabmap from a configuration file and a database.
int getLoopClosureId() const
const Transform & getLastLocalizationPose() const
std::map< int, int > getWeights() const
bool process(const cv::Mat &image, int id=0, const std::map< std::string, float > &externalStats=std::map< std::string, float >())
Appearance-only convenience overload (loop-closure detection without odometry).
void dumpData() const
Dumps the Memory state (signatures, words, dictionary) to the working directory.
void generateDOTGraph(const std::string &path, int id=0, int margin=5)
Writes a Graphviz DOT file of the pose graph.
void getGraph(std::map< int, Transform > &poses, std::multimap< int, Link > &constraints, bool optimized, bool global, std::map< int, Signature > *signatures=0, bool withImages=false, bool withScan=false, bool withUserData=false, bool withGrid=false, bool withWords=true, bool withGlobalDescriptors=true) const
Extracts a full snapshot of the current pose graph.
std::vector< int > getPathNextNodes() const
int triggerNewMap()
Starts a new map session (next process() will create a fresh map id).
const std::multimap< int, Link > & getLocalConstraints() const
void setDummyDictionary(bool enabled=true)
Loads the visual word dictionary as ids only, without descriptors.
float getHighestHypothesisValue() const
void clearPath(int status)
Clears the current path and sets its terminal status.
bool isInSTM(int locationId) const
void parseParameters(const ParametersMap ¶meters)
Re-parses parameters and propagates them to owned sub-objects (Memory, BayesFilter,...
const Statistics & getStatistics() const
void close(bool databaseSaved=true, const std::string &ouputDatabasePath="")
Closes Rtabmap and releases the underlying Memory.
bool isIDsGenerated() const
int getPathCurrentGoalId() const
const std::vector< std::pair< int, Transform > > & getPath() const
int detectMoreLoopClosures(float clusterRadiusMax=0.5f, float clusterAngle=M_PI/6.0f, int iterations=1, bool intraSession=true, bool interSession=true, const ProgressState *state=0, float clusterRadiusMin=0.0f, int toFromMapId=-1)
Post-processing: searches for additional loop closures over the existing graph.
float getGoalReachedRadius() const
const std::string & getWorkingDir() const
int refineLinks()
Re-runs registration on every link of the current graph and updates the ones that converge.
void setMemoryThreshold(int maxMemoryAllowed)
Sets the maximum number of signatures kept in WM (0 = unbounded).
float getLocalRadius() const
void init(const ParametersMap ¶meters, const std::string &databasePath="", bool loadDatabaseParameters=false)
Initializes Rtabmap with parameters and a database.
Signature getSignatureCopy(int id, bool images, bool scan, bool userData, bool occupancyGrid, bool withWords, bool withGlobalDescriptors) const
Returns a copy of signature id with optional payloads attached.
unsigned int getPathCurrentGoalIndex() const
void setOptimizedPoses(const std::map< int, Transform > &poses, const std::multimap< int, Link > &constraints)
Replaces the current optimized poses and constraints with externally provided ones.
Transform getMapCorrection() const
std::set< int > getSTM() const
void setTimeThreshold(float maxTimeAllowed)
Sets the per-iteration time budget (ms).
std::map< int, Transform > getForwardWMPoses(int fromId, int maxNearestNeighbors, float radius, int maxDiffID) const
Returns optimized poses of WM nodes located in front of fromId.
int getMemoryThreshold() const
double getLastProcessTime() const
bool process(const SensorData &data, Transform odomPose, float odomLinearVariance, float odomAngularVariance, const std::vector< float > &odomVelocity=std::vector< float >(), const std::map< std::string, float > &externalStats=std::map< std::string, float >())
Convenience overload: builds a diagonal covariance from scalar variances.
int getLastLocationId() const
unsigned int getPathCurrentIndex() const
void setInitialPose(const Transform &initialPose)
Sets the localization prior pose used to seed the next process() call (localization mode only).
const ParametersMap & getParameters() const
std::map< int, Transform > getNodesInRadius(int nodeId, float radius, int k=0, std::map< int, float > *distsSqr=0)
Returns optimized poses within a metric radius of node nodeId.
void adjustLikelihood(std::map< int, float > &likelihood) const
Applies the standard RTAB-Map likelihood adjustment.
void rejectLastLoopClosure()
Removes the loop-closure link added at the last process() iteration.
bool globalBundleAdjustment(int optimizerType=1, bool rematchFeatures=true, int iterations=0, float pixelVariance=0.0f)
Runs a global bundle adjustment over the optimized graph.
int getHighestHypothesisId() const
int getTotalMemSize() const
bool computePath(int targetNode, bool global)
Plans a path from the current location to node targetNode.
Transform getPose(int locationId) const
int cleanupLocalGrids(const std::map< int, Transform > &mapPoses, const cv::Mat &map, float xMin, float yMin, float cellSize, int cropRadius=1, bool filterScans=false)
Filters spurious obstacles from every node's local grid using a reference 2D map.
void dumpPrediction() const
Dumps the Bayes-filter prediction matrix to a file in the working directory.
std::map< int, std::map< int, Transform > > getPaths(const std::map< int, Transform > &poses, const Transform &target, int maxGraphDepth=0) const
Segments a set of optimized poses into paths connected by neighbor links.
bool process(const SensorData &data, Transform odomPose, const cv::Mat &odomCovariance=cv::Mat::eye(6, 6, CV_64FC1), const std::vector< float > &odomVelocity=std::vector< float >(), const std::map< std::string, float > &externalStats=std::map< std::string, float >())
Main RTAB-Map iteration: ingests one sensor frame and updates the map.
float getLoopClosureValue() const
std::list< int > getWM() const
RTABMAP_DEPRECATED void get3DMap(std::map< int, Signature > &signatures, std::map< int, Transform > &poses, std::multimap< int, Link > &constraints, bool optimized, bool global) const
Deprecated: use getGraph() instead with withImages=true, withScan=true, withUserData=true and withGri...
const std::map< int, Transform > & getLocalOptimizedPoses() const
const Transform & getPathTransformToGoal() const
void deleteLastLocation()
Deletes the most recent (non-intermediate) location from the map.
cv::Mat getInformation(const cv::Mat &covariance) const
Converts an odometry covariance into an information matrix, clipping by Memory::getOdomMaxInf() when ...
bool addLink(const Link &link)
Adds an external link to the map.
void exportPoses(const std::string &path, bool optimized, bool global, int format)
Exports the current pose graph to a text file.
void resetMemory()
Clears all in-memory state and resets the database.
bool labelLocation(int id, const std::string &label)
Assigns or clears a label on signature id.
float getTimeThreshold() const
std::vector< std::pair< int, Transform > > getPathNextPoses() const
VhStrategy
Loop-closure verification strategy.
@ kVhEpipolar
Epipolar geometry verification (mostly historical, RGB-only mode).
@ kVhNone
No verification: the highest hypothesis above threshold is accepted.
int getPathStatus() const
Container class for all sensor data captured at a specific time.
Represents a node in RTAB-Map's pose graph.
Collects and manages runtime statistics for RTAB-Map.
std::map< std::string, std::string > ParametersMap
Parameter keys mapped to their values, as used by every configurable class (see Parameters).
Largest pose-graph constraint violations after optimization.