DbViewer/info tool: Updated number of links to report unique links. Added statistics about length of loop closures in info tool.

This commit is contained in:
matlabbe
2023-12-18 16:27:18 -08:00
parent ec8f9fdcfd
commit 933d26f005
3 changed files with 48 additions and 12 deletions

View File

@@ -7290,15 +7290,25 @@ void DatabaseViewer::updateGraphView()
int totalPriors = 0; int totalPriors = 0;
int totalLandmarks = 0; int totalLandmarks = 0;
int totalGravity = 0; int totalGravity = 0;
std::multimap<int, int> uniqueLinks;
for(std::multimap<int, rtabmap::Link>::iterator iter=links.begin(); iter!=links.end();) for(std::multimap<int, rtabmap::Link>::iterator iter=links.begin(); iter!=links.end();)
{ {
bool isUnique = iter->second.from() == iter->second.to(); // Count all self-reference links
if(graph::findLink(uniqueLinks, iter->second.from(), iter->second.to(), true) == uniqueLinks.end())
{
uniqueLinks.insert(std::make_pair(iter->second.from(), iter->second.to()));
isUnique = true;
}
if(iter->second.type() == Link::kNeighbor) if(iter->second.type() == Link::kNeighbor)
{ {
++totalNeighbor; if(isUnique)
++totalNeighbor;
} }
else if(iter->second.type() == Link::kNeighborMerged) else if(iter->second.type() == Link::kNeighborMerged)
{ {
++totalNeighborMerged; if(isUnique)
++totalNeighborMerged;
} }
else if(iter->second.type() == Link::kGlobalClosure) else if(iter->second.type() == Link::kGlobalClosure)
{ {
@@ -7308,7 +7318,8 @@ void DatabaseViewer::updateGraphView()
continue; continue;
} }
loopLinks_.push_back(iter->second); loopLinks_.push_back(iter->second);
++totalGlobal; if(isUnique)
++totalGlobal;
} }
else if(iter->second.type() == Link::kLocalSpaceClosure) else if(iter->second.type() == Link::kLocalSpaceClosure)
{ {
@@ -7318,7 +7329,8 @@ void DatabaseViewer::updateGraphView()
continue; continue;
} }
loopLinks_.push_back(iter->second); loopLinks_.push_back(iter->second);
++totalLocalSpace; if(isUnique)
++totalLocalSpace;
} }
else if(iter->second.type() == Link::kLocalTimeClosure) else if(iter->second.type() == Link::kLocalTimeClosure)
{ {
@@ -7328,7 +7340,8 @@ void DatabaseViewer::updateGraphView()
continue; continue;
} }
loopLinks_.push_back(iter->second); loopLinks_.push_back(iter->second);
++totalLocalTime; if(isUnique)
++totalLocalTime;
} }
else if(iter->second.type() == Link::kUserClosure) else if(iter->second.type() == Link::kUserClosure)
{ {
@@ -7338,7 +7351,8 @@ void DatabaseViewer::updateGraphView()
continue; continue;
} }
loopLinks_.push_back(iter->second); loopLinks_.push_back(iter->second);
++totalUser; if(isUnique)
++totalUser;
} }
else if(iter->second.type() == Link::kLandmark) else if(iter->second.type() == Link::kLandmark)
{ {
@@ -7353,7 +7367,8 @@ void DatabaseViewer::updateGraphView()
poses.insert(std::make_pair(iter->second.to(), poses.at(iter->second.from())*iter->second.transform())); poses.insert(std::make_pair(iter->second.to(), poses.at(iter->second.from())*iter->second.transform()));
} }
loopLinks_.push_back(iter->second); loopLinks_.push_back(iter->second);
++totalLandmarks; if(isUnique)
++totalLandmarks;
// add landmark priors if there are some // add landmark priors if there are some
int markerId = iter->second.to(); int markerId = iter->second.to();
@@ -7365,16 +7380,19 @@ void DatabaseViewer::updateGraphView()
links.insert(std::make_pair(markerId, Link(markerId, markerId, Link::kPosePrior, markerPriors.at(markerId), infMatrix))); links.insert(std::make_pair(markerId, Link(markerId, markerId, Link::kPosePrior, markerPriors.at(markerId), infMatrix)));
UDEBUG("Added prior %d : %s (variance: lin=%f ang=%f)", markerId, markerPriors.at(markerId).prettyPrint().c_str(), UDEBUG("Added prior %d : %s (variance: lin=%f ang=%f)", markerId, markerPriors.at(markerId).prettyPrint().c_str(),
markerPriorsLinearVariance, markerPriorsAngularVariance); markerPriorsLinearVariance, markerPriorsAngularVariance);
++totalPriors; if(isUnique)
++totalPriors;
} }
} }
else if(iter->second.type() == Link::kPosePrior) else if(iter->second.type() == Link::kPosePrior)
{ {
++totalPriors; if(isUnique)
++totalPriors;
} }
else if(iter->second.type() == Link::kGravity) else if(iter->second.type() == Link::kGravity)
{ {
++totalGravity; if(isUnique)
++totalGravity;
} }
else else
{ {

View File

@@ -1393,6 +1393,9 @@
</item> </item>
<item row="10" column="1"> <item row="10" column="1">
<widget class="QLabel" name="label_41"> <widget class="QLabel" name="label_41">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;N: Neighbor&lt;/p&gt;&lt;p&gt;NM: Neighbor Merged&lt;/p&gt;&lt;p&gt;G: Global&lt;/p&gt;&lt;p&gt;LS: Local by Space (Proximity)&lt;/p&gt;&lt;p&gt;LT: Local by Time (Proximity)&lt;/p&gt;&lt;p&gt;U: User&lt;/p&gt;&lt;p&gt;P: Prior&lt;/p&gt;&lt;p&gt;LM: Landmark&lt;/p&gt;&lt;p&gt;GR: Gravity&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text"> <property name="text">
<string>Links (N, NM, G, LS, LT, U, P, LM, GR)</string> <string>Links (N, NM, G, LS, LT, U, P, LM, GR)</string>
</property> </property>

View File

@@ -347,7 +347,9 @@ int main(int argc, char * argv[])
driver->getAllLinks(links, true, true); driver->getAllLinks(links, true, true);
bool reducedGraph = false; bool reducedGraph = false;
std::vector<int> linkTypes(Link::kEnd, 0); std::vector<int> linkTypes(Link::kEnd, 0);
for(std::multimap<int, Link>::iterator iter=links.begin(); iter!=links.end(); ++iter) std::vector<std::vector<float> > linkLengths(Link::kEnd);
std::multimap<int, Link> uniqueLinks = graph::filterDuplicateLinks(links);
for(std::multimap<int, Link>::iterator iter=uniqueLinks.begin(); iter!=uniqueLinks.end(); ++iter)
{ {
if(iter->second.type() == Link::kNeighborMerged) if(iter->second.type() == Link::kNeighborMerged)
{ {
@@ -356,6 +358,7 @@ int main(int argc, char * argv[])
if(iter->second.type()>=0 && iter->second.type()<Link::kEnd) if(iter->second.type()>=0 && iter->second.type()<Link::kEnd)
{ {
++linkTypes[iter->second.type()]; ++linkTypes[iter->second.type()];
linkLengths[iter->second.type()].push_back(iter->second.transform().getNorm());
} }
} }
if(reducedGraph) if(reducedGraph)
@@ -408,7 +411,19 @@ int main(int argc, char * argv[])
std::cout << (uFormat("Links:\n")); std::cout << (uFormat("Links:\n"));
for(size_t i=0; i<linkTypes.size(); ++i) for(size_t i=0; i<linkTypes.size(); ++i)
{ {
std::cout << (uFormat("%s%d\n", pad(uFormat(" %s:", Link::typeName((Link::Type)i).c_str())).c_str(), linkTypes[i])); float avg = uMean(linkLengths[i]);
float std = uVariance(linkLengths[i], avg);
float max = uMax(linkLengths[i]);
if(std>0)
{
std = std::sqrt(std);
}
std::cout << (uFormat("%s%d\t(length avg: %.2fm, std: %.2fm, max: %.2fm)\n",
pad(uFormat(" %s:", Link::typeName((Link::Type)i).c_str())).c_str(),
linkTypes[i],
avg,
std,
max));
} }
std::cout << ("\n"); std::cout << ("\n");
long total = 0; long total = 0;