RTAB-Map 0.24.5
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
305 void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws, bool missingWordsExpected = false);
306
307 // Specific queries...
308 void loadNodeData(Signature & signature, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
309 void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
310 void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
311 bool getCalibration(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const;
312 bool getLaserScanInfo(int signatureId, LaserScan & info) const;
313 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;
314 void getLocalFeatures(int signatureId, std::multimap<int, int> & words, std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & points, cv::Mat & descriptors) const;
316 void loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
317 void getWeight(int signatureId, int & weight) const;
318 void getLastNodeIds(std::set<int> & ids) const;
319 void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false, bool ignoreIntermediateNodes = false) const;
320 void getAllOdomPoses(std::map<int, Transform> & poses, bool ignoreChildren = false, bool ignoreIntermediateNodes = false) const;
321 void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true, bool withLandmarks = false) const;
322 void getLastNodeId(int & id) const;
323 void getLastMapId(int & mapId) const;
331 void getLastWordId(int & id, bool lookInFeatures = false) const;
332 void getInvertedIndexNi(int signatureId, int & ni) const;
333 void getNodesObservingLandmark(int landmarkId, std::map<int, Link> & nodes) const;
334 void getNodeIdByLabel(const std::string & label, int & id) const;
335 void getAllLabels(std::map<int, std::string> & labels) const;
338protected:
342 DBDriver(const ParametersMap & parameters = ParametersMap());
343
354 virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = false) = 0;
355 virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
356 virtual bool isConnectedQuery() const = 0;
357 virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
358 virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
359 virtual long getNodesMemoryUsedQuery() const = 0;
360 virtual long getLinksMemoryUsedQuery() const = 0;
361 virtual long getImagesMemoryUsedQuery() const = 0;
362 virtual long getDepthImagesMemoryUsedQuery() const = 0;
363 virtual long getCalibrationsMemoryUsedQuery() const = 0;
364 virtual long getGridsMemoryUsedQuery() const = 0;
365 virtual long getLaserScansMemoryUsedQuery() const = 0;
366 virtual long getUserDataMemoryUsedQuery() const = 0;
367 virtual long getWordsMemoryUsedQuery() const = 0;
368 virtual long getFeaturesMemoryUsedQuery() const = 0;
369 virtual long getStatisticsMemoryUsedQuery() const = 0;
370 virtual int getLastNodesSizeQuery() const = 0;
371 virtual int getLastDictionarySizeQuery() const = 0;
372 virtual int getTotalNodesSizeQuery() const = 0;
373 virtual int getTotalDictionarySizeQuery() const = 0;
374 virtual ParametersMap getLastParametersQuery() const = 0;
375 virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const = 0;
376 virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const = 0;
377 virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const = 0;
378
379 virtual void executeNoResultQuery(const std::string & sql) const = 0;
380
381 virtual void getWeightQuery(int signatureId, int & weight) const = 0;
382
383 virtual void saveQuery(const std::list<Signature *> & signatures) = 0;
384 virtual void saveQuery(const std::list<VisualWord *> & words) const = 0;
385 virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
386 virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
387
388 virtual void addLinkQuery(const Link & link) const = 0;
389 virtual void updateLinkQuery(const Link & link) const = 0;
390
391 virtual void updateOccupancyGridQuery(
392 int nodeId,
393 const cv::Mat & ground,
394 const cv::Mat & obstacles,
395 const cv::Mat & empty,
396 float cellSize,
397 const cv::Point3f & viewpoint) const = 0;
398
399 virtual void updateCalibrationQuery(
400 int nodeId,
401 const std::vector<CameraModel> & models,
402 const std::vector<StereoCameraModel> & stereoModels) const = 0;
403
404 virtual void updateDepthImageQuery(
405 int nodeId,
406 const cv::Mat & image,
407 const std::string & format) const = 0;
408
409 virtual void updateLaserScanQuery(
410 int nodeId,
411 const LaserScan & scan) const = 0;
412
413 virtual void addStatisticsQuery(const Statistics & statistics, bool saveWmState) const = 0;
414 virtual void savePreviewImageQuery(const cv::Mat & image) const = 0;
415 virtual cv::Mat loadPreviewImageQuery() const = 0;
416 virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const = 0;
417 virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose = 0) const = 0;
418 virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const = 0;
419 virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
420 virtual void saveOptimizedMeshQuery(
421 const cv::Mat & cloud,
422 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
423#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
424 const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
425#else
426 const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
427#endif
428 const cv::Mat & textures) const = 0;
429 virtual cv::Mat loadOptimizedMeshQuery(
430 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
431#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
432 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
433#else
434 std::vector<std::vector<Eigen::Vector2f> > * texCoords,
435#endif
436 cv::Mat * textures) const = 0;
437 virtual void saveFlannIndexQuery(const std::vector<unsigned char> & indexData) const = 0;
438
439 // Load objects
440 virtual void loadQuery(VWDictionary & dictionary, bool lastStateOnly = true, bool idsOnly = false) const = 0;
441 virtual void loadLastNodesQuery(std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
442 virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
443 virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws, bool missingWordsExpected) const = 0;
444 virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
445
446 virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
447 virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const = 0;
448 virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
449 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;
450 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;
451 virtual void getLastNodeIdsQuery(std::set<int> & ids) const = 0;
452 virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const = 0;
453 virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const = 0;
454 virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks, bool withLandmarks) const = 0;
455 virtual void getLastIdQuery(const std::string & tableName, int & id, const std::string & fieldName="id") const = 0;
456 virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
457 virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map<int, Link> & nodes) const = 0;
458 virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const = 0;
459 virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const = 0;
462private:
464 void beginTransaction() const;
466 void commit() const;
467
468 //non-abstract methods
469 void saveOrUpdate(const std::vector<Signature *> & signatures);
470 void saveOrUpdate(const std::vector<VisualWord *> & words) const;
471
472 //thread stuff
473 virtual void mainLoop();
474
475private:
476 UMutex _transactionMutex;
477 std::map<int, Signature *> _trashSignatures;//<id, Signature*>
478 std::map<int, VisualWord *> _trashVisualWords; //<id, VisualWord*>
479 // Lock order: _trashesMutex -> _dbSafeAccessMutex -> _transactionMutex.
480 // emptyTrashes() locks _dbSafeAccessMutex before releasing _trashesMutex, so that
481 // an item not found in the trash is guaranteed to be readable from the database.
482 UMutex _trashesMutex;
483 UMutex _dbSafeAccessMutex;
484 USemaphore _addSem;
485 double _emptyTrashesTime;
486 std::string _url;
487 std::string _targetVersion;
488 bool _timestampUpdate;
489};
490
491}
492
493#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 loadWords(const std::set< int > &wordIds, std::list< VisualWord * > &vws, bool missingWordsExpected=false)
Load words by id (trash first, then the database); returned words must be freed after usage.
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.
void getLastWordId(int &id, bool lookInFeatures=false) const
Get the largest word id of the dictionary (trash and Word table).
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