diff --git a/guilib/include/rtabmap/gui/DatabaseViewer.h b/guilib/include/rtabmap/gui/DatabaseViewer.h index d5b0e10d..806a8a90 100644 --- a/guilib/include/rtabmap/gui/DatabaseViewer.h +++ b/guilib/include/rtabmap/gui/DatabaseViewer.h @@ -59,6 +59,7 @@ private slots: void exportDatabase(); void extractImages(); void generateLocalGraph(); + void generateTOROGraph(); void view3DMap(); void generate3DMap(); void sliderAValueChanged(int); diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp index 9911fdf6..d2b8ae81 100644 --- a/guilib/src/DatabaseViewer.cpp +++ b/guilib/src/DatabaseViewer.cpp @@ -75,9 +75,12 @@ DatabaseViewer::DatabaseViewer(QWidget * parent) : connect(ui_->actionExtract_images, SIGNAL(triggered()), this, SLOT(extractImages())); connect(ui_->actionGenerate_graph_dot, SIGNAL(triggered()), this, SLOT(generateGraph())); connect(ui_->actionGenerate_local_graph_dot, SIGNAL(triggered()), this, SLOT(generateLocalGraph())); + connect(ui_->actionGenerate_TORO_graph_graph, SIGNAL(triggered()), this, SLOT(generateTOROGraph())); connect(ui_->actionView_3D_map, SIGNAL(triggered()), this, SLOT(view3DMap())); connect(ui_->actionGenerate_3D_map_pcd, SIGNAL(triggered()), this, SLOT(generate3DMap())); + ui_->actionGenerate_TORO_graph_graph->setEnabled(false); + ui_->horizontalSlider_A->setTracking(false); ui_->horizontalSlider_B->setTracking(false); ui_->horizontalSlider_A->setEnabled(false); @@ -290,6 +293,8 @@ void DatabaseViewer::updateIds() ui_->spinBox_optimizationsFrom->setValue(memory_->getLastWorkingSignature()->id()); } + ui_->actionGenerate_TORO_graph_graph->setEnabled(false); + graphes_.clear(); neighborLinks_.clear(); loopLinks_.clear(); for(std::multimap::iterator iter = links_.begin(); iter!=links_.end(); ++iter) @@ -413,6 +418,26 @@ void DatabaseViewer::generateLocalGraph() } } +void DatabaseViewer::generateTOROGraph() +{ + if(!graphes_.size() || !links_.size()) + { + QMessageBox::warning(this, tr("Cannot generate a TORO graph"), tr("No poses or no links...")); + return; + } + bool ok = false; + int id = QInputDialog::getInt(this, tr("Which iteration?"), tr("Iteration (0 -> %1)").arg(graphes_.size()-1), graphes_.size()-1, 0, graphes_.size()-1, 1, &ok); + + if(ok) + { + QString path = QFileDialog::getSaveFileName(this, tr("Save File"), pathDatabase_+"/constraints" + QString::number(id) + ".graph", tr("TORO file (*.graph)")); + if(!path.isEmpty()) + { + rtabmap::util3d::saveTOROGraph(path.toStdString(), uValueAt(graphes_, id), links_); + } + } +} + void DatabaseViewer::view3DMap() { if(!ids_.size() || !memory_) @@ -899,6 +924,7 @@ void DatabaseViewer::updateGraphView() std::map finalPoses; graphes_.push_back(poses_); + ui_->actionGenerate_TORO_graph_graph->setEnabled(true); std::map ids = memory_->getNeighborsId(ui_->spinBox_optimizationsFrom->value(), 0, -1, true); // Modify IDs using the margin from the current signature (TORO root will be the last signature) diff --git a/guilib/src/ui/DatabaseViewer.ui b/guilib/src/ui/DatabaseViewer.ui index a8a58bf5..88bb320b 100644 --- a/guilib/src/ui/DatabaseViewer.ui +++ b/guilib/src/ui/DatabaseViewer.ui @@ -280,6 +280,7 @@ + @@ -458,7 +459,7 @@ - Generate graph (.dot) ... + Generate graph (*.dot) ... @@ -488,7 +489,7 @@ - Export 3D map (.pcd) ... + Export 3D map (*.pcd) ... @@ -506,6 +507,11 @@ View 3D map... + + + Generate TORO graph (*.graph)... + +