RTAB-Map 0.23.12
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
341 virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = false) = 0;
342 virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
343 virtual bool isConnectedQuery() const = 0;
344 virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
345 virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
346 virtual long getNodesMemoryUsedQuery() const = 0;
347 virtual long getLinksMemoryUsedQuery() const = 0;
348 virtual long getImagesMemoryUsedQuery() const = 0;
349 virtual long getDepthImagesMemoryUsedQuery() const = 0;
350 virtual long getCalibrationsMemoryUsedQuery() const = 0;
351 virtual long getGridsMemoryUsedQuery() const = 0;
352 virtual long getLaserScansMemoryUsedQuery() const = 0;
353 virtual long getUserDataMemoryUsedQuery() const = 0;
354 virtual long getWordsMemoryUsedQuery() const = 0;
355 virtual long getFeaturesMemoryUsedQuery() const = 0;
356 virtual long getStatisticsMemoryUsedQuery() const = 0;
357 virtual int getLastNodesSizeQuery() const = 0;
358 virtual int getLastDictionarySizeQuery() const = 0;
359 virtual int getTotalNodesSizeQuery() const = 0;
360 virtual int getTotalDictionarySizeQuery() const = 0;
361 virtual ParametersMap getLastParametersQuery() const = 0;
362 virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const = 0;
363 virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const = 0;
364 virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const = 0;
365
366 virtual void executeNoResultQuery(const std::string & sql) const = 0;
367
368 virtual void getWeightQuery(int signatureId, int & weight) const = 0;
369
370 virtual void saveQuery(const std::list<Signature *> & signatures) = 0;
371 virtual void saveQuery(const std::list<VisualWord *> & words) const = 0;
372 virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
373 virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
374
375 virtual void addLinkQuery(const Link & link) const = 0;
376 virtual void updateLinkQuery(const Link & link) const = 0;
377
378 virtual void updateOccupancyGridQuery(
379 int nodeId,
380 const cv::Mat & ground,
381 const cv::Mat & obstacles,
382 const cv::Mat & empty,
383 float cellSize,
384 const cv::Point3f & viewpoint) const = 0;
385
386 virtual void updateCalibrationQuery(
387 int nodeId,
388 const std::vector<CameraModel> & models,
389 const std::vector<StereoCameraModel> & stereoModels) const = 0;
390
391 virtual void updateDepthImageQuery(
392 int nodeId,
393 const cv::Mat & image,
394 const std::string & format) const = 0;
395
396 virtual void updateLaserScanQuery(
397 int nodeId,
398 const LaserScan & scan) const = 0;
399
400 virtual void addStatisticsQuery(const Statistics & statistics, bool saveWmState) const = 0;
401 virtual void savePreviewImageQuery(const cv::Mat & image) const = 0;
402 virtual cv::Mat loadPreviewImageQuery() const = 0;
403 virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const = 0;
404 virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose = 0) const = 0;
405 virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const = 0;
406 virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
407 virtual void saveOptimizedMeshQuery(
408 const cv::Mat & cloud,
409 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
410#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
411 const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
412#else
413 const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
414#endif
415 const cv::Mat & textures) const = 0;
416 virtual cv::Mat loadOptimizedMeshQuery(
417 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
418#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
419 std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
420#else
421 std::vector<std::vector<Eigen::Vector2f> > * texCoords,
422#endif
423 cv::Mat * textures) const = 0;
424 virtual void saveFlannIndexQuery(const std::vector<unsigned char> & indexData) const = 0;
425
426 // Load objects
427 virtual void loadQuery(VWDictionary & dictionary, bool lastStateOnly = true, bool idsOnly = false) const = 0;
428 virtual void loadLastNodesQuery(std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
429 virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures, bool loadWordIdsOnly) const = 0;
430 virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
431 virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
432
433 virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
434 virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, std::vector<StereoCameraModel> & stereoModels) const = 0;
435 virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
436 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;
437 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;
438 virtual void getLastNodeIdsQuery(std::set<int> & ids) const = 0;
439 virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const = 0;
440 virtual void getAllOdomPosesQuery(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const = 0;
441 virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks, bool withLandmarks) const = 0;
442 virtual void getLastIdQuery(const std::string & tableName, int & id, const std::string & fieldName="id") const = 0;
443 virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
444 virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map<int, Link> & nodes) const = 0;
445 virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const = 0;
446 virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const = 0;
449private:
451 void beginTransaction() const;
453 void commit() const;
454
455 //non-abstract methods
456 void saveOrUpdate(const std::vector<Signature *> & signatures);
457 void saveOrUpdate(const std::vector<VisualWord *> & words) const;
458
459 //thread stuff
460 virtual void mainLoop();
461
462private:
463 UMutex _transactionMutex;
464 std::map<int, Signature *> _trashSignatures;//<id, Signature*>
465 std::map<int, VisualWord *> _trashVisualWords; //<id, VisualWord*>
466 // Lock order: _trashesMutex -> _dbSafeAccessMutex -> _transactionMutex.
467 // emptyTrashes() locks _dbSafeAccessMutex before releasing _trashesMutex, so that
468 // an item not found in the trash is guaranteed to be readable from the database.
469 UMutex _trashesMutex;
470 UMutex _dbSafeAccessMutex;
471 USemaphore _addSem;
472 double _emptyTrashesTime;
473 std::string _url;
474 std::string _targetVersion;
475 bool _timestampUpdate;
476};
477
478}
479
480#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