31#include "rtabmap/core/rtabmap_core_export.h"
33#include "rtabmap/utilite/UEventsHandler.h"
34#include "rtabmap/core/Parameters.h"
35#include "rtabmap/core/SensorData.h"
36#include "rtabmap/core/Link.h"
37#include "rtabmap/core/Features2d.h"
43#include <opencv2/core/core.hpp>
44#if CV_MAJOR_VERSION < 5
45#include <opencv2/features2d/features2d.hpp>
47#include <opencv2/features.hpp>
49#include <pcl/pcl_config.h>
60class RegistrationInfo;
66class GlobalDescriptorExtractor;
159 const cv::Mat & covariance,
160 const std::vector<float> & velocity = std::vector<float>(),
172 bool init(
const std::string & dbUrl,
173 bool dbOverwritten =
false,
175 bool postInitClosingEvents =
false);
186 void close(
bool databaseSaved =
true,
bool postInitClosingEvents =
false,
const std::string & ouputDatabasePath =
"");
198 const std::list<int> & ids);
238 std::list<int>
forget(
const std::set<int> & ignoredIds = std::set<int>());
265 void save2DMap(
const cv::Mat & map,
float xMin,
float yMin,
float cellSize)
const;
267 cv::Mat
load2DMap(
float & xMin,
float & yMin,
float & cellSize)
const;
276 const cv::Mat & cloud,
277 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons = std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > >(),
278#
if PCL_VERSION_COMPARE(>=, 1, 8, 0)
279 const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(),
281 const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(),
283 const cv::Mat & textures = cv::Mat())
const;
286 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons = 0,
287#
if PCL_VERSION_COMPARE(>=, 1, 8, 0)
288 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
290 std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
292 cv::Mat * textures = 0)
const;
329 int maxCheckedInDatabase = -1,
330 bool incrementMarginOnLoop =
false,
331 bool ignoreLoopIds =
false,
332 bool ignoreIntermediateNodes =
false,
333 bool ignoreLocalSpaceLoopIds =
false,
334 const std::set<int> & nodesSet = std::set<int>(),
335 double * dbAccessTime = 0)
const;
347 const std::map<int, Transform> & optimizedPoses,
348 int maxGraphDepth)
const;
365 void deleteLocation(
int locationId, std::list<int> * deletedWords = 0,
bool keepLinkedInDb =
false);
371 void removeRawData(
int id,
bool image =
true,
bool scan =
true,
bool userData =
true,
bool occupancyGrid =
true);
388 int reduceNode(
int id,
float maxDistance = 0.0f,
bool keepLinkedInDb =
false,
int direction = 0);
411 const std::set<int> &
getStMem()
const {
return _stMem;}
416 bool lookInDatabase =
false)
const;
419 bool lookInDatabase =
false)
const;
427 bool lookInDatabase =
false,
428 bool withLandmarks =
false)
const;
430 std::multimap<int, Link>
getAllLinks(
bool lookInDatabase,
bool ignoreNullLinks =
true,
bool withLandmarks =
false)
const;
456 const std::map<int, std::string> &
getAllLabels()
const {
return _labels;}
487 int getMapId(
int id,
bool lookInDatabase =
false)
const;
519 void getGPS(
int id,
GPS & gps,
Transform & offsetENU,
bool lookInDatabase,
int maxGraphDepth = 0)
const;
543 std::vector<float> & velocity,
546 bool lookInDatabase =
false)
const;
559 std::multimap<int, int> & words,
560 std::vector<cv::KeyPoint> & wordsKpts,
561 std::vector<cv::Point3f> & words3,
562 cv::Mat & wordsDescriptors,
563 std::vector<GlobalDescriptor> & globalDescriptors)
const;
566 std::vector<CameraModel> & models,
567 std::vector<StereoCameraModel> & stereoModels)
const;
614 bool isReadOnly()
const {
return !_incrementalMemory && _localizationReadOnly;}
623 bool isInSTM(
int signatureId)
const {
return _stMem.find(signatureId) != _stMem.end();}
625 bool isInWM(
int signatureId)
const {
return _workingMem.find(signatureId) != _workingMem.end();}
627 bool isInLTM(
int signatureId)
const {
return !this->isInSTM(signatureId) && !this->isInWM(signatureId);}
687 void generateGraph(
const std::string & fileName,
const std::set<int> & ids = std::set<int>());
725 const std::map<int, Transform> & poses,
731 bool filterScans =
false);
748 const std::set<int> & ids,
749 std::map<int, Transform> & poses,
750 std::multimap<int, Link> & links,
751 bool lookInDatabase =
false,
752 bool landmarksAdded =
false);
782 const std::map<int, Transform> & poses,
787 void addSignatureToStm(
Signature * signature,
const cv::Mat & covariance);
789 void loadDataFromDb(
bool postInitClosingEvents);
790 void saveFlannIndex(
bool postInitClosingEvents);
791 void moveToTrash(
Signature * s,
bool keepLinkedToGraph =
true, std::list<int> * deletedWords = 0);
793 void moveSignatureToWMFromSTM(
int id,
int * reducedTo = 0);
794 void addSignatureToWmFromLTM(
Signature * signature);
796 std::list<Signature *> getRemovableSignatures(
int count,
797 const std::set<int> & ignoredIds = std::set<int>());
800 bool rehearsalMerge(
int oldId,
int newId);
801 bool canBeReduced(
const Link & link,
float maxDistance,
int direction);
803 const std::map<int, Signature*> & getSignatures()
const {
return _signatures;}
812 void disableWordsRef(
int signatureId);
813 void enableWordsRef(
const std::list<int> & signatureIds);
814 void cleanUnusedWords();
815 int getNi(
int signatureId)
const;
824 float _similarityThreshold;
826 bool _rawDescriptorsKept;
827 bool _loadVisualLocalFeaturesOnInit;
828 bool _saveDepth16Format;
829 bool _notLinkedNodesKeptInDb;
830 bool _saveIntermediateNodeData;
831 std::string _rgbCompressionFormat;
832 std::string _depthCompressionFormat;
833 bool _incrementalMemory;
834 bool _localizationReadOnly;
835 bool _localizationDataSaved;
836 bool _flannIndexSaved;
839 float _recentWmRatio;
840 bool _transferSortingByWeightId;
841 bool _idUpdatedToNewOneRehearsal;
843 bool _badSignaturesIgnored;
844 bool _mapLabelsAdded;
846 float _maskFloorThreshold;
847 bool _stereoFromMotion;
848 unsigned int _imagePreDecimation;
849 unsigned int _imagePostDecimation;
850 bool _compressionParallelized;
851 float _laserScanDownsampleStepSize;
852 float _laserScanVoxelSize;
853 int _laserScanNormalK;
854 float _laserScanNormalRadius;
855 float _laserScanGroundNormalsUp;
856 bool _reextractLoopClosureFeatures;
857 bool _localBundleOnLoopClosure;
859 float _rehearsalMaxDistance;
860 float _rehearsalMaxAngle;
861 bool _rehearsalWeightIgnoredWhileMoving;
862 bool _useOdometryFeatures;
863 bool _useOdometryGravity;
864 bool _rotateImagesUpsideUp;
865 bool _createOccupancyGrid;
868 bool _imagesAlreadyRectified;
869 bool _rectifyOnlyFeatures;
870 bool _covOffDiagonalIgnored;
872 float _markerLinVariance;
873 float _markerAngVariance;
874 bool _markerOrientationIgnored;
879 int _lastGlobalLoopClosureId;
882 int _signaturesAdded;
883 int _workingMemIntermediateNodesCount;
884 int _stMemIntermediateNodesCount;
886 bool _receivingOdometryFeatures;
888 std::vector<CameraModel> _rectCameraModels;
889 std::vector<StereoCameraModel> _rectStereoCameraModels;
890 std::vector<double> _odomMaxInf;
892 std::map<int, Signature *> _signatures;
893 std::set<int> _stMem;
894 std::map<int, double> _workingMem;
895 std::map<int, Transform> _groundTruths;
896 std::map<int, std::string> _labels;
897 std::map<int, std::set<int> > _landmarksIndex;
898 std::map<int, float> _landmarksSize;
904 bool _tfIdfLikelihoodUsed;
917 bool _dummyDictionary;
Wrappers of STL for convenient functions.
Abstract database driver for RTAB-Map maps (signatures, links, words, statistics).
Abstract 2D feature detector and descriptor extractor for visual SLAM.
WGS84 GPS fix attached to a sensor sample or graph node.
Directed constraint between two nodes in RTAB-Map's pose graph.
Builds per-node local occupancy grids from laser scans or depth clouds.
Three-tiered memory management (STM, WM, LTM) for RTAB-Map.
const std::set< int > & getStMem() const
const std::map< int, std::string > & getAllLabels() const
void emptyTrash()
Forces the database driver to flush any queued signature/word saves.
cv::Mat loadOptimizedMesh(std::vector< std::vector< std::vector< RTABMAP_PCL_INDEX > > > *polygons=0, std::vector< std::vector< Eigen::Vector2f > > *texCoords=0, cv::Mat *textures=0) const
Loads the optimized mesh previously written by saveOptimizedMesh().
std::map< int, float > getNeighborsIdRadius(int signatureId, float radius, const std::map< int, Transform > &optimizedPoses, int maxGraphDepth) const
Returns neighbor ids within a Euclidean radius using optimized poses.
static const int kIdStart
First valid signature id assigned to a new signature (positive integer).
const Signature * getSignature(int id) const
std::multimap< int, Link > getNeighborLinks(int signatureId, bool lookInDatabase=false) const
Returns neighbor (sequential) links of signatureId; lookInDatabase also checks LTM.
bool isBinDataKept() const
bool isInSTM(int signatureId) const
virtual void dumpSignatures(const char *fileNameSign, bool words3D) const
Dumps signatures' word ids (and 3D positions if words3D) to fileNameSign.
bool allNodesInWM() const
SensorData getNodeData(int locationId, bool images, bool scan, bool userData, bool occupancyGrid) const
Loads sensor data of locationId from WM or LTM.
int getMapId(int id, bool lookInDatabase=false) const
bool isInLTM(int signatureId) const
Memory(const ParametersMap ¶meters=ParametersMap())
Constructs a Memory instance with the given parameters.
Transform computeTransform(int fromId, int toId, Transform guess, RegistrationInfo *info=0, bool useKnownCorrespondencesIfPossible=false)
Convenience overload: loads signatures by id and forwards to the Signature variant.
void deleteLocation(int locationId, std::list< int > *deletedWords=0, bool keepLinkedInDb=false)
Removes locationId from WM/STM and the database.
void joinTrashThread()
Blocks until the asynchronous database write thread has finished pending work.
bool isLocalizationDataSaved() const
Transform computeIcpTransformMulti(int newId, int oldId, const std::map< int, Transform > &poses, RegistrationInfo *info=0)
ICP registration of one node against an assembled cloud from multiple neighbors.
bool update(const SensorData &data, Statistics *stats=0)
Adds a sensor observation to the map (overload without odometry pose).
int getStMemIntermediateNodesCount() const
void removeLink(int idA, int idB)
Removes any link between idA and idB (both directions).
double getDbSavingTime() const
bool addLink(const Link &link, bool addInDatabase=false)
Adds a graph link between two signatures.
int getMaxStMemSize() const
bool isIncremental() const
void close(bool databaseSaved=true, bool postInitClosingEvents=false, const std::string &ouputDatabasePath="")
Flushes pending data and closes the database connection.
int getSignatureIdByLabel(const std::string &label, bool lookInDatabase=true) const
Transform computeTransform(Signature &fromS, Signature &toS, Transform guess, RegistrationInfo *info=0, bool useKnownCorrespondencesIfPossible=false) const
Computes the relative transform from fromS to toS using the registration pipeline.
void dumpMemoryTree(const char *fileNameTree) const
Writes a human-readable dump of WM/STM, links and weights to fileNameTree.
Transform getOdomPose(int signatureId, bool lookInDatabase=false) const
void getNodeWordsAndGlobalDescriptors(int nodeId, std::multimap< int, int > &words, std::vector< cv::KeyPoint > &wordsKpts, std::vector< cv::Point3f > &words3, cv::Mat &wordsDescriptors, std::vector< GlobalDescriptor > &globalDescriptors) const
Loads the visual words, 3D points and global descriptors stored with nodeId.
std::set< int > getAllSignatureIds(bool ignoreChildren=true) const
Returns all signature ids in WM, STM and LTM.
std::map< int, int > getWeights() const
bool isInWM(int signatureId) const
std::list< int > forget(const std::set< int > &ignoredIds=std::set< int >())
Transfers oldest signatures from WM to LTM to respect memory and/or time limits.
std::map< int, int > getNeighborsId(int signatureId, int maxGraphDepth, int maxCheckedInDatabase=-1, bool incrementMarginOnLoop=false, bool ignoreLoopIds=false, bool ignoreIntermediateNodes=false, bool ignoreLocalSpaceLoopIds=false, const std::set< int > &nodesSet=std::set< int >(), double *dbAccessTime=0) const
Breadth-first walk of the pose graph from signatureId.
static const int kIdVirtual
Reserved id for the "virtual place" used by the Bayes filter (negative).
size_t getWorkingMemSize(bool ignoreIntermediateNodes=false) const
Returns the number of signatures in working memory, excluding the virtual place.
DBDriver * _dbDriver
Database driver owning the persistent storage (created by init()).
const VWDictionary * getVWDictionary() const
virtual void dumpMemory(std::string directory) const
Dumps every internal map (signatures, words, dictionary) to text files in directory.
int getLastSignatureId() const
void setDummyDictionary(bool enabled)
Enables a dummy visual word dictionary (no descriptors kept, word ids only).
bool isIDsGenerated() const
int cleanupLocalGrids(const std::map< int, Transform > &poses, const cv::Mat &map, float xMin, float yMin, float cellSize, int cropRadius=1, bool filterScans=false)
Removes spurious obstacle points from each node's local grid using a reference 2D map.
void updateAge(int signatureId)
Refreshes the age of signatureId in working memory, marking it as recent.
bool isGraphReduced() const
void updateLink(const Link &link, bool updateInDatabase=false)
Replaces an existing link with link (same endpoints and type).
std::multimap< int, Link > getLinks(int signatureId, bool lookInDatabase=false, bool withLandmarks=false) const
Returns all links of signatureId (neighbor, loop, prior, gravity, ...).
void saveOptimizedMesh(const cv::Mat &cloud, const std::vector< std::vector< std::vector< RTABMAP_PCL_INDEX > > > &polygons=std::vector< std::vector< std::vector< RTABMAP_PCL_INDEX > > >(), const std::vector< std::vector< Eigen::Vector2f > > &texCoords=std::vector< std::vector< Eigen::Vector2f > >(), const cv::Mat &textures=cv::Mat()) const
Persists an optimized textured/colored mesh to the database.
void removeAllVirtualLinks()
Removes every virtual link in WM.
int getDatabaseMemoryUsed() const
bool memoryChanged() const
Reports whether the in-memory map has been modified since the database was last loaded or reset....
std::multimap< int, Link > getLoopClosureLinks(int signatureId, bool lookInDatabase=false) const
Returns loop-closure links of signatureId; lookInDatabase also checks LTM.
Transform getGroundTruthPose(int signatureId, bool lookInDatabase=false) const
void saveLocationData(int locationId)
Forces locationId to be flushed to the database.
std::map< int, float > computeLikelihood(const Signature *signature, const std::list< int > &ids)
Computes loop-closure likelihood of signature against a set of WM ids.
cv::Mat load2DMap(float &xMin, float &yMin, float &cellSize) const
Loads the 2D occupancy grid previously written by save2DMap().
std::map< int, Transform > loadOptimizedPoses(Transform *lastlocalizationPose) const
Loads optimized poses previously written by saveOptimizedPoses().
std::set< int > reactivateSignatures(const std::list< int > &ids, unsigned int maxLoaded, double &timeDbAccess)
Reloads signatures from LTM into WM.
void removeVirtualLinks(int signatureId)
Removes virtual links attached to signatureId.
bool update(const SensorData &data, const Transform &pose, const cv::Mat &covariance, const std::vector< float > &velocity=std::vector< float >(), Statistics *stats=0)
Adds a sensor observation with odometry pose and velocity to the map.
const Feature2D * getFeature2D() const
bool isOdomGravityUsed() const
std::string getDatabaseUrl() const
void getMetricConstraints(const std::set< int > &ids, std::map< int, Transform > &poses, std::multimap< int, Link > &links, bool lookInDatabase=false, bool landmarksAdded=false)
Extracts a sub-graph (poses + links) for a set of node ids.
const std::map< int, double > & getWorkingMem() const
void saveOptimizedPoses(const std::map< int, Transform > &optimizedPoses, const Transform &lastlocalizationPose) const
Persists an optimized pose graph and the last localization pose for next session.
bool labelSignature(int id, const std::string &label)
Assigns or removes a label on id.
virtual void parseParameters(const ParametersMap ¶meters)
Re-parses parameters and propagates them to owned sub-objects.
cv::Mat getImageCompressed(int signatureId) const
cv::Mat loadPreviewImage() const
Loads the preview image previously written by savePreviewImage().
const std::map< int, Transform > & getGroundTruths() const
static const int kIdInvalid
Sentinel value indicating an invalid signature id (zero).
void save2DMap(const cv::Mat &map, float xMin, float yMin, float cellSize) const
Persists a 2D occupancy grid (origin xMin, yMin and resolution cellSize).
int reduceNode(int id, float maxDistance=0.0f, bool keepLinkedInDb=false, int direction=0)
Merges id with a close neighbor (graph reduction).
void getGPS(int id, GPS &gps, Transform &offsetENU, bool lookInDatabase, int maxGraphDepth=0) const
Returns a GPS fix for id, falling back to the nearest GPS-tagged neighbor.
Transform computeIcpTransform(const Signature &fromS, const Signature &toS, Transform guess, RegistrationInfo *info=0) const
Refines a transform using ICP alignment of laser scans only.
void removeRawData(int id, bool image=true, bool scan=true, bool userData=true, bool occupancyGrid=true)
Strips raw images, scan, user data and/or occupancy grid from id to save memory (RAM)....
std::multimap< int, Link > getAllLinks(bool lookInDatabase, bool ignoreNullLinks=true, bool withLandmarks=false) const
Returns links of every signature; ignoreNullLinks drops empty placeholders.
const std::map< int, std::set< int > > & getLandmarksIndex() const
const Signature * getLastWorkingSignature(bool ignoreIntermediateNodes) const
Returns the most recent WM signature.
unsigned long getMemoryUsed() const
int getLastGlobalLoopClosureId() const
int getWorkingMemIntermediateNodesCount() const
float getSimilarityThreshold() const
const std::vector< double > & getOdomMaxInf() const
bool getNodeInfo(int signatureId, Transform &odomPose, int &mapId, int &weight, std::string &label, double &stamp, Transform &groundTruth, std::vector< float > &velocity, GPS &gps, EnvSensors &sensors, bool lookInDatabase=false) const
Reads metadata of signatureId (no images/scan/words).
void convertToIntermediate(int locationId)
Marks locationId as intermediate (weight = -1); excludes it from loop closure.
std::string getDatabaseVersion() const
void generateGraph(const std::string &fileName, const std::set< int > &ids=std::set< int >())
Writes a Graphviz DOT file of the pose graph.
bool init(const std::string &dbUrl, bool dbOverwritten=false, const ParametersMap ¶meters=ParametersMap(), bool postInitClosingEvents=false)
Opens or creates a database and loads existing state into WM.
void getNodeCalibration(int nodeId, std::vector< CameraModel > &models, std::vector< StereoCameraModel > &stereoModels) const
Loads mono and/or stereo camera calibration stored with nodeId.
virtual const ParametersMap & getParameters() const
int cleanup()
Drops the last signature if flagged as bad, or any signature in localization mode.
void saveStatistics(const Statistics &statistics, bool saveWMState)
Persists statistics to the database; saveWMState records the WM id list.
void dumpDictionary(const char *fileNameRef, const char *fileNameDesc) const
Dumps the visual word dictionary: references to fileNameRef, descriptors to fileNameDesc.
int incrementMapId(std::map< int, int > *reducedIds=0)
Starts a new map id, breaking session continuity (e.g. after localization loss).
std::map< int, Link > getNodesObservingLandmark(int landmarkId, bool lookInDatabase) const
Returns all nodes observing landmark landmarkId, mapped to the observation link.
bool setUserData(int id, const cv::Mat &data)
Attaches user data to signature id, compressing it on the fly if needed.
void savePreviewImage(const cv::Mat &image) const
Stores a preview image (typically a thumbnail of the last frame) in the database.
Statistics and diagnostics returned by Registration.
Visual registration between two signatures using features and geometry.
Abstract base for registering two observations (visual, ICP, or both).
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.
Manages a dictionary of visual words for visual place recognition and loop closure detection.
std::map< EnvSensor::Type, EnvSensor > EnvSensors
Map of environmental readings keyed by EnvSensor::Type (at most one per type).
std::map< std::string, std::string > ParametersMap
Parameter keys mapped to their values, as used by every configurable class (see Parameters).