diff --git a/corelib/src/Graph.cpp b/corelib/src/Graph.cpp index 542e9fdb..433fa900 100644 --- a/corelib/src/Graph.cpp +++ b/corelib/src/Graph.cpp @@ -1603,7 +1603,7 @@ int findNearestNode( kdTree->nearestKSearch(pt, 1, ind, dist); if(ind.size() && dist.size() && ind[0] >= 0) { - UDEBUG("Nearest node = %d: %f", ids[ind[0]], dist[0]); + //UDEBUG("Nearest node = %d: %f", ids[ind[0]], dist[0]); id = ids[ind[0]]; } } diff --git a/corelib/src/Memory.cpp b/corelib/src/Memory.cpp index ace57d42..e8406d3c 100644 --- a/corelib/src/Memory.cpp +++ b/corelib/src/Memory.cpp @@ -2406,6 +2406,18 @@ Transform Memory::computeIcpTransformMulti( UASSERT(uContains(poses, toId) && uContains(_signatures, toId)); UDEBUG("Guess=%s", (poses.at(fromId).inverse() * poses.at(toId)).prettyPrint().c_str()); + if(ULogger::level() == ULogger::kDebug) + { + std::string ids; + for(std::map::const_iterator iter = poses.begin(); iter!=poses.end(); ++iter) + { + if(iter->first != fromId) + { + ids += uNumber2Str(iter->first) + " "; + } + } + UDEBUG("%d vs %s", fromId, ids.c_str()); + } // make sure that all laser scans are loaded std::list depthToLoad; @@ -2438,6 +2450,7 @@ Transform Memory::computeIcpTransformMulti( std::string msg; int maxPoints = fromScan.cols; pcl::PointCloud::Ptr assembledToClouds(new pcl::PointCloud); + pcl::PointCloud::Ptr assembledToNormalClouds(new pcl::PointCloud); bool is2D = true; for(std::map::const_iterator iter = poses.begin(); iter!=poses.end(); ++iter) { @@ -2454,14 +2467,26 @@ Transform Memory::computeIcpTransformMulti( { is2D = false; } - pcl::PointCloud::Ptr cloud = util3d::laserScanToPointCloud( - scan, - s->sensorData().laserScanInfo().localTransform() * toPose.inverse() * iter->second); + + if(scan.channels() >= 5) + { + pcl::PointCloud::Ptr cloudNormal = util3d::laserScanToPointCloudNormal( + scan, + s->sensorData().laserScanInfo().localTransform() * toPose.inverse() * iter->second); + *assembledToNormalClouds += *cloudNormal; + } + else + { + pcl::PointCloud::Ptr cloud = util3d::laserScanToPointCloud( + scan, + s->sensorData().laserScanInfo().localTransform() * toPose.inverse() * iter->second); + *assembledToClouds += *cloud; + } + if(scan.cols > maxPoints) { maxPoints = scan.cols; } - *assembledToClouds += *cloud; } } else @@ -2470,28 +2495,22 @@ Transform Memory::computeIcpTransformMulti( } } } - if(assembledToClouds->size()) - { - if(is2D) - { - assembledData.setLaserScanRaw( - util3d::laserScan2dFromPointCloud(*assembledToClouds), - LaserScanInfo( - fromS->sensorData().laserScanInfo().maxPoints()?fromS->sensorData().laserScanInfo().maxPoints():maxPoints, - fromS->sensorData().laserScanInfo().maxRange(), - Transform::getIdentity())); // scans are in base frame - } - else - { - assembledData.setLaserScanRaw( - util3d::laserScanFromPointCloud(*assembledToClouds), - LaserScanInfo( - fromS->sensorData().laserScanInfo().maxPoints()?fromS->sensorData().laserScanInfo().maxPoints():maxPoints, - fromS->sensorData().laserScanInfo().maxRange(), - Transform::getIdentity())); // scans are in base frame - } + cv::Mat assembledScan; + if(assembledToNormalClouds->size()) + { + assembledScan = is2D?util3d::laserScan2dFromPointCloud(*assembledToNormalClouds):util3d::laserScanFromPointCloud(*assembledToNormalClouds); } + else if(assembledToClouds->size()) + { + assembledScan = is2D?util3d::laserScan2dFromPointCloud(*assembledToClouds):util3d::laserScanFromPointCloud(*assembledToClouds); + } + // scans are in base frame but for 2d scans, set the height so that correspondences matching works + assembledData.setLaserScanRaw(assembledScan, + LaserScanInfo( + fromS->sensorData().laserScanInfo().maxPoints()?fromS->sensorData().laserScanInfo().maxPoints():maxPoints, + fromS->sensorData().laserScanInfo().maxRange(), + is2D?Transform(0,0,fromS->sensorData().laserScanInfo().localTransform().z(),0,0,0):Transform::getIdentity())); Transform guess = poses.at(fromId).inverse() * poses.at(toId); std::vector inliersV; diff --git a/corelib/src/RegistrationIcp.cpp b/corelib/src/RegistrationIcp.cpp index a9f8e3e2..ac7acdfb 100644 --- a/corelib/src/RegistrationIcp.cpp +++ b/corelib/src/RegistrationIcp.cpp @@ -425,8 +425,8 @@ Transform RegistrationIcp::computeTransformationImpl( if( _pointToPlane && _voxelSize == 0.0f && - fromScan.channels() >= 6 && - toScan.channels() >= 6 && + fromScan.channels() >= 5 && + toScan.channels() >= 5 && !((fromScan.channels() == 5 || toScan.channels() == 5) && !_libpointmatcher)) // PCL crashes if 2D) { //special case if we have already normals computed and there is no filtering @@ -454,8 +454,8 @@ Transform RegistrationIcp::computeTransformationImpl( PM::ICP & icp = *((PM::ICP*)_libpointmatcherICP); UDEBUG("libpointmatcher icp... (if there is a seg fault here, make sure all third party libraries are built with same Eigen version.)"); T = icp(data, ref); - UDEBUG("libpointmatcher icp...done!"); icpT = Transform::fromEigen3d(Eigen::Affine3d(Eigen::Matrix4d(eigenMatrixToDim(T.template cast(), 4)))); + UDEBUG("libpointmatcher icp...done! T=%s", icpT.prettyPrint().c_str()); float matchRatio = icp.errorMinimizer->getWeightedPointUsedRatio(); UDEBUG("match ratio: %f", matchRatio); diff --git a/corelib/src/Rtabmap.cpp b/corelib/src/Rtabmap.cpp index 61fa3fef..6aaf2265 100644 --- a/corelib/src/Rtabmap.cpp +++ b/corelib/src/Rtabmap.cpp @@ -1228,9 +1228,7 @@ bool Rtabmap::process( //============================================================ if(_proximityByTime && rehearsedId == 0 && // don't do it if rehearsal happened - signature->getWords3().size() && _memory->isIncremental() && // don't do it in localization mode - !signature->isBadSignature() && signature->getWeight()>=0) { const std::set & stm = _memory->getStMem(); @@ -1511,7 +1509,7 @@ bool Rtabmap::process( ++immunizedGlobally; } - UDEBUG("nt=%d m=%d immunized=1", iter->first, iter->second); + //UDEBUG("nt=%d m=%d immunized=1", iter->first, iter->second); } neighbors.erase(iter++); } @@ -1557,7 +1555,7 @@ bool Rtabmap::process( { ++nbDirectNeighborsInDb; } - UDEBUG("nt=%d m=%d", iter->first, iter->second); + //UDEBUG("nt=%d m=%d", iter->first, iter->second); } neighbors.erase(iter++); } @@ -1698,7 +1696,7 @@ bool Rtabmap::process( { ++immunizedLocally; } - UDEBUG("local node %d on path immunized=1", iter->first); + //UDEBUG("local node %d on path immunized=1", iter->first); } } } @@ -1745,7 +1743,7 @@ bool Rtabmap::process( { ++immunizedLocally; } - UDEBUG("local node %d (%f m) immunized=1", iter->second, iter->first); + //UDEBUG("local node %d (%f m) immunized=1", iter->second, iter->first); } } } @@ -2006,7 +2004,7 @@ bool Rtabmap::process( //find the nearest pose on the path int nearestId = rtabmap::graph::findNearestNode(path, _optimizedPoses.at(signature->id())); UASSERT(nearestId > 0); - UDEBUG("Path %d (size=%d) distance=%fm", nearestId, (int)path.size(), _optimizedPoses.at(signature->id()).getDistance(_optimizedPoses.at(nearestId))); + //UDEBUG("Path %d (size=%d) distance=%fm", nearestId, (int)path.size(), _optimizedPoses.at(signature->id()).getDistance(_optimizedPoses.at(nearestId))); // nearest pose must be close and not linked to current location if(!signature->hasLink(nearestId) && @@ -2101,7 +2099,7 @@ bool Rtabmap::process( } else { - UDEBUG("Path %d ignored", nearestId); + //UDEBUG("Path %d ignored", nearestId); } } } @@ -2996,7 +2994,7 @@ std::map > Rtabmap::getPaths(std::mapfirst); + //UDEBUG("%d <- %d", nearestId, jter->first); path.insert(*jter); poses.erase(jter); } diff --git a/guilib/src/CloudViewer.cpp b/guilib/src/CloudViewer.cpp index 00ef8032..0edff4a7 100644 --- a/guilib/src/CloudViewer.cpp +++ b/guilib/src/CloudViewer.cpp @@ -496,7 +496,7 @@ bool CloudViewer::updateCloudPose( { if(_addedClouds.contains(id)) { - UDEBUG("Updating pose %s to %s", id.c_str(), pose.prettyPrint().c_str()); + //UDEBUG("Updating pose %s to %s", id.c_str(), pose.prettyPrint().c_str()); bool samePose = _addedClouds.find(id).value() == pose; Eigen::Affine3f posef = pose.toEigen3f(); if(samePose || diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp index ae2ac6d9..e5603b6f 100644 --- a/guilib/src/DatabaseViewer.cpp +++ b/guilib/src/DatabaseViewer.cpp @@ -4020,19 +4020,19 @@ void DatabaseViewer::sliderIterationsValueChanged(int value) UINFO("rotational_min=%f", rotational_min); UINFO("rotational_max=%f", rotational_max); - ui_->toolBox_statistics->updateStat("GT/translational_rmse/", translational_rmse, false); - ui_->toolBox_statistics->updateStat("GT/translational_mean/", translational_mean, false); - ui_->toolBox_statistics->updateStat("GT/translational_median/", translational_median, false); - ui_->toolBox_statistics->updateStat("GT/translational_std/", translational_std, false); - ui_->toolBox_statistics->updateStat("GT/translational_min/", translational_min, false); - ui_->toolBox_statistics->updateStat("GT/translational_max/", translational_max, false); + ui_->toolBox_statistics->updateStat("GT/translational rmse/", translational_rmse, false); + ui_->toolBox_statistics->updateStat("GT/translational mean/", translational_mean, false); + ui_->toolBox_statistics->updateStat("GT/translational median/", translational_median, false); + ui_->toolBox_statistics->updateStat("GT/translational std/", translational_std, false); + ui_->toolBox_statistics->updateStat("GT/translational min/", translational_min, false); + ui_->toolBox_statistics->updateStat("GT/translational max/", translational_max, false); - ui_->toolBox_statistics->updateStat("GT/rotational_rmse/", rotational_rmse, false); - ui_->toolBox_statistics->updateStat("GT/rotational_mean/", rotational_mean, false); - ui_->toolBox_statistics->updateStat("GT/rotational_median/", rotational_median, false); - ui_->toolBox_statistics->updateStat("GT/rotational_std/", rotational_std, false); - ui_->toolBox_statistics->updateStat("GT/rotational_min/", rotational_min, false); - ui_->toolBox_statistics->updateStat("GT/rotational_max/", rotational_max, false); + ui_->toolBox_statistics->updateStat("GT/rotational rmse/", rotational_rmse, false); + ui_->toolBox_statistics->updateStat("GT/rotational mean/", rotational_mean, false); + ui_->toolBox_statistics->updateStat("GT/rotational median/", rotational_median, false); + ui_->toolBox_statistics->updateStat("GT/rotational std/", rotational_std, false); + ui_->toolBox_statistics->updateStat("GT/rotational min/", rotational_min, false); + ui_->toolBox_statistics->updateStat("GT/rotational max/", rotational_max, false); } } diff --git a/guilib/src/GraphViewer.cpp b/guilib/src/GraphViewer.cpp index 98e5f70f..2380ccdf 100644 --- a/guilib/src/GraphViewer.cpp +++ b/guilib/src/GraphViewer.cpp @@ -673,7 +673,7 @@ void GraphViewer::updatePosterior(const std::map & posterior) std::map::const_iterator jter = posterior.find(iter.key()); if(jter != posterior.end()) { - UDEBUG("id=%d max=%f hyp=%f color = %f", iter.key(), max, jter->second, (1-jter->second/max)*240.0f/360.0f); + //UDEBUG("id=%d max=%f hyp=%f color = %f", iter.key(), max, jter->second, (1-jter->second/max)*240.0f/360.0f); iter.value()->setColor(QColor::fromHsvF((1-jter->second/max)*240.0f/360.0f, 1, 1, 1)); //0=red 240=blue } else diff --git a/guilib/src/MainWindow.cpp b/guilib/src/MainWindow.cpp index b32b27f3..82568ee3 100644 --- a/guilib/src/MainWindow.cpp +++ b/guilib/src/MainWindow.cpp @@ -3309,35 +3309,35 @@ Transform MainWindow::alignPosesToGroundTruth( if((_preferencesDialog->isTimeUsedInFigures() && stamp > 0.0) || (refId && refId>=0)) { - _ui->statsToolBox->updateStat("GT/translational_rmse/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_rmse, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_mean/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_mean, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_median/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_median, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_std/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_std, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_min/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_min, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_max/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_max, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational rmse/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_rmse, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational mean/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_mean, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational median/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_median, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational std/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_std, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational min/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_min, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational max/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, translational_max, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_rmse/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_rmse, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_mean/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_mean, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_median/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_median, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_std/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_std, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_min/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_min, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_max/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_max, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational rmse/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_rmse, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational mean/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_mean, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational median/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_median, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational std/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_std, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational min/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_min, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational max/", _preferencesDialog->isTimeUsedInFigures()?stamp-_firstStamp:refId, rotational_max, _preferencesDialog->isCacheSavedInFigures()); } else { - _ui->statsToolBox->updateStat("GT/translational_rmse/", translational_rmse, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_mean/", translational_mean, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_median/", translational_median, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_std/", translational_std, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_min/", translational_min, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/translational_max/", translational_max, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational rmse/", translational_rmse, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational mean/", translational_mean, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational median/", translational_median, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational std/", translational_std, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational min/", translational_min, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/translational max/", translational_max, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_rmse/", rotational_rmse, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_mean/", rotational_mean, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_median/", rotational_median, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_std/", rotational_std, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_min/", rotational_min, _preferencesDialog->isCacheSavedInFigures()); - _ui->statsToolBox->updateStat("GT/rotational_max/", rotational_max, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational rmse/", rotational_rmse, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational mean/", rotational_mean, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational median/", rotational_median, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational std/", rotational_std, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational min/", rotational_min, _preferencesDialog->isCacheSavedInFigures()); + _ui->statsToolBox->updateStat("GT/rotational max/", rotational_max, _preferencesDialog->isCacheSavedInFigures()); } } } @@ -3348,43 +3348,58 @@ void MainWindow::updateNodeVisibility(int nodeId, bool visible) { UINFO("Update visibility %d", nodeId); QMap viewerClouds = _cloudViewer->getAddedClouds(); - if(_preferencesDialog->isCloudsShown(0)) + Transform pose; + if(_currentGTPosesMap.size() && + _ui->actionAnchor_clouds_to_ground_truth->isChecked() && + _currentGTPosesMap.find(nodeId)!=_currentGTPosesMap.end()) { - std::string cloudName = uFormat("cloud%d", nodeId); - if(visible && !viewerClouds.contains(cloudName) && _cachedSignatures.contains(nodeId) && _currentPosesMap.find(nodeId) != _currentPosesMap.end()) - { - createAndAddCloudToMap(nodeId, _currentPosesMap.find(nodeId)->second, uValue(_currentMapIds, nodeId, -1)); - } - else if(viewerClouds.contains(cloudName)) - { - if(visible && _currentPosesMap.find(nodeId) != _currentPosesMap.end()) - { - //make sure the transformation was done - _cloudViewer->updateCloudPose(cloudName, _currentPosesMap.find(nodeId)->second); - } - _cloudViewer->setCloudVisibility(cloudName, visible); - } + pose = _currentGTPosesMap.at(nodeId); + } + else if(_currentPosesMap.find(nodeId) != _currentPosesMap.end()) + { + pose = _currentPosesMap.at(nodeId); } - if(_preferencesDialog->isScansShown(0)) + if(!pose.isNull() || !visible) { - std::string scanName = uFormat("scan%d", nodeId); - if(visible && !viewerClouds.contains(scanName) && _cachedSignatures.contains(nodeId) && _currentPosesMap.find(nodeId) != _currentPosesMap.end()) + if(_preferencesDialog->isCloudsShown(0)) { - createAndAddScanToMap(nodeId, _currentPosesMap.find(nodeId)->second, uValue(_currentMapIds, nodeId, -1)); - } - else if(viewerClouds.contains(scanName)) - { - if(visible && _currentPosesMap.find(nodeId) != _currentPosesMap.end()) + std::string cloudName = uFormat("cloud%d", nodeId); + if(visible && !viewerClouds.contains(cloudName) && _cachedSignatures.contains(nodeId)) { - //make sure the transformation was done - _cloudViewer->updateCloudPose(scanName, _currentPosesMap.find(nodeId)->second); + createAndAddCloudToMap(nodeId, pose, uValue(_currentMapIds, nodeId, -1)); + } + else if(viewerClouds.contains(cloudName)) + { + if(visible) + { + //make sure the transformation was done + _cloudViewer->updateCloudPose(cloudName, pose); + } + _cloudViewer->setCloudVisibility(cloudName, visible); } - _cloudViewer->setCloudVisibility(scanName, visible); } - } - _cloudViewer->update(); + if(_preferencesDialog->isScansShown(0)) + { + std::string scanName = uFormat("scan%d", nodeId); + if(visible && !viewerClouds.contains(scanName) && _cachedSignatures.contains(nodeId)) + { + createAndAddScanToMap(nodeId, pose, uValue(_currentMapIds, nodeId, -1)); + } + else if(viewerClouds.contains(scanName)) + { + if(visible) + { + //make sure the transformation was done + _cloudViewer->updateCloudPose(scanName, pose); + } + _cloudViewer->setCloudVisibility(scanName, visible); + } + } + + _cloudViewer->update(); + } } void MainWindow::updateGraphView()