mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 17:40:23 +08:00
DBDriver: added ignoreBadSignatures param to getAllNodeIds()
This commit is contained in:
@@ -122,7 +122,7 @@ public:
|
|||||||
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp) const;
|
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp) const;
|
||||||
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
void getWeight(int signatureId, int & weight) const;
|
void getWeight(int signatureId, int & weight) const;
|
||||||
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false) const;
|
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false) const;
|
||||||
void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true) const;
|
void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true) const;
|
||||||
void getLastNodeId(int & id) const;
|
void getLastNodeId(int & id) const;
|
||||||
void getLastWordId(int & id) const;
|
void getLastWordId(int & id) const;
|
||||||
@@ -170,7 +170,7 @@ private:
|
|||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) const = 0;
|
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) const = 0;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp) const = 0;
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp) const = 0;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren) const = 0;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const = 0;
|
||||||
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
|
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
||||||
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
|
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
|
||||||
|
|||||||
@@ -627,7 +627,7 @@ void DBDriver::getWeight(int signatureId, int & weight) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBDriver::getAllNodeIds(std::set<int> & ids, bool ignoreChildren) const
|
void DBDriver::getAllNodeIds(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const
|
||||||
{
|
{
|
||||||
// look in the trash
|
// look in the trash
|
||||||
_trashesMutex.lock();
|
_trashesMutex.lock();
|
||||||
@@ -662,7 +662,7 @@ void DBDriver::getAllNodeIds(std::set<int> & ids, bool ignoreChildren) const
|
|||||||
_trashesMutex.unlock();
|
_trashesMutex.unlock();
|
||||||
|
|
||||||
_dbSafeAccessMutex.lock();
|
_dbSafeAccessMutex.lock();
|
||||||
this->getAllNodeIdsQuery(ids, ignoreChildren);
|
this->getAllNodeIdsQuery(ids, ignoreChildren, ignoreBadSignatures);
|
||||||
_dbSafeAccessMutex.unlock();
|
_dbSafeAccessMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1062,7 +1062,7 @@ bool DBDriverSqlite3::getNodeInfoQuery(int signatureId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DBDriverSqlite3::getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren) const
|
void DBDriverSqlite3::getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const
|
||||||
{
|
{
|
||||||
if(_ppDb)
|
if(_ppDb)
|
||||||
{
|
{
|
||||||
@@ -1072,20 +1072,18 @@ void DBDriverSqlite3::getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildre
|
|||||||
sqlite3_stmt * ppStmt = 0;
|
sqlite3_stmt * ppStmt = 0;
|
||||||
std::stringstream query;
|
std::stringstream query;
|
||||||
|
|
||||||
if(!ignoreChildren)
|
query << "SELECT DISTINCT id "
|
||||||
|
<< "FROM Node ";
|
||||||
|
if(ignoreChildren)
|
||||||
{
|
{
|
||||||
query << "SELECT id "
|
query << "INNER JOIN Link "
|
||||||
<< "FROM Node "
|
<< "ON id = to_id "; // use to_id to ignore all children (which don't have link pointing on them)
|
||||||
<< "ORDER BY id";
|
|
||||||
}
|
}
|
||||||
else
|
if(ignoreBadSignatures)
|
||||||
{
|
{
|
||||||
query << "SELECT id "
|
query << "WHERE id in (select node_id from Map_Node_Word) ";
|
||||||
<< "FROM Node "
|
|
||||||
<< "INNER JOIN Link "
|
|
||||||
<< "ON id = to_id " // use to_id to ignore all children (which don't have link pointing on them)
|
|
||||||
<< "ORDER BY id";
|
|
||||||
}
|
}
|
||||||
|
query << "ORDER BY id";
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(_ppDb, query.str().c_str(), -1, &ppStmt, 0);
|
rc = sqlite3_prepare_v2(_ppDb, query.str().c_str(), -1, &ppStmt, 0);
|
||||||
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error: %s", sqlite3_errmsg(_ppDb)).c_str());
|
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error: %s", sqlite3_errmsg(_ppDb)).c_str());
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ private:
|
|||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) const;
|
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) const;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp) const;
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp) const;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren) const;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const;
|
||||||
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const;
|
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const;
|
||||||
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const;
|
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const;
|
||||||
|
|||||||
@@ -1062,6 +1062,10 @@ void DatabaseViewer::updateIds()
|
|||||||
int sessions = ids_.size()?1:0;
|
int sessions = ids_.size()?1:0;
|
||||||
double totalTime = 0.0;
|
double totalTime = 0.0;
|
||||||
double previousStamp = 0.0;
|
double previousStamp = 0.0;
|
||||||
|
std::set<int> idsWithoutBad;
|
||||||
|
dbDriver_->getAllNodeIds(idsWithoutBad, false, true);
|
||||||
|
int badcountInLTM = 0;
|
||||||
|
int badCountInGraph = 0;
|
||||||
for(int i=0; i<ids_.size(); ++i)
|
for(int i=0; i<ids_.size(); ++i)
|
||||||
{
|
{
|
||||||
idToIndex_.insert(ids_[i], i);
|
idToIndex_.insert(ids_[i], i);
|
||||||
@@ -1129,6 +1133,15 @@ void DatabaseViewer::updateIds()
|
|||||||
{
|
{
|
||||||
poses_.insert(std::make_pair(ids_[i], p));
|
poses_.insert(std::make_pair(ids_[i], p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(idsWithoutBad.find(ids_[i]) == idsWithoutBad.end())
|
||||||
|
{
|
||||||
|
++badcountInLTM;
|
||||||
|
if(addPose)
|
||||||
|
{
|
||||||
|
++badCountInGraph;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
UINFO("Loaded %d ids, %d poses and %d links", (int)ids_.size(), (int)poses_.size(), (int)links_.size());
|
UINFO("Loaded %d ids, %d poses and %d links", (int)ids_.size(), (int)poses_.size(), (int)links_.size());
|
||||||
|
|
||||||
@@ -1148,6 +1161,9 @@ void DatabaseViewer::updateIds()
|
|||||||
ui_->textEdit_info->append(tr("Scans size:\t\t%1 MB").arg(dbDriver_->getLaserScansMemoryUsed()/1000000));
|
ui_->textEdit_info->append(tr("Scans size:\t\t%1 MB").arg(dbDriver_->getLaserScansMemoryUsed()/1000000));
|
||||||
ui_->textEdit_info->append(tr("User data size:\t%1 bytes").arg(dbDriver_->getUserDataMemoryUsed()));
|
ui_->textEdit_info->append(tr("User data size:\t%1 bytes").arg(dbDriver_->getUserDataMemoryUsed()));
|
||||||
ui_->textEdit_info->append(tr("Dictionary size:\t%1 bytes").arg(dbDriver_->getWordsMemoryUsed()));
|
ui_->textEdit_info->append(tr("Dictionary size:\t%1 bytes").arg(dbDriver_->getWordsMemoryUsed()));
|
||||||
|
ui_->textEdit_info->append("");
|
||||||
|
ui_->textEdit_info->append(tr("%1 bad signatures in LTM").arg(badcountInLTM));
|
||||||
|
ui_->textEdit_info->append(tr("%1 bad signatures in the global graph").arg(badCountInGraph));
|
||||||
|
|
||||||
if(ids.size())
|
if(ids.size())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user