DBDriver.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 "rtabmap/core/DBDriver.h"
29 
30 #include "rtabmap/core/Signature.h"
34 #include "rtabmap/utilite/UMath.h"
36 #include "rtabmap/utilite/UTimer.h"
37 #include "rtabmap/utilite/UStl.h"
38 
39 namespace rtabmap {
40 
42 {
43  return new DBDriverSqlite3(parameters);
44 }
45 
46 DBDriver::DBDriver(const ParametersMap & parameters) :
47  _emptyTrashesTime(0),
48  _timestampUpdate(true)
49 {
50  this->parseParameters(parameters);
51 }
52 
54 {
55  join(true);
56  this->emptyTrashes();
57 }
58 
59 void DBDriver::parseParameters(const ParametersMap & parameters)
60 {
61  Parameters::parse(parameters, Parameters::kDbTargetVersion(), _targetVersion);
62 }
63 
64 void DBDriver::closeConnection(bool save, const std::string & outputUrl)
65 {
66  UDEBUG("isRunning=%d", this->isRunning());
67  this->join(true);
68  UDEBUG("");
69  if(save)
70  {
71  this->emptyTrashes();
72  }
73  else
74  {
76  _trashSignatures.clear();
77  _trashVisualWords.clear();
79  }
81  this->disconnectDatabaseQuery(save, outputUrl);
83  UDEBUG("");
84 }
85 
86 bool DBDriver::openConnection(const std::string & url, bool overwritten)
87 {
88  UDEBUG("");
89  _url = url;
91  if(this->connectDatabaseQuery(url, overwritten))
92  {
94  return true;
95  }
97  return false;
98 }
99 
101 {
102  bool r;
104  r = isConnectedQuery();
106  return r;
107 }
108 
109 // In bytes
110 unsigned long DBDriver::getMemoryUsed() const
111 {
112  unsigned long bytes;
116  return bytes;
117 }
118 
120 {
121  long bytes;
125  return bytes;
126 }
128 {
129  long bytes;
133  return bytes;
134 }
136 {
137  long bytes;
141  return bytes;
142 }
144 {
145  long bytes;
149  return bytes;
150 }
152 {
153  long bytes;
157  return bytes;
158 }
160 {
161  long bytes;
165  return bytes;
166 }
168 {
169  long bytes;
173  return bytes;
174 }
176 {
177  long bytes;
181  return bytes;
182 }
184 {
185  long bytes;
189  return bytes;
190 }
192 {
193  long bytes;
197  return bytes;
198 }
200 {
201  long bytes;
205  return bytes;
206 }
208 {
209  int nodes;
213  return nodes;
214 }
216 {
217  int words;
219  words = getLastDictionarySizeQuery();
221  return words;
222 }
224 {
225  int words;
227  words = getTotalNodesSizeQuery();
229  return words;
230 }
232 {
233  int words;
235  words = getTotalDictionarySizeQuery();
237  return words;
238 }
240 {
241  ParametersMap parameters;
243  parameters = getLastParametersQuery();
245  return parameters;
246 }
247 
248 std::map<std::string, float> DBDriver::getStatistics(int nodeId, double & stamp, std::vector<int> * wmState) const
249 {
250  std::map<std::string, float> statistics;
252  statistics = getStatisticsQuery(nodeId, stamp, wmState);
254  return statistics;
255 }
256 
257 std::map<int, std::pair<std::map<std::string, float>, double> > DBDriver::getAllStatistics() const
258 {
259  std::map<int, std::pair<std::map<std::string, float>, double> > statistics;
261  statistics = getAllStatisticsQuery();
263  return statistics;
264 }
265 
266 std::map<int, std::vector<int> > DBDriver::getAllStatisticsWmStates() const
267 {
268  std::map<int, std::vector<int> > wmStates;
270  wmStates = getAllStatisticsWmStatesQuery();
272  return wmStates;
273 }
274 
275 std::string DBDriver::getDatabaseVersion() const
276 {
277  std::string version = "0.0.0";
281  return version;
282 }
283 
285 {
286  this->emptyTrashes();
287  this->kill(); // Do it only once
288 }
289 
291 {
293  ULOGGER_DEBUG("");
294  this->executeNoResultQuery("BEGIN TRANSACTION;");
295 }
296 
297 void DBDriver::commit() const
298 {
299  ULOGGER_DEBUG("");
300  this->executeNoResultQuery("COMMIT;");
302 }
303 
304 void DBDriver::executeNoResult(const std::string & sql) const
305 {
307  this->executeNoResultQuery(sql);
309 }
310 
311 void DBDriver::emptyTrashes(bool async)
312 {
313  if(async)
314  {
315  ULOGGER_DEBUG("Async emptying, start the trash thread");
316  this->start();
317  return;
318  }
319 
320  UTimer totalTime;
321  totalTime.start();
322 
323  std::map<int, Signature*> signatures;
324  std::map<int, VisualWord*> visualWords;
326  {
327  ULOGGER_DEBUG("signatures=%d, visualWords=%d", _trashSignatures.size(), _trashVisualWords.size());
328  signatures = _trashSignatures;
329  visualWords = _trashVisualWords;
330  _trashSignatures.clear();
331  _trashVisualWords.clear();
332 
334  }
336 
337  if(signatures.size() || visualWords.size())
338  {
339  this->beginTransaction();
340  UTimer timer;
341  timer.start();
342  if(signatures.size())
343  {
344  if(this->isConnected())
345  {
346  //Only one query to the database
347  this->saveOrUpdate(uValues(signatures));
348  }
349 
350  for(std::map<int, Signature *>::iterator iter=signatures.begin(); iter!=signatures.end(); ++iter)
351  {
352  delete iter->second;
353  }
354  signatures.clear();
355  ULOGGER_DEBUG("Time emptying memory signatures trash = %f...", timer.ticks());
356  }
357  if(visualWords.size())
358  {
359  if(this->isConnected())
360  {
361  //Only one query to the database
362  this->saveOrUpdate(uValues(visualWords));
363  }
364 
365  for(std::map<int, VisualWord *>::iterator iter=visualWords.begin(); iter!=visualWords.end(); ++iter)
366  {
367  delete (*iter).second;
368  }
369  visualWords.clear();
370  ULOGGER_DEBUG("Time emptying memory visualWords trash = %f...", timer.ticks());
371  }
372 
373  this->commit();
374  }
375 
376  _emptyTrashesTime = totalTime.ticks();
377  ULOGGER_DEBUG("Total time emptying trashes = %fs...", _emptyTrashesTime);
378 
380 }
381 
383 {
384  if(s)
385  {
386  UDEBUG("s=%d", s->id());
388  {
389  _trashSignatures.insert(std::pair<int, Signature*>(s->id(), s));
390  }
392  }
393 }
394 
396 {
397  if(vw)
398  {
400  {
401  _trashVisualWords.insert(std::pair<int, VisualWord*>(vw->id(), vw));
402  }
404  }
405 }
406 
407 void DBDriver::saveOrUpdate(const std::vector<Signature *> & signatures)
408 {
409  ULOGGER_DEBUG("");
410  std::list<Signature *> toSave;
411  std::list<Signature *> toUpdate;
412  if(this->isConnected() && signatures.size())
413  {
414  for(std::vector<Signature *>::const_iterator i=signatures.begin(); i!=signatures.end();++i)
415  {
416  if((*i)->isSaved())
417  {
418  toUpdate.push_back(*i);
419  }
420  else
421  {
422  toSave.push_back(*i);
423  }
424  }
425 
426  if(toUpdate.size())
427  {
428  this->updateQuery(toUpdate, _timestampUpdate);
429  }
430  if(toSave.size())
431  {
432  this->saveQuery(toSave);
433  }
434  }
435 }
436 
437 void DBDriver::saveOrUpdate(const std::vector<VisualWord *> & words) const
438 {
439  ULOGGER_DEBUG("words.size=%d", (int)words.size());
440  std::list<VisualWord *> toSave;
441  std::list<VisualWord *> toUpdate;
442  if(this->isConnected() && words.size())
443  {
444  for(std::vector<VisualWord *>::const_iterator i=words.begin(); i!=words.end();++i)
445  {
446  if((*i)->isSaved())
447  {
448  toUpdate.push_back(*i);
449  }
450  else
451  {
452  toSave.push_back(*i);
453  }
454  }
455 
456  if(toUpdate.size())
457  {
458  this->updateQuery(toUpdate, _timestampUpdate);
459  }
460  if(toSave.size())
461  {
462  this->saveQuery(toSave);
463  }
464  }
465 }
466 
467 void DBDriver::addLink(const Link & link)
468 {
470  this->addLinkQuery(link);
472 }
473 void DBDriver::removeLink(int from, int to)
474 {
475  this->executeNoResult(uFormat("DELETE FROM Link WHERE from_id=%d and to_id=%d", from, to).c_str());
476 }
477 void DBDriver::updateLink(const Link & link)
478 {
480  this->updateLinkQuery(link);
482 }
484  int nodeId,
485  const cv::Mat & ground,
486  const cv::Mat & obstacles,
487  const cv::Mat & empty,
488  float cellSize,
489  const cv::Point3f & viewpoint)
490 {
492  //just to make sure the occupancy grids are compressed for convenience
494  data.setOccupancyGrid(ground, obstacles, empty, cellSize, viewpoint);
496  nodeId,
497  data.gridGroundCellsCompressed(),
498  data.gridObstacleCellsCompressed(),
499  data.gridEmptyCellsCompressed(),
500  cellSize,
501  viewpoint);
503 }
504 
505 void DBDriver::updateCalibration(int nodeId, const std::vector<CameraModel> & models, const std::vector<StereoCameraModel> & stereoModels)
506 {
509  nodeId,
510  models,
511  stereoModels);
513 }
514 
515 void DBDriver::updateDepthImage(int nodeId, const cv::Mat & image, const std::string & format)
516 {
518  this->updateDepthImageQuery(
519  nodeId,
520  image,
521  format);
523 }
524 
525 void DBDriver::updateLaserScan(int nodeId, const LaserScan & scan)
526 {
528  this->updateLaserScanQuery(
529  nodeId,
530  scan);
532 }
533 
534 void DBDriver::load(VWDictionary * dictionary, bool lastStateOnly) const
535 {
537  this->loadQuery(dictionary, lastStateOnly);
539 }
540 
541 void DBDriver::loadLastNodes(std::list<Signature *> & signatures) const
542 {
544  this->loadLastNodesQuery(signatures);
546 }
547 
548 Signature * DBDriver::loadSignature(int id, bool * loadedFromTrash)
549 {
550  std::list<int> ids;
551  ids.push_back(id);
552  std::list<Signature*> signatures;
553  std::set<int> loadedFromTrashSet;
554  loadSignatures(ids, signatures, &loadedFromTrashSet);
555  if(loadedFromTrash && loadedFromTrashSet.size())
556  {
557  *loadedFromTrash = true;
558  }
559  if(!signatures.empty())
560  {
561  return signatures.front();
562  }
563  return 0;
564 }
565 void DBDriver::loadSignatures(const std::list<int> & signIds,
566  std::list<Signature *> & signatures,
567  std::set<int> * loadedFromTrash)
568 {
569  UDEBUG("");
570  // look up in the trash before the database
571  std::list<int> ids = signIds;
572  bool valueFound = false;
574  {
575  for(std::list<int>::iterator iter = ids.begin(); iter != ids.end();)
576  {
577  valueFound = false;
578  for(std::map<int, Signature*>::iterator sIter = _trashSignatures.begin(); sIter!=_trashSignatures.end();)
579  {
580  if(sIter->first == *iter)
581  {
582  signatures.push_back(sIter->second);
583  _trashSignatures.erase(sIter++);
584 
585  valueFound = true;
586  break;
587  }
588  else
589  {
590  ++sIter;
591  }
592  }
593  if(valueFound)
594  {
595  if(loadedFromTrash)
596  {
597  loadedFromTrash->insert(*iter);
598  }
599  iter = ids.erase(iter);
600  }
601  else
602  {
603  ++iter;
604  }
605  }
606  }
608  UDEBUG("");
609  if(ids.size())
610  {
612  this->loadSignaturesQuery(ids, signatures);
614  }
615 }
616 
617 void DBDriver::loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws)
618 {
619  // look up in the trash before the database
620  std::set<int> ids = wordIds;
621  std::map<int, VisualWord*>::iterator wIter;
622  std::list<VisualWord *> puttedBack;
624  {
625  if(_trashVisualWords.size())
626  {
627  for(std::set<int>::iterator iter = ids.begin(); iter != ids.end();)
628  {
629  UASSERT(*iter>0);
630  wIter = _trashVisualWords.find(*iter);
631  if(wIter != _trashVisualWords.end())
632  {
633  UDEBUG("put back word %d from trash", *iter);
634  puttedBack.push_back(wIter->second);
635  _trashVisualWords.erase(wIter);
636  ids.erase(iter++);
637  }
638  else
639  {
640  ++iter;
641  }
642  }
643  }
644  }
646  if(ids.size())
647  {
649  this->loadWordsQuery(ids, vws);
651  uAppend(vws, puttedBack);
652  }
653  else if(puttedBack.size())
654  {
655  uAppend(vws, puttedBack);
656  }
657 }
658 
659 void DBDriver::loadNodeData(Signature * signature, bool images, bool scan, bool userData, bool occupancyGrid) const
660 {
661  std::list<Signature *> signatures;
662  signatures.push_back(signature);
663  this->loadNodeData(signatures, images, scan, userData, occupancyGrid);
664 }
665 
666 void DBDriver::loadNodeData(std::list<Signature *> & signatures, bool images, bool scan, bool userData, bool occupancyGrid) const
667 {
668  // Don't look in the trash, we assume that if we want to load
669  // data of a signature, it is not in thrash! Print an error if so.
671  if(_trashSignatures.size())
672  {
673  for(std::list<Signature *>::iterator iter=signatures.begin(); iter!=signatures.end(); ++iter)
674  {
675  UASSERT(*iter != 0);
676  UASSERT_MSG(!uContains(_trashSignatures, (*iter)->id()), uFormat("Signature %d should not be used when transferred to trash!!!!", (*iter)->id()).c_str());
677  }
678  }
680 
682  this->loadNodeDataQuery(signatures, images, scan, userData, occupancyGrid);
684 }
685 
687  int signatureId,
688  SensorData & data,
689  bool images, bool scan, bool userData, bool occupancyGrid) const
690 {
691  bool found = false;
692  // look in the trash
694  if(uContains(_trashSignatures, signatureId))
695  {
696  const Signature * s = _trashSignatures.at(signatureId);
697  if((!s->isSaved() ||
698  ((!images || !s->sensorData().imageCompressed().empty()) &&
699  (!scan || !s->sensorData().laserScanCompressed().isEmpty()) &&
700  (!userData || !s->sensorData().userDataCompressed().empty()) &&
701  (!occupancyGrid || s->sensorData().gridCellSize() != 0.0f))))
702  {
703  data = (SensorData)s->sensorData();
704  if(!images)
705  {
706  data.setRGBDImage(cv::Mat(), cv::Mat(), std::vector<CameraModel>());
707  }
708  if(!scan)
709  {
710  data.setLaserScan(LaserScan());
711  }
712  if(!userData)
713  {
714  data.setUserData(cv::Mat());
715  }
716  if(!occupancyGrid)
717  {
718  data.setOccupancyGrid(cv::Mat(), cv::Mat(), cv::Mat(), 0, cv::Point3f());
719  }
720  found = true;
721  }
722  }
724 
725  if(!found)
726  {
728  std::list<Signature *> signatures;
729  Signature tmp(signatureId);
730  signatures.push_back(&tmp);
731  loadNodeDataQuery(signatures, images, scan, userData, occupancyGrid);
732  data = signatures.front()->sensorData();
734  }
735 }
736 
738  int signatureId,
739  std::vector<CameraModel> & models,
740  std::vector<StereoCameraModel> & stereoModels) const
741 {
742  UDEBUG("");
743  bool found = false;
744  // look in the trash
746  if(uContains(_trashSignatures, signatureId))
747  {
748  models = _trashSignatures.at(signatureId)->sensorData().cameraModels();
749  stereoModels = _trashSignatures.at(signatureId)->sensorData().stereoCameraModels();
750  found = true;
751  }
753 
754  if(!found)
755  {
757  found = this->getCalibrationQuery(signatureId, models, stereoModels);
759  }
760  return found;
761 }
762 
764  int signatureId,
765  LaserScan & info) const
766 {
767  UDEBUG("");
768  bool found = false;
769  // look in the trash
771  if(uContains(_trashSignatures, signatureId))
772  {
773  info = _trashSignatures.at(signatureId)->sensorData().laserScanCompressed();
774  found = true;
775  }
777 
778  if(!found)
779  {
781  found = this->getLaserScanInfoQuery(signatureId, info);
783  }
784  return found;
785 }
786 
788  int signatureId,
789  Transform & pose,
790  int & mapId,
791  int & weight,
792  std::string & label,
793  double & stamp,
794  Transform & groundTruthPose,
795  std::vector<float> & velocity,
796  GPS & gps,
797  EnvSensors & sensors) const
798 {
799  bool found = false;
800  // look in the trash
802  if(uContains(_trashSignatures, signatureId))
803  {
804  pose = _trashSignatures.at(signatureId)->getPose().clone();
805  mapId = _trashSignatures.at(signatureId)->mapId();
806  weight = _trashSignatures.at(signatureId)->getWeight();
807  label = std::string(_trashSignatures.at(signatureId)->getLabel());
808  stamp = _trashSignatures.at(signatureId)->getStamp();
809  groundTruthPose = _trashSignatures.at(signatureId)->getGroundTruthPose().clone();
810  velocity = std::vector<float>(_trashSignatures.at(signatureId)->getVelocity());
811  gps = GPS(_trashSignatures.at(signatureId)->sensorData().gps());
812  sensors = EnvSensors(_trashSignatures.at(signatureId)->sensorData().envSensors());
813  found = true;
814  }
816 
817  if(!found)
818  {
820  found = this->getNodeInfoQuery(signatureId, pose, mapId, weight, label, stamp, groundTruthPose, velocity, gps, sensors);
822  }
823  return found;
824 }
825 
826 void DBDriver::loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type) const
827 {
828  bool found = false;
829  // look in the trash
831  if(uContains(_trashSignatures, signatureId))
832  {
833  const Signature * s = _trashSignatures.at(signatureId);
834  UASSERT(s != 0);
835  for(std::map<int, Link>::const_iterator nIter = s->getLinks().begin();
836  nIter!=s->getLinks().end();
837  ++nIter)
838  {
839  if(type == Link::kAllWithoutLandmarks || type == Link::kAllWithLandmarks || nIter->second.type() == type)
840  {
841  links.insert(*nIter);
842  }
843  }
845  {
846  links.insert(s->getLandmarks().begin(), s->getLandmarks().end());
847  }
848  found = true;
849  }
851 
852  if(!found)
853  {
855  this->loadLinksQuery(signatureId, links, type);
857  }
858 }
859 
860 void DBDriver::getWeight(int signatureId, int & weight) const
861 {
862  bool found = false;
863  // look in the trash
865  if(uContains(_trashSignatures, signatureId))
866  {
867  weight = _trashSignatures.at(signatureId)->getWeight();
868  found = true;
869  }
871 
872  if(!found)
873  {
875  this->getWeightQuery(signatureId, weight);
877  }
878 }
879 
880 void DBDriver::getLastNodeIds(std::set<int> & ids) const
881 {
883  this->getLastNodeIdsQuery(ids);
885 }
886 
887 void DBDriver::getAllNodeIds(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const
888 {
889  // look in the trash
891  if(_trashSignatures.size())
892  {
893  for(std::map<int, Signature*>::const_iterator sIter = _trashSignatures.begin(); sIter!=_trashSignatures.end(); ++sIter)
894  {
895  bool hasNeighbors = !ignoreChildren;
896  if(ignoreChildren)
897  {
898  for(std::map<int, Link>::const_iterator nIter = sIter->second->getLinks().begin();
899  nIter!=sIter->second->getLinks().end();
900  ++nIter)
901  {
902  if(nIter->second.type() == Link::kNeighbor ||
903  nIter->second.type() == Link::kNeighborMerged)
904  {
905  hasNeighbors = true;
906  break;
907  }
908  }
909  }
910  if(hasNeighbors && (!ignoreIntermediateNodes || sIter->second->getWeight() != -1))
911  {
912  ids.insert(sIter->first);
913  }
914  }
915 
916  std::vector<int> keys = uKeys(_trashSignatures);
917 
918  }
920 
922  this->getAllNodeIdsQuery(ids, ignoreChildren, ignoreBadSignatures, ignoreIntermediateNodes);
924 }
925 
926 void DBDriver::getAllOdomPoses(std::map<int, Transform> & poses, bool ignoreChildren, bool ignoreIntermediateNodes) const
927 {
928  // look in the trash
930  if(_trashSignatures.size())
931  {
932  for(std::map<int, Signature*>::const_iterator sIter = _trashSignatures.begin(); sIter!=_trashSignatures.end(); ++sIter)
933  {
934  bool hasNeighbors = !ignoreChildren;
935  if(ignoreChildren)
936  {
937  for(std::map<int, Link>::const_iterator nIter = sIter->second->getLinks().begin();
938  nIter!=sIter->second->getLinks().end();
939  ++nIter)
940  {
941  if(nIter->second.type() == Link::kNeighbor ||
942  nIter->second.type() == Link::kNeighborMerged)
943  {
944  hasNeighbors = true;
945  break;
946  }
947  }
948  }
949  if(hasNeighbors && (!ignoreIntermediateNodes || sIter->second->getWeight() != -1))
950  {
951  poses.insert(std::make_pair(sIter->first, sIter->second->getPose()));
952  }
953  }
954 
955  std::vector<int> keys = uKeys(_trashSignatures);
956 
957  }
959 
961  this->getAllOdomPosesQuery(poses, ignoreChildren, ignoreIntermediateNodes);
963 }
964 
965 void DBDriver::getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks, bool withLandmarks) const
966 {
968  this->getAllLinksQuery(links, ignoreNullLinks, withLandmarks);
970 
971  // look in the trash
973  if(_trashSignatures.size())
974  {
975  for(std::map<int, Signature*>::const_iterator iter=_trashSignatures.begin(); iter!=_trashSignatures.end(); ++iter)
976  {
977  links.erase(iter->first);
978  for(std::map<int, Link>::const_iterator jter=iter->second->getLinks().begin();
979  jter!=iter->second->getLinks().end();
980  ++jter)
981  {
982  if(!ignoreNullLinks || jter->second.isValid())
983  {
984  links.insert(std::make_pair(iter->first, jter->second));
985  }
986  }
987  if(withLandmarks)
988  {
989  for(std::map<int, Link>::const_iterator jter=iter->second->getLandmarks().begin();
990  jter!=iter->second->getLandmarks().end();
991  ++jter)
992  {
993  if(!ignoreNullLinks || jter->second.isValid())
994  {
995  links.insert(std::make_pair(iter->first, jter->second));
996  }
997  }
998  }
999  }
1000  }
1002 }
1003 
1004 void DBDriver::getLastNodeId(int & id) const
1005 {
1006  // look in the trash
1007  _trashesMutex.lock();
1008  if(_trashSignatures.size())
1009  {
1010  id = _trashSignatures.rbegin()->first;
1011  }
1013 
1015  this->getLastIdQuery("Node", id);
1016  int statisticsId = 0;
1017  if(uStrNumCmp(this->getDatabaseVersion(), "0.11.11") >= 0)
1018  {
1019  this->getLastIdQuery("Statistics", statisticsId);
1020  if(statisticsId > id)
1021  {
1022  id = statisticsId;
1023  }
1024  }
1026 }
1027 
1028 void DBDriver::getLastMapId(int & mapId) const
1029 {
1030  // look in the trash
1031  _trashesMutex.lock();
1032  if(_trashSignatures.size())
1033  {
1034  mapId = _trashSignatures.rbegin()->second->mapId();
1035  }
1037 
1039  this->getLastIdQuery("Node", mapId, "map_id");
1041 }
1042 
1043 void DBDriver::getLastWordId(int & id) const
1044 {
1045  // look in the trash
1046  _trashesMutex.lock();
1047  if(_trashVisualWords.size())
1048  {
1049  id = _trashVisualWords.rbegin()->first;
1050  }
1052 
1054  this->getLastIdQuery("Word", id);
1056 }
1057 
1058 void DBDriver::getInvertedIndexNi(int signatureId, int & ni) const
1059 {
1060  bool found = false;
1061  // look in the trash
1062  _trashesMutex.lock();
1063  if(uContains(_trashSignatures, signatureId))
1064  {
1065  ni = _trashSignatures.at(signatureId)->getWords().size();
1066  found = true;
1067  }
1069 
1070  if(!found)
1071  {
1073  this->getInvertedIndexNiQuery(signatureId, ni);
1075  }
1076 }
1077 
1078 void DBDriver::getNodesObservingLandmark(int landmarkId, std::map<int, Link> & nodes) const
1079 {
1080  if(landmarkId < 0)
1081  {
1082  // look in the trash
1083  _trashesMutex.lock();
1084  for(std::map<int, Signature*>::const_iterator sIter = _trashSignatures.begin(); sIter!=_trashSignatures.end(); ++sIter)
1085  {
1086  std::map<int, Link>::const_iterator kter = sIter->second->getLandmarks().find(landmarkId);
1087  if(kter != sIter->second->getLandmarks().end())
1088  {
1089  nodes.insert(std::make_pair(sIter->second->id(), kter->second));
1090  }
1091  }
1093 
1094  // then look in the database
1096  this->getNodesObservingLandmarkQuery(landmarkId, nodes);
1098  }
1099  else
1100  {
1101  UWARN("Can't search with an empty label!");
1102  }
1103 }
1104 
1105 void DBDriver::getNodeIdByLabel(const std::string & label, int & id) const
1106 {
1107  if(!label.empty())
1108  {
1109  int idFound = 0;
1110  // look in the trash
1111  _trashesMutex.lock();
1112  for(std::map<int, Signature*>::const_iterator sIter = _trashSignatures.begin(); sIter!=_trashSignatures.end(); ++sIter)
1113  {
1114  if(sIter->second->getLabel().compare(label) == 0)
1115  {
1116  idFound = sIter->first;
1117  break;
1118  }
1119  }
1121 
1122  // then look in the database
1123  if(idFound == 0)
1124  {
1126  this->getNodeIdByLabelQuery(label, id);
1128  }
1129  else
1130  {
1131  id = idFound;
1132  }
1133  }
1134  else
1135  {
1136  UWARN("Can't search with an empty label!");
1137  }
1138 }
1139 
1140 void DBDriver::getAllLabels(std::map<int, std::string> & labels) const
1141 {
1142  // look in the trash
1143  _trashesMutex.lock();
1144  for(std::map<int, Signature*>::const_iterator sIter = _trashSignatures.begin(); sIter!=_trashSignatures.end(); ++sIter)
1145  {
1146  if(!sIter->second->getLabel().empty())
1147  {
1148  labels.insert(std::make_pair(sIter->first, sIter->second->getLabel()));
1149  }
1150  }
1152 
1153  // then look in the database
1155  this->getAllLabelsQuery(labels);
1157 }
1158 
1160  int stMemSize,
1161  int lastSignAdded,
1162  int processMemUsed,
1163  int databaseMemUsed,
1164  int dictionarySize,
1165  const ParametersMap & parameters) const
1166 {
1167  ULOGGER_DEBUG("");
1168  if(this->isConnected())
1169  {
1170  std::stringstream query;
1171  if(uStrNumCmp(this->getDatabaseVersion(), "0.11.8") >= 0)
1172  {
1173  std::string param = Parameters::serialize(parameters);
1174  if(uStrNumCmp(this->getDatabaseVersion(), "0.11.11") >= 0)
1175  {
1176  query << "INSERT INTO Info(STM_size,last_sign_added,process_mem_used,database_mem_used,dictionary_size,parameters) values("
1177  << stMemSize << ","
1178  << lastSignAdded << ","
1179  << processMemUsed << ","
1180  << databaseMemUsed << ","
1181  << dictionarySize << ","
1182  "'" << param.c_str() << "');";
1183  }
1184  else
1185  {
1186  query << "INSERT INTO Statistics(STM_size,last_sign_added,process_mem_used,database_mem_used,dictionary_size,parameters) values("
1187  << stMemSize << ","
1188  << lastSignAdded << ","
1189  << processMemUsed << ","
1190  << databaseMemUsed << ","
1191  << dictionarySize << ","
1192  "'" << param.c_str() << "');";
1193  }
1194  }
1195  else
1196  {
1197  query << "INSERT INTO Statistics(STM_size,last_sign_added,process_mem_used,database_mem_used,dictionary_size) values("
1198  << stMemSize << ","
1199  << lastSignAdded << ","
1200  << processMemUsed << ","
1201  << databaseMemUsed << ","
1202  << dictionarySize << ");";
1203  }
1204 
1205  this->executeNoResultQuery(query.str());
1206  }
1207 }
1208 
1209 void DBDriver::addStatistics(const Statistics & statistics, bool saveWmState) const
1210 {
1212  addStatisticsQuery(statistics, saveWmState);
1214 }
1215 
1216 void DBDriver::savePreviewImage(const cv::Mat & image) const
1217 {
1219  savePreviewImageQuery(image);
1221 }
1222 
1224 {
1226  cv::Mat image = loadPreviewImageQuery();
1228  return image;
1229 }
1230 
1231 void DBDriver::saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const
1232 {
1234  saveOptimizedPosesQuery(optimizedPoses, lastlocalizationPose);
1236 }
1237 std::map<int, Transform> DBDriver::loadOptimizedPoses(Transform * lastlocalizationPose) const
1238 {
1240  std::map<int, Transform> poses = loadOptimizedPosesQuery(lastlocalizationPose);
1242  return poses;
1243 }
1244 
1245 void DBDriver::save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const
1246 {
1248  save2DMapQuery(map, xMin, yMin, cellSize);
1250 }
1251 
1252 cv::Mat DBDriver::load2DMap(float & xMin, float & yMin, float & cellSize) const
1253 {
1255  cv::Mat map = load2DMapQuery(xMin, yMin, cellSize);
1257  return map;
1258 }
1259 
1261  const cv::Mat & cloud,
1262  const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
1263 #if PCL_VERSION_COMPARE(>=, 1, 8, 0)
1264  const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
1265 #else
1266  const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
1267 #endif
1268  const cv::Mat & textures) const
1269 {
1271  saveOptimizedMeshQuery(cloud, polygons, texCoords, textures);
1273 }
1274 
1276  std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
1277 #if PCL_VERSION_COMPARE(>=, 1, 8, 0)
1278  std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
1279 #else
1280  std::vector<std::vector<Eigen::Vector2f> > * texCoords,
1281 #endif
1282  cv::Mat * textures) const
1283 {
1285  cv::Mat cloud = loadOptimizedMeshQuery(polygons, texCoords, textures);
1287  return cloud;
1288 }
1289 
1291  const std::string & fileName,
1292  const std::set<int> & idsInput,
1293  const std::map<int, Signature *> & otherSignatures)
1294 {
1295  if(this->isConnected())
1296  {
1297  if(!fileName.empty())
1298  {
1299  FILE* fout = 0;
1300  #ifdef _MSC_VER
1301  fopen_s(&fout, fileName.c_str(), "w");
1302  #else
1303  fout = fopen(fileName.c_str(), "w");
1304  #endif
1305 
1306  if (!fout)
1307  {
1308  UERROR("Cannot open file %s!", fileName.c_str());
1309  return;
1310  }
1311 
1312  std::set<int> ids;
1313  if(idsInput.size() == 0)
1314  {
1315  this->getAllNodeIds(ids);
1316  UDEBUG("ids.size()=%d", ids.size());
1317  for(std::map<int, Signature*>::const_iterator iter=otherSignatures.begin(); iter!=otherSignatures.end(); ++iter)
1318  {
1319  ids.insert(iter->first);
1320  }
1321  }
1322  else
1323  {
1324  ids = idsInput;
1325  }
1326 
1327  const char * colorG = "green";
1328  const char * colorP = "pink";
1329  const char * colorNM = "blue";
1330  UINFO("Generating map with %d locations", ids.size());
1331  fprintf(fout, "digraph G {\n");
1332  for(std::set<int>::iterator i=ids.begin(); i!=ids.end(); ++i)
1333  {
1334  if(otherSignatures.find(*i) == otherSignatures.end())
1335  {
1336  int id = *i;
1337  std::multimap<int, Link> links;
1338  this->loadLinks(id, links);
1339  int weight = 0;
1340  this->getWeight(id, weight);
1341  for(std::multimap<int, Link>::iterator iter = links.begin(); iter!=links.end(); ++iter)
1342  {
1343  int weightNeighbor = 0;
1344  if(otherSignatures.find(iter->first) == otherSignatures.end())
1345  {
1346  this->getWeight(iter->first, weightNeighbor);
1347  }
1348  else
1349  {
1350  weightNeighbor = otherSignatures.find(iter->first)->second->getWeight();
1351  }
1352  //UDEBUG("Add neighbor link from %d to %d", id, iter->first);
1353  if(iter->second.type() == Link::kNeighbor)
1354  {
1355  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\"\n",
1356  id,
1357  weight,
1358  iter->first,
1359  weightNeighbor);
1360  }
1361  else if(iter->second.type() == Link::kNeighborMerged)
1362  {
1363  //merged neighbor
1364  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\" [label=\"M\", fontcolor=%s, fontsize=8];\n",
1365  id,
1366  weight,
1367  iter->first,
1368  weightNeighbor,
1369  colorNM);
1370  }
1371  else if(iter->first > id)
1372  {
1373  //loop
1374  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\" [label=\"L\", fontcolor=%s, fontsize=8];\n",
1375  id,
1376  weight,
1377  iter->first,
1378  weightNeighbor,
1379  colorG);
1380  }
1381  else
1382  {
1383  //child
1384  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\" [label=\"C\", fontcolor=%s, fontsize=8];\n",
1385  id,
1386  weight,
1387  iter->first,
1388  weightNeighbor,
1389  colorP);
1390  }
1391  }
1392  }
1393  }
1394  for(std::map<int, Signature*>::const_iterator i=otherSignatures.begin(); i!=otherSignatures.end(); ++i)
1395  {
1396  if(ids.find(i->first) != ids.end())
1397  {
1398  int id = i->second->id();
1399  const std::multimap<int, Link> & links = i->second->getLinks();
1400  int weight = i->second->getWeight();
1401  for(std::multimap<int, Link>::const_iterator iter = links.begin(); iter!=links.end(); ++iter)
1402  {
1403  int weightNeighbor = 0;
1404  const Signature * s = uValue(otherSignatures, iter->first, (Signature*)0);
1405  if(s)
1406  {
1407  weightNeighbor = s->getWeight();
1408  }
1409  else
1410  {
1411  this->getWeight(iter->first, weightNeighbor);
1412  }
1413  //UDEBUG("Add neighbor link from %d to %d", id, iter->first);
1414  if(iter->second.type() == Link::kNeighbor)
1415  {
1416  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\"\n",
1417  id,
1418  weight,
1419  iter->first,
1420  weightNeighbor);
1421  }
1422  else if(iter->second.type() == Link::kNeighborMerged)
1423  {
1424  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\" [label=\"M\", fontcolor=%s, fontsize=8];\n",
1425  id,
1426  weight,
1427  iter->first,
1428  weightNeighbor,
1429  colorNM);
1430  }
1431  else if(iter->first > id)
1432  {
1433  //loop
1434  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\" [label=\"L\", fontcolor=%s, fontsize=8];\n",
1435  id,
1436  weight,
1437  iter->first,
1438  weightNeighbor,
1439  colorG);
1440  }
1441  else if(iter->first != id)
1442  {
1443  //child
1444  fprintf(fout, " \"%d\\n%d\" -> \"%d\\n%d\" [label=\"C\", fontcolor=%s, fontsize=8];\n",
1445  id,
1446  weight,
1447  iter->first,
1448  weightNeighbor,
1449  colorP);
1450  }
1451  }
1452  }
1453  }
1454  fprintf(fout, "}\n");
1455  fclose(fout);
1456  UINFO("Graph saved to \"%s\" (Tip: $ neato -Tpdf \"%s\" -o out.pdf)", fileName.c_str(), fileName.c_str());
1457  }
1458  }
1459 }
1460 
1461 } // namespace rtabmap
rtabmap::SensorData
Definition: SensorData.h:51
rtabmap::DBDriver::DBDriver
DBDriver(const ParametersMap &parameters=ParametersMap())
Definition: DBDriver.cpp:46
rtabmap::DBDriver::_trashVisualWords
std::map< int, VisualWord * > _trashVisualWords
Definition: DBDriver.h:310
rtabmap::DBDriver::loadWords
void loadWords(const std::set< int > &wordIds, std::list< VisualWord * > &vws)
Definition: DBDriver.cpp:617
UMutex::lock
int lock() const
Definition: UMutex.h:87
rtabmap::DBDriver::loadOptimizedPoses
std::map< int, Transform > loadOptimizedPoses(Transform *lastlocalizationPose=0) const
Definition: DBDriver.cpp:1237
rtabmap::DBDriver::getNodeData
void getNodeData(int signatureId, SensorData &data, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const
Definition: DBDriver.cpp:686
rtabmap::DBDriver::getTotalNodesSizeQuery
virtual int getTotalNodesSizeQuery() const =0
rtabmap::DBDriver::getCalibration
bool getCalibration(int signatureId, std::vector< CameraModel > &models, std::vector< StereoCameraModel > &stereoModels) const
Definition: DBDriver.cpp:737
rtabmap::DBDriver::getNodesObservingLandmark
void getNodesObservingLandmark(int landmarkId, std::map< int, Link > &nodes) const
Definition: DBDriver.cpp:1078
rtabmap::DBDriver::getNodesMemoryUsed
long getNodesMemoryUsed() const
Definition: DBDriver.cpp:119
rtabmap::DBDriver::beginTransaction
void beginTransaction() const
Definition: DBDriver.cpp:290
rtabmap::DBDriver::updateLink
void updateLink(const Link &link)
Definition: DBDriver.cpp:477
UINFO
#define UINFO(...)
rtabmap::DBDriver::getLastParameters
ParametersMap getLastParameters() const
Definition: DBDriver.cpp:239
rtabmap::DBDriver::addStatistics
void addStatistics(const Statistics &statistics, bool saveWmState) const
Definition: DBDriver.cpp:1209
rtabmap::Statistics
Definition: Statistics.h:53
rtabmap::DBDriver::getStatisticsMemoryUsedQuery
virtual long getStatisticsMemoryUsedQuery() const =0
bytes
format
std::string format(const std::string &str, const std::vector< std::string > &find, const std::vector< std::string > &replace)
rtabmap::DBDriver::isConnectedQuery
virtual bool isConnectedQuery() const =0
rtabmap::DBDriver::getTotalDictionarySizeQuery
virtual int getTotalDictionarySizeQuery() const =0
timer
s
RealScalar s
rtabmap::DBDriver::_timestampUpdate
bool _timestampUpdate
Definition: DBDriver.h:317
rtabmap::DBDriver::getImagesMemoryUsed
long getImagesMemoryUsed() const
Definition: DBDriver.cpp:135
keys
const KeyVector keys
rtabmap::DBDriver::openConnection
bool openConnection(const std::string &url, bool overwritten=false)
Definition: DBDriver.cpp:86
rtabmap::DBDriver::getLastNodesSize
int getLastNodesSize() const
Definition: DBDriver.cpp:207
rtabmap::DBDriver::save2DMapQuery
virtual void save2DMapQuery(const cv::Mat &map, float xMin, float yMin, float cellSize) const =0
rtabmap::DBDriver::loadSignaturesQuery
virtual void loadSignaturesQuery(const std::list< int > &ids, std::list< Signature * > &signatures) const =0
rtabmap::DBDriver::getLastIdQuery
virtual void getLastIdQuery(const std::string &tableName, int &id, const std::string &fieldName="id") const =0
UMutex::unlock
int unlock() const
Definition: UMutex.h:113
rtabmap::DBDriver::addLink
void addLink(const Link &link)
Definition: DBDriver.cpp:467
rtabmap::DBDriver::getLastNodesSizeQuery
virtual int getLastNodesSizeQuery() const =0
rtabmap::DBDriver::getGridsMemoryUsedQuery
virtual long getGridsMemoryUsedQuery() const =0
rtabmap::DBDriver::_trashSignatures
std::map< int, Signature * > _trashSignatures
Definition: DBDriver.h:309
rtabmap::DBDriver::updateCalibrationQuery
virtual void updateCalibrationQuery(int nodeId, const std::vector< CameraModel > &models, const std::vector< StereoCameraModel > &stereoModels) const =0
rtabmap::DBDriver::getAllStatisticsWmStatesQuery
virtual std::map< int, std::vector< int > > getAllStatisticsWmStatesQuery() const =0
rtabmap::DBDriver::loadSignature
Signature * loadSignature(int id, bool *loadedFromTrash=0)
Definition: DBDriver.cpp:548
rtabmap::DBDriver::getCalibrationQuery
virtual bool getCalibrationQuery(int signatureId, std::vector< CameraModel > &models, std::vector< StereoCameraModel > &stereoModels) const =0
rtabmap::DBDriver::getAllOdomPosesQuery
virtual void getAllOdomPosesQuery(std::map< int, Transform > &poses, bool ignoreChildren, bool ignoreIntermediateNodes) const =0
rtabmap::DBDriver::updateDepthImageQuery
virtual void updateDepthImageQuery(int nodeId, const cv::Mat &image, const std::string &format) const =0
UThread::join
void join(bool killFirst=false)
Definition: UThread.cpp:85
rtabmap::DBDriver::getLastParametersQuery
virtual ParametersMap getLastParametersQuery() const =0
rtabmap::GPS
Definition: GPS.h:35
type
rtabmap::DBDriver::getAllStatisticsWmStates
std::map< int, std::vector< int > > getAllStatisticsWmStates() const
Definition: DBDriver.cpp:266
rtabmap::DBDriver::executeNoResult
void executeNoResult(const std::string &sql) const
Definition: DBDriver.cpp:304
rtabmap::DBDriver::isConnected
bool isConnected() const
Definition: DBDriver.cpp:100
rtabmap::DBDriver::updateLaserScanQuery
virtual void updateLaserScanQuery(int nodeId, const LaserScan &scan) const =0
rtabmap::DBDriver::updateOccupancyGrid
void updateOccupancyGrid(int nodeId, const cv::Mat &ground, const cv::Mat &obstacles, const cv::Mat &empty, float cellSize, const cv::Point3f &viewpoint)
Definition: DBDriver.cpp:483
rtabmap::DBDriver::loadOptimizedMeshQuery
virtual cv::Mat loadOptimizedMeshQuery(std::vector< std::vector< std::vector< RTABMAP_PCL_INDEX > > > *polygons, std::vector< std::vector< Eigen::Vector2f > > *texCoords, cv::Mat *textures) const =0
true
#define true
Definition: ConvertUTF.c:57
UTimer::start
void start()
Definition: UTimer.cpp:87
rtabmap::DBDriver::getDepthImagesMemoryUsedQuery
virtual long getDepthImagesMemoryUsedQuery() const =0
rtabmap::DBDriver::addStatisticsQuery
virtual void addStatisticsQuery(const Statistics &statistics, bool saveWmState) const =0
rtabmap::DBDriver::loadNodeData
void loadNodeData(Signature *signature, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const
Definition: DBDriver.cpp:659
rtabmap::DBDriver::getStatistics
std::map< std::string, float > getStatistics(int nodeId, double &stamp, std::vector< int > *wmState=0) const
Definition: DBDriver.cpp:248
rtabmap::DBDriver::addLinkQuery
virtual void addLinkQuery(const Link &link) const =0
rtabmap::LaserScan
Definition: LaserScan.h:37
rtabmap::ParametersMap
std::map< std::string, std::string > ParametersMap
Definition: Parameters.h:43
rtabmap::DBDriver::loadLastNodes
void loadLastNodes(std::list< Signature * > &signatures) const
Definition: DBDriver.cpp:541
rtabmap::DBDriver::loadQuery
virtual void loadQuery(VWDictionary *dictionary, bool lastStateOnly=true) const =0
UTimer.h
ULOGGER_DEBUG
#define ULOGGER_DEBUG(...)
Definition: ULogger.h:53
rtabmap::VisualWord
Definition: VisualWord.h:38
rtabmap::DBDriver::getUserDataMemoryUsed
long getUserDataMemoryUsed() const
Definition: DBDriver.cpp:175
UMath.h
Basic mathematics functions.
rtabmap::DBDriver::loadNodeDataQuery
virtual void loadNodeDataQuery(std::list< Signature * > &signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const =0
rtabmap::DBDriver::getImagesMemoryUsedQuery
virtual long getImagesMemoryUsedQuery() const =0
rtabmap::DBDriver::getDepthImagesMemoryUsed
long getDepthImagesMemoryUsed() const
Definition: DBDriver.cpp:143
rtabmap::Parameters::parse
static bool parse(const ParametersMap &parameters, const std::string &key, bool &value)
Definition: Parameters.cpp:503
rtabmap::DBDriver::save2DMap
void save2DMap(const cv::Mat &map, float xMin, float yMin, float cellSize) const
Definition: DBDriver.cpp:1245
rtabmap::DBDriver::savePreviewImageQuery
virtual void savePreviewImageQuery(const cv::Mat &image) const =0
VisualWord.h
rtabmap::DBDriver::connectDatabaseQuery
virtual bool connectDatabaseQuery(const std::string &url, bool overwritten=false)=0
labels
std::vector< std::string > labels
rtabmap::DBDriver::getAllStatisticsQuery
virtual std::map< int, std::pair< std::map< std::string, float >, double > > getAllStatisticsQuery() const =0
rtabmap::DBDriver::_emptyTrashesTime
double _emptyTrashesTime
Definition: DBDriver.h:314
rtabmap::DBDriver::getLastDictionarySize
int getLastDictionarySize() const
Definition: DBDriver.cpp:215
rtabmap::DBDriver::updateLinkQuery
virtual void updateLinkQuery(const Link &link) const =0
rtabmap::DBDriver::getUserDataMemoryUsedQuery
virtual long getUserDataMemoryUsedQuery() const =0
rtabmap::DBDriver::_url
std::string _url
Definition: DBDriver.h:315
uContains
bool uContains(const std::list< V > &list, const V &value)
Definition: UStl.h:407
rtabmap::DBDriver::getWordsMemoryUsedQuery
virtual long getWordsMemoryUsedQuery() const =0
rtabmap::DBDriver::getTotalNodesSize
int getTotalNodesSize() const
Definition: DBDriver.cpp:223
rtabmap::DBDriver::getStatisticsMemoryUsed
long getStatisticsMemoryUsed() const
Definition: DBDriver.cpp:199
uKeys
std::vector< K > uKeys(const std::multimap< K, V > &mm)
Definition: UStl.h:67
rtabmap::DBDriver::parseParameters
virtual void parseParameters(const ParametersMap &parameters)
Definition: DBDriver.cpp:59
uStrNumCmp
int uStrNumCmp(const std::string &a, const std::string &b)
Definition: UStl.h:717
data
int data[]
Eigen::aligned_allocator
rtabmap::DBDriver::getLastMapId
void getLastMapId(int &mapId) const
Definition: DBDriver.cpp:1028
rtabmap::DBDriver::loadLinksQuery
virtual void loadLinksQuery(int signatureId, std::multimap< int, Link > &links, Link::Type type=Link::kUndef) const =0
UConversion.h
Some conversion functions.
rtabmap::DBDriverSqlite3
Definition: DBDriverSqlite3.h:40
rtabmap::DBDriver::getWeightQuery
virtual void getWeightQuery(int signatureId, int &weight) const =0
rtabmap::DBDriver::loadPreviewImage
cv::Mat loadPreviewImage() const
Definition: DBDriver.cpp:1223
Signature.h
rtabmap::DBDriver::_transactionMutex
UMutex _transactionMutex
Definition: DBDriver.h:308
rtabmap::DBDriver::mainLoop
virtual void mainLoop()
Definition: DBDriver.cpp:284
rtabmap::DBDriver::updateCalibration
void updateCalibration(int nodeId, const std::vector< CameraModel > &models, const std::vector< StereoCameraModel > &stereoModels)
Definition: DBDriver.cpp:505
rtabmap::DBDriver::getLastWordId
void getLastWordId(int &id) const
Definition: DBDriver.cpp:1043
DBDriverSqlite3.h
rtabmap::DBDriver::getNodesMemoryUsedQuery
virtual long getNodesMemoryUsedQuery() const =0
velocity
Velocity3 velocity(const NavState &X, OptionalJacobian< 3, 9 > H)
rtabmap::DBDriver::getAllLabelsQuery
virtual void getAllLabelsQuery(std::map< int, std::string > &labels) const =0
UThread::kill
void kill()
Definition: UThread.cpp:48
rtabmap::DBDriver::_targetVersion
std::string _targetVersion
Definition: DBDriver.h:316
rtabmap::DBDriver::getNodeInfo
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:787
info
else if n * info
rtabmap::DBDriver::getNodesObservingLandmarkQuery
virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map< int, Link > &nodes) const =0
rtabmap::DBDriver::getFeaturesMemoryUsedQuery
virtual long getFeaturesMemoryUsedQuery() const =0
rtabmap::DBDriver::getMemoryUsedQuery
virtual unsigned long getMemoryUsedQuery() const =0
UASSERT
#define UASSERT(condition)
version
version
rtabmap::DBDriver::getDatabaseVersion
std::string getDatabaseVersion() const
Definition: DBDriver.cpp:275
uValue
V uValue(const std::map< K, V > &m, const K &key, const V &defaultValue=V())
Definition: UStl.h:238
rtabmap::DBDriver::getNodeIdByLabel
void getNodeIdByLabel(const std::string &label, int &id) const
Definition: DBDriver.cpp:1105
UThread::start
void start()
Definition: UThread.cpp:122
rtabmap::Parameters::serialize
static std::string serialize(const ParametersMap &parameters)
Definition: Parameters.cpp:93
rtabmap::DBDriver::getLaserScanInfo
bool getLaserScanInfo(int signatureId, LaserScan &info) const
Definition: DBDriver.cpp:763
rtabmap::DBDriver::getAllStatistics
std::map< int, std::pair< std::map< std::string, float >, double > > getAllStatistics() const
Definition: DBDriver.cpp:257
rtabmap::DBDriver::getWordsMemoryUsed
long getWordsMemoryUsed() const
Definition: DBDriver.cpp:183
DBDriver.h
rtabmap::DBDriver::getLastDictionarySizeQuery
virtual int getLastDictionarySizeQuery() const =0
uAppend
void uAppend(std::list< V > &list, const std::list< V > &newItems)
Definition: UStl.h:524
rtabmap::DBDriver::getCalibrationsMemoryUsed
long getCalibrationsMemoryUsed() const
Definition: DBDriver.cpp:151
rtabmap::DBDriver::executeNoResultQuery
virtual void executeNoResultQuery(const std::string &sql) const =0
rtabmap::DBDriver::emptyTrashes
void emptyTrashes(bool async=false)
Definition: DBDriver.cpp:311
rtabmap::DBDriver::getAllLabels
void getAllLabels(std::map< int, std::string > &labels) const
Definition: DBDriver.cpp:1140
rtabmap::DBDriver::loadLinks
void loadLinks(int signatureId, std::multimap< int, Link > &links, Link::Type type=Link::kUndef) const
Definition: DBDriver.cpp:826
UASSERT_MSG
#define UASSERT_MSG(condition, msg_str)
Definition: ULogger.h:67
UWARN
#define UWARN(...)
rtabmap::DBDriver::getLastNodeIds
void getLastNodeIds(std::set< int > &ids) const
Definition: DBDriver.cpp:880
rtabmap::DBDriver
Definition: DBDriver.h:62
rtabmap::DBDriver::getLinksMemoryUsed
long getLinksMemoryUsed() const
Definition: DBDriver.cpp:127
uFormat
std::string UTILITE_EXPORT uFormat(const char *fmt,...)
Definition: UConversion.cpp:365
nodes
KeyVector nodes
rtabmap::DBDriver::removeLink
void removeLink(int from, int to)
Definition: DBDriver.cpp:473
ULogger.h
ULogger class and convenient macros.
rtabmap::DBDriver::loadPreviewImageQuery
virtual cv::Mat loadPreviewImageQuery() const =0
rtabmap::Transform
Definition: Transform.h:41
empty
UTimer::ticks
double ticks()
Definition: UTimer.cpp:117
rtabmap::DBDriver::getMemoryUsed
unsigned long getMemoryUsed() const
Definition: DBDriver.cpp:110
rtabmap::VWDictionary
Definition: VWDictionary.h:46
rtabmap::DBDriver::getAllOdomPoses
void getAllOdomPoses(std::map< int, Transform > &poses, bool ignoreChildren=false, bool ignoreIntermediateNodes=false) const
Definition: DBDriver.cpp:926
rtabmap::EnvSensors
std::map< EnvSensor::Type, EnvSensor > EnvSensors
Definition: EnvSensor.h:81
rtabmap::DBDriver::getLinksMemoryUsedQuery
virtual long getLinksMemoryUsedQuery() const =0
rtabmap::DBDriver::updateQuery
virtual void updateQuery(const std::list< Signature * > &signatures, bool updateTimestamp) const =0
rtabmap::DBDriver::getWeight
void getWeight(int signatureId, int &weight) const
Definition: DBDriver.cpp:860
rtabmap::DBDriver::saveOrUpdate
void saveOrUpdate(const std::vector< Signature * > &signatures)
Definition: DBDriver.cpp:407
rtabmap::DBDriver::updateOccupancyGridQuery
virtual void updateOccupancyGridQuery(int nodeId, const cv::Mat &ground, const cv::Mat &obstacles, const cv::Mat &empty, float cellSize, const cv::Point3f &viewpoint) const =0
rtabmap::DBDriver::_dbSafeAccessMutex
UMutex _dbSafeAccessMutex
Definition: DBDriver.h:312
rtabmap::DBDriver::getCalibrationsMemoryUsedQuery
virtual long getCalibrationsMemoryUsedQuery() const =0
rtabmap::DBDriver::getDatabaseVersionQuery
virtual bool getDatabaseVersionQuery(std::string &version) const =0
rtabmap::DBDriver::saveOptimizedPosesQuery
virtual void saveOptimizedPosesQuery(const std::map< int, Transform > &optimizedPoses, const Transform &lastlocalizationPose) const =0
rtabmap::DBDriver::getAllLinksQuery
virtual void getAllLinksQuery(std::multimap< int, Link > &links, bool ignoreNullLinks, bool withLandmarks) const =0
iter
iterator iter(handle obj)
rtabmap::DBDriver::loadOptimizedMesh
cv::Mat loadOptimizedMesh(std::vector< std::vector< std::vector< RTABMAP_PCL_INDEX > > > *polygons=0, std::vector< std::vector< Eigen::Vector2f > > *texCoords=0, cv::Mat *textures=0) const
Definition: DBDriver.cpp:1275
rtabmap::DBDriver::disconnectDatabaseQuery
virtual void disconnectDatabaseQuery(bool save=true, const std::string &outputUrl="")=0
rtabmap::DBDriver::addInfoAfterRun
void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap &parameters) const
Definition: DBDriver.cpp:1159
c_str
const char * c_str(Args &&...args)
UStl.h
Wrappers of STL for convenient functions.
rtabmap::DBDriver::asyncSave
void asyncSave(Signature *s)
Definition: DBDriver.cpp:382
rtabmap::DBDriver::getFeaturesMemoryUsed
long getFeaturesMemoryUsed() const
Definition: DBDriver.cpp:191
UDEBUG
#define UDEBUG(...)
rtabmap::DBDriver::~DBDriver
virtual ~DBDriver()
Definition: DBDriver.cpp:53
UTimer
Definition: UTimer.h:46
rtabmap::DBDriver::_trashesMutex
UMutex _trashesMutex
Definition: DBDriver.h:311
rtabmap::DBDriver::load2DMap
cv::Mat load2DMap(float &xMin, float &yMin, float &cellSize) const
Definition: DBDriver.cpp:1252
rtabmap::DBDriver::getLastNodeIdsQuery
virtual void getLastNodeIdsQuery(std::set< int > &ids) const =0
rtabmap::DBDriver::loadOptimizedPosesQuery
virtual std::map< int, Transform > loadOptimizedPosesQuery(Transform *lastlocalizationPose=0) const =0
rtabmap::DBDriver::getNodeInfoQuery
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
rtabmap::DBDriver::loadLastNodesQuery
virtual void loadLastNodesQuery(std::list< Signature * > &signatures) const =0
rtabmap::DBDriver::getLastNodeId
void getLastNodeId(int &id) const
Definition: DBDriver.cpp:1004
rtabmap::DBDriver::updateLaserScan
void updateLaserScan(int nodeId, const LaserScan &scan)
Definition: DBDriver.cpp:525
rtabmap::DBDriver::getLaserScansMemoryUsed
long getLaserScansMemoryUsed() const
Definition: DBDriver.cpp:167
UThread::isRunning
bool isRunning() const
Definition: UThread.cpp:245
rtabmap::DBDriver::updateDepthImage
void updateDepthImage(int nodeId, const cv::Mat &image, const std::string &format)
Definition: DBDriver.cpp:515
url
url
rtabmap::DBDriver::load
void load(VWDictionary *dictionary, bool lastStateOnly=true) const
Definition: DBDriver.cpp:534
rtabmap::DBDriver::getAllNodeIds
void getAllNodeIds(std::set< int > &ids, bool ignoreChildren=false, bool ignoreBadSignatures=false, bool ignoreIntermediateNodes=false) const
Definition: DBDriver.cpp:887
rtabmap::DBDriver::savePreviewImage
void savePreviewImage(const cv::Mat &image) const
Definition: DBDriver.cpp:1216
rtabmap::DBDriver::getLaserScanInfoQuery
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan &info) const =0
uValues
std::vector< V > uValues(const std::multimap< K, V > &mm)
Definition: UStl.h:100
rtabmap::DBDriver::generateGraph
void generateGraph(const std::string &fileName, const std::set< int > &ids=std::set< int >(), const std::map< int, Signature * > &otherSignatures=std::map< int, Signature * >())
Definition: DBDriver.cpp:1290
rtabmap::DBDriver::commit
void commit() const
Definition: DBDriver.cpp:297
rtabmap::DBDriver::saveOptimizedPoses
void saveOptimizedPoses(const std::map< int, Transform > &optimizedPoses, const Transform &lastlocalizationPose) const
Definition: DBDriver.cpp:1231
rtabmap::DBDriver::getInvertedIndexNiQuery
virtual void getInvertedIndexNiQuery(int signatureId, int &ni) const =0
rtabmap::DBDriver::load2DMapQuery
virtual cv::Mat load2DMapQuery(float &xMin, float &yMin, float &cellSize) const =0
rtabmap::DBDriver::getNodeIdByLabelQuery
virtual void getNodeIdByLabelQuery(const std::string &label, int &id) const =0
rtabmap::DBDriver::getTotalDictionarySize
int getTotalDictionarySize() const
Definition: DBDriver.cpp:231
rtabmap::DBDriver::loadWordsQuery
virtual void loadWordsQuery(const std::set< int > &wordIds, std::list< VisualWord * > &vws) const =0
rtabmap::DBDriver::getInvertedIndexNi
void getInvertedIndexNi(int signatureId, int &ni) const
Definition: DBDriver.cpp:1058
rtabmap
Definition: CameraARCore.cpp:35
rtabmap::DBDriver::saveQuery
virtual void saveQuery(const std::list< Signature * > &signatures)=0
rtabmap::DBDriver::getGridsMemoryUsed
long getGridsMemoryUsed() const
Definition: DBDriver.cpp:159
rtabmap::DBDriver::getStatisticsQuery
virtual std::map< std::string, float > getStatisticsQuery(int nodeId, double &stamp, std::vector< int > *wmState) const =0
UERROR
#define UERROR(...)
rtabmap::VisualWord::id
int id() const
Definition: VisualWord.h:49
rtabmap::DBDriver::getAllNodeIdsQuery
virtual void getAllNodeIdsQuery(std::set< int > &ids, bool ignoreChildren, bool ignoreBadSignatures, bool ignoreIntermediateNodes) const =0
rtabmap::DBDriver::saveOptimizedMeshQuery
virtual void saveOptimizedMeshQuery(const cv::Mat &cloud, const std::vector< std::vector< std::vector< RTABMAP_PCL_INDEX > > > &polygons, const std::vector< std::vector< Eigen::Vector2f > > &texCoords, const cv::Mat &textures) const =0
rtabmap::DBDriver::loadSignatures
void loadSignatures(const std::list< int > &ids, std::list< Signature * > &signatures, std::set< int > *loadedFromTrash=0)
Definition: DBDriver.cpp:565
i
int i
rtabmap::DBDriver::getAllLinks
void getAllLinks(std::multimap< int, Link > &links, bool ignoreNullLinks=true, bool withLandmarks=false) const
Definition: DBDriver.cpp:965
rtabmap::DBDriver::getLaserScansMemoryUsedQuery
virtual long getLaserScansMemoryUsedQuery() const =0
rtabmap::DBDriver::closeConnection
void closeConnection(bool save=true, const std::string &outputUrl="")
Definition: DBDriver.cpp:64
rtabmap::Signature
Definition: Signature.h:48
rtabmap::DBDriver::saveOptimizedMesh
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
Definition: DBDriver.cpp:1260
rtabmap::DBDriver::create
static DBDriver * create(const ParametersMap &parameters=ParametersMap())
Definition: DBDriver.cpp:41


rtabmap
Author(s): Mathieu Labbe
autogenerated on Thu Feb 13 2025 03:44:52