RTAB-Map 0.23.10
Real-Time Appearance-Based Mapping
Loading...
Searching...
No Matches
DBDriver.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 DBDRIVER_H_
29#define DBDRIVER_H_
30
31#include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines
32
33#include <string>
34#include <list>
35#include <map>
36#include <set>
37#include <opencv2/core/core.hpp>
38#include "rtabmap/utilite/UMutex.h"
40#include "rtabmap/core/Parameters.h"
41#include "rtabmap/core/SensorData.h"
42#include <rtabmap/core/Statistics.h>
43
44#include <rtabmap/core/Transform.h>
45#include <rtabmap/core/Link.h>
46
47namespace rtabmap {
48
49class Signature;
50class VWDictionary;
51class VisualWord;
52
71class RTABMAP_CORE_EXPORT DBDriver : public UThreadNode
72{
73public:
79 static DBDriver * create(const ParametersMap & parameters = ParametersMap());
80
81public:
82 virtual ~DBDriver();
83
85 virtual void parseParameters(const ParametersMap & parameters);
90 virtual bool isInMemory() const {return _url.empty();}
92 const std::string & getUrl() const {return _url;}
94 const std::string & getTargetVersion() const {return _targetVersion;}
95
115 void emptyTrashes(bool async = false);
116 double getEmptyTrashesTime() const {return _emptyTrashesTime;}
117 void setTimestampUpdateEnabled(bool enabled) {_timestampUpdate = enabled;} // used on Update Signature and Word queries
118
127 const std::string & fileName,
128 const std::set<int> & ids = std::set<int>(),
129 const std::map<int, Signature *> & otherSignatures = std::map<int, Signature *>());
130
137 void addLink(const Link & link);
139 void removeLink(int from, int to);
141 void updateLink(const Link & link);
150 int nodeId,
151 const cv::Mat & ground,
152 const cv::Mat & obstacles,
153 const cv::Mat & empty,
154 float cellSize,
155 const cv::Point3f & viewpoint);
158 int nodeId,
159 const std::vector<CameraModel> & models,
160 const std::vector<StereoCameraModel> & stereoModels);
167 void updateDepthImage(int nodeId, const cv::Mat & image, const std::string & format);
173 void updateLaserScan(int nodeId, const LaserScan & scan);
176public:
181 void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap & parameters) const;
187 void addStatistics(const Statistics & statistics, bool saveWmState) const;
193 void savePreviewImage(const cv::Mat & image) const;
195 cv::Mat loadPreviewImage() const;
197 void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
199 std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose = 0) const;
201 void save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
203 cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
212 const cv::Mat & cloud,
213 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons = std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > >(), // Textures -> polygons -> vertices
214#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
215 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
216#else
217 const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
218#endif
219 const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size);
220 cv::Mat loadOptimizedMesh(
221 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons = 0,
222#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
223 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
224#else
225 std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
226#endif
227 cv::Mat * textures = 0) const;
233 void saveFlannIndex(const std::vector<unsigned char> & indexData) const;
236public:
242 bool openConnection(const std::string & url, bool overwritten = false, bool readOnly = false);
244 void closeConnection(bool save = true, const std::string & outputUrl = "");
246 bool isConnected() const;
247 unsigned long getMemoryUsed() const; // In bytes
249 std::string getDatabaseVersion() const;
250 long getNodesMemoryUsed() const;
251 long getLinksMemoryUsed() const;
252 long getImagesMemoryUsed() const;
253 long getDepthImagesMemoryUsed() const;
254 long getCalibrationsMemoryUsed() const;
255 long getGridsMemoryUsed() const;
256 long getLaserScansMemoryUsed() const;
257 long getUserDataMemoryUsed() const;
258 long getWordsMemoryUsed() const;
259 long getFeaturesMemoryUsed() const;
260 long getStatisticsMemoryUsed() const;
261 int getLastNodesSize() const; // working memory
262 int getLastDictionarySize() const; // working memory
263 int getTotalNodesSize() const;
264 int getTotalDictionarySize() const;
265 ParametersMap getLastParameters() const;
266 std::map<std::string, float> getStatistics(int nodeId, double & stamp, std::vector<int> * wmState=0) const;
267 std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatistics() const;
268 std::map<int, std::vector<int> > getAllStatisticsWmStates() const;
269
286 void executeNoResult(const std::string & sql) const;
287
293 // Load objects
294 void load(VWDictionary & dictionary, bool lastStateOnly = true, bool idsOnly = false) const;
295 void loadLastNodes(std::list<Signature *> & signatures, bool loadWordIdsOnly = false) const; // returned signatures must be freed after usage
297 Signature * loadSignature(int id, bool * loadedFromTrash = 0); // returned signature must be freed after usage, call loadSignatures() instead if more than one signature should be loaded
298 void loadSignatures(const std::list<int> & ids, std::list<Signature *> & signatures, std::set<int> * loadedFromTrash = 0, bool loadWordIdsOnly = false); // returned signatures must be freed after usage
299 void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws); // returned words must be freed after usage
300
301 // Specific queries...
302 void loadNodeData(Signature & signature, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
303 void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
304 void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
305 bool getCalibration(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
306 bool getLaserScanInfo(int signatureId, LaserScan & info) const;
307 bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
308 void getLocalFeatures(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const;
310 void loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
311 void getWeight(int signatureId, int & weight) const;
312 void getLastNodeIds(std::set<int> & ids) const;
313 void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false, bool ignoreIntermediateNodes = false) const;
314 void getAllOdomPoses(std::map<int, Transform> & poses, bool ignoreChildren = false, bool ignoreIntermediateNodes = false) const;
315 void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true, bool withLandmarks = false) const;
316 void getLastNodeId(int & id) const;
317 void getLastMapId(int & mapId) const;
318 void getLastWordId(int & id) const;
319 void getInvertedIndexNi(int signatureId, int & ni) const;
320 void getNodesObservingLandmark(int landmarkId, std::map<int, Link> & nodes) const;
321 void getNodeIdByLabel(const std::string & label, int & id) const;
322 void getAllLabels(std::map<int, std::string> & labels) const;
325protected:
329 DBDriver(const ParametersMap & parameters = ParametersMap());
330
335 virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = false) = 0;
336 virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
337 virtual bool isConnectedQuery() const = 0;
338 virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
339 virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
340 virtual long getNodesMemoryUsedQuery() const = 0;
341 virtual long getLinksMemoryUsedQuery() const = 0;
342 virtual long getImagesMemoryUsedQuery() const = 0;
343 virtual long getDepthImagesMemoryUsedQuery() const = 0;
344 virtual long getCalibrationsMemoryUsedQuery() const = 0;
345 virtual long getGridsMemoryUsedQuery() const = 0;
346 virtual long getLaserScansMemoryUsedQuery() const = 0;
347 virtual long getUserDataMemoryUsedQuery() const = 0;
348 virtual long getWordsMemoryUsedQuery() const = 0;
349 virtual long getFeaturesMemoryUsedQuery() const = 0;
350 virtual long getStatisticsMemoryUsedQuery() const = 0;
351 virtual int getLastNodesSizeQuery() const = 0;
352 virtual int getLastDictionarySizeQuery() const = 0;
353 virtual int getTotalNodesSizeQuery() const = 0;
354 virtual int getTotalDictionarySizeQuery() const = 0;
355 virtual ParametersMap getLastParametersQuery() const = 0;
356 virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const = 0;
357 virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const = 0;
358 virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const = 0;
359
360 virtual void executeNoResultQuery(const std::string & sql) const = 0;
361
362 virtual void getWeightQuery(int signatureId, int & weight) const = 0;
363
364 virtual void saveQuery(const std::list<Signature *> & signatures) = 0;
365 virtual void saveQuery(const std::list<VisualWord *> & words) const = 0;
366 virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
367 virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
368
369 virtual void addLinkQuery(const Link & link) const = 0;
370 virtual void updateLinkQuery(const Link & link) const = 0;
371
372 virtual void updateOccupancyGridQuery(
373 int nodeId,
374 const cv::Mat & ground,
375 const cv::Mat & obstacles,
376 const cv::Mat & empty,
377 float cellSize,
378 const cv::Point3f & viewpoint) const = 0;
379
380 virtual void updateCalibrationQuery(
381 int nodeId,
382 const std::vector<CameraModel> & models,
383 const std::vector<StereoCameraModel> & stereoModels) const = 0;
384
385 virtual void updateDepthImageQuery(
386 int nodeId,
387 const cv::Mat & image,
388 const std::string & format) const = 0;
389
390 virtual void updateLaserScanQuery(
391 int nodeId,
392 const LaserScan & scan) const = 0;
393
394 virtual void addStatisticsQuery(const Statistics & statistics, bool saveWmState) const = 0;
395 virtual void savePreviewImageQuery(const cv::Mat & image) const = 0;
396 virtual cv::Mat loadPreviewImageQuery() const = 0;
397 virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const = 0;
398 virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose = 0) const = 0;
399 virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const = 0;
400 virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
401 virtual void saveOptimizedMeshQuery(
402 const cv::Mat & cloud,
403 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
404#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
405 const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
406#else
407 const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
408#endif
409 const cv::Mat & textures) const = 0;
410 virtual cv::Mat loadOptimizedMeshQuery(
411 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
412#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
413 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
414#else
415 std::vector<std::vector<Eigen::Vector2f> > * texCoords,
416#endif
417 cv::Mat * textures) const = 0;
418 virtual void saveFlannIndexQuery(const std::vector<unsigned char> & indexData) const = 0;
419
420 // Load objects
421 virtual void loadQuery(VWDictionary & dictionary, bool lastStateOnly = true, bool idsOnly = false) const = 0;
422 virtual void loadLastNodesQuery(std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
423 virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
424 virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
425 virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
426
427 virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
428 virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const = 0;
429 virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
430 virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const = 0;
431 virtual void getLocalFeaturesQuery(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const = 0;
432 virtual void getLastNodeIdsQuery(std::set<int> & ids) const = 0;
433 virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const = 0;
434 virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const = 0;
435 virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks, bool withLandmarks) const = 0;
436 virtual void getLastIdQuery(const std::string & tableName, int & id, const std::string & fieldName="id") const = 0;
437 virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
438 virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map<int, Link> & nodes) const = 0;
439 virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const = 0;
440 virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const = 0;
443private:
445 void beginTransaction() const;
447 void commit() const;
448
449 //non-abstract methods
450 void saveOrUpdate(const std::vector<Signature *> & signatures);
451 void saveOrUpdate(const std::vector<VisualWord *> & words) const;
452
453 //thread stuff
454 virtual void mainLoop();
455
456private:
457 UMutex _transactionMutex;
458 std::map<int, Signature *> _trashSignatures;//<id, Signature*>
459 std::map<int, VisualWord *> _trashVisualWords; //<id, VisualWord*>
460 UMutex _trashesMutex;
461 UMutex _dbSafeAccessMutex;
462 USemaphore _addSem;
463 double _emptyTrashesTime;
464 std::string _url;
465 std::string _targetVersion;
466 bool _timestampUpdate;
467};
468
469}
470
471#endif /* DBDRIVER_H_ */
Backward-compatible alias header for UThread.
Abstract database driver for RTAB-Map maps (signatures, links, words, statistics).
Definition DBDriver.h:72
Signature * loadSignature(int id, bool *loadedFromTrash=0)
Load one signature by id; caller must delete the returned pointer.
virtual bool isInMemory() const
True when no database file URL was set at open time.
Definition DBDriver.h:90
static DBDriver * create(const ParametersMap &parameters=ParametersMap())
Factory: returns a SQLite database driver (DBDriverSqlite3).
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
Persist the global optimized 3D mesh to the database.
void updateOccupancyGrid(int nodeId, const cv::Mat &ground, const cv::Mat &obstacles, const cv::Mat &empty, float cellSize, const cv::Point3f &viewpoint)
Update occupancy grid cells for a node.
void saveFlannIndex(const std::vector< unsigned char > &indexData) const
Persist the visual word dictionary FLANN index (serialized blob).
void updateDepthImage(int nodeId, const cv::Mat &image, const std::string &format)
Update the depth image stored for a node.
virtual void parseParameters(const ParametersMap &parameters)
Parse driver parameters from the map (e.g. target schema version).
const std::string & getTargetVersion() const
Definition DBDriver.h:94
void addStatistics(const Statistics &statistics, bool saveWmState) const
Append a Statistics record for a processed node.
void save2DMap(const cv::Mat &map, float xMin, float yMin, float cellSize) const
Save the assembled 2D occupancy grid and its origin metadata.
DBDriver(const ParametersMap &parameters=ParametersMap())
Protected constructor for subclasses.
void updateCalibration(int nodeId, const std::vector< CameraModel > &models, const std::vector< StereoCameraModel > &stereoModels)
Update camera calibration stored for a node.
std::map< int, Transform > loadOptimizedPoses(Transform *lastlocalizationPose=0) const
Load optimized poses; optional last localization pose output.
const std::string & getUrl() const
Definition DBDriver.h:92
bool isConnected() const
void removeLink(int from, int to)
Remove a link between two nodes.
void updateLaserScan(int nodeId, const LaserScan &scan)
Update the laser scan stored for a node.
void savePreviewImage(const cv::Mat &image) const
Save the map preview thumbnail in the Admin table.
void executeNoResult(const std::string &sql) const
Run a SQL statement that does not return result rows.
void asyncSave(VisualWord *vw)
Queue a visual word for deferred save; ownership is transferred.
void updateLink(const Link &link)
Update an existing link in the database.
std::string getDatabaseVersion() const
cv::Mat loadPreviewImage() const
Load and uncompress the map preview thumbnail from the Admin table.
cv::Mat load2DMap(float &xMin, float &yMin, float &cellSize) const
Load the 2D map and fill origin/cell size outputs.
void loadLinks(int signatureId, std::multimap< int, Link > &links, Link::Type type=Link::kUndef) const
Load outgoing links from signatureId, optionally filtered by type.
void emptyTrashes(bool async=false)
Flush queued signatures and visual words to the database.
void saveOptimizedPoses(const std::map< int, Transform > &optimizedPoses, const Transform &lastlocalizationPose) const
Persist graph-optimized poses and last localization pose.
void closeConnection(bool save=true, const std::string &outputUrl="")
Close the connection; optionally flush trashes and save in-memory DB to outputUrl.
void generateGraph(const std::string &fileName, const std::set< int > &ids=std::set< int >(), const std::map< int, Signature * > &otherSignatures=std::map< int, Signature * >())
Export the pose graph to a Graphviz DOT file for visualization.
bool openConnection(const std::string &url, bool overwritten=false, bool readOnly=false)
Open or create the database at url (empty url uses an in-memory database).
void addLink(const Link &link)
Insert or replace a link in the database.
void asyncSave(Signature *s)
Queue a signature for deferred save; ownership is transferred.
WGS84 GPS fix attached to a sensor sample or graph node.
Definition GPS.h:47
Represents 2D or 3D laser scan data with support for multiple point data formats.
Definition LaserScan.h:46
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.
Represents a visual word (feature descriptor) used in the bag-of-words (BoW) model.
Definition VisualWord.h:50
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