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
104 void emptyTrashes(bool async = false);
105 double getEmptyTrashesTime() const {return _emptyTrashesTime;}
106 void setTimestampUpdateEnabled(bool enabled) {_timestampUpdate = enabled;} // used on Update Signature and Word queries
107
116 const std::string & fileName,
117 const std::set<int> & ids = std::set<int>(),
118 const std::map<int, Signature *> & otherSignatures = std::map<int, Signature *>());
119
126 void addLink(const Link & link);
128 void removeLink(int from, int to);
130 void updateLink(const Link & link);
139 int nodeId,
140 const cv::Mat & ground,
141 const cv::Mat & obstacles,
142 const cv::Mat & empty,
143 float cellSize,
144 const cv::Point3f & viewpoint);
147 int nodeId,
148 const std::vector<CameraModel> & models,
149 const std::vector<StereoCameraModel> & stereoModels);
156 void updateDepthImage(int nodeId, const cv::Mat & image, const std::string & format);
162 void updateLaserScan(int nodeId, const LaserScan & scan);
165public:
170 void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap & parameters) const;
176 void addStatistics(const Statistics & statistics, bool saveWmState) const;
182 void savePreviewImage(const cv::Mat & image) const;
184 cv::Mat loadPreviewImage() const;
186 void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
188 std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose = 0) const;
190 void save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
192 cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
201 const cv::Mat & cloud,
202 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons = std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > >(), // Textures -> polygons -> vertices
203#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
204 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
205#else
206 const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
207#endif
208 const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size);
209 cv::Mat loadOptimizedMesh(
210 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons = 0,
211#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
212 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
213#else
214 std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
215#endif
216 cv::Mat * textures = 0) const;
222 void saveFlannIndex(const std::vector<unsigned char> & indexData) const;
225public:
231 bool openConnection(const std::string & url, bool overwritten = false, bool readOnly = false);
233 void closeConnection(bool save = true, const std::string & outputUrl = "");
235 bool isConnected() const;
236 unsigned long getMemoryUsed() const; // In bytes
238 std::string getDatabaseVersion() const;
239 long getNodesMemoryUsed() const;
240 long getLinksMemoryUsed() const;
241 long getImagesMemoryUsed() const;
242 long getDepthImagesMemoryUsed() const;
243 long getCalibrationsMemoryUsed() const;
244 long getGridsMemoryUsed() const;
245 long getLaserScansMemoryUsed() const;
246 long getUserDataMemoryUsed() const;
247 long getWordsMemoryUsed() const;
248 long getFeaturesMemoryUsed() const;
249 long getStatisticsMemoryUsed() const;
250 int getLastNodesSize() const; // working memory
251 int getLastDictionarySize() const; // working memory
252 int getTotalNodesSize() const;
253 int getTotalDictionarySize() const;
254 ParametersMap getLastParameters() const;
255 std::map<std::string, float> getStatistics(int nodeId, double & stamp, std::vector<int> * wmState=0) const;
256 std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatistics() const;
257 std::map<int, std::vector<int> > getAllStatisticsWmStates() const;
258
275 void executeNoResult(const std::string & sql) const;
276
282 // Load objects
283 void load(VWDictionary & dictionary, bool lastStateOnly = true, bool idsOnly = false) const;
284 void loadLastNodes(std::list<Signature *> & signatures, bool loadWordIdsOnly = false) const; // returned signatures must be freed after usage
286 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
287 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
288 void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws); // returned words must be freed after usage
289
290 // Specific queries...
291 void loadNodeData(Signature & signature, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
292 void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
293 void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
294 bool getCalibration(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
295 bool getLaserScanInfo(int signatureId, LaserScan & info) const;
296 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;
297 void getLocalFeatures(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const;
299 void loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
300 void getWeight(int signatureId, int & weight) const;
301 void getLastNodeIds(std::set<int> & ids) const;
302 void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false, bool ignoreIntermediateNodes = false) const;
303 void getAllOdomPoses(std::map<int, Transform> & poses, bool ignoreChildren = false, bool ignoreIntermediateNodes = false) const;
304 void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true, bool withLandmarks = false) const;
305 void getLastNodeId(int & id) const;
306 void getLastMapId(int & mapId) const;
307 void getLastWordId(int & id) const;
308 void getInvertedIndexNi(int signatureId, int & ni) const;
309 void getNodesObservingLandmark(int landmarkId, std::map<int, Link> & nodes) const;
310 void getNodeIdByLabel(const std::string & label, int & id) const;
311 void getAllLabels(std::map<int, std::string> & labels) const;
314protected:
318 DBDriver(const ParametersMap & parameters = ParametersMap());
319
324 virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = false) = 0;
325 virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
326 virtual bool isConnectedQuery() const = 0;
327 virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
328 virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
329 virtual long getNodesMemoryUsedQuery() const = 0;
330 virtual long getLinksMemoryUsedQuery() const = 0;
331 virtual long getImagesMemoryUsedQuery() const = 0;
332 virtual long getDepthImagesMemoryUsedQuery() const = 0;
333 virtual long getCalibrationsMemoryUsedQuery() const = 0;
334 virtual long getGridsMemoryUsedQuery() const = 0;
335 virtual long getLaserScansMemoryUsedQuery() const = 0;
336 virtual long getUserDataMemoryUsedQuery() const = 0;
337 virtual long getWordsMemoryUsedQuery() const = 0;
338 virtual long getFeaturesMemoryUsedQuery() const = 0;
339 virtual long getStatisticsMemoryUsedQuery() const = 0;
340 virtual int getLastNodesSizeQuery() const = 0;
341 virtual int getLastDictionarySizeQuery() const = 0;
342 virtual int getTotalNodesSizeQuery() const = 0;
343 virtual int getTotalDictionarySizeQuery() const = 0;
344 virtual ParametersMap getLastParametersQuery() const = 0;
345 virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const = 0;
346 virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const = 0;
347 virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const = 0;
348
349 virtual void executeNoResultQuery(const std::string & sql) const = 0;
350
351 virtual void getWeightQuery(int signatureId, int & weight) const = 0;
352
353 virtual void saveQuery(const std::list<Signature *> & signatures) = 0;
354 virtual void saveQuery(const std::list<VisualWord *> & words) const = 0;
355 virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
356 virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
357
358 virtual void addLinkQuery(const Link & link) const = 0;
359 virtual void updateLinkQuery(const Link & link) const = 0;
360
361 virtual void updateOccupancyGridQuery(
362 int nodeId,
363 const cv::Mat & ground,
364 const cv::Mat & obstacles,
365 const cv::Mat & empty,
366 float cellSize,
367 const cv::Point3f & viewpoint) const = 0;
368
369 virtual void updateCalibrationQuery(
370 int nodeId,
371 const std::vector<CameraModel> & models,
372 const std::vector<StereoCameraModel> & stereoModels) const = 0;
373
374 virtual void updateDepthImageQuery(
375 int nodeId,
376 const cv::Mat & image,
377 const std::string & format) const = 0;
378
379 virtual void updateLaserScanQuery(
380 int nodeId,
381 const LaserScan & scan) const = 0;
382
383 virtual void addStatisticsQuery(const Statistics & statistics, bool saveWmState) const = 0;
384 virtual void savePreviewImageQuery(const cv::Mat & image) const = 0;
385 virtual cv::Mat loadPreviewImageQuery() const = 0;
386 virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const = 0;
387 virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose = 0) const = 0;
388 virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const = 0;
389 virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
390 virtual void saveOptimizedMeshQuery(
391 const cv::Mat & cloud,
392 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
393#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
394 const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
395#else
396 const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
397#endif
398 const cv::Mat & textures) const = 0;
399 virtual cv::Mat loadOptimizedMeshQuery(
400 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
401#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
402 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
403#else
404 std::vector<std::vector<Eigen::Vector2f> > * texCoords,
405#endif
406 cv::Mat * textures) const = 0;
407 virtual void saveFlannIndexQuery(const std::vector<unsigned char> & indexData) const = 0;
408
409 // Load objects
410 virtual void loadQuery(VWDictionary & dictionary, bool lastStateOnly = true, bool idsOnly = false) const = 0;
411 virtual void loadLastNodesQuery(std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
412 virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
413 virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
414 virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
415
416 virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
417 virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const = 0;
418 virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
419 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;
420 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;
421 virtual void getLastNodeIdsQuery(std::set<int> & ids) const = 0;
422 virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const = 0;
423 virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const = 0;
424 virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks, bool withLandmarks) const = 0;
425 virtual void getLastIdQuery(const std::string & tableName, int & id, const std::string & fieldName="id") const = 0;
426 virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
427 virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map<int, Link> & nodes) const = 0;
428 virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const = 0;
429 virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const = 0;
432private:
434 void beginTransaction() const;
436 void commit() const;
437
438 //non-abstract methods
439 void saveOrUpdate(const std::vector<Signature *> & signatures);
440 void saveOrUpdate(const std::vector<VisualWord *> & words) const;
441
442 //thread stuff
443 virtual void mainLoop();
444
445private:
446 UMutex _transactionMutex;
447 std::map<int, Signature *> _trashSignatures;//<id, Signature*>
448 std::map<int, VisualWord *> _trashVisualWords; //<id, VisualWord*>
449 UMutex _trashesMutex;
450 UMutex _dbSafeAccessMutex;
451 USemaphore _addSem;
452 double _emptyTrashesTime;
453 std::string _url;
454 std::string _targetVersion;
455 bool _timestampUpdate;
456};
457
458}
459
460#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