mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 01:20:25 +08:00
Added option to show graphs in the 3D map view. (See "General Settings->3D rendering->Show Graphs" default true)
git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1943 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
@@ -2145,9 +2145,7 @@ void Rtabmap::get3DMap(std::map<int, Signature> & signatures,
|
|||||||
|
|
||||||
for(std::set<int>::iterator iter = ids.begin(); iter!=ids.end(); ++iter)
|
for(std::set<int>::iterator iter = ids.begin(); iter!=ids.end(); ++iter)
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
|
||||||
Signature data = _memory->getSignatureData(*iter);
|
Signature data = _memory->getSignatureData(*iter);
|
||||||
UDEBUG("");
|
|
||||||
if(data.id() != Memory::kIdInvalid)
|
if(data.id() != Memory::kIdInvalid)
|
||||||
{
|
{
|
||||||
signatures.insert(std::make_pair(*iter, Signature())).first->second = data;
|
signatures.insert(std::make_pair(*iter, Signature())).first->second = data;
|
||||||
@@ -2155,7 +2153,7 @@ void Rtabmap::get3DMap(std::map<int, Signature> & signatures,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size()))
|
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1))
|
||||||
{
|
{
|
||||||
UERROR("Last working signature is null!?");
|
UERROR("Last working signature is null!?");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2889,13 +2889,13 @@ cv::Mat create2DMap(const std::map<int, Transform> & poses,
|
|||||||
float & xMin,
|
float & xMin,
|
||||||
float & yMin)
|
float & yMin)
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("poses=%d, scans = %d", poses.size(), scans.size());
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > localScans;
|
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > localScans;
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ> minMax;
|
pcl::PointCloud<pcl::PointXYZ> minMax;
|
||||||
for(std::map<int, Transform>::const_iterator iter = poses.begin(); iter!=poses.end(); ++iter)
|
for(std::map<int, Transform>::const_iterator iter = poses.begin(); iter!=poses.end(); ++iter)
|
||||||
{
|
{
|
||||||
if(uContains(scans, iter->first) && scans.size())
|
if(uContains(scans, iter->first) && scans.at(iter->first)->size())
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = transformPointCloud<pcl::PointXYZ>(scans.at(iter->first), iter->second);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = transformPointCloud<pcl::PointXYZ>(scans.at(iter->first), iter->second);
|
||||||
pcl::PointXYZ min, max;
|
pcl::PointXYZ min, max;
|
||||||
|
|||||||
@@ -130,6 +130,13 @@ public:
|
|||||||
void updateCameraPosition(
|
void updateCameraPosition(
|
||||||
const Transform & pose);
|
const Transform & pose);
|
||||||
|
|
||||||
|
void addOrUpdateGraph(
|
||||||
|
const std::string & id,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZ>::Ptr & graph,
|
||||||
|
const QColor & color = Qt::gray);
|
||||||
|
void removeGraph(const std::string & id);
|
||||||
|
void removeAllGraphs();
|
||||||
|
|
||||||
void setTrajectoryShown(bool shown);
|
void setTrajectoryShown(bool shown);
|
||||||
void setTrajectorySize(int value);
|
void setTrajectorySize(int value);
|
||||||
void clearTrajectory();
|
void clearTrajectory();
|
||||||
@@ -182,6 +189,7 @@ private:
|
|||||||
QAction * _aShowGrid;
|
QAction * _aShowGrid;
|
||||||
QAction * _aSetBackgroundColor;
|
QAction * _aSetBackgroundColor;
|
||||||
QMenu * _menu;
|
QMenu * _menu;
|
||||||
|
std::map<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr > _graphes;
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr _trajectory;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr _trajectory;
|
||||||
unsigned int _maxTrajectorySize;
|
unsigned int _maxTrajectorySize;
|
||||||
QMap<std::string, Transform> _addedClouds; // include cloud, scan, meshes
|
QMap<std::string, Transform> _addedClouds; // include cloud, scan, meshes
|
||||||
|
|||||||
@@ -194,9 +194,9 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void update3DMapVisibility(bool cloudsShown, bool scansShown);
|
void update3DMapVisibility(bool cloudsShown, bool scansShown);
|
||||||
void updateMapCloud(const std::map<int, Transform> & poses, const Transform & pose, const std::multimap<int, Link> & constraints, bool verboseProgress = false);
|
void updateMapCloud(const std::map<int, Transform> & poses, const Transform & pose, const std::multimap<int, Link> & constraints, const std::map<int, int> & mapIds, bool verboseProgress = false);
|
||||||
void createAndAddCloudToMap(int nodeId, const Transform & pose);
|
void createAndAddCloudToMap(int nodeId, const Transform & pose, int mapId);
|
||||||
void createAndAddScanToMap(int nodeId, const Transform & pose);
|
void createAndAddScanToMap(int nodeId, const Transform & pose, int mapId);
|
||||||
void drawKeypoints(const std::multimap<int, cv::KeyPoint> & refWords, const std::multimap<int, cv::KeyPoint> & loopWords);
|
void drawKeypoints(const std::multimap<int, cv::KeyPoint> & refWords, const std::multimap<int, cv::KeyPoint> & loopWords);
|
||||||
void setupMainLayout(bool vertical);
|
void setupMainLayout(bool vertical);
|
||||||
void updateSelectSourceImageMenu(int type);
|
void updateSelectSourceImageMenu(int type);
|
||||||
@@ -261,9 +261,9 @@ private:
|
|||||||
bool _emptyNewDatabase;
|
bool _emptyNewDatabase;
|
||||||
|
|
||||||
QMap<int, Signature> _cachedSignatures;
|
QMap<int, Signature> _cachedSignatures;
|
||||||
QMap<int, int> _mapIds;
|
std::map<int, Transform> _currentPosesMap; // <nodeId, pose>
|
||||||
std::map<int, Transform> _currentPosesMap;
|
std::multimap<int, Link> _currentLinksMap; // <nodeFromId, link>
|
||||||
std::multimap<int, Link> _currentLinksMap;
|
std::map<int, int> _currentMapIds; // <nodeId, mapId>
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > _createdClouds;
|
std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > _createdClouds;
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > _createdScans;
|
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > _createdScans;
|
||||||
std::map<int, std::pair<cv::Mat, cv::Mat> > _occupancyLocalMaps; // <ground, obstacles>
|
std::map<int, std::pair<cv::Mat, cv::Mat> > _occupancyLocalMaps; // <ground, obstacles>
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ public:
|
|||||||
int getKeypointsOpacity() const;
|
int getKeypointsOpacity() const;
|
||||||
int getOdomQualityWarnThr() const;
|
int getOdomQualityWarnThr() const;
|
||||||
|
|
||||||
|
bool isGraphsShown() const;
|
||||||
bool isCloudMeshing() const;
|
bool isCloudMeshing() const;
|
||||||
bool isCloudsShown(int index) const; // 0=map, 1=odom
|
bool isCloudsShown(int index) const; // 0=map, 1=odom
|
||||||
double getCloudVoxelSize(int index) const; // 0=map, 1=odom
|
double getCloudVoxelSize(int index) const; // 0=map, 1=odom
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ CloudViewer::~CloudViewer()
|
|||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
this->removeAllClouds();
|
this->removeAllClouds();
|
||||||
|
this->removeAllGraphs();
|
||||||
delete _visualizer;
|
delete _visualizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,6 +424,61 @@ void CloudViewer::removeOccupancyGridMap()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CloudViewer::addOrUpdateGraph(
|
||||||
|
const std::string & id,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZ>::Ptr & graph,
|
||||||
|
const QColor & color)
|
||||||
|
{
|
||||||
|
if(id.empty())
|
||||||
|
{
|
||||||
|
UERROR("id should not be empty!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
removeGraph(id);
|
||||||
|
|
||||||
|
if(graph->size())
|
||||||
|
{
|
||||||
|
_graphes.insert(std::make_pair(id, graph));
|
||||||
|
|
||||||
|
pcl::PolygonMesh mesh;
|
||||||
|
pcl::Vertices vertices;
|
||||||
|
vertices.vertices.resize(graph->size());
|
||||||
|
for(unsigned int i=0; i<vertices.vertices.size(); ++i)
|
||||||
|
{
|
||||||
|
vertices.vertices[i] = i;
|
||||||
|
}
|
||||||
|
pcl::toPCLPointCloud2(*graph, mesh.cloud);
|
||||||
|
mesh.polygons.push_back(vertices);
|
||||||
|
_visualizer->addPolylineFromPolygonMesh(mesh, id);
|
||||||
|
_visualizer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, color.redF(), color.greenF(), color.blueF(), id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudViewer::removeGraph(const std::string & id)
|
||||||
|
{
|
||||||
|
if(id.empty())
|
||||||
|
{
|
||||||
|
UERROR("id should not be empty!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_graphes.find(id) != _graphes.end())
|
||||||
|
{
|
||||||
|
_visualizer->removeShape(id);
|
||||||
|
_graphes.erase(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudViewer::removeAllGraphs()
|
||||||
|
{
|
||||||
|
for(std::map<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr >::iterator iter = _graphes.begin(); iter!=_graphes.end(); ++iter)
|
||||||
|
{
|
||||||
|
_visualizer->removeShape(iter->first);
|
||||||
|
}
|
||||||
|
_graphes.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void CloudViewer::setTrajectoryShown(bool shown)
|
void CloudViewer::setTrajectoryShown(bool shown)
|
||||||
{
|
{
|
||||||
_aShowTrajectory->setChecked(shown);
|
_aShowTrajectory->setChecked(shown);
|
||||||
|
|||||||
@@ -735,14 +735,6 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
signature.uncompressData(); // make sure data are uncompressed
|
signature.uncompressData(); // make sure data are uncompressed
|
||||||
_cachedSignatures.insert(stat.getSignature().id(), signature);
|
_cachedSignatures.insert(stat.getSignature().id(), signature);
|
||||||
|
|
||||||
// map ids
|
|
||||||
for(std::map<int, int>::const_iterator iter = stat.getMapIds().begin();
|
|
||||||
iter != stat.getMapIds().end();
|
|
||||||
++iter)
|
|
||||||
{
|
|
||||||
_mapIds.insert(iter->first, iter->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
int rehearsed = (int)uValue(stat.data(), Statistics::kMemoryRehearsal_merged(), 0.0f);
|
int rehearsed = (int)uValue(stat.data(), Statistics::kMemoryRehearsal_merged(), 0.0f);
|
||||||
int localTimeClosures = (int)uValue(stat.data(), Statistics::kLocalLoopTime_closures(), 0.0f);
|
int localTimeClosures = (int)uValue(stat.data(), Statistics::kLocalLoopTime_closures(), 0.0f);
|
||||||
bool scanMatchingSuccess = (bool)uValue(stat.data(), Statistics::kLocalLoopOdom_corrected(), 0.0f);
|
bool scanMatchingSuccess = (bool)uValue(stat.data(), Statistics::kLocalLoopOdom_corrected(), 0.0f);
|
||||||
@@ -936,7 +928,8 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
// update pose only if odometry is not received
|
// update pose only if odometry is not received
|
||||||
updateMapCloud(stat.poses(),
|
updateMapCloud(stat.poses(),
|
||||||
_odometryReceived||stat.poses().size()==0?Transform():stat.poses().rbegin()->second,
|
_odometryReceived||stat.poses().size()==0?Transform():stat.poses().rbegin()->second,
|
||||||
stat.constraints());
|
stat.constraints(),
|
||||||
|
stat.getMapIds());
|
||||||
|
|
||||||
_odometryReceived = false;
|
_odometryReceived = false;
|
||||||
|
|
||||||
@@ -986,12 +979,14 @@ void MainWindow::updateMapCloud(
|
|||||||
const std::map<int, Transform> & posesIn,
|
const std::map<int, Transform> & posesIn,
|
||||||
const Transform & currentPose,
|
const Transform & currentPose,
|
||||||
const std::multimap<int, Link> & constraints,
|
const std::multimap<int, Link> & constraints,
|
||||||
|
const std::map<int, int> & mapIdsIn,
|
||||||
bool verboseProgress)
|
bool verboseProgress)
|
||||||
{
|
{
|
||||||
if(posesIn.size())
|
if(posesIn.size())
|
||||||
{
|
{
|
||||||
_currentPosesMap = posesIn;
|
_currentPosesMap = posesIn;
|
||||||
_currentLinksMap = constraints;
|
_currentLinksMap = constraints;
|
||||||
|
_currentMapIds = mapIdsIn;
|
||||||
if(_currentPosesMap.size())
|
if(_currentPosesMap.size())
|
||||||
{
|
{
|
||||||
if(!_ui->actionSave_point_cloud->isEnabled() &&
|
if(!_ui->actionSave_point_cloud->isEnabled() &&
|
||||||
@@ -1022,6 +1017,7 @@ void MainWindow::updateMapCloud(
|
|||||||
|
|
||||||
// filter duplicated poses
|
// filter duplicated poses
|
||||||
std::map<int, Transform> poses;
|
std::map<int, Transform> poses;
|
||||||
|
std::map<int, int> mapIds;
|
||||||
if(_preferencesDialog->isCloudFiltering() && posesIn.size())
|
if(_preferencesDialog->isCloudFiltering() && posesIn.size())
|
||||||
{
|
{
|
||||||
float radius = _preferencesDialog->getCloudFilteringRadius();
|
float radius = _preferencesDialog->getCloudFilteringRadius();
|
||||||
@@ -1029,11 +1025,26 @@ void MainWindow::updateMapCloud(
|
|||||||
poses = util3d::radiusPosesFiltering(posesIn, radius, angle);
|
poses = util3d::radiusPosesFiltering(posesIn, radius, angle);
|
||||||
// make sure the last is here
|
// make sure the last is here
|
||||||
poses.insert(*posesIn.rbegin());
|
poses.insert(*posesIn.rbegin());
|
||||||
|
for(std::map<int, Transform>::iterator iter= poses.begin(); iter!=poses.end(); ++iter)
|
||||||
|
{
|
||||||
|
std::map<int, int>::const_iterator jter = mapIdsIn.find(iter->first);
|
||||||
|
if(jter!=mapIdsIn.end())
|
||||||
|
{
|
||||||
|
mapIds.insert(*jter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("map id of node %d not found!", iter->first);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
poses = posesIn;
|
poses = posesIn;
|
||||||
|
mapIds = mapIdsIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, bool> posesMask;
|
std::map<int, bool> posesMask;
|
||||||
for(std::map<int, Transform>::const_iterator iter = posesIn.begin(); iter!=posesIn.end(); ++iter)
|
for(std::map<int, Transform>::const_iterator iter = posesIn.begin(); iter!=posesIn.end(); ++iter)
|
||||||
{
|
{
|
||||||
@@ -1075,7 +1086,7 @@ void MainWindow::updateMapCloud(
|
|||||||
QMap<int, Signature>::iterator jter = _cachedSignatures.find(iter->first);
|
QMap<int, Signature>::iterator jter = _cachedSignatures.find(iter->first);
|
||||||
if(!jter->getImageCompressed().empty() && !jter->getDepthCompressed().empty())
|
if(!jter->getImageCompressed().empty() && !jter->getDepthCompressed().empty())
|
||||||
{
|
{
|
||||||
this->createAndAddCloudToMap(iter->first, iter->second);
|
this->createAndAddCloudToMap(iter->first, iter->second, uValue(mapIds, iter->first, -1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1110,7 +1121,7 @@ void MainWindow::updateMapCloud(
|
|||||||
QMap<int, Signature>::iterator jter = _cachedSignatures.find(iter->first);
|
QMap<int, Signature>::iterator jter = _cachedSignatures.find(iter->first);
|
||||||
if(!jter->getDepth2DCompressed().empty())
|
if(!jter->getDepth2DCompressed().empty())
|
||||||
{
|
{
|
||||||
this->createAndAddScanToMap(iter->first, iter->second);
|
this->createAndAddScanToMap(iter->first, iter->second, uValue(mapIds, iter->first, -1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!_preferencesDialog->isScansShown(0))
|
if(!_preferencesDialog->isScansShown(0))
|
||||||
@@ -1139,6 +1150,7 @@ void MainWindow::updateMapCloud(
|
|||||||
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove not used clouds
|
//remove not used clouds
|
||||||
for(QMap<std::string, Transform>::iterator iter = viewerClouds.begin(); iter!=viewerClouds.end(); ++iter)
|
for(QMap<std::string, Transform>::iterator iter = viewerClouds.begin(); iter!=viewerClouds.end(); ++iter)
|
||||||
{
|
{
|
||||||
@@ -1157,6 +1169,35 @@ void MainWindow::updateMapCloud(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update 3D graphes (show all poses)
|
||||||
|
_ui->widget_cloudViewer->removeAllGraphs();
|
||||||
|
if(_preferencesDialog->isGraphsShown() && _currentPosesMap.size())
|
||||||
|
{
|
||||||
|
// Find all graphs
|
||||||
|
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > graphs;
|
||||||
|
for(std::map<int, Transform>::iterator iter=_currentPosesMap.begin(); iter!=_currentPosesMap.end(); ++iter)
|
||||||
|
{
|
||||||
|
int mapId = uValue(_currentMapIds, iter->first, -1);
|
||||||
|
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr >::iterator kter = graphs.find(mapId);
|
||||||
|
if(kter == graphs.end())
|
||||||
|
{
|
||||||
|
kter = graphs.insert(std::make_pair(mapId, pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>))).first;
|
||||||
|
}
|
||||||
|
kter->second->push_back(pcl::PointXYZ(iter->second.x(), iter->second.y(), iter->second.z()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// add graphs
|
||||||
|
for(std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr >::iterator iter=graphs.begin(); iter!=graphs.end(); ++iter)
|
||||||
|
{
|
||||||
|
QColor color = Qt::gray;
|
||||||
|
if(iter->first >= 0)
|
||||||
|
{
|
||||||
|
color = (Qt::GlobalColor)(iter->first % 12 + 7 );
|
||||||
|
}
|
||||||
|
_ui->widget_cloudViewer->addOrUpdateGraph(uFormat("graph_%d", iter->first), iter->second, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update occupancy grid map in 3D map view and graph view
|
// Update occupancy grid map in 3D map view and graph view
|
||||||
if(_ui->graphicsView_graphView->isVisible() && constraints.size())
|
if(_ui->graphicsView_graphView->isVisible() && constraints.size())
|
||||||
{
|
{
|
||||||
@@ -1234,7 +1275,7 @@ void MainWindow::updateMapCloud(
|
|||||||
_ui->widget_cloudViewer->render();
|
_ui->widget_cloudViewer->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose)
|
void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose, int mapId)
|
||||||
{
|
{
|
||||||
std::string cloudName = uFormat("cloud%d", nodeId);
|
std::string cloudName = uFormat("cloud%d", nodeId);
|
||||||
if(_ui->widget_cloudViewer->getAddedClouds().contains(cloudName))
|
if(_ui->widget_cloudViewer->getAddedClouds().contains(cloudName))
|
||||||
@@ -1250,6 +1291,11 @@ void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(iter->getImageCompressed().empty() || iter->getDepthCompressed().empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
cv::Mat image, depth;
|
cv::Mat image, depth;
|
||||||
iter->uncompressData(&image, &depth, 0);
|
iter->uncompressData(&image, &depth, 0);
|
||||||
|
|
||||||
@@ -1322,7 +1368,6 @@ void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose)
|
|||||||
pcl::copyPointCloud(*cloudWithNormals, *cloud);
|
pcl::copyPointCloud(*cloudWithNormals, *cloud);
|
||||||
}
|
}
|
||||||
QColor color = Qt::gray;
|
QColor color = Qt::gray;
|
||||||
int mapId = _mapIds.value(nodeId, -1);
|
|
||||||
if(mapId >= 0)
|
if(mapId >= 0)
|
||||||
{
|
{
|
||||||
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
||||||
@@ -1341,7 +1386,7 @@ void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose)
|
|||||||
_ui->widget_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
_ui->widget_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose)
|
void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int mapId)
|
||||||
{
|
{
|
||||||
std::string scanName = uFormat("scan%d", nodeId);
|
std::string scanName = uFormat("scan%d", nodeId);
|
||||||
if(_ui->widget_cloudViewer->getAddedClouds().contains(scanName))
|
if(_ui->widget_cloudViewer->getAddedClouds().contains(scanName))
|
||||||
@@ -1356,13 +1401,15 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose)
|
|||||||
UERROR("Node %d is not in the cache.", nodeId);
|
UERROR("Node %d is not in the cache.", nodeId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!iter->getDepth2DCompressed().empty())
|
||||||
|
{
|
||||||
cv::Mat depth2D;
|
cv::Mat depth2D;
|
||||||
iter->uncompressData(0, 0, &depth2D);
|
iter->uncompressData(0, 0, &depth2D);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
||||||
cloud = util3d::depth2DToPointCloud(depth2D);
|
cloud = util3d::depth2DToPointCloud(depth2D);
|
||||||
QColor color = Qt::red;
|
QColor color = Qt::red;
|
||||||
int mapId = _mapIds.value(nodeId, -1);
|
|
||||||
if(mapId >= 0)
|
if(mapId >= 0)
|
||||||
{
|
{
|
||||||
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
||||||
@@ -1378,6 +1425,7 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose)
|
|||||||
_ui->widget_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
_ui->widget_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
||||||
_ui->widget_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
_ui->widget_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::updateNodeVisibility(int nodeId, bool visible)
|
void MainWindow::updateNodeVisibility(int nodeId, bool visible)
|
||||||
{
|
{
|
||||||
@@ -1389,7 +1437,7 @@ void MainWindow::updateNodeVisibility(int nodeId, bool visible)
|
|||||||
std::string cloudName = uFormat("cloud%d", nodeId);
|
std::string cloudName = uFormat("cloud%d", nodeId);
|
||||||
if(visible && !viewerClouds.contains(cloudName))
|
if(visible && !viewerClouds.contains(cloudName))
|
||||||
{
|
{
|
||||||
createAndAddCloudToMap(nodeId, _currentPosesMap.find(nodeId)->second);
|
createAndAddCloudToMap(nodeId, _currentPosesMap.find(nodeId)->second, uValue(_currentMapIds, nodeId, -1));
|
||||||
}
|
}
|
||||||
else if(viewerClouds.contains(cloudName))
|
else if(viewerClouds.contains(cloudName))
|
||||||
{
|
{
|
||||||
@@ -1407,7 +1455,7 @@ void MainWindow::updateNodeVisibility(int nodeId, bool visible)
|
|||||||
std::string scanName = uFormat("scan%d", nodeId);
|
std::string scanName = uFormat("scan%d", nodeId);
|
||||||
if(visible && !viewerClouds.contains(scanName))
|
if(visible && !viewerClouds.contains(scanName))
|
||||||
{
|
{
|
||||||
createAndAddScanToMap(nodeId, _currentPosesMap.find(nodeId)->second);
|
createAndAddScanToMap(nodeId, _currentPosesMap.find(nodeId)->second, uValue(_currentMapIds, nodeId, -1));
|
||||||
}
|
}
|
||||||
else if(viewerClouds.contains(scanName))
|
else if(viewerClouds.contains(scanName))
|
||||||
{
|
{
|
||||||
@@ -1536,16 +1584,6 @@ void MainWindow::processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap & eve
|
|||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
QApplication::processEvents();
|
QApplication::processEvents();
|
||||||
|
|
||||||
for(std::map<int, int>::const_iterator iter = event.getMapIds().begin();
|
|
||||||
iter!=event.getMapIds().end();
|
|
||||||
++iter)
|
|
||||||
{
|
|
||||||
_mapIds.insert(iter->first, iter->second);
|
|
||||||
}
|
|
||||||
_initProgressDialog->appendText(tr("Inserted %1 map ids").arg(_mapIds.size()));
|
|
||||||
_initProgressDialog->incrementStep();
|
|
||||||
QApplication::processEvents();
|
|
||||||
|
|
||||||
_initProgressDialog->appendText("Inserting data in the cache... done.");
|
_initProgressDialog->appendText("Inserting data in the cache... done.");
|
||||||
|
|
||||||
if(event.getPoses().size())
|
if(event.getPoses().size())
|
||||||
@@ -1553,7 +1591,7 @@ void MainWindow::processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap & eve
|
|||||||
_initProgressDialog->appendText("Updating the 3D map cloud...");
|
_initProgressDialog->appendText("Updating the 3D map cloud...");
|
||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
QApplication::processEvents();
|
QApplication::processEvents();
|
||||||
this->updateMapCloud(event.getPoses(), Transform(), event.getConstraints(), true);
|
this->updateMapCloud(event.getPoses(), Transform(), event.getConstraints(), event.getMapIds(), true);
|
||||||
_initProgressDialog->appendText("Updating the 3D map cloud... done.");
|
_initProgressDialog->appendText("Updating the 3D map cloud... done.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1609,7 +1647,7 @@ void MainWindow::applyPrefSettings(PreferencesDialog::PANEL_FLAGS flags)
|
|||||||
UDEBUG("Cloud rendering settings changed...");
|
UDEBUG("Cloud rendering settings changed...");
|
||||||
if(_currentPosesMap.size())
|
if(_currentPosesMap.size())
|
||||||
{
|
{
|
||||||
this->updateMapCloud(std::map<int, Transform>(_currentPosesMap), Transform(), std::multimap<int, Link>(_currentLinksMap));
|
this->updateMapCloud(_currentPosesMap, Transform(), _currentLinksMap, _currentMapIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2936,7 +2974,7 @@ void MainWindow::postProcessing()
|
|||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
|
|
||||||
_initProgressDialog->appendText(tr("Updating map..."));
|
_initProgressDialog->appendText(tr("Updating map..."));
|
||||||
this->updateMapCloud(optimizedPoses, Transform(), _currentLinksMap, false);
|
this->updateMapCloud(optimizedPoses, Transform(), _currentLinksMap, _currentMapIds, false);
|
||||||
_initProgressDialog->appendText(tr("Updating map... done!"));
|
_initProgressDialog->appendText(tr("Updating map... done!"));
|
||||||
|
|
||||||
_initProgressDialog->setValue(_initProgressDialog->maximumSteps());
|
_initProgressDialog->setValue(_initProgressDialog->maximumSteps());
|
||||||
@@ -3172,15 +3210,17 @@ void MainWindow::downloadPoseGraph()
|
|||||||
void MainWindow::clearTheCache()
|
void MainWindow::clearTheCache()
|
||||||
{
|
{
|
||||||
_cachedSignatures.clear();
|
_cachedSignatures.clear();
|
||||||
_mapIds.clear();
|
|
||||||
_createdClouds.clear();
|
_createdClouds.clear();
|
||||||
_createdScans.clear();
|
_createdScans.clear();
|
||||||
_occupancyLocalMaps.clear();
|
_occupancyLocalMaps.clear();
|
||||||
_ui->widget_cloudViewer->removeAllClouds();
|
_ui->widget_cloudViewer->removeAllClouds();
|
||||||
|
_ui->widget_cloudViewer->removeAllGraphs();
|
||||||
_ui->widget_cloudViewer->setBackgroundColor(Qt::black);
|
_ui->widget_cloudViewer->setBackgroundColor(Qt::black);
|
||||||
_ui->widget_cloudViewer->clearTrajectory();
|
_ui->widget_cloudViewer->clearTrajectory();
|
||||||
_ui->widget_mapVisibility->clear();
|
_ui->widget_mapVisibility->clear();
|
||||||
_currentPosesMap.clear();
|
_currentPosesMap.clear();
|
||||||
|
_currentLinksMap.clear();
|
||||||
|
_currentMapIds.clear();
|
||||||
_odometryCorrection = Transform::getIdentity();
|
_odometryCorrection = Transform::getIdentity();
|
||||||
_lastOdomPose.setNull();
|
_lastOdomPose.setNull();
|
||||||
//disable save cloud action
|
//disable save cloud action
|
||||||
@@ -3506,7 +3546,7 @@ void MainWindow::viewScans()
|
|||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
|
|
||||||
QColor color = Qt::red;
|
QColor color = Qt::red;
|
||||||
int mapId = _mapIds.value(iter->first, -1);
|
int mapId = uValue(_currentMapIds, iter->first, -1);
|
||||||
if(mapId >= 0)
|
if(mapId >= 0)
|
||||||
{
|
{
|
||||||
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
||||||
@@ -3679,7 +3719,7 @@ void MainWindow::viewClouds()
|
|||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
|
|
||||||
QColor color = Qt::gray;
|
QColor color = Qt::gray;
|
||||||
int mapId = _mapIds.value(iter->first, -1);
|
int mapId = uValue(_currentMapIds, iter->first, -1);
|
||||||
if(mapId >= 0)
|
if(mapId >= 0)
|
||||||
{
|
{
|
||||||
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
||||||
|
|||||||
@@ -189,6 +189,9 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
connect(_3dRenderingOpacityScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingOpacityScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingPtSizeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingPtSizeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(_ui->checkBox_showGraphs, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
|
||||||
connect(_ui->checkBox_meshing, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->checkBox_meshing, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_ui->spinBox_normalKSearch, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->spinBox_normalKSearch, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
@@ -801,6 +804,9 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
_3dRenderingOpacityScan[i]->setValue(1.0);
|
_3dRenderingOpacityScan[i]->setValue(1.0);
|
||||||
_3dRenderingPtSizeScan[i]->setValue(1);
|
_3dRenderingPtSizeScan[i]->setValue(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ui->checkBox_showGraphs->setChecked(true);
|
||||||
|
|
||||||
_ui->checkBox_meshing->setChecked(false);
|
_ui->checkBox_meshing->setChecked(false);
|
||||||
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
|
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
|
||||||
_ui->spinBox_normalKSearch->setValue(20);
|
_ui->spinBox_normalKSearch->setValue(20);
|
||||||
@@ -1032,6 +1038,8 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
|
|||||||
_3dRenderingOpacityScan[i]->setValue(settings.value(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value()).toDouble());
|
_3dRenderingOpacityScan[i]->setValue(settings.value(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value()).toDouble());
|
||||||
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
|
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
|
||||||
}
|
}
|
||||||
|
_ui->checkBox_showGraphs->setChecked(settings.value("showGraphs", _ui->checkBox_showGraphs->isChecked()).toBool());
|
||||||
|
|
||||||
_ui->checkBox_meshing->setChecked(settings.value("meshing", _ui->checkBox_meshing->isChecked()).toBool());
|
_ui->checkBox_meshing->setChecked(settings.value("meshing", _ui->checkBox_meshing->isChecked()).toBool());
|
||||||
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
|
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
|
||||||
_ui->spinBox_normalKSearch->setValue(settings.value("meshNormalKSearch", _ui->spinBox_normalKSearch->value()).toInt());
|
_ui->spinBox_normalKSearch->setValue(settings.value("meshNormalKSearch", _ui->spinBox_normalKSearch->value()).toInt());
|
||||||
@@ -1274,6 +1282,8 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath)
|
|||||||
settings.setValue(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value());
|
settings.setValue(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value());
|
||||||
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
|
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
|
||||||
}
|
}
|
||||||
|
settings.setValue("showGraphs", _ui->checkBox_showGraphs->isChecked());
|
||||||
|
|
||||||
settings.setValue("meshing", _ui->checkBox_meshing->isChecked());
|
settings.setValue("meshing", _ui->checkBox_meshing->isChecked());
|
||||||
settings.setValue("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value());
|
settings.setValue("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value());
|
||||||
settings.setValue("meshNormalKSearch", _ui->spinBox_normalKSearch->value());
|
settings.setValue("meshNormalKSearch", _ui->spinBox_normalKSearch->value());
|
||||||
@@ -2531,6 +2541,10 @@ bool PreferencesDialog::isCloudsShown(int index) const
|
|||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
return _3dRenderingShowClouds[index]->isChecked();
|
return _3dRenderingShowClouds[index]->isChecked();
|
||||||
}
|
}
|
||||||
|
bool PreferencesDialog::isGraphsShown() const
|
||||||
|
{
|
||||||
|
return _ui->checkBox_showGraphs->isChecked();
|
||||||
|
}
|
||||||
bool PreferencesDialog::isCloudMeshing() const
|
bool PreferencesDialog::isCloudMeshing() const
|
||||||
{
|
{
|
||||||
return _ui->checkBox_meshing->isChecked();
|
return _ui->checkBox_meshing->isChecked();
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-316</y>
|
||||||
<width>744</width>
|
<width>744</width>
|
||||||
<height>905</height>
|
<height>1074</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>21</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29">
|
<layout class="QVBoxLayout" name="verticalLayout_29">
|
||||||
@@ -588,6 +588,16 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
||||||
<item row="9" column="0">
|
<item row="9" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_showScans">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize_scan">
|
<widget class="QSpinBox" name="spinBox_ptsize_scan">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -597,7 +607,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
<item row="4" column="2">
|
||||||
<widget class="QLabel" name="label_108">
|
<widget class="QLabel" name="label_108">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>3D cloud decimation (1-2-4-8-...).</string>
|
<string>3D cloud decimation (1-2-4-8-...).</string>
|
||||||
@@ -663,7 +673,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -682,7 +692,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize_odom">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize_odom">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -701,7 +711,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="2">
|
<item row="3" column="2">
|
||||||
<widget class="QLabel" name="label_107">
|
<widget class="QLabel" name="label_107">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>3D cloud voxel size.</string>
|
<string>3D cloud voxel size.</string>
|
||||||
@@ -711,7 +721,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_decimation">
|
<widget class="QSpinBox" name="spinBox_decimation">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -724,7 +734,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QSpinBox" name="spinBox_decimation_odom">
|
<widget class="QSpinBox" name="spinBox_decimation_odom">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -737,7 +747,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -756,7 +766,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_odom">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_odom">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -775,7 +785,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="2">
|
<item row="5" column="2">
|
||||||
<widget class="QLabel" name="label_132">
|
<widget class="QLabel" name="label_132">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>3D cloud maximum depth (0 means no limit).</string>
|
<string>3D cloud maximum depth (0 means no limit).</string>
|
||||||
@@ -785,7 +795,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -804,7 +814,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -823,7 +833,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="2">
|
<item row="6" column="2">
|
||||||
<widget class="QLabel" name="label_155">
|
<widget class="QLabel" name="label_155">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>3D cloud opacity.</string>
|
<string>3D cloud opacity.</string>
|
||||||
@@ -833,7 +843,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize">
|
<widget class="QSpinBox" name="spinBox_ptsize">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -843,7 +853,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize_odom">
|
<widget class="QSpinBox" name="spinBox_ptsize_odom">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -853,7 +863,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="2">
|
<item row="7" column="2">
|
||||||
<widget class="QLabel" name="label_157">
|
<widget class="QLabel" name="label_157">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>3D cloud point size (1..64).</string>
|
<string>3D cloud point size (1..64).</string>
|
||||||
@@ -863,17 +873,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="9" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_showScans">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="1">
|
|
||||||
<widget class="QCheckBox" name="checkBox_showOdomScans">
|
<widget class="QCheckBox" name="checkBox_showOdomScans">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -883,7 +883,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="2">
|
<item row="9" column="2">
|
||||||
<widget class="QLabel" name="label_110">
|
<widget class="QLabel" name="label_110">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show 2D scans.</string>
|
<string>Show 2D scans.</string>
|
||||||
@@ -893,7 +893,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_scan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_scan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -912,14 +912,14 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="13" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_meshing">
|
<widget class="QCheckBox" name="checkBox_meshing">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom_scan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom_scan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -938,7 +938,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="2">
|
<item row="10" column="2">
|
||||||
<widget class="QLabel" name="label_156">
|
<widget class="QLabel" name="label_156">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>2D scan opacity.</string>
|
<string>2D scan opacity.</string>
|
||||||
@@ -948,7 +948,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize_odom_scan">
|
<widget class="QSpinBox" name="spinBox_ptsize_odom_scan">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -958,7 +958,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="2">
|
<item row="11" column="2">
|
||||||
<widget class="QLabel" name="label_158">
|
<widget class="QLabel" name="label_158">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>2D scan point size (1..64).</string>
|
<string>2D scan point size (1..64).</string>
|
||||||
@@ -968,7 +968,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="2">
|
<item row="15" column="2">
|
||||||
<widget class="QLabel" name="label_168">
|
<widget class="QLabel" name="label_168">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sphere radius that is to be used for determining the k-nearest neighbors used for triangulating (GP3). Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
<string>Sphere radius that is to be used for determining the k-nearest neighbors used for triangulating (GP3). Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
||||||
@@ -978,7 +978,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="2">
|
<item row="17" column="2">
|
||||||
<widget class="QLabel" name="label_85">
|
<widget class="QLabel" name="label_85">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Mesh smoothing using Moving Least Squares algorithm (MLS).</string>
|
<string>Mesh smoothing using Moving Least Squares algorithm (MLS).</string>
|
||||||
@@ -988,7 +988,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="0">
|
<item row="15" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_gp3Radius">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_gp3Radius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1007,7 +1007,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="0">
|
<item row="18" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1026,7 +1026,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="2">
|
<item row="13" column="2">
|
||||||
<widget class="QLabel" name="label_169">
|
<widget class="QLabel" name="label_169">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Online meshing using Greedy Projection Triangulation (GP3).</string>
|
<string>Online meshing using Greedy Projection Triangulation (GP3).</string>
|
||||||
@@ -1036,7 +1036,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="2">
|
<item row="18" column="2">
|
||||||
<widget class="QLabel" name="label_87">
|
<widget class="QLabel" name="label_87">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>MLS search radius: Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting. Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
<string>MLS search radius: Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting. Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
||||||
@@ -1046,7 +1046,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="0">
|
<item row="17" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_mls">
|
<widget class="QCheckBox" name="checkBox_mls">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1056,7 +1056,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="2">
|
<item row="14" column="2">
|
||||||
<widget class="QLabel" name="label_71">
|
<widget class="QLabel" name="label_71">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Set the number of k nearest neighbors to use for the normal estimation to create the mesh. Not used when mesh smoothing below is used.</string>
|
<string>Set the number of k nearest neighbors to use for the normal estimation to create the mesh. Not used when mesh smoothing below is used.</string>
|
||||||
@@ -1066,13 +1066,33 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
<item row="14" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>20</number>
|
<number>20</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="12" column="2">
|
||||||
|
<widget class="QLabel" name="label_213">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show graphs.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="12" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_showGraphs">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user