RTAB-Map 0.23.10
Real-Time Appearance-Based Mapping
Loading...
Searching...
No Matches
Memory.h
1/*
2Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of the Universite de Sherbrooke nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
28#ifndef MEMORY_H_
29#define MEMORY_H_
30
31#include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines
32
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"
38#include <typeinfo>
39#include <list>
40#include <map>
41#include <set>
43#include <opencv2/core/core.hpp>
44#if CV_MAJOR_VERSION < 5
45#include <opencv2/features2d/features2d.hpp>
46#else
47#include <opencv2/features.hpp>
48#endif
49#include <pcl/pcl_config.h>
50
51namespace rtabmap {
52
53class Signature;
54class DBDriver;
55class VWDictionary;
56class VisualWord;
57class Feature2D;
58class Statistics;
59class Registration;
60class RegistrationInfo;
61class RegistrationIcp;
62class RegistrationVis;
63class Stereo;
64class LocalGridMaker;
65class MarkerDetector;
66class GlobalDescriptorExtractor;
67
101class RTABMAP_CORE_EXPORT Memory
102{
103public:
105 static const int kIdStart;
107 static const int kIdVirtual;
109 static const int kIdInvalid;
110
111public:
119 Memory(const ParametersMap & parameters = ParametersMap());
120 virtual ~Memory();
121
128 virtual void parseParameters(const ParametersMap & parameters);
130 virtual const ParametersMap & getParameters() const {return parameters_;}
141 bool update(const SensorData & data,
142 Statistics * stats = 0);
157 bool update(const SensorData & data,
158 const Transform & pose,
159 const cv::Mat & covariance,
160 const std::vector<float> & velocity = std::vector<float>(), // vx,vy,vz,vroll,vpitch,vyaw
161 Statistics * stats = 0);
172 bool init(const std::string & dbUrl,
173 bool dbOverwritten = false,
174 const ParametersMap & parameters = ParametersMap(),
175 bool postInitClosingEvents = false);
186 void close(bool databaseSaved = true, bool postInitClosingEvents = false, const std::string & ouputDatabasePath = "");
197 std::map<int, float> computeLikelihood(const Signature * signature,
198 const std::list<int> & ids);
206 int incrementMapId(std::map<int, int> * reducedIds = 0);
213 void updateAge(int signatureId);
214
238 std::list<int> forget(const std::set<int> & ignoredIds = std::set<int>());
247 std::set<int> reactivateSignatures(const std::list<int> & ids, unsigned int maxLoaded, double & timeDbAccess);
248
253 int cleanup();
255 void saveStatistics(const Statistics & statistics, bool saveWMState);
257 void savePreviewImage(const cv::Mat & image) const;
259 cv::Mat loadPreviewImage() const;
261 void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
263 std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose) const;
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> > >(), // Textures -> polygons -> vertices
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> > >(), // Textures -> uv coords for each vertex of the polygons
280#else
281 const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
282#endif
283 const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size)
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,
289#else
290 std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
291#endif
292 cv::Mat * textures = 0) const;
303 bool addLink(const Link & link, bool addInDatabase = false);
305 void updateLink(const Link & link, bool updateInDatabase = false);
309 void removeVirtualLinks(int signatureId);
326 std::map<int, int> getNeighborsId(
327 int signatureId,
328 int maxGraphDepth,
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;
344 std::map<int, float> getNeighborsIdRadius(
345 int signatureId,
346 float radius,
347 const std::map<int, Transform> & optimizedPoses,
348 int maxGraphDepth) const;
350 void convertToIntermediate(int locationId);
365 void deleteLocation(int locationId, std::list<int> * deletedWords = 0, bool keepLinkedInDb = false);
367 void saveLocationData(int locationId);
369 void removeLink(int idA, int idB);
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);
397 void setDummyDictionary(bool enabled);
398
400 const std::map<int, double> & getWorkingMem() const {return _workingMem;}
405 size_t getWorkingMemSize(bool ignoreIntermediateNodes = false) const;
407 int getWorkingMemIntermediateNodesCount() const {return _workingMemIntermediateNodesCount;}
409 int getStMemIntermediateNodesCount() const {return _stMemIntermediateNodesCount;}
411 const std::set<int> & getStMem() const {return _stMem;}
413 int getMaxStMemSize() const {return _maxStMemSize;}
415 std::multimap<int, Link> getNeighborLinks(int signatureId,
416 bool lookInDatabase = false) const;
418 std::multimap<int, Link> getLoopClosureLinks(int signatureId,
419 bool lookInDatabase = false) const;
426 std::multimap<int, Link> getLinks(int signatureId,
427 bool lookInDatabase = false,
428 bool withLandmarks = false) const;
430 std::multimap<int, Link> getAllLinks(bool lookInDatabase, bool ignoreNullLinks = true, bool withLandmarks = false) const;
432 bool isBinDataKept() const {return _binDataKept;}
434 float getSimilarityThreshold() const {return _similarityThreshold;}
436 std::map<int, int> getWeights() const;
443 const Signature * getLastWorkingSignature(bool ignoreIntermediateNodes) const;
445 std::map<int, Link> getNodesObservingLandmark(int landmarkId, bool lookInDatabase) const;
447 int getSignatureIdByLabel(const std::string & label, bool lookInDatabase = true) const;
454 bool labelSignature(int id, const std::string & label);
456 const std::map<int, std::string> & getAllLabels() const {return _labels;}
458 const std::map<int, std::set<int> > & getLandmarksIndex() const {return _landmarksIndex;}
460 bool allNodesInWM() const {return _allNodesInWM;}
461
477 bool setUserData(int id, const cv::Mat & data);
481 std::string getDatabaseVersion() const;
483 std::string getDatabaseUrl() const;
485 double getDbSavingTime() const;
487 int getMapId(int id, bool lookInDatabase = false) const;
489 Transform getOdomPose(int signatureId, bool lookInDatabase = false) const;
491 Transform getGroundTruthPose(int signatureId, bool lookInDatabase = false) const;
493 const std::map<int, Transform> & getGroundTruths() const {return _groundTruths;}
519 void getGPS(int id, GPS & gps, Transform & offsetENU, bool lookInDatabase, int maxGraphDepth = 0) const;
536 bool getNodeInfo(int signatureId,
537 Transform & odomPose,
538 int & mapId,
539 int & weight,
540 std::string & label,
541 double & stamp,
542 Transform & groundTruth,
543 std::vector<float> & velocity,
544 GPS & gps,
545 EnvSensors & sensors,
546 bool lookInDatabase = false) const;
548 cv::Mat getImageCompressed(int signatureId) const;
556 SensorData getNodeData(int locationId, bool images, bool scan, bool userData, bool occupancyGrid) 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;
565 void getNodeCalibration(int nodeId,
566 std::vector<CameraModel> & models,
567 std::vector<StereoCameraModel> & stereoModels) const;
572 std::set<int> getAllSignatureIds(bool ignoreChildren = true) const;
602 bool memoryChanged() const {return _memoryChanged;}
607 bool isIncremental() const {return _incrementalMemory;}
614 bool isReadOnly() const {return !_incrementalMemory && _localizationReadOnly;}
619 bool isLocalizationDataSaved() const {return _localizationDataSaved;}
621 const Signature * getSignature(int id) const;
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);}
629 bool isIDsGenerated() const {return _generateIds;}
631 int getLastGlobalLoopClosureId() const {return _lastGlobalLoopClosureId;}
633 const Feature2D * getFeature2D() const {return _feature2D;}
635 bool isGraphReduced() const {return _reduceGraph;}
653 const std::vector<double> & getOdomMaxInf() const {return _odomMaxInf;}
669 bool isOdomGravityUsed() const {return _useOdometryGravity;}
670
672 void dumpMemoryTree(const char * fileNameTree) const;
674 virtual void dumpMemory(std::string directory) const;
676 virtual void dumpSignatures(const char * fileNameSign, bool words3D) const;
678 void dumpDictionary(const char * fileNameRef, const char * fileNameDesc) const;
680 unsigned long getMemoryUsed() const; //Bytes
681
687 void generateGraph(const std::string & fileName, const std::set<int> & ids = std::set<int>());
725 const std::map<int, Transform> & poses,
726 const cv::Mat & map,
727 float xMin,
728 float yMin,
729 float cellSize,
730 int cropRadius = 1,
731 bool filterScans = false);
732
735
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);
753
763 Transform computeTransform(Signature & fromS, Signature & toS, Transform guess, RegistrationInfo * info = 0, bool useKnownCorrespondencesIfPossible = false) const;
765 Transform computeTransform(int fromId, int toId, Transform guess, RegistrationInfo * info = 0, bool useKnownCorrespondencesIfPossible = false);
770 Transform computeIcpTransform(const Signature & fromS, const Signature & toS, Transform guess, RegistrationInfo * info = 0) const;
780 int newId,
781 int oldId,
782 const std::map<int, Transform> & poses,
783 RegistrationInfo * info = 0);
784
785private:
786 void preUpdate();
787 void addSignatureToStm(Signature * signature, const cv::Mat & covariance);
788 void clear();
789 void loadDataFromDb(bool postInitClosingEvents);
790 void saveFlannIndex(bool postInitClosingEvents);
791 void moveToTrash(Signature * s, bool keepLinkedToGraph = true, std::list<int> * deletedWords = 0);
792
793 void moveSignatureToWMFromSTM(int id, int * reducedTo = 0);
794 void addSignatureToWmFromLTM(Signature * signature);
795 Signature * _getSignature(int id) const;
796 std::list<Signature *> getRemovableSignatures(int count,
797 const std::set<int> & ignoredIds = std::set<int>());
798 int getNextId();
799 void rehearsal(Signature * signature, Statistics * stats = 0);
800 bool rehearsalMerge(int oldId, int newId);
801 bool canBeReduced(const Link & link, float maxDistance, int direction);
802
803 const std::map<int, Signature*> & getSignatures() const {return _signatures;}
804
805 void copyData(const Signature * from, Signature * to);
806 Signature * createSignature(
807 const SensorData & data,
808 const Transform & pose,
809 Statistics * stats = 0);
810
811 //keypoint stuff
812 void disableWordsRef(int signatureId);
813 void enableWordsRef(const std::list<int> & signatureIds);
814 void cleanUnusedWords();
815 int getNi(int signatureId) const;
816
817protected:
820
821private:
822 // parameters
823 ParametersMap parameters_;
824 float _similarityThreshold;
825 bool _binDataKept;
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;
837 bool _reduceGraph;
838 int _maxStMemSize;
839 float _recentWmRatio;
840 bool _transferSortingByWeightId;
841 bool _idUpdatedToNewOneRehearsal;
842 bool _generateIds;
843 bool _badSignaturesIgnored;
844 bool _mapLabelsAdded;
845 bool _depthAsMask;
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;
858 bool _invertedReg;
859 float _rehearsalMaxDistance;
860 float _rehearsalMaxAngle;
861 bool _rehearsalWeightIgnoredWhileMoving;
862 bool _useOdometryFeatures;
863 bool _useOdometryGravity;
864 bool _rotateImagesUpsideUp;
865 bool _createOccupancyGrid;
866 int _visMaxFeatures;
867 bool _visSSC;
868 bool _imagesAlreadyRectified;
869 bool _rectifyOnlyFeatures;
870 bool _covOffDiagonalIgnored;
871 bool _detectMarkers;
872 float _markerLinVariance;
873 float _markerAngVariance;
874 bool _markerOrientationIgnored;
875
876 int _idCount;
877 int _idMapCount;
878 Signature * _lastSignature;
879 int _lastGlobalLoopClosureId;
880 bool _memoryChanged; // False by default, become true only when Memory::update() is called.
881 bool _linksChanged; // False by default, become true when links are modified.
882 int _signaturesAdded;
883 int _workingMemIntermediateNodesCount; // number of nodes with weight==-1 currently in _workingMem
884 int _stMemIntermediateNodesCount; // number of nodes with weight==-1 currently in _stMem
885 bool _allNodesInWM;
886 bool _receivingOdometryFeatures;
887 GPS _gpsOrigin;
888 std::vector<CameraModel> _rectCameraModels;
889 std::vector<StereoCameraModel> _rectStereoCameraModels;
890 std::vector<double> _odomMaxInf;
891
892 std::map<int, Signature *> _signatures; // TODO : check if a signature is already added? although it is not supposed to occur...
893 std::set<int> _stMem; // id
894 std::map<int, double> _workingMem; // id,age
895 std::map<int, Transform> _groundTruths;
896 std::map<int, std::string> _labels;
897 std::map<int, std::set<int> > _landmarksIndex; // < -landmarkId, nodeIds >
898 std::map<int, float> _landmarksSize; // +landmarkId
899
900 //Keypoint stuff
901 VWDictionary * _vwd;
902 Feature2D * _feature2D;
903 float _badSignRatio;
904 bool _tfIdfLikelihoodUsed;
905 bool _parallelized;
906
907 Registration * _registrationPipeline;
908 RegistrationIcp * _registrationIcpMulti;
909 RegistrationVis * _registrationVis;
910
911 LocalGridMaker * _localMapMaker;
912
913 MarkerDetector * _markerDetector;
914
915 GlobalDescriptorExtractor * _globalDescriptorExtractor;
916
917 bool _dummyDictionary;
918};
919
920} // namespace rtabmap
921
922#endif /* MEMORY_H_ */
Wrappers of STL for convenient functions.
Abstract database driver for RTAB-Map maps (signatures, links, words, statistics).
Definition DBDriver.h:72
Abstract 2D feature detector and descriptor extractor for visual SLAM.
Definition Features2d.h:145
WGS84 GPS fix attached to a sensor sample or graph node.
Definition GPS.h:47
Builds per-node local occupancy grids from laser scans or depth clouds.
Three-tiered memory management (STM, WM, LTM) for RTAB-Map.
Definition Memory.h:102
const std::set< int > & getStMem() const
Definition Memory.h:411
const std::map< int, std::string > & getAllLabels() const
Definition Memory.h:456
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).
Definition Memory.h:105
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
Definition Memory.h:432
bool isInSTM(int signatureId) const
Definition Memory.h:623
virtual void dumpSignatures(const char *fileNameSign, bool words3D) const
Dumps signatures' word ids (and 3D positions if words3D) to fileNameSign.
bool allNodesInWM() const
Definition Memory.h:460
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
Definition Memory.h:627
Memory(const ParametersMap &parameters=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
Definition Memory.h:619
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
Definition Memory.h:409
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
Definition Memory.h:413
bool isIncremental() const
Definition Memory.h:607
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
Definition Memory.h:625
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).
Definition Memory.h:107
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()).
Definition Memory.h:819
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
Definition Memory.h:629
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
Definition Memory.h:635
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....
Definition Memory.h:602
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
Definition Memory.h:633
bool isOdomGravityUsed() const
Definition Memory.h:669
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
Definition Memory.h:400
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 &parameters)
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
Definition Memory.h:493
static const int kIdInvalid
Sentinel value indicating an invalid signature id (zero).
Definition Memory.h:109
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
Definition Memory.h:458
const Signature * getLastWorkingSignature(bool ignoreIntermediateNodes) const
Returns the most recent WM signature.
unsigned long getMemoryUsed() const
bool isReadOnly() const
Definition Memory.h:614
int getLastGlobalLoopClosureId() const
Definition Memory.h:631
int getWorkingMemIntermediateNodesCount() const
Definition Memory.h:407
float getSimilarityThreshold() const
Definition Memory.h:434
const std::vector< double > & getOdomMaxInf() const
Definition Memory.h:653
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 &parameters=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
Definition Memory.h:130
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.
Definition SensorData.h:97
Represents a node in RTAB-Map's pose graph.
Definition Signature.h:84
Collects and manages runtime statistics for RTAB-Map.
Definition Statistics.h:108
Represents a 3D rigid body transformation (rotation + translation).
Definition Transform.h:53
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).
Definition EnvSensor.h:114
std::map< std::string, std::string > ParametersMap
Parameter keys mapped to their values, as used by every configurable class (see Parameters).
Definition Parameters.h:44