tools/Info/main.cpp
Go to the documentation of this file.
1 /*
2 Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
3 All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, 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 
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 ON 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
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 
28 #include <stdio.h>
29 #include <string.h>
30 #include <stdlib.h>
31 #include <signal.h>
32 
33 #include <rtabmap/core/DBDriver.h>
35 #include <rtabmap/core/Graph.h>
37 #include "rtabmap/utilite/UFile.h"
38 #include "rtabmap/utilite/UStl.h"
39 
40 using namespace rtabmap;
41 
42 #ifdef _WIN32
43 #include <Windows.h>
44 #define COLOR_NORMAL FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
45 #define COLOR_RED FOREGROUND_RED | FOREGROUND_INTENSITY
46 #define COLOR_GREEN FOREGROUND_GREEN
47 #define COLOR_YELLOW FOREGROUND_GREEN | FOREGROUND_RED
48 #else
49 #define COLOR_NORMAL "\033[0m"
50 #define COLOR_RED "\033[31m"
51 #define COLOR_GREEN "\033[32m"
52 #define COLOR_YELLOW "\033[33m"
53 #endif
54 
55 void showUsage()
56 {
57  printf("\nUsage:\n"
58  "rtabmap-info [options] \"map.db\"\n"
59  " Options:\n"
60  " --diff Show only modified parameters.\n"
61  " --diff \"other_map.db\" Compare parameters with other database.\n"
62  "\n");
63  exit(1);
64 }
65 
66 std::string pad(const std::string & title, int padding = 20)
67 {
68  int emptySize = padding - (int)title.size();
69  if(emptySize>0)
70  {
71  return title + std::string(emptySize, ' ');
72  }
73  return title;
74 }
75 
76 int main(int argc, char * argv[])
77 {
78  if(argc < 2)
79  {
80  showUsage();
81  }
82 
83  std::string otherDatabasePath;
84  bool diff = false;
85  for(int i=1; i<argc-1; ++i)
86  {
87  if(strcmp(argv[i], "--diff") == 0)
88  {
89  ++i;
90  if(i<argc-1)
91  {
92  otherDatabasePath = uReplaceChar(argv[i], '~', UDirectory::homeDir());
93  printf("Comparing with other database \"%s\"...\n", otherDatabasePath.c_str());
94  }
95  diff = true;
96  }
97  }
98 
99  std::string databasePath = uReplaceChar(argv[argc-1], '~', UDirectory::homeDir());
100  if(!UFile::exists(databasePath))
101  {
102  printf("Database \"%s\" doesn't exist!\n", databasePath.c_str());
103  return -1;
104  }
105 
106  DBDriver * driver = DBDriver::create();
107  if(!driver->openConnection(databasePath))
108  {
109  printf("Cannot open database \"%s\".\n", databasePath.c_str());
110  delete driver;
111  return -1;
112  }
113 
114  ParametersMap parameters = driver->getLastParameters();
115  ParametersMap defaultParameters = Parameters::getDefaultParameters();
117  std::string otherDatabasePathName;
118  if(!otherDatabasePath.empty())
119  {
120  driver->closeConnection(false);
121 
122  if(!UFile::exists(otherDatabasePath))
123  {
124  printf("Database \"%s\" doesn't exist!\n", otherDatabasePath.c_str());
125  delete driver;
126  return -1;
127  }
128 
129  if(!driver->openConnection(otherDatabasePath))
130  {
131  printf("Cannot open database \"%s\".\n", otherDatabasePath.c_str());
132  delete driver;
133  return -1;
134  }
135  otherDatabasePathName = UFile::getName(otherDatabasePath);
136  defaultParameters = driver->getLastParameters();
137  removedParameters.clear();
138  }
139 
140 #ifdef _WIN32
141  HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
142 #endif
143  int padding = 35;
144  std::cout << ("Parameters (Yellow=modified, Red=old parameter not used anymore, NA=not in database):\n");
145  for(ParametersMap::iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
146  {
147  ParametersMap::const_iterator jter = defaultParameters.find(iter->first);
148  std::string defaultValue;
149  bool defaultValueSet = false;
150  if(jter == defaultParameters.end())
151  {
152  jter = removedParameters.find(iter->first);
153  if(jter != removedParameters.end())
154  {
155  defaultValue = jter->second;
156  defaultValueSet = true;
157  }
158  }
159  else
160  {
161  defaultValue = jter->second;
162  defaultValueSet = true;
163  }
164 
165  if(defaultValueSet &&
166  iter->second.compare(defaultValue) != 0 &&
167  iter->first.compare(Parameters::kRtabmapWorkingDirectory()) != 0)
168  {
169  bool different = true;
170  if(Parameters::getType(iter->first).compare("double") ==0 ||
171  Parameters::getType(iter->first).compare("float") == 0)
172  {
173  if(uStr2Double(iter->second) == uStr2Double(defaultValue))
174  {
175  different = false;
176  }
177  }
178 
179  if(different)
180  {
181  //yellow
182 #ifdef _WIN32
183  SetConsoleTextAttribute(H,COLOR_YELLOW);
184 #else
185  printf("%s", COLOR_YELLOW);
186 #endif
187  std::cout << (uFormat("%s%s (%s=%s)\n", pad(iter->first + "=", padding).c_str(), iter->second.c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str(), defaultValue.c_str()));
188  }
189  else if(!diff)
190  {
191  //green
192 #ifdef _WIN32
193  SetConsoleTextAttribute(H,COLOR_NORMAL);
194 #else
195  printf("%s", COLOR_NORMAL);
196 #endif
197  std::cout << (uFormat("%s%s\n", pad(iter->first + "=", padding).c_str(), iter->second.c_str()));
198  }
199  }
200  else if(!defaultValueSet)
201  {
202  //red
203 #ifdef _WIN32
204  SetConsoleTextAttribute(H,COLOR_RED);
205 #else
206  printf("%s", COLOR_RED);
207 #endif
208  std::cout << (uFormat("%s%s (%s=NA)\n", pad(iter->first + "=", padding).c_str(), iter->second.c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str()));
209  }
210  else if(!diff)
211  {
212  //green
213 #ifdef _WIN32
214  SetConsoleTextAttribute(H,COLOR_NORMAL);
215 #else
216  printf("%s", COLOR_NORMAL);
217 #endif
218  std::cout << (uFormat("%s%s\n", pad(iter->first + "=", padding).c_str(), iter->second.c_str()));
219  }
220 #ifdef _WIN32
221  SetConsoleTextAttribute(H,COLOR_NORMAL);
222 #else
223  printf("%s", COLOR_NORMAL);
224 #endif
225  }
226 
227  for(ParametersMap::iterator iter=defaultParameters.begin(); iter!=defaultParameters.end(); ++iter)
228  {
229  ParametersMap::const_iterator jter = parameters.find(iter->first);
230  if(jter == parameters.end())
231  {
232  //red
233 #ifdef _WIN32
234  SetConsoleTextAttribute(H,COLOR_RED);
235 #else
236  printf("%s", COLOR_RED);
237 #endif
238  std::cout << (uFormat("%sNA (%s=\"%s\")\n", pad(iter->first + "=", padding).c_str(), otherDatabasePath.empty()?"default":otherDatabasePathName.c_str(), iter->second.c_str()));
239 
240 #ifdef _WIN32
241  SetConsoleTextAttribute(H,COLOR_NORMAL);
242 #else
243  printf("%s", COLOR_NORMAL);
244 #endif
245  }
246  }
247 
248  if(otherDatabasePath.empty())
249  {
250  printf("\nInfo:\n\n");
251  std::string info;
252  std::set<int> ids;
253  driver->getAllNodeIds(ids);
254  Transform lastLocalization;
255  std::map<int, Transform> optimizedPoses = driver->loadOptimizedPoses(&lastLocalization);
256  cv::Vec3f min, max;
257  if(!optimizedPoses.empty())
258  {
259  graph::computeMinMax(optimizedPoses, min, max);
260  }
261  std::multimap<int, int> mapIdsLinkedToLastGraph;
262  int lastMapId=0;
263  double previousStamp = 0.0f;
264  Transform previousPose;
265  float infoTotalOdom = 0.0f;
266  double infoTotalTime = 0.0f;
267  int sessions = !ids.empty()?1:0;
268  int odomPoses = 0;
269  int gtPoses = 0;
270  int gpsValues = 0;
271  for(std::set<int>::iterator iter=ids.begin(); iter!=ids.end(); ++iter)
272  {
273  Transform p, g;
274  int w;
275  std::string l;
276  double s;
277  int mapId;
278  std::vector<float> v;
279  GPS gps;
280  EnvSensors sensors;
281  int id = *iter;
282  driver->getNodeInfo(id, p, mapId, w, l, s, g, v, gps, sensors);
283  if(!p.isNull())
284  {
285  ++odomPoses;
286  }
287  if(!g.isNull())
288  {
289  ++gtPoses;
290  }
291  if(gps.stamp()>0.0)
292  {
293  ++gpsValues;
294  }
295  if(optimizedPoses.find(id) != optimizedPoses.end())
296  {
297  mapIdsLinkedToLastGraph.insert(std::make_pair(mapId, id));
298  }
299  if(iter!=ids.begin())
300  {
301  if(lastMapId == mapId)
302  {
303  if(!p.isNull() && !previousPose.isNull())
304  {
305  infoTotalOdom += p.getDistance(previousPose);
306  }
307 
308  if(previousStamp > 0.0 && s > 0.0)
309  {
310  infoTotalTime += s-previousStamp;
311  }
312  }
313  else
314  {
315  ++sessions;
316  }
317  }
318  lastMapId = mapId;
319  previousStamp=s;
320  previousPose=p;
321  }
322  std::cout << (uFormat("%s%s\n", pad("Path:").c_str(), driver->getUrl().c_str()));
323  std::cout << (uFormat("%s%s\n", pad("Version:").c_str(), driver->getDatabaseVersion().c_str()));
324  std::cout << (uFormat("%s%d\n", pad("Sessions:").c_str(), sessions));
325  std::multimap<int, Link> links;
326  driver->getAllLinks(links, true, true);
327  bool reducedGraph = false;
328  std::vector<int> linkTypes(Link::kEnd, 0);
329  for(std::multimap<int, Link>::iterator iter=links.begin(); iter!=links.end(); ++iter)
330  {
331  if(iter->second.type() == Link::kNeighborMerged)
332  {
333  reducedGraph = true;
334  }
335  if(iter->second.type()>=0 && iter->second.type()<Link::kEnd)
336  {
337  ++linkTypes[iter->second.type()];
338  }
339  }
340  if(reducedGraph)
341  {
342  std::cout << (uFormat("%s%f m (approx. as graph has been reduced)\n", pad("Total odom:").c_str(), infoTotalOdom));
343  }
344  else
345  {
346  std::cout << (uFormat("%s%f m\n", pad("Total odometry length:").c_str(), infoTotalOdom));
347  }
348 
349  std::stringstream sessionsInOptGraphStr;
350  std::list<int> mapsLinkedToLastGraph = uUniqueKeys(mapIdsLinkedToLastGraph);
351  for(std::list<int>::iterator iter=mapsLinkedToLastGraph.begin(); iter!=mapsLinkedToLastGraph.end(); ++iter)
352  {
353  if(iter!=mapsLinkedToLastGraph.begin())
354  {
355  sessionsInOptGraphStr << ", ";
356  }
357  sessionsInOptGraphStr << *iter << "(" << mapIdsLinkedToLastGraph.count(*iter) << ")";
358  }
359 
360  int lastWordIdId = 0;
361  int wordsDim = 0;
362  int wordsType = 0;
363  driver->getLastWordId(lastWordIdId);
364  if(lastWordIdId>0)
365  {
366  std::set<int> ids;
367  ids.insert(lastWordIdId);
368  std::list<VisualWord *> vws;
369  driver->loadWords(ids, vws);
370  if(!vws.empty())
371  {
372  wordsDim = vws.front()->getDescriptor().cols;
373  wordsType = vws.front()->getDescriptor().type();
374  delete vws.front();
375  vws.clear();
376  }
377  }
378 
379  std::cout << (uFormat("%s%fs\n", pad("Total time:").c_str(), infoTotalTime));
380  std::cout << (uFormat("%s%d nodes and %d words (dim=%d type=%s)\n", pad("LTM:").c_str(), (int)ids.size(), driver->getTotalDictionarySize(), wordsDim, wordsType==CV_8UC1?"8U":wordsType==CV_32FC1?"32F":uNumber2Str(wordsType).c_str()));
381  std::cout << (uFormat("%s%d nodes and %d words\n", pad("WM:").c_str(), driver->getLastNodesSize(), driver->getLastDictionarySize()));
382  std::cout << (uFormat("%s%d poses and %d links\n", pad("Global graph:").c_str(), odomPoses, links.size()));
383  std::cout << (uFormat("%s%d poses (x=%d->%d, y=%d->%d, z=%d->%d)\n", pad("Optimized graph:").c_str(), (int)optimizedPoses.size(), links.size(), (int)min[0], (int)max[0], (int)min[1], (int)max[1], min[2], (int)max[2]));
384  std::cout << (uFormat("%s%d/%d [%s]\n", pad("Maps in graph:").c_str(), (int)mapsLinkedToLastGraph.size(), sessions, sessionsInOptGraphStr.str().c_str()));
385  std::cout << (uFormat("%s%d poses\n", pad("Ground truth:").c_str(), gtPoses));
386  std::cout << (uFormat("%s%d poses\n", pad("GPS:").c_str(), gpsValues));
387  std::cout << (uFormat("Links:\n"));
388  for(size_t i=0; i<linkTypes.size(); ++i)
389  {
390  std::cout << (uFormat("%s%d\n", pad(uFormat(" %s:", Link::typeName((Link::Type)i).c_str())).c_str(), linkTypes[i]));
391  }
392  std::cout << ("\n");
393  long total = 0;
394  long dbSize = UFile::length(driver->getUrl());
395  long mem = dbSize;
396  std::cout << (uFormat("%s%d %s\n", pad("Database size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes"));
397  mem = driver->getNodesMemoryUsed();
398  total+=mem;
399  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Nodes size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
400  mem = driver->getLinksMemoryUsed();
401  total+=mem;
402  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Links size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
403  mem = driver->getImagesMemoryUsed();
404  total+=mem;
405  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("RGB Images size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
406  mem = driver->getDepthImagesMemoryUsed();
407  total+=mem;
408  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Depth Images size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
409  mem = driver->getCalibrationsMemoryUsed();
410  total+=mem;
411  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Calibrations size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
412  mem = driver->getGridsMemoryUsed();
413  total+=mem;
414  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Grids size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
415  mem = driver->getLaserScansMemoryUsed();
416  total+=mem;
417  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Scans size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
418  mem = driver->getUserDataMemoryUsed();
419  total+=mem;
420  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("User data size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
421  mem = driver->getWordsMemoryUsed();
422  total+=mem;
423  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Dictionary size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
424  mem = driver->getFeaturesMemoryUsed();
425  total+=mem;
426  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Features size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
427  mem = driver->getStatisticsMemoryUsed();
428  total+=mem;
429  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Statistics size:").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
430  mem = dbSize - total;
431  std::cout << (uFormat("%s%d %s\t(%.2f%%)\n", pad("Other (indexing, unused):").c_str(), mem>1000000?mem/1000000:mem>1000?mem/1000:mem, mem>1000000?"MB":mem>1000?"KB":"Bytes", dbSize>0?double(mem)/double(dbSize)*100.0:0.0));
432  std::cout << ("\n");
433  }
434 
435  return 0;
436 }
static std::string homeDir()
Definition: UDirectory.cpp:355
std::list< K > uUniqueKeys(const std::multimap< K, V > &mm)
Definition: UStl.h:46
long getWordsMemoryUsed() const
Definition: DBDriver.cpp:183
#define COLOR_NORMAL
std::string getName()
Definition: UFile.h:135
const double & stamp() const
Definition: GPS.h:59
long length()
Definition: UFile.h:110
GLM_FUNC_DECL genType min(genType const &x, genType const &y)
void showUsage()
void loadWords(const std::set< int > &wordIds, std::list< VisualWord *> &vws)
Definition: DBDriver.cpp:606
long getStatisticsMemoryUsed() const
Definition: DBDriver.cpp:199
double UTILITE_EXP uStr2Double(const std::string &str)
long getFeaturesMemoryUsed() const
Definition: DBDriver.cpp:191
std::map< std::string, std::string > ParametersMap
Definition: Parameters.h:43
int main(int argc, char *argv[])
long getNodesMemoryUsed() const
Definition: DBDriver.cpp:119
std::map< int, Transform > loadOptimizedPoses(Transform *lastlocalizationPose=0) const
Definition: DBDriver.cpp:1187
bool openConnection(const std::string &url, bool overwritten=false)
Definition: DBDriver.cpp:86
void getAllLinks(std::multimap< int, Link > &links, bool ignoreNullLinks=true, bool withLandmarks=false) const
Definition: DBDriver.cpp:915
long getLaserScansMemoryUsed() const
Definition: DBDriver.cpp:167
Wrappers of STL for convenient functions.
int getTotalDictionarySize() const
Definition: DBDriver.cpp:231
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
Definition: DBDriver.cpp:776
static const ParametersMap & getBackwardCompatibilityMap()
Definition: Parameters.cpp:447
void closeConnection(bool save=true, const std::string &outputUrl="")
Definition: DBDriver.cpp:64
void getAllNodeIds(std::set< int > &ids, bool ignoreChildren=false, bool ignoreBadSignatures=false, bool ignoreIntermediateNodes=false) const
Definition: DBDriver.cpp:876
long getGridsMemoryUsed() const
Definition: DBDriver.cpp:159
std::string UTILITE_EXP uReplaceChar(const std::string &str, char before, char after)
Definition: UConversion.cpp:33
static DBDriver * create(const ParametersMap &parameters=ParametersMap())
Definition: DBDriver.cpp:41
long getCalibrationsMemoryUsed() const
Definition: DBDriver.cpp:151
float getDistance(const Transform &t) const
Definition: Transform.cpp:283
bool isNull() const
Definition: Transform.cpp:107
static std::string getType(const std::string &paramKey)
Definition: Parameters.cpp:467
int getLastNodesSize() const
Definition: DBDriver.cpp:207
static const ParametersMap & getDefaultParameters()
Definition: Parameters.h:807
void RTABMAP_EXP computeMinMax(const std::map< int, Transform > &poses, cv::Vec3f &min, cv::Vec3f &max)
Definition: Graph.cpp:2329
void getLastWordId(int &id) const
Definition: DBDriver.cpp:993
GLM_FUNC_DECL genType max(genType const &x, genType const &y)
bool exists()
Definition: UFile.h:104
#define COLOR_YELLOW
long getDepthImagesMemoryUsed() const
Definition: DBDriver.cpp:143
diff
ParametersMap getLastParameters() const
Definition: DBDriver.cpp:239
long getImagesMemoryUsed() const
Definition: DBDriver.cpp:135
std::string getDatabaseVersion() const
Definition: DBDriver.cpp:275
int getLastDictionarySize() const
Definition: DBDriver.cpp:215
std::map< EnvSensor::Type, EnvSensor > EnvSensors
Definition: EnvSensor.h:81
std::string pad(const std::string &title, int padding=20)
long getUserDataMemoryUsed() const
Definition: DBDriver.cpp:175
#define COLOR_RED
std::string UTILITE_EXP uFormat(const char *fmt,...)
long getLinksMemoryUsed() const
Definition: DBDriver.cpp:127
std::string UTILITE_EXP uNumber2Str(unsigned int number)
Definition: UConversion.cpp:91
const std::string & getUrl() const
Definition: DBDriver.h:72


rtabmap
Author(s): Mathieu Labbe
autogenerated on Mon Jan 23 2023 03:37:29