mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-03 10:00:23 +08:00
0.12.15 Parameters: added "GridGlobal" parameter group, fixed https://github.com/introlab/rtabmap_ros/issues/162
This commit is contained in:
@@ -21,7 +21,7 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 12)
|
SET(RTABMAP_MINOR_VERSION 12)
|
||||||
SET(RTABMAP_PATCH_VERSION 4)
|
SET(RTABMAP_PATCH_VERSION 5)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public:
|
|||||||
void parseParameters(const ParametersMap & parameters);
|
void parseParameters(const ParametersMap & parameters);
|
||||||
void setCellSize(float cellSize);
|
void setCellSize(float cellSize);
|
||||||
float getCellSize() const {return cellSize_;}
|
float getCellSize() const {return cellSize_;}
|
||||||
|
float getMinMapSize() const {return minMapSize_;}
|
||||||
bool isGridFromDepth() const {return occupancyFromCloud_;}
|
bool isGridFromDepth() const {return occupancyFromCloud_;}
|
||||||
bool isFullUpdate() const {return fullUpdate_;}
|
bool isFullUpdate() const {return fullUpdate_;}
|
||||||
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
||||||
@@ -69,13 +70,8 @@ public:
|
|||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles);
|
const cv::Mat & obstacles);
|
||||||
void update(const std::map<int, Transform> & poses, float minMapSize = 0.0f, float footprintRadius = 0.0f);
|
void update(const std::map<int, Transform> & poses);
|
||||||
const cv::Mat & getMap(float & xMin, float & yMin) const
|
const cv::Mat getMap(float & xMin, float & yMin) const;
|
||||||
{
|
|
||||||
xMin = xMin_;
|
|
||||||
yMin = yMin_;
|
|
||||||
return map_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ParametersMap parameters_;
|
ParametersMap parameters_;
|
||||||
@@ -107,6 +103,9 @@ private:
|
|||||||
double scan2dMaxUnknownSpaceFilledRange_;
|
double scan2dMaxUnknownSpaceFilledRange_;
|
||||||
bool projRayTracing_;
|
bool projRayTracing_;
|
||||||
bool fullUpdate_;
|
bool fullUpdate_;
|
||||||
|
float minMapSize_;
|
||||||
|
bool erode_;
|
||||||
|
float footprintRadius_;
|
||||||
|
|
||||||
std::map<int, std::pair<cv::Mat, cv::Mat> > cache_;
|
std::map<int, std::pair<cv::Mat, cv::Mat> > cache_;
|
||||||
cv::Mat map_;
|
cv::Mat map_;
|
||||||
|
|||||||
@@ -505,7 +505,11 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Grid, Scan2dUnknownSpaceFilled, bool, false, "Unknown space filled. Only used with 2D laser scans.");
|
RTABMAP_PARAM(Grid, Scan2dUnknownSpaceFilled, bool, false, "Unknown space filled. Only used with 2D laser scans.");
|
||||||
RTABMAP_PARAM(Grid, Scan2dMaxFilledRange, float, 4.0, "Unknown space filled maximum range. If 0, the laser scan maximum range is used.");
|
RTABMAP_PARAM(Grid, Scan2dMaxFilledRange, float, 4.0, "Unknown space filled maximum range. If 0, the laser scan maximum range is used.");
|
||||||
RTABMAP_PARAM(Grid, ProjRayTracing, bool, true, uFormat("[%s=false] 2D ray tracing is done for each projected obstacle, filling unknown space between the sensor and obstacles.", kGrid3D().c_str()));
|
RTABMAP_PARAM(Grid, ProjRayTracing, bool, true, uFormat("[%s=false] 2D ray tracing is done for each projected obstacle, filling unknown space between the sensor and obstacles.", kGrid3D().c_str()));
|
||||||
RTABMAP_PARAM(Grid, FullUpdate, bool, true, "When the graph is changed, the whole map will be reconstructed instead of moving individually each cells of the map. Also, data added to cache won't be released after updating the map. This process is longer but more robust to drift that would erase some parts of the map when it should not.");
|
|
||||||
|
RTABMAP_PARAM(GridGlobal, FullUpdate, bool, true, "When the graph is changed, the whole map will be reconstructed instead of moving individually each cells of the map. Also, data added to cache won't be released after updating the map. This process is longer but more robust to drift that would erase some parts of the map when it should not.");
|
||||||
|
RTABMAP_PARAM(GridGlobal, FootprintRadius, float, 0.0, "Footprint radius (m) used to clear all obstacles under the graph.");
|
||||||
|
RTABMAP_PARAM(GridGlobal, MinSize, float, 0.0, "Minimum map size (m).");
|
||||||
|
RTABMAP_PARAM(GridGlobal, Eroded, bool, false, "Erode obstacle cells.");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~Parameters();
|
virtual ~Parameters();
|
||||||
|
|||||||
@@ -65,7 +65,10 @@ OccupancyGrid::OccupancyGrid(const ParametersMap & parameters) :
|
|||||||
scan2dUnknownSpaceFilled_(Parameters::defaultGridScan2dUnknownSpaceFilled()),
|
scan2dUnknownSpaceFilled_(Parameters::defaultGridScan2dUnknownSpaceFilled()),
|
||||||
scan2dMaxUnknownSpaceFilledRange_(Parameters::defaultGridScan2dMaxFilledRange()),
|
scan2dMaxUnknownSpaceFilledRange_(Parameters::defaultGridScan2dMaxFilledRange()),
|
||||||
projRayTracing_(Parameters::defaultGridProjRayTracing()),
|
projRayTracing_(Parameters::defaultGridProjRayTracing()),
|
||||||
fullUpdate_(Parameters::defaultGridFullUpdate()),
|
fullUpdate_(Parameters::defaultGridGlobalFullUpdate()),
|
||||||
|
minMapSize_(Parameters::defaultGridGlobalMinSize()),
|
||||||
|
erode_(Parameters::defaultGridGlobalEroded()),
|
||||||
|
footprintRadius_(Parameters::defaultGridGlobalFootprintRadius()),
|
||||||
xMin_(0.0f),
|
xMin_(0.0f),
|
||||||
yMin_(0.0f)
|
yMin_(0.0f)
|
||||||
{
|
{
|
||||||
@@ -132,7 +135,12 @@ void OccupancyGrid::parseParameters(const ParametersMap & parameters)
|
|||||||
Parameters::parse(parameters, Parameters::kGridScan2dUnknownSpaceFilled(), scan2dUnknownSpaceFilled_);
|
Parameters::parse(parameters, Parameters::kGridScan2dUnknownSpaceFilled(), scan2dUnknownSpaceFilled_);
|
||||||
Parameters::parse(parameters, Parameters::kGridScan2dMaxFilledRange(), scan2dMaxUnknownSpaceFilledRange_);
|
Parameters::parse(parameters, Parameters::kGridScan2dMaxFilledRange(), scan2dMaxUnknownSpaceFilledRange_);
|
||||||
Parameters::parse(parameters, Parameters::kGridProjRayTracing(), projRayTracing_);
|
Parameters::parse(parameters, Parameters::kGridProjRayTracing(), projRayTracing_);
|
||||||
Parameters::parse(parameters, Parameters::kGridFullUpdate(), fullUpdate_);
|
Parameters::parse(parameters, Parameters::kGridGlobalFullUpdate(), fullUpdate_);
|
||||||
|
Parameters::parse(parameters, Parameters::kGridGlobalMinSize(), minMapSize_);
|
||||||
|
Parameters::parse(parameters, Parameters::kGridGlobalEroded(), erode_);
|
||||||
|
Parameters::parse(parameters, Parameters::kGridGlobalFootprintRadius(), footprintRadius_);
|
||||||
|
|
||||||
|
UASSERT(minMapSize_ >= 0.0f);
|
||||||
|
|
||||||
// convert ROI from string to vector
|
// convert ROI from string to vector
|
||||||
ParametersMap::const_iterator iter;
|
ParametersMap::const_iterator iter;
|
||||||
@@ -379,6 +387,17 @@ void OccupancyGrid::clear()
|
|||||||
addedNodes_.clear();
|
addedNodes_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cv::Mat OccupancyGrid::getMap(float & xMin, float & yMin) const
|
||||||
|
{
|
||||||
|
xMin = xMin_;
|
||||||
|
yMin = yMin_;
|
||||||
|
if(erode_ && !map_.empty())
|
||||||
|
{
|
||||||
|
return util3d::erodeMap(map_);
|
||||||
|
}
|
||||||
|
return map_;
|
||||||
|
}
|
||||||
|
|
||||||
void OccupancyGrid::addToCache(
|
void OccupancyGrid::addToCache(
|
||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
@@ -388,18 +407,18 @@ void OccupancyGrid::addToCache(
|
|||||||
uInsert(cache_, std::make_pair(nodeId, std::make_pair(ground, obstacles)));
|
uInsert(cache_, std::make_pair(nodeId, std::make_pair(ground, obstacles)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void OccupancyGrid::update(const std::map<int, Transform> & posesIn, float minMapSize, float footprintRadius)
|
void OccupancyGrid::update(const std::map<int, Transform> & posesIn)
|
||||||
{
|
{
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
UDEBUG("Update (poses=%d addedNodes_=%d)", (int)posesIn.size(), (int)addedNodes_.size());
|
UDEBUG("Update (poses=%d addedNodes_=%d)", (int)posesIn.size(), (int)addedNodes_.size());
|
||||||
|
|
||||||
float margin = cellSize_*10.0f+(footprintRadius>cellSize_*1.5f?float(int(footprintRadius/cellSize_)+1):0.0f)*cellSize_;
|
float margin = cellSize_*10.0f+(footprintRadius_>cellSize_*1.5f?float(int(footprintRadius_/cellSize_)+1):0.0f)*cellSize_;
|
||||||
|
|
||||||
float minX=-minMapSize/2.0f;
|
float minX=-minMapSize_/2.0f;
|
||||||
float minY=-minMapSize/2.0f;
|
float minY=-minMapSize_/2.0f;
|
||||||
float maxX=minMapSize/2.0f;
|
float maxX=minMapSize_/2.0f;
|
||||||
float maxY=minMapSize/2.0f;
|
float maxY=minMapSize_/2.0f;
|
||||||
bool undefinedSize = minMapSize == 0.0f;
|
bool undefinedSize = minMapSize_ == 0.0f;
|
||||||
std::map<int, cv::Mat> emptyLocalMaps;
|
std::map<int, cv::Mat> emptyLocalMaps;
|
||||||
std::map<int, cv::Mat> occupiedLocalMaps;
|
std::map<int, cv::Mat> occupiedLocalMaps;
|
||||||
|
|
||||||
@@ -714,10 +733,10 @@ void OccupancyGrid::update(const std::map<int, Transform> & posesIn, float minMa
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UASSERT(xMin <= xMin_);
|
UASSERT_MSG(xMin <= xMin_+cellSize_/2, uFormat("xMin=%f, xMin_=%f, cellSize_=%f", xMin, xMin_, cellSize_).c_str());
|
||||||
UASSERT(yMin <= yMin_);
|
UASSERT_MSG(yMin <= yMin_+cellSize_/2, uFormat("yMin=%f, yMin_=%f, cellSize_=%f", yMin, yMin_, cellSize_).c_str());
|
||||||
UASSERT(xMax >= xMin_+float(map_.cols)*cellSize_);
|
UASSERT_MSG(xMax >= xMin_+float(map_.cols)*cellSize_ - cellSize_/2, uFormat("xMin=%f, xMin_=%f, cols=%d cellSize_=%f", xMin, xMin_, map_.cols, cellSize_).c_str());
|
||||||
UASSERT(yMax >= yMin_+float(map_.rows)*cellSize_);
|
UASSERT_MSG(yMax >= yMin_+float(map_.rows)*cellSize_ - cellSize_/2, uFormat("yMin=%f, yMin_=%f, cols=%d cellSize_=%f", yMin, yMin_, map_.rows, cellSize_).c_str());
|
||||||
|
|
||||||
UDEBUG("Copy map");
|
UDEBUG("Copy map");
|
||||||
// copy the old map in the new map
|
// copy the old map in the new map
|
||||||
@@ -815,11 +834,11 @@ void OccupancyGrid::update(const std::map<int, Transform> & posesIn, float minMa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(footprintRadius >= cellSize_*1.5f)
|
if(footprintRadius_ >= cellSize_*1.5f)
|
||||||
{
|
{
|
||||||
// place free space under the footprint of the robot
|
// place free space under the footprint of the robot
|
||||||
cv::Point2i ptBegin((kter->second.x()-footprintRadius-xMin)/cellSize_, (kter->second.y()-footprintRadius-yMin)/cellSize_);
|
cv::Point2i ptBegin((kter->second.x()-footprintRadius_-xMin)/cellSize_, (kter->second.y()-footprintRadius_-yMin)/cellSize_);
|
||||||
cv::Point2i ptEnd((kter->second.x()+footprintRadius-xMin)/cellSize_, (kter->second.y()+footprintRadius-yMin)/cellSize_);
|
cv::Point2i ptEnd((kter->second.x()+footprintRadius_-xMin)/cellSize_, (kter->second.y()+footprintRadius_-yMin)/cellSize_);
|
||||||
if(ptBegin.x < 0)
|
if(ptBegin.x < 0)
|
||||||
ptBegin.x = 0;
|
ptBegin.x = 0;
|
||||||
if(ptEnd.x >= map.cols)
|
if(ptEnd.x >= map.cols)
|
||||||
@@ -926,7 +945,7 @@ void OccupancyGrid::update(const std::map<int, Transform> & posesIn, float minMa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(footprintRadius >= cellSize_*1.5f || incrementalGraphUpdate)
|
if(footprintRadius_ >= cellSize_*1.5f || incrementalGraphUpdate)
|
||||||
{
|
{
|
||||||
for(int i=1; i<map.rows-1; ++i)
|
for(int i=1; i<map.rows-1; ++i)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -224,6 +224,9 @@ const std::map<std::string, std::pair<bool, std::string> > & Parameters::getRemo
|
|||||||
{
|
{
|
||||||
// removed parameters
|
// removed parameters
|
||||||
|
|
||||||
|
// 0.12.5
|
||||||
|
removedParameters_.insert(std::make_pair("Grid/FullUpdate", std::make_pair(true, Parameters::kGridGlobalFullUpdate())));
|
||||||
|
|
||||||
// 0.12.1
|
// 0.12.1
|
||||||
removedParameters_.insert(std::make_pair("Grid/3DGroundIsObstacle", std::make_pair(true, Parameters::kGridGroundIsObstacle())));
|
removedParameters_.insert(std::make_pair("Grid/3DGroundIsObstacle", std::make_pair(true, Parameters::kGridGroundIsObstacle())));
|
||||||
|
|
||||||
|
|||||||
@@ -198,8 +198,6 @@ public:
|
|||||||
|
|
||||||
bool getGridMapShown() const;
|
bool getGridMapShown() const;
|
||||||
double getGridMapResolution() const;;
|
double getGridMapResolution() const;;
|
||||||
bool isGridMapEroded() const;
|
|
||||||
double getGridMapFootprintRadius() const;
|
|
||||||
bool isGridMapFrom3DCloud() const;
|
bool isGridMapFrom3DCloud() const;
|
||||||
bool projMapFrame() const;
|
bool projMapFrame() const;
|
||||||
double projMaxGroundAngle() const;
|
double projMaxGroundAngle() const;
|
||||||
|
|||||||
@@ -2153,16 +2153,22 @@ void MainWindow::updateMapCloud(
|
|||||||
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)
|
||||||
{
|
{
|
||||||
std::list<std::string> splitted = uSplitNumChar(iter.key());
|
std::list<std::string> splitted = uSplitNumChar(iter.key());
|
||||||
|
int id = 0;
|
||||||
if(splitted.size() == 2)
|
if(splitted.size() == 2)
|
||||||
{
|
{
|
||||||
int id = std::atoi(splitted.back().c_str());
|
id = std::atoi(splitted.back().c_str());
|
||||||
if(poses.find(id) == poses.end())
|
if(splitted.front().at(splitted.front().size()-1) == '-')
|
||||||
{
|
{
|
||||||
if(_cloudViewer->getCloudVisibility(iter.key()))
|
id*=-1;
|
||||||
{
|
}
|
||||||
UDEBUG("Hide %s", iter.key().c_str());
|
}
|
||||||
_cloudViewer->setCloudVisibility(iter.key(), false);
|
|
||||||
}
|
if(id != 0 && poses.find(id) == poses.end())
|
||||||
|
{
|
||||||
|
if(_cloudViewer->getCloudVisibility(iter.key()))
|
||||||
|
{
|
||||||
|
UDEBUG("Hide %s", iter.key().c_str());
|
||||||
|
_cloudViewer->setCloudVisibility(iter.key(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2378,7 +2384,7 @@ void MainWindow::updateMapCloud(
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
_occupancyGrid->update(poses, 0, _preferencesDialog->getGridMapFootprintRadius());
|
_occupancyGrid->update(poses);
|
||||||
if(stats)
|
if(stats)
|
||||||
{
|
{
|
||||||
stats->insert(std::make_pair("GUI/Grid Update/ms", (float)timer.restart()*1000.0f));
|
stats->insert(std::make_pair("GUI/Grid Update/ms", (float)timer.restart()*1000.0f));
|
||||||
@@ -2387,11 +2393,6 @@ void MainWindow::updateMapCloud(
|
|||||||
}
|
}
|
||||||
if(!map8S.empty())
|
if(!map8S.empty())
|
||||||
{
|
{
|
||||||
if(_preferencesDialog->isGridMapEroded())
|
|
||||||
{
|
|
||||||
map8S = util3d::erodeMap(map8S);
|
|
||||||
}
|
|
||||||
|
|
||||||
//convert to gray scaled map
|
//convert to gray scaled map
|
||||||
map8U = util3d::convertMap2Image8U(map8S);
|
map8U = util3d::convertMap2Image8U(map8S);
|
||||||
|
|
||||||
@@ -2530,7 +2531,7 @@ std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> MainWindow::c
|
|||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
||||||
pcl::IndicesPtr indices(new std::vector<int>);
|
pcl::IndicesPtr indices(new std::vector<int>);
|
||||||
UASSERT(nodeId == data.id());
|
UASSERT_MSG(nodeId == -1 || nodeId == data.id(), uFormat("nodeId=%d data.id()=%d", nodeId, data.id()).c_str());
|
||||||
|
|
||||||
// Create organized cloud
|
// Create organized cloud
|
||||||
cloud = util3d::cloudRGBFromSensorData(data,
|
cloud = util3d::cloudRGBFromSensorData(data,
|
||||||
@@ -2597,7 +2598,8 @@ std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> MainWindow::c
|
|||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloudWithNormals(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloudWithNormals(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
||||||
if(_preferencesDialog->isSubtractFiltering() &&
|
if(_preferencesDialog->isSubtractFiltering() &&
|
||||||
_preferencesDialog->getSubtractFilteringRadius() > 0.0)
|
_preferencesDialog->getSubtractFilteringRadius() > 0.0 &&
|
||||||
|
nodeId > 0)
|
||||||
{
|
{
|
||||||
pcl::IndicesPtr beforeFiltering = indices;
|
pcl::IndicesPtr beforeFiltering = indices;
|
||||||
if( cloud->size() &&
|
if( cloud->size() &&
|
||||||
@@ -2801,7 +2803,7 @@ std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> MainWindow::c
|
|||||||
{
|
{
|
||||||
outputPair.first = output;
|
outputPair.first = output;
|
||||||
outputPair.second = indices;
|
outputPair.second = indices;
|
||||||
if(_preferencesDialog->isCloudsKept())
|
if(_preferencesDialog->isCloudsKept() && nodeId > 0)
|
||||||
{
|
{
|
||||||
_cachedClouds.insert(std::make_pair(nodeId, outputPair));
|
_cachedClouds.insert(std::make_pair(nodeId, outputPair));
|
||||||
_createdCloudsMemoryUsage += (long)(output->size() * sizeof(pcl::PointXYZRGB) + indices->size()*sizeof(int));
|
_createdCloudsMemoryUsage += (long)(output->size() * sizeof(pcl::PointXYZRGB) + indices->size()*sizeof(int));
|
||||||
@@ -2809,12 +2811,12 @@ std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> MainWindow::c
|
|||||||
_cloudViewer->setCloudOpacity(cloudName, _preferencesDialog->getCloudOpacity(0));
|
_cloudViewer->setCloudOpacity(cloudName, _preferencesDialog->getCloudOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
||||||
}
|
}
|
||||||
else
|
else if(nodeId>0)
|
||||||
{
|
{
|
||||||
_cachedEmptyClouds.insert(nodeId);
|
_cachedEmptyClouds.insert(nodeId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if(nodeId>0)
|
||||||
{
|
{
|
||||||
_cachedEmptyClouds.insert(nodeId);
|
_cachedEmptyClouds.insert(nodeId);
|
||||||
}
|
}
|
||||||
@@ -2869,17 +2871,19 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(_preferencesDialog->getCloudVoxelSizeScan(0) > 0.0)
|
if(nodeId > 0)
|
||||||
{
|
{
|
||||||
//reconvert the voxelized cloud
|
if(_preferencesDialog->getCloudVoxelSizeScan(0) > 0.0)
|
||||||
scan = util3d::laserScanFromPointCloud(*cloud);
|
{
|
||||||
|
//reconvert the voxelized cloud
|
||||||
|
scan = util3d::laserScanFromPointCloud(*cloud);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = util3d::transformLaserScan(scan, iter->sensorData().laserScanInfo().localTransform());
|
||||||
|
}
|
||||||
|
_createdScans.insert(std::make_pair(nodeId, scan)); // keep scan in base_link frame
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
scan = util3d::transformLaserScan(scan, iter->sensorData().laserScanInfo().localTransform());
|
|
||||||
}
|
|
||||||
_createdScans.insert(std::make_pair(nodeId, scan)); // keep scan in base_link frame
|
|
||||||
|
|
||||||
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
||||||
}
|
}
|
||||||
@@ -2903,16 +2907,19 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(_preferencesDialog->getCloudVoxelSizeScan(0) > 0.0)
|
if(nodeId > 0)
|
||||||
{
|
{
|
||||||
//reconvert the voxelized cloud
|
if(_preferencesDialog->getCloudVoxelSizeScan(0) > 0.0)
|
||||||
scan = util3d::laserScanFromPointCloud(*cloud);
|
{
|
||||||
|
//reconvert the voxelized cloud
|
||||||
|
scan = util3d::laserScanFromPointCloud(*cloud);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = util3d::transformLaserScan(scan, iter->sensorData().laserScanInfo().localTransform());
|
||||||
|
}
|
||||||
|
_createdScans.insert(std::make_pair(nodeId, scan)); // keep scan in base_link frame
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
scan = util3d::transformLaserScan(scan, iter->sensorData().laserScanInfo().localTransform());
|
|
||||||
}
|
|
||||||
_createdScans.insert(std::make_pair(nodeId, scan)); // keep scan in base_link frame
|
|
||||||
|
|
||||||
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
||||||
@@ -2999,7 +3006,7 @@ void MainWindow::createAndAddFeaturesToMap(int nodeId, const Transform & pose, i
|
|||||||
{
|
{
|
||||||
UERROR("Adding features cloud %d to viewer failed!", nodeId);
|
UERROR("Adding features cloud %d to viewer failed!", nodeId);
|
||||||
}
|
}
|
||||||
else
|
else if(nodeId > 0)
|
||||||
{
|
{
|
||||||
_createdFeatures.insert(std::make_pair(nodeId, cloud));
|
_createdFeatures.insert(std::make_pair(nodeId, cloud));
|
||||||
}
|
}
|
||||||
@@ -5921,11 +5928,6 @@ void MainWindow::exportGridMap()
|
|||||||
|
|
||||||
if(!pixels.empty())
|
if(!pixels.empty())
|
||||||
{
|
{
|
||||||
if(_preferencesDialog->isGridMapEroded())
|
|
||||||
{
|
|
||||||
pixels = util3d::erodeMap(pixels);
|
|
||||||
}
|
|
||||||
|
|
||||||
cv::Mat map8U(pixels.rows, pixels.cols, CV_8U);
|
cv::Mat map8U(pixels.rows, pixels.cols, CV_8U);
|
||||||
//convert to gray scaled map
|
//convert to gray scaled map
|
||||||
for (int i = 0; i < pixels.rows; ++i)
|
for (int i = 0; i < pixels.rows; ++i)
|
||||||
|
|||||||
@@ -402,10 +402,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
connect(_ui->doubleSpinBox_subtractFilteringAngle, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->doubleSpinBox_subtractFilteringAngle, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
|
||||||
connect(_ui->checkBox_map_shown, SIGNAL(clicked(bool)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->checkBox_map_shown, SIGNAL(clicked(bool)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_ui->doubleSpinBox_map_resolution, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
|
||||||
connect(_ui->doubleSpinBox_map_opacity, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->doubleSpinBox_map_opacity, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_ui->checkBox_map_erode, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
|
||||||
connect(_ui->doubleSpinBox_map_footprintRadius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
|
||||||
|
|
||||||
connect(_ui->groupBox_octomap, SIGNAL(toggled(bool)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->groupBox_octomap, SIGNAL(toggled(bool)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_ui->spinBox_octomap_treeDepth, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->spinBox_octomap_treeDepth, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
@@ -843,7 +840,6 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->checkBox_grid_flatObstaclesDetected->setObjectName(Parameters::kGridFlatObstacleDetected().c_str());
|
_ui->checkBox_grid_flatObstaclesDetected->setObjectName(Parameters::kGridFlatObstacleDetected().c_str());
|
||||||
_ui->groupBox_grid_fromDepthImage->setObjectName(Parameters::kGridFromDepth().c_str());
|
_ui->groupBox_grid_fromDepthImage->setObjectName(Parameters::kGridFromDepth().c_str());
|
||||||
_ui->checkBox_grid_projMapFrame->setObjectName(Parameters::kGridMapFrameProjection().c_str());
|
_ui->checkBox_grid_projMapFrame->setObjectName(Parameters::kGridMapFrameProjection().c_str());
|
||||||
_ui->checkBox_grid_fullUpdate->setObjectName(Parameters::kGridFullUpdate().c_str());
|
|
||||||
_ui->doubleSpinBox_grid_maxGroundAngle->setObjectName(Parameters::kGridMaxGroundAngle().c_str());
|
_ui->doubleSpinBox_grid_maxGroundAngle->setObjectName(Parameters::kGridMaxGroundAngle().c_str());
|
||||||
_ui->spinBox_grid_normalK->setObjectName(Parameters::kGridNormalK().c_str());
|
_ui->spinBox_grid_normalK->setObjectName(Parameters::kGridNormalK().c_str());
|
||||||
_ui->doubleSpinBox_grid_maxGroundHeight->setObjectName(Parameters::kGridMaxGroundHeight().c_str());
|
_ui->doubleSpinBox_grid_maxGroundHeight->setObjectName(Parameters::kGridMaxGroundHeight().c_str());
|
||||||
@@ -858,6 +854,11 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->doubleSpinBox_grid_unknownSpaceFilledMaxRange->setObjectName(Parameters::kGridScan2dMaxFilledRange().c_str());
|
_ui->doubleSpinBox_grid_unknownSpaceFilledMaxRange->setObjectName(Parameters::kGridScan2dMaxFilledRange().c_str());
|
||||||
_ui->spinBox_grid_scanDecimation->setObjectName(Parameters::kGridScanDecimation().c_str());
|
_ui->spinBox_grid_scanDecimation->setObjectName(Parameters::kGridScanDecimation().c_str());
|
||||||
|
|
||||||
|
_ui->checkBox_grid_fullUpdate->setObjectName(Parameters::kGridGlobalFullUpdate().c_str());
|
||||||
|
_ui->doubleSpinBox_grid_minMapSize->setObjectName(Parameters::kGridGlobalMinSize().c_str());
|
||||||
|
_ui->doubleSpinBox_grid_footprintRadius->setObjectName(Parameters::kGridGlobalFootprintRadius().c_str());
|
||||||
|
_ui->checkBox_grid_erode->setObjectName(Parameters::kGridGlobalEroded().c_str());
|
||||||
|
|
||||||
//Odometry
|
//Odometry
|
||||||
_ui->odom_strategy->setObjectName(Parameters::kOdomStrategy().c_str());
|
_ui->odom_strategy->setObjectName(Parameters::kOdomStrategy().c_str());
|
||||||
connect(_ui->odom_strategy, SIGNAL(currentIndexChanged(int)), _ui->stackedWidget_odometryType, SLOT(setCurrentIndex(int)));
|
connect(_ui->odom_strategy, SIGNAL(currentIndexChanged(int)), _ui->stackedWidget_odometryType, SLOT(setCurrentIndex(int)));
|
||||||
@@ -1306,9 +1307,6 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
else if(groupBox->objectName() == _ui->groupBox_gridMap2->objectName())
|
else if(groupBox->objectName() == _ui->groupBox_gridMap2->objectName())
|
||||||
{
|
{
|
||||||
_ui->checkBox_map_shown->setChecked(false);
|
_ui->checkBox_map_shown->setChecked(false);
|
||||||
_ui->doubleSpinBox_map_resolution->setValue(0.05);
|
|
||||||
_ui->checkBox_map_erode->setChecked(false);
|
|
||||||
_ui->doubleSpinBox_map_footprintRadius->setValue(0);
|
|
||||||
_ui->doubleSpinBox_map_opacity->setValue(0.75);
|
_ui->doubleSpinBox_map_opacity->setValue(0.75);
|
||||||
|
|
||||||
_ui->groupBox_octomap->setChecked(false);
|
_ui->groupBox_octomap->setChecked(false);
|
||||||
@@ -1685,9 +1683,6 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
|
|||||||
_ui->doubleSpinBox_subtractFilteringAngle->setValue(settings.value("subtractFilteringAngle", _ui->doubleSpinBox_subtractFilteringAngle->value()).toDouble());
|
_ui->doubleSpinBox_subtractFilteringAngle->setValue(settings.value("subtractFilteringAngle", _ui->doubleSpinBox_subtractFilteringAngle->value()).toDouble());
|
||||||
|
|
||||||
_ui->checkBox_map_shown->setChecked(settings.value("gridMapShown", _ui->checkBox_map_shown->isChecked()).toBool());
|
_ui->checkBox_map_shown->setChecked(settings.value("gridMapShown", _ui->checkBox_map_shown->isChecked()).toBool());
|
||||||
_ui->doubleSpinBox_map_resolution->setValue(settings.value("gridMapResolution", _ui->doubleSpinBox_map_resolution->value()).toDouble());
|
|
||||||
_ui->checkBox_map_erode->setChecked(settings.value("gridMapEroded", _ui->checkBox_map_erode->isChecked()).toBool());
|
|
||||||
_ui->doubleSpinBox_map_footprintRadius->setValue(settings.value("gridMapFootprintRadius", _ui->doubleSpinBox_map_footprintRadius->value()).toDouble());
|
|
||||||
_ui->doubleSpinBox_map_opacity->setValue(settings.value("gridMapOpacity", _ui->doubleSpinBox_map_opacity->value()).toDouble());
|
_ui->doubleSpinBox_map_opacity->setValue(settings.value("gridMapOpacity", _ui->doubleSpinBox_map_opacity->value()).toDouble());
|
||||||
|
|
||||||
_ui->groupBox_octomap->setChecked(settings.value("octomap", _ui->groupBox_octomap->isChecked()).toBool());
|
_ui->groupBox_octomap->setChecked(settings.value("octomap", _ui->groupBox_octomap->isChecked()).toBool());
|
||||||
@@ -2071,9 +2066,6 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath) const
|
|||||||
settings.setValue("subtractFilteringAngle", _ui->doubleSpinBox_subtractFilteringAngle->value());
|
settings.setValue("subtractFilteringAngle", _ui->doubleSpinBox_subtractFilteringAngle->value());
|
||||||
|
|
||||||
settings.setValue("gridMapShown", _ui->checkBox_map_shown->isChecked());
|
settings.setValue("gridMapShown", _ui->checkBox_map_shown->isChecked());
|
||||||
settings.setValue("gridMapResolution", _ui->doubleSpinBox_map_resolution->value());
|
|
||||||
settings.setValue("gridMapEroded", _ui->checkBox_map_erode->isChecked());
|
|
||||||
settings.setValue("gridMapFootprintRadius", _ui->doubleSpinBox_map_footprintRadius->value());
|
|
||||||
settings.setValue("gridMapOpacity", _ui->doubleSpinBox_map_opacity->value());
|
settings.setValue("gridMapOpacity", _ui->doubleSpinBox_map_opacity->value());
|
||||||
|
|
||||||
settings.setValue("octomap", _ui->groupBox_octomap->isChecked());
|
settings.setValue("octomap", _ui->groupBox_octomap->isChecked());
|
||||||
@@ -4251,15 +4243,7 @@ bool PreferencesDialog::getGridMapShown() const
|
|||||||
}
|
}
|
||||||
double PreferencesDialog::getGridMapResolution() const
|
double PreferencesDialog::getGridMapResolution() const
|
||||||
{
|
{
|
||||||
return _ui->doubleSpinBox_map_resolution->value();
|
return _ui->doubleSpinBox_grid_resolution->value();
|
||||||
}
|
|
||||||
bool PreferencesDialog::isGridMapEroded() const
|
|
||||||
{
|
|
||||||
return _ui->checkBox_map_erode->isChecked();
|
|
||||||
}
|
|
||||||
double PreferencesDialog::getGridMapFootprintRadius() const
|
|
||||||
{
|
|
||||||
return _ui->doubleSpinBox_map_footprintRadius->value();
|
|
||||||
}
|
}
|
||||||
bool PreferencesDialog::isGridMapFrom3DCloud() const
|
bool PreferencesDialog::isGridMapFrom3DCloud() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-675</y>
|
||||||
<width>673</width>
|
<width>678</width>
|
||||||
<height>2735</height>
|
<height>2701</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>3</number>
|
<number>15</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
||||||
@@ -1794,45 +1794,6 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_20" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_20" columnstretch="0,1">
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLabel" name="label_159">
|
|
||||||
<property name="text">
|
|
||||||
<string>Resolution (cell size).</string>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLabel" name="label_170">
|
|
||||||
<property name="text">
|
|
||||||
<string>Opacity.</string>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_map_opacity">
|
|
||||||
<property name="suffix">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<double>0.010000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.050000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>0.750000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_map_shown">
|
<widget class="QCheckBox" name="checkBox_map_shown">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -1853,10 +1814,20 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_170">
|
||||||
|
<property name="text">
|
||||||
|
<string>Opacity.</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_map_resolution">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_map_opacity">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<double>0.010000000000000</double>
|
<double>0.010000000000000</double>
|
||||||
@@ -1864,63 +1835,11 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>1.000000000000000</double>
|
<double>1.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="singleStep">
|
||||||
<double>0.050000000000000</double>
|
<double>0.050000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QLabel" name="label_224">
|
|
||||||
<property name="text">
|
|
||||||
<string>Erode.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QCheckBox" name="checkBox_map_erode">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QLabel" name="label_319">
|
|
||||||
<property name="text">
|
|
||||||
<string>Footprint radius.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_map_footprintRadius">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<double>0.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>10.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<double>0.000000000000000</double>
|
<double>0.750000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -8413,7 +8332,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_occupancy2">
|
<widget class="QGroupBox" name="groupBox_occupancy2">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Occupancy Grid</string>
|
<string>Local Occupancy Grid</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@@ -8421,7 +8340,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_110">
|
<layout class="QVBoxLayout" name="verticalLayout_110">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_75" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_75" columnstretch="0,1">
|
||||||
<item row="9" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_noiseRadius">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_noiseRadius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8440,7 +8359,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_minGroundHeight">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_minGroundHeight">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8462,7 +8381,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="1">
|
<item row="12" column="1">
|
||||||
<widget class="QLabel" name="label_335">
|
<widget class="QLabel" name="label_335">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Footprint filtering height (0=disabled). Footprint length and width should be set.</string>
|
<string>Footprint filtering height (0=disabled). Footprint length and width should be set.</string>
|
||||||
@@ -8475,7 +8394,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_maxObstacleHeight">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_maxObstacleHeight">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8488,7 +8407,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_maxGroundHeight">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_maxGroundHeight">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8504,7 +8423,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QLabel" name="label_321">
|
<widget class="QLabel" name="label_321">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Noise filtering min neighbors.</string>
|
<string>Noise filtering min neighbors.</string>
|
||||||
@@ -8517,7 +8436,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLabel" name="label_310">
|
<widget class="QLabel" name="label_310">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Maximum ground height (0=disabled). Should be set if Normals Segmentation Approach is checked below.</string>
|
<string>Maximum ground height (0=disabled). Should be set if Normals Segmentation Approach is checked below.</string>
|
||||||
@@ -8530,7 +8449,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QLabel" name="label_309">
|
<widget class="QLabel" name="label_309">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Maximum obstacles height (0=disabled).</string>
|
<string>Maximum obstacles height (0=disabled).</string>
|
||||||
@@ -8543,7 +8462,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="9" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_grid_noiseMinNeighbors">
|
<widget class="QSpinBox" name="spinBox_grid_noiseMinNeighbors">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -8556,7 +8475,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_resolution">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_resolution">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8572,7 +8491,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="1">
|
<item row="13" column="1">
|
||||||
<widget class="QLabel" name="label_331">
|
<widget class="QLabel" name="label_331">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Laser scan decimation.</string>
|
<string>Laser scan decimation.</string>
|
||||||
@@ -8585,7 +8504,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="0">
|
<item row="13" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_grid_scanDecimation">
|
<widget class="QSpinBox" name="spinBox_grid_scanDecimation">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -8598,7 +8517,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_333">
|
<widget class="QLabel" name="label_333">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Footprint filtering length (0=disabled).</string>
|
<string>Footprint filtering length (0=disabled).</string>
|
||||||
@@ -8611,7 +8530,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QLabel" name="label_334">
|
<widget class="QLabel" name="label_334">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Footprint filtering width (0=disabled). Footprint length should be set.</string>
|
<string>Footprint filtering width (0=disabled). Footprint length should be set.</string>
|
||||||
@@ -8624,7 +8543,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="0">
|
<item row="11" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintWidth">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintWidth">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8643,7 +8562,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="0">
|
<item row="12" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintHeight">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintHeight">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8662,20 +8581,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QLabel" name="label_332">
|
|
||||||
<property name="text">
|
|
||||||
<string>Global occupancy grid full update. When the graph is changed, the whole map will be reconstructed instead of moving individually each cells of the map. Also, data added to cache won't be released after updating the map. This process is longer but more robust to drift that would erase some parts of the map when it should not.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
|
||||||
<widget class="QLabel" name="label_327">
|
<widget class="QLabel" name="label_327">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Minimum ground height (0=disabled).</string>
|
<string>Minimum ground height (0=disabled).</string>
|
||||||
@@ -8688,7 +8594,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLabel" name="label_326">
|
<widget class="QLabel" name="label_326">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Resolution (cell size).</string>
|
<string>Resolution (cell size).</string>
|
||||||
@@ -8698,7 +8604,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLabel" name="label_325">
|
<widget class="QLabel" name="label_325">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Noise filtering radius (0=disabled). Done after segmentation.</string>
|
<string>Noise filtering radius (0=disabled). Done after segmentation.</string>
|
||||||
@@ -8711,7 +8617,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintLength">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintLength">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -8753,17 +8659,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_grid_fullUpdate">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLabel" name="label_311">
|
<widget class="QLabel" name="label_311">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Projection in map frame. On a 3D terrain and a fixed local camera transform (the cloud is created relative to ground), you may want to disable this to do the projection in robot frame instead.</string>
|
<string>Projection in map frame. On a 3D terrain and a fixed local camera transform (the cloud is created relative to ground), you may want to disable this to do the projection in robot frame instead.</string>
|
||||||
@@ -8776,7 +8672,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_grid_projMapFrame">
|
<widget class="QCheckBox" name="checkBox_grid_projMapFrame">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -9266,6 +9162,152 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_66">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_116">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_occupancyGlobal2">
|
||||||
|
<property name="title">
|
||||||
|
<string>Global Occupancy Grid</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_115">
|
||||||
|
<item>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_88" columnstretch="0,1">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_grid_fullUpdate">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_332">
|
||||||
|
<property name="text">
|
||||||
|
<string>Full update. When the graph is changed, the whole map will be reconstructed instead of moving individually each cells of the map. Data added to cache won't be released after updating the map. This process is longer but more robust to drift that would erase some parts of the map when it should not.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="label_224">
|
||||||
|
<property name="text">
|
||||||
|
<string>Erode obstacle cells.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLabel" name="label_319">
|
||||||
|
<property name="text">
|
||||||
|
<string>Footprint radius used to clear all obstacles under the graph.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_grid_erode">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_footprintRadius">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_366">
|
||||||
|
<property name="text">
|
||||||
|
<string>Minimum map size.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_grid_minMapSize">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>9999.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_59">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>2473</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
<widget class="QWidget" name="page_30">
|
<widget class="QWidget" name="page_30">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_97">
|
<layout class="QVBoxLayout" name="verticalLayout_97">
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
Reference in New Issue
Block a user