mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 08:47:45 +08:00
0.11.4: API change: added minDepth parameter to cloudFromXXXXX() methods and removed voxel parameter
This commit is contained in:
+1
-1
@@ -20,7 +20,7 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 11)
|
SET(RTABMAP_MINOR_VERSION 11)
|
||||||
SET(RTABMAP_PATCH_VERSION 3)
|
SET(RTABMAP_PATCH_VERSION 4)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
|
|||||||
@@ -416,7 +416,7 @@ int RTABMapApp::Render()
|
|||||||
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>);
|
||||||
LOGI("Creating node cloud %d (image size=%dx%d)", id, data.imageRaw().cols, data.imageRaw().rows);
|
LOGI("Creating node cloud %d (image size=%dx%d)", id, data.imageRaw().cols, data.imageRaw().rows);
|
||||||
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, data.imageRaw().rows/data.depthRaw().rows, maxCloudDepth_, 0, 0, indices.get());
|
cloud = rtabmap::util3d::cloudRGBFromSensorData(data, data.imageRaw().rows/data.depthRaw().rows, maxCloudDepth_, 0, indices.get());
|
||||||
|
|
||||||
if(cloud->size() && indices->size())
|
if(cloud->size() && indices->size())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ private:
|
|||||||
bool _scanFromDepth;
|
bool _scanFromDepth;
|
||||||
int _scanDecimation;
|
int _scanDecimation;
|
||||||
float _scanMaxDepth;
|
float _scanMaxDepth;
|
||||||
|
float _scanMinDepth;
|
||||||
float _scanVoxelSize;
|
float _scanVoxelSize;
|
||||||
int _scanNormalsK;
|
int _scanNormalsK;
|
||||||
StereoDense * _stereoDense;
|
StereoDense * _stereoDense;
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromDepth(
|
|||||||
float fx, float fy,
|
float fx, float fy,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromDepthRGB(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromDepthRGB(
|
||||||
@@ -88,6 +89,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromDepthRGB(
|
|||||||
float fx, float fy,
|
float fx, float fy,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromDisparity(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromDisparity(
|
||||||
@@ -95,6 +97,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromDisparity(
|
|||||||
const StereoCameraModel & model,
|
const StereoCameraModel & model,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromDisparityRGB(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromDisparityRGB(
|
||||||
@@ -103,6 +106,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromDisparityRGB(
|
|||||||
const StereoCameraModel & model,
|
const StereoCameraModel & model,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromStereoImages(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromStereoImages(
|
||||||
@@ -111,29 +115,26 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromStereoImages(
|
|||||||
const StereoCameraModel & model,
|
const StereoCameraModel & model,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
||||||
const SensorData & sensorData,
|
const SensorData & sensorData,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float voxelSize = 0.0f,
|
float minDepth = 0.0f,
|
||||||
int samples = 0,
|
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an RGB cloud from the images contained in SensorData. If "voxelSize" and
|
* Create an RGB cloud from the images contained in SensorData. If there is only one camera,
|
||||||
* "samples" are not set (0), the returned cloud is organized. Otherwise, all NaN
|
* the returned cloud is organized. Otherwise, all NaN
|
||||||
* points are removed and the cloud will be dense.
|
* points are removed and the cloud will be dense.
|
||||||
*
|
*
|
||||||
* Note that multiple RGB-D camera images will result in a dense cloud.
|
|
||||||
*
|
|
||||||
* @param sensorData, the sensor data.
|
* @param sensorData, the sensor data.
|
||||||
* @param decimation, images are decimated by this factor before projecting points to 3D. The factor
|
* @param decimation, images are decimated by this factor before projecting points to 3D. The factor
|
||||||
* should be a factor of the image width and height.
|
* should be a factor of the image width and height.
|
||||||
* @param maxDepth, maximum depth of the projected points (farther points are set to null in case of an organized cloud).
|
* @param maxDepth, maximum depth of the projected points (farther points are set to null in case of an organized cloud).
|
||||||
* @param voxelSize, use a voxel grid filter with this size of voxel.
|
* @param minDepth, minimum depth of the projected points (closer points are set to null in case of an organized cloud).
|
||||||
* @param samples, random sampling filtering target cloud size.
|
|
||||||
* @param validIndices, the indices of valid points in the cloud
|
* @param validIndices, the indices of valid points in the cloud
|
||||||
* @return a RGB cloud.
|
* @return a RGB cloud.
|
||||||
*/
|
*/
|
||||||
@@ -141,8 +142,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
const SensorData & sensorData,
|
const SensorData & sensorData,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float voxelSize = 0.0f,
|
float minDepth = 0.0f,
|
||||||
int samples = 0,
|
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ> RTABMAP_EXP laserScanFromDepthImage(
|
pcl::PointCloud<pcl::PointXYZ> RTABMAP_EXP laserScanFromDepthImage(
|
||||||
@@ -152,6 +152,7 @@ pcl::PointCloud<pcl::PointXYZ> RTABMAP_EXP laserScanFromDepthImage(
|
|||||||
float cx,
|
float cx,
|
||||||
float cy,
|
float cy,
|
||||||
float maxDepth = 0,
|
float maxDepth = 0,
|
||||||
|
float minDepth = 0,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
// return CV_32FC3
|
// return CV_32FC3
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ CameraThread::CameraThread(Camera * camera, const ParametersMap & parameters) :
|
|||||||
_scanFromDepth(false),
|
_scanFromDepth(false),
|
||||||
_scanDecimation(4),
|
_scanDecimation(4),
|
||||||
_scanMaxDepth(4.0f),
|
_scanMaxDepth(4.0f),
|
||||||
|
_scanMinDepth(0.0f),
|
||||||
_scanVoxelSize(0.0f),
|
_scanVoxelSize(0.0f),
|
||||||
_scanNormalsK(0),
|
_scanNormalsK(0),
|
||||||
_stereoDense(new StereoBM(parameters))
|
_stereoDense(new StereoBM(parameters))
|
||||||
@@ -174,7 +175,7 @@ void CameraThread::mainLoop()
|
|||||||
UASSERT(_scanDecimation >= 1);
|
UASSERT(_scanDecimation >= 1);
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
pcl::IndicesPtr validIndices(new std::vector<int>);
|
pcl::IndicesPtr validIndices(new std::vector<int>);
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = util3d::cloudFromSensorData(data, _scanDecimation, _scanMaxDepth, 0.0f, 0, validIndices.get());
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = util3d::cloudFromSensorData(data, _scanDecimation, _scanMaxDepth, _scanMinDepth, validIndices.get());
|
||||||
float maxPoints = (data.depthRaw().rows/_scanDecimation)*(data.depthRaw().cols/_scanDecimation);
|
float maxPoints = (data.depthRaw().rows/_scanDecimation)*(data.depthRaw().cols/_scanDecimation);
|
||||||
if(_scanVoxelSize>0.0f)
|
if(_scanVoxelSize>0.0f)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -616,7 +616,7 @@ std::map<int, Transform> radiusPosesFiltering(
|
|||||||
float angle,
|
float angle,
|
||||||
bool keepLatest)
|
bool keepLatest)
|
||||||
{
|
{
|
||||||
if(poses.size() > 1 && radius > 0.0f)
|
if(poses.size() > 2 && radius > 0.0f)
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
cloud->resize(poses.size());
|
cloud->resize(poses.size());
|
||||||
@@ -710,6 +710,10 @@ std::map<int, Transform> radiusPosesFiltering(
|
|||||||
keptPoses.insert(std::make_pair(names.at(*iter), transforms.at(*iter)));
|
keptPoses.insert(std::make_pair(names.at(*iter), transforms.at(*iter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure the first and last poses are still here
|
||||||
|
keptPoses.insert(*poses.begin());
|
||||||
|
keptPoses.insert(*poses.rbegin());
|
||||||
|
|
||||||
return keptPoses;
|
return keptPoses;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1928,10 +1928,8 @@ bool Rtabmap::process(
|
|||||||
{
|
{
|
||||||
// path filtering
|
// path filtering
|
||||||
std::map<int, Transform> filteredPath = graph::radiusPosesFiltering(path, _proximityFilteringRadius, 0, true);
|
std::map<int, Transform> filteredPath = graph::radiusPosesFiltering(path, _proximityFilteringRadius, 0, true);
|
||||||
// make sure the nearest and farthest poses are still here
|
// make sure the current pose is still here
|
||||||
filteredPath.insert(*path.find(nearestId));
|
filteredPath.insert(*path.find(nearestId));
|
||||||
filteredPath.insert(*path.begin());
|
|
||||||
filteredPath.insert(*path.rbegin());
|
|
||||||
path = filteredPath;
|
path = filteredPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-76
@@ -245,6 +245,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
float fx, float fy,
|
float fx, float fy,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
UASSERT(!imageDepth.empty() && (imageDepth.type() == CV_16UC1 || imageDepth.type() == CV_32FC1));
|
UASSERT(!imageDepth.empty() && (imageDepth.type() == CV_16UC1 || imageDepth.type() == CV_32FC1));
|
||||||
@@ -275,7 +276,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDepth(
|
|||||||
pcl::PointXYZ & pt = cloud->at((h/decimation)*cloud->width + (w/decimation));
|
pcl::PointXYZ & pt = cloud->at((h/decimation)*cloud->width + (w/decimation));
|
||||||
|
|
||||||
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w, h, cx, cy, fx, fy, false);
|
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w, h, cx, cy, fx, fy, false);
|
||||||
if(maxDepth<=0.0f || ptXYZ.z <= maxDepth)
|
if(pcl::isFinite(ptXYZ) && ptXYZ.z>=minDepth && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
||||||
{
|
{
|
||||||
pt.x = ptXYZ.x;
|
pt.x = ptXYZ.x;
|
||||||
pt.y = ptXYZ.y;
|
pt.y = ptXYZ.y;
|
||||||
@@ -307,6 +308,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
float fx, float fy,
|
float fx, float fy,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
@@ -381,7 +383,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDepthRGB(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w*rgbToDepthFactorX, h*rgbToDepthFactorY, depthCx, depthCy, depthFx, depthFy, false);
|
pcl::PointXYZ ptXYZ = projectDepthTo3D(imageDepth, w*rgbToDepthFactorX, h*rgbToDepthFactorY, depthCx, depthCy, depthFx, depthFy, false);
|
||||||
if(pcl::isFinite(ptXYZ) && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
if(pcl::isFinite(ptXYZ) && ptXYZ.z>=minDepth && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
||||||
{
|
{
|
||||||
pt.x = ptXYZ.x;
|
pt.x = ptXYZ.x;
|
||||||
pt.y = ptXYZ.y;
|
pt.y = ptXYZ.y;
|
||||||
@@ -415,6 +417,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDisparity(
|
|||||||
const StereoCameraModel & model,
|
const StereoCameraModel & model,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
UASSERT(imageDisparity.type() == CV_32FC1 || imageDisparity.type()==CV_16SC1);
|
UASSERT(imageDisparity.type() == CV_32FC1 || imageDisparity.type()==CV_16SC1);
|
||||||
@@ -443,7 +446,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDisparity(
|
|||||||
{
|
{
|
||||||
float disp = float(imageDisparity.at<short>(h,w))/16.0f;
|
float disp = float(imageDisparity.at<short>(h,w))/16.0f;
|
||||||
cv::Point3f pt = projectDisparityTo3D(cv::Point2f(w, h), disp, model);
|
cv::Point3f pt = projectDisparityTo3D(cv::Point2f(w, h), disp, model);
|
||||||
if(maxDepth <= 0.0f || pt.z <= maxDepth)
|
if(pt.z >= minDepth && (maxDepth <= 0.0f || pt.z <= maxDepth))
|
||||||
{
|
{
|
||||||
cloud->at((h/decimation)*cloud->width + (w/decimation)) = pcl::PointXYZ(pt.x, pt.y, pt.z);
|
cloud->at((h/decimation)*cloud->width + (w/decimation)) = pcl::PointXYZ(pt.x, pt.y, pt.z);
|
||||||
if(validIndices)
|
if(validIndices)
|
||||||
@@ -469,7 +472,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFromDisparity(
|
|||||||
{
|
{
|
||||||
float disp = imageDisparity.at<float>(h,w);
|
float disp = imageDisparity.at<float>(h,w);
|
||||||
cv::Point3f pt = projectDisparityTo3D(cv::Point2f(w, h), disp, model);
|
cv::Point3f pt = projectDisparityTo3D(cv::Point2f(w, h), disp, model);
|
||||||
if(maxDepth <= 0.0f || pt.z <= maxDepth)
|
if(pt.z > minDepth && (maxDepth <= 0.0f || pt.z <= maxDepth))
|
||||||
{
|
{
|
||||||
cloud->at((h/decimation)*cloud->width + (w/decimation)) = pcl::PointXYZ(pt.x, pt.y, pt.z);
|
cloud->at((h/decimation)*cloud->width + (w/decimation)) = pcl::PointXYZ(pt.x, pt.y, pt.z);
|
||||||
if(validIndices)
|
if(validIndices)
|
||||||
@@ -500,6 +503,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDisparityRGB(
|
|||||||
const StereoCameraModel & model,
|
const StereoCameraModel & model,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
UASSERT(!imageRgb.empty() && !imageDisparity.empty());
|
UASSERT(!imageRgb.empty() && !imageDisparity.empty());
|
||||||
@@ -554,7 +558,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromDisparityRGB(
|
|||||||
|
|
||||||
float disp = imageDisparity.type()==CV_16SC1?float(imageDisparity.at<short>(h,w))/16.0f:imageDisparity.at<float>(h,w);
|
float disp = imageDisparity.type()==CV_16SC1?float(imageDisparity.at<short>(h,w))/16.0f:imageDisparity.at<float>(h,w);
|
||||||
cv::Point3f ptXYZ = projectDisparityTo3D(cv::Point2f(w, h), disp, model);
|
cv::Point3f ptXYZ = projectDisparityTo3D(cv::Point2f(w, h), disp, model);
|
||||||
if(util3d::isFinite(ptXYZ) && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
if(util3d::isFinite(ptXYZ) && ptXYZ.z >= minDepth && (maxDepth<=0.0f || ptXYZ.z <= maxDepth))
|
||||||
{
|
{
|
||||||
pt.x = ptXYZ.x;
|
pt.x = ptXYZ.x;
|
||||||
pt.y = ptXYZ.y;
|
pt.y = ptXYZ.y;
|
||||||
@@ -583,6 +587,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromStereoImages(
|
|||||||
const StereoCameraModel & model,
|
const StereoCameraModel & model,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
UASSERT(!imageLeft.empty() && !imageRight.empty());
|
UASSERT(!imageLeft.empty() && !imageRight.empty());
|
||||||
@@ -622,6 +627,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromStereoImages(
|
|||||||
modelDecimation,
|
modelDecimation,
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
validIndices);
|
validIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -629,8 +635,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
|||||||
const SensorData & sensorData,
|
const SensorData & sensorData,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float voxelSize,
|
float minDepth,
|
||||||
int samples,
|
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
@@ -652,36 +657,16 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
|||||||
sensorData.cameraModels()[i].fy(),
|
sensorData.cameraModels()[i].fy(),
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
sensorData.cameraModels().size()==1?validIndices:0);
|
sensorData.cameraModels().size()==1?validIndices:0);
|
||||||
|
|
||||||
if(tmp->size())
|
|
||||||
{
|
|
||||||
bool filtered = false;
|
|
||||||
|
|
||||||
if(tmp->size() && voxelSize)
|
|
||||||
{
|
|
||||||
tmp = util3d::voxelize(tmp, voxelSize);
|
|
||||||
filtered = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmp->size() && samples)
|
|
||||||
{
|
|
||||||
tmp = util3d::randomSampling(tmp, samples);
|
|
||||||
filtered = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmp->size() && !filtered && sensorData.cameraModels().size() > 1)
|
|
||||||
{
|
|
||||||
tmp = util3d::removeNaNFromPointCloud(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmp->size())
|
if(tmp->size())
|
||||||
{
|
{
|
||||||
tmp = util3d::transformPointCloud(tmp, sensorData.cameraModels()[i].localTransform());
|
tmp = util3d::transformPointCloud(tmp, sensorData.cameraModels()[i].localTransform());
|
||||||
}
|
|
||||||
|
|
||||||
if(sensorData.cameraModels().size() > 1)
|
if(sensorData.cameraModels().size() > 1)
|
||||||
{
|
{
|
||||||
|
tmp = util3d::removeNaNFromPointCloud(tmp);
|
||||||
*cloud += *tmp;
|
*cloud += *tmp;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -695,11 +680,6 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
|||||||
UERROR("Camera model %d is invalid", i);
|
UERROR("Camera model %d is invalid", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cloud->size() && voxelSize && sensorData.cameraModels().size() > 1)
|
|
||||||
{
|
|
||||||
cloud = util3d::voxelize(cloud, voxelSize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if(!sensorData.imageRaw().empty() && !sensorData.rightRaw().empty() && sensorData.stereoCameraModel().isValidForProjection())
|
else if(!sensorData.imageRaw().empty() && !sensorData.rightRaw().empty() && sensorData.stereoCameraModel().isValidForProjection())
|
||||||
{
|
{
|
||||||
@@ -720,15 +700,11 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
|||||||
sensorData.stereoCameraModel(),
|
sensorData.stereoCameraModel(),
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
validIndices);
|
validIndices);
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
if(cloud->size() && voxelSize)
|
|
||||||
{
|
|
||||||
cloud = util3d::voxelize(cloud, voxelSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
cloud = util3d::transformPointCloud(cloud, sensorData.stereoCameraModel().left().localTransform());
|
cloud = util3d::transformPointCloud(cloud, sensorData.stereoCameraModel().left().localTransform());
|
||||||
@@ -742,8 +718,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
const SensorData & sensorData,
|
const SensorData & sensorData,
|
||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float voxelSize,
|
float minDepth,
|
||||||
int samples,
|
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices)
|
||||||
{
|
{
|
||||||
UASSERT(!sensorData.imageRaw().empty());
|
UASSERT(!sensorData.imageRaw().empty());
|
||||||
@@ -785,35 +760,16 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
sensorData.cameraModels()[i].fy(),
|
sensorData.cameraModels()[i].fy(),
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
sensorData.cameraModels().size() == 1?validIndices:0);
|
sensorData.cameraModels().size() == 1?validIndices:0);
|
||||||
|
|
||||||
if(tmp->size())
|
|
||||||
{
|
|
||||||
bool filtered = false;
|
|
||||||
if(tmp->size() && voxelSize)
|
|
||||||
{
|
|
||||||
tmp = util3d::voxelize(tmp, voxelSize);
|
|
||||||
filtered = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmp->size() && samples)
|
|
||||||
{
|
|
||||||
tmp = util3d::randomSampling(tmp, samples);
|
|
||||||
filtered = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmp->size() && !filtered && sensorData.cameraModels().size() > 1)
|
|
||||||
{
|
|
||||||
tmp = util3d::removeNaNFromPointCloud(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tmp->size())
|
if(tmp->size())
|
||||||
{
|
{
|
||||||
tmp = util3d::transformPointCloud(tmp, sensorData.cameraModels()[i].localTransform());
|
tmp = util3d::transformPointCloud(tmp, sensorData.cameraModels()[i].localTransform());
|
||||||
}
|
|
||||||
|
|
||||||
if(sensorData.cameraModels().size() > 1)
|
if(sensorData.cameraModels().size() > 1)
|
||||||
{
|
{
|
||||||
|
tmp = util3d::removeNaNFromPointCloud(tmp);
|
||||||
*cloud += *tmp;
|
*cloud += *tmp;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -828,11 +784,6 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cloud->size() && voxelSize && sensorData.cameraModels().size() > 1)
|
|
||||||
{
|
|
||||||
cloud = util3d::voxelize(cloud, voxelSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cloud->is_dense && validIndices)
|
if(cloud->is_dense && validIndices)
|
||||||
{
|
{
|
||||||
//generate indices for all points (they are all valid)
|
//generate indices for all points (they are all valid)
|
||||||
@@ -852,21 +803,14 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
sensorData.stereoCameraModel(),
|
sensorData.stereoCameraModel(),
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
|
minDepth,
|
||||||
validIndices);
|
validIndices);
|
||||||
|
|
||||||
if(cloud->size())
|
|
||||||
{
|
|
||||||
if(cloud->size() && voxelSize)
|
|
||||||
{
|
|
||||||
cloud = util3d::voxelize(cloud, voxelSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
cloud = util3d::transformPointCloud(cloud, sensorData.stereoCameraModel().left().localTransform());
|
cloud = util3d::transformPointCloud(cloud, sensorData.stereoCameraModel().left().localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return cloud;
|
return cloud;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -877,6 +821,7 @@ pcl::PointCloud<pcl::PointXYZ> laserScanFromDepthImage(
|
|||||||
float cx,
|
float cx,
|
||||||
float cy,
|
float cy,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
|
float minDepth,
|
||||||
const Transform & localTransform)
|
const Transform & localTransform)
|
||||||
{
|
{
|
||||||
UASSERT(depthImage.type() == CV_16UC1 || depthImage.type() == CV_32FC1);
|
UASSERT(depthImage.type() == CV_16UC1 || depthImage.type() == CV_32FC1);
|
||||||
@@ -891,7 +836,7 @@ pcl::PointCloud<pcl::PointXYZ> laserScanFromDepthImage(
|
|||||||
for(int i=0; i<depthImage.cols; ++i)
|
for(int i=0; i<depthImage.cols; ++i)
|
||||||
{
|
{
|
||||||
pcl::PointXYZ pt = util3d::projectDepthTo3D(depthImage, i, middle, cx, cy, fx, fy, false);
|
pcl::PointXYZ pt = util3d::projectDepthTo3D(depthImage, i, middle, cx, cy, fx, fy, false);
|
||||||
if(pcl::isFinite(pt) && (maxDepth == 0 || pt.z < maxDepth))
|
if(pcl::isFinite(pt) && pt.z >= minDepth && (maxDepth == 0 || pt.z < maxDepth))
|
||||||
{
|
{
|
||||||
if(!localTransform.isIdentity())
|
if(!localTransform.isIdentity())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void setDecimation(int decimation) {decimation_ = decimation;}
|
void setDecimation(int decimation) {decimation_ = decimation;}
|
||||||
void setMaxDepth(int maxDepth) {maxDepth_ = maxDepth;}
|
void setMaxDepth(int maxDepth) {maxDepth_ = maxDepth;}
|
||||||
void setSamples(int samples) {samples_ = samples;}
|
void setMinDepth(int minDepth) {minDepth_ = minDepth;}
|
||||||
void updateView(const Transform & AtoB = Transform());
|
void updateView(const Transform & AtoB = Transform());
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -71,7 +71,7 @@ private:
|
|||||||
|
|
||||||
int decimation_;
|
int decimation_;
|
||||||
float maxDepth_;
|
float maxDepth_;
|
||||||
int samples_;
|
float minDepth_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ public:
|
|||||||
bool isCloudsShown(int index) const; // 0=map, 1=odom
|
bool isCloudsShown(int index) const; // 0=map, 1=odom
|
||||||
int getCloudDecimation(int index) const; // 0=map, 1=odom
|
int getCloudDecimation(int index) const; // 0=map, 1=odom
|
||||||
double getCloudMaxDepth(int index) const; // 0=map, 1=odom
|
double getCloudMaxDepth(int index) const; // 0=map, 1=odom
|
||||||
|
double getCloudMinDepth(int index) const; // 0=map, 1=odom
|
||||||
double getCloudOpacity(int index) const; // 0=map, 1=odom
|
double getCloudOpacity(int index) const; // 0=map, 1=odom
|
||||||
int getCloudPointSize(int index) const; // 0=map, 1=odom
|
int getCloudPointSize(int index) const; // 0=map, 1=odom
|
||||||
|
|
||||||
@@ -340,6 +341,7 @@ private:
|
|||||||
QVector<QCheckBox*> _3dRenderingShowClouds;
|
QVector<QCheckBox*> _3dRenderingShowClouds;
|
||||||
QVector<QSpinBox*> _3dRenderingDecimation;
|
QVector<QSpinBox*> _3dRenderingDecimation;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingMaxDepth;
|
QVector<QDoubleSpinBox*> _3dRenderingMaxDepth;
|
||||||
|
QVector<QDoubleSpinBox*> _3dRenderingMinDepth;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingOpacity;
|
QVector<QDoubleSpinBox*> _3dRenderingOpacity;
|
||||||
QVector<QSpinBox*> _3dRenderingPtSize;
|
QVector<QSpinBox*> _3dRenderingPtSize;
|
||||||
QVector<QCheckBox*> _3dRenderingShowScans;
|
QVector<QCheckBox*> _3dRenderingShowScans;
|
||||||
|
|||||||
@@ -239,6 +239,7 @@ DatabaseViewer::DatabaseViewer(const QString & ini, QWidget * parent) :
|
|||||||
connect(ui_->doubleSpinBox_gridCellSize, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
connect(ui_->doubleSpinBox_gridCellSize, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
||||||
connect(ui_->spinBox_projDecimation, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
connect(ui_->spinBox_projDecimation, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
||||||
connect(ui_->doubleSpinBox_projMaxDepth, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
connect(ui_->doubleSpinBox_projMaxDepth, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
||||||
|
connect(ui_->doubleSpinBox_projMinDepth, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
||||||
connect(ui_->doubleSpinBox_projMaxAngle, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
connect(ui_->doubleSpinBox_projMaxAngle, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
||||||
connect(ui_->spinBox_projClusterSize, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
connect(ui_->spinBox_projClusterSize, SIGNAL(editingFinished()), this, SLOT(updateGrid()));
|
||||||
|
|
||||||
@@ -268,6 +269,7 @@ DatabaseViewer::DatabaseViewer(const QString & ini, QWidget * parent) :
|
|||||||
connect(ui_->doubleSpinBox_gridCellSize, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_gridCellSize, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
connect(ui_->spinBox_projDecimation, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
connect(ui_->spinBox_projDecimation, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
||||||
connect(ui_->doubleSpinBox_projMaxDepth, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_projMaxDepth, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
|
connect(ui_->doubleSpinBox_projMinDepth, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
connect(ui_->doubleSpinBox_projMaxAngle, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_projMaxAngle, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
connect(ui_->spinBox_projClusterSize, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
connect(ui_->spinBox_projClusterSize, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
||||||
connect(ui_->groupBox_posefiltering, SIGNAL(clicked(bool)), this, SLOT(configModified()));
|
connect(ui_->groupBox_posefiltering, SIGNAL(clicked(bool)), this, SLOT(configModified()));
|
||||||
@@ -276,6 +278,7 @@ DatabaseViewer::DatabaseViewer(const QString & ini, QWidget * parent) :
|
|||||||
|
|
||||||
connect(ui_->spinBox_icp_decimation, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
connect(ui_->spinBox_icp_decimation, SIGNAL(valueChanged(int)), this, SLOT(configModified()));
|
||||||
connect(ui_->doubleSpinBox_icp_maxDepth, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_icp_maxDepth, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
|
connect(ui_->doubleSpinBox_icp_minDepth, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
connect(ui_->checkBox_icp_laserScan, SIGNAL(stateChanged(int)), this, SLOT(configModified()));
|
connect(ui_->checkBox_icp_laserScan, SIGNAL(stateChanged(int)), this, SLOT(configModified()));
|
||||||
|
|
||||||
connect(ui_->doubleSpinBox_detectMore_radius, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
connect(ui_->doubleSpinBox_detectMore_radius, SIGNAL(valueChanged(double)), this, SLOT(configModified()));
|
||||||
@@ -388,6 +391,7 @@ void DatabaseViewer::readSettings()
|
|||||||
ui_->doubleSpinBox_gridCellSize->setValue(settings.value("gridCellSize", ui_->doubleSpinBox_gridCellSize->value()).toDouble());
|
ui_->doubleSpinBox_gridCellSize->setValue(settings.value("gridCellSize", ui_->doubleSpinBox_gridCellSize->value()).toDouble());
|
||||||
ui_->spinBox_projDecimation->setValue(settings.value("projDecimation", ui_->spinBox_projDecimation->value()).toInt());
|
ui_->spinBox_projDecimation->setValue(settings.value("projDecimation", ui_->spinBox_projDecimation->value()).toInt());
|
||||||
ui_->doubleSpinBox_projMaxDepth->setValue(settings.value("projMaxDepth", ui_->doubleSpinBox_projMaxDepth->value()).toDouble());
|
ui_->doubleSpinBox_projMaxDepth->setValue(settings.value("projMaxDepth", ui_->doubleSpinBox_projMaxDepth->value()).toDouble());
|
||||||
|
ui_->doubleSpinBox_projMinDepth->setValue(settings.value("projMinDepth", ui_->doubleSpinBox_projMinDepth->value()).toDouble());
|
||||||
ui_->doubleSpinBox_projMaxAngle->setValue(settings.value("projMaxAngle", ui_->doubleSpinBox_projMaxAngle->value()).toDouble());
|
ui_->doubleSpinBox_projMaxAngle->setValue(settings.value("projMaxAngle", ui_->doubleSpinBox_projMaxAngle->value()).toDouble());
|
||||||
ui_->spinBox_projClusterSize->setValue(settings.value("projClusterSize", ui_->spinBox_projClusterSize->value()).toInt());
|
ui_->spinBox_projClusterSize->setValue(settings.value("projClusterSize", ui_->spinBox_projClusterSize->value()).toInt());
|
||||||
ui_->groupBox_posefiltering->setChecked(settings.value("poseFiltering", ui_->groupBox_posefiltering->isChecked()).toBool());
|
ui_->groupBox_posefiltering->setChecked(settings.value("poseFiltering", ui_->groupBox_posefiltering->isChecked()).toBool());
|
||||||
@@ -411,6 +415,7 @@ void DatabaseViewer::readSettings()
|
|||||||
settings.beginGroup("icp");
|
settings.beginGroup("icp");
|
||||||
ui_->spinBox_icp_decimation->setValue(settings.value("decimation", ui_->spinBox_icp_decimation->value()).toInt());
|
ui_->spinBox_icp_decimation->setValue(settings.value("decimation", ui_->spinBox_icp_decimation->value()).toInt());
|
||||||
ui_->doubleSpinBox_icp_maxDepth->setValue(settings.value("maxDepth", ui_->doubleSpinBox_icp_maxDepth->value()).toDouble());
|
ui_->doubleSpinBox_icp_maxDepth->setValue(settings.value("maxDepth", ui_->doubleSpinBox_icp_maxDepth->value()).toDouble());
|
||||||
|
ui_->doubleSpinBox_icp_minDepth->setValue(settings.value("minDepth", ui_->doubleSpinBox_icp_minDepth->value()).toDouble());
|
||||||
ui_->checkBox_icp_laserScan->setChecked(settings.value("icpLaserScan", ui_->checkBox_icp_laserScan->isChecked()).toBool());
|
ui_->checkBox_icp_laserScan->setChecked(settings.value("icpLaserScan", ui_->checkBox_icp_laserScan->isChecked()).toBool());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
// Visual parameters
|
// Visual parameters
|
||||||
@@ -474,6 +479,7 @@ void DatabaseViewer::writeSettings()
|
|||||||
settings.setValue("gridCellSize", ui_->doubleSpinBox_gridCellSize->value());
|
settings.setValue("gridCellSize", ui_->doubleSpinBox_gridCellSize->value());
|
||||||
settings.setValue("projDecimation", ui_->spinBox_projDecimation->value());
|
settings.setValue("projDecimation", ui_->spinBox_projDecimation->value());
|
||||||
settings.setValue("projMaxDepth", ui_->doubleSpinBox_projMaxDepth->value());
|
settings.setValue("projMaxDepth", ui_->doubleSpinBox_projMaxDepth->value());
|
||||||
|
settings.setValue("projMinDepth", ui_->doubleSpinBox_projMinDepth->value());
|
||||||
settings.setValue("projMaxAngle", ui_->doubleSpinBox_projMaxAngle->value());
|
settings.setValue("projMaxAngle", ui_->doubleSpinBox_projMaxAngle->value());
|
||||||
settings.setValue("projClusterSize", ui_->spinBox_projClusterSize->value());
|
settings.setValue("projClusterSize", ui_->spinBox_projClusterSize->value());
|
||||||
settings.setValue("poseFiltering", ui_->groupBox_posefiltering->isChecked());
|
settings.setValue("poseFiltering", ui_->groupBox_posefiltering->isChecked());
|
||||||
@@ -497,6 +503,7 @@ void DatabaseViewer::writeSettings()
|
|||||||
settings.beginGroup("icp");
|
settings.beginGroup("icp");
|
||||||
settings.setValue("decimation", ui_->spinBox_icp_decimation->value());
|
settings.setValue("decimation", ui_->spinBox_icp_decimation->value());
|
||||||
settings.setValue("maxDepth", ui_->doubleSpinBox_icp_maxDepth->value());
|
settings.setValue("maxDepth", ui_->doubleSpinBox_icp_maxDepth->value());
|
||||||
|
settings.setValue("minDepth", ui_->doubleSpinBox_icp_minDepth->value());
|
||||||
settings.setValue("icpLaserScan", ui_->checkBox_icp_laserScan->isChecked());
|
settings.setValue("icpLaserScan", ui_->checkBox_icp_laserScan->isChecked());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
@@ -1710,10 +1717,15 @@ void DatabaseViewer::generate3DMap()
|
|||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
||||||
UASSERT(data.imageRaw().empty() || data.imageRaw().type()==CV_8UC3 || data.imageRaw().type() == CV_8UC1);
|
UASSERT(data.imageRaw().empty() || data.imageRaw().type()==CV_8UC3 || data.imageRaw().type() == CV_8UC1);
|
||||||
UASSERT(data.depthOrRightRaw().empty() || data.depthOrRightRaw().type()==CV_8UC1 || data.depthOrRightRaw().type() == CV_16UC1 || data.depthOrRightRaw().type() == CV_32FC1);
|
UASSERT(data.depthOrRightRaw().empty() || data.depthOrRightRaw().type()==CV_8UC1 || data.depthOrRightRaw().type() == CV_16UC1 || data.depthOrRightRaw().type() == CV_32FC1);
|
||||||
cloud = util3d::cloudRGBFromSensorData(data, decimation, maxDepth, assemble?0.01:0);
|
pcl::IndicesPtr validIndices(new std::vector<int>);
|
||||||
|
cloud = util3d::cloudRGBFromSensorData(data, decimation, maxDepth, 0, validIndices.get());
|
||||||
|
|
||||||
if(assemble)
|
if(assemble)
|
||||||
{
|
{
|
||||||
|
if(cloud->size())
|
||||||
|
{
|
||||||
|
cloud = util3d::voxelize(cloud, validIndices, 0.01);
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
cloud = rtabmap::util3d::transformPointCloud(cloud, pose);
|
cloud = rtabmap::util3d::transformPointCloud(cloud, pose);
|
||||||
@@ -1726,6 +1738,7 @@ void DatabaseViewer::generate3DMap()
|
|||||||
*assembledCloud += *cloud;
|
*assembledCloud += *cloud;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
UINFO("Created cloud %d (%d points)", iter->first, (int)cloud->size());
|
UINFO("Created cloud %d (%d points)", iter->first, (int)cloud->size());
|
||||||
progressDialog.appendText(QString("Created cloud %1 (%2 points)").arg(iter->first).arg(cloud->size()));
|
progressDialog.appendText(QString("Created cloud %1 (%2 points)").arg(iter->first).arg(cloud->size()));
|
||||||
}
|
}
|
||||||
@@ -3282,10 +3295,16 @@ void DatabaseViewer::sliderIterationsValueChanged(int value)
|
|||||||
if(!data.depthOrRightRaw().empty())
|
if(!data.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
||||||
|
pcl::IndicesPtr validIndices(new std::vector<int>);
|
||||||
cloud = util3d::cloudFromSensorData(data,
|
cloud = util3d::cloudFromSensorData(data,
|
||||||
ui_->spinBox_projDecimation->value(),
|
ui_->spinBox_projDecimation->value(),
|
||||||
ui_->doubleSpinBox_projMaxDepth->value(),
|
ui_->doubleSpinBox_projMaxDepth->value(),
|
||||||
ui_->doubleSpinBox_gridCellSize->value());
|
ui_->doubleSpinBox_projMinDepth->value(),
|
||||||
|
validIndices.get());
|
||||||
|
if(ui_->doubleSpinBox_gridCellSize->value())
|
||||||
|
{
|
||||||
|
cloud = util3d::voxelize(cloud, validIndices, ui_->doubleSpinBox_gridCellSize->value());
|
||||||
|
}
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
@@ -3607,9 +3626,10 @@ void DatabaseViewer::updateGraphView()
|
|||||||
|
|
||||||
void DatabaseViewer::updateGrid()
|
void DatabaseViewer::updateGrid()
|
||||||
{
|
{
|
||||||
if((sender() != ui_->spinBox_projDecimation && sender() != ui_->doubleSpinBox_projMaxDepth && sender()!=ui_->doubleSpinBox_projMaxAngle && sender()!=ui_->spinBox_projClusterSize) ||
|
if((sender() != ui_->spinBox_projDecimation && sender() != ui_->doubleSpinBox_projMaxDepth && sender() != ui_->doubleSpinBox_projMinDepth && sender()!=ui_->doubleSpinBox_projMaxAngle && sender()!=ui_->spinBox_projClusterSize) ||
|
||||||
(sender() == ui_->spinBox_projDecimation && ui_->groupBox_gridFromProjection->isChecked()) ||
|
(sender() == ui_->spinBox_projDecimation && ui_->groupBox_gridFromProjection->isChecked()) ||
|
||||||
(sender() == ui_->doubleSpinBox_projMaxDepth && ui_->groupBox_gridFromProjection->isChecked()) ||
|
(sender() == ui_->doubleSpinBox_projMaxDepth && ui_->groupBox_gridFromProjection->isChecked()) ||
|
||||||
|
(sender() == ui_->doubleSpinBox_projMinDepth && ui_->groupBox_gridFromProjection->isChecked()) ||
|
||||||
(sender() == ui_->doubleSpinBox_projMaxAngle && ui_->groupBox_gridFromProjection->isChecked()) ||
|
(sender() == ui_->doubleSpinBox_projMaxAngle && ui_->groupBox_gridFromProjection->isChecked()) ||
|
||||||
(sender() == ui_->spinBox_projClusterSize && ui_->groupBox_gridFromProjection->isChecked()))
|
(sender() == ui_->spinBox_projClusterSize && ui_->groupBox_gridFromProjection->isChecked()))
|
||||||
{
|
{
|
||||||
@@ -3723,11 +3743,13 @@ void DatabaseViewer::refineConstraint(int from, int to, bool silent, bool update
|
|||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFrom = util3d::cloudFromSensorData(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFrom = util3d::cloudFromSensorData(
|
||||||
dataFrom,
|
dataFrom,
|
||||||
ui_->spinBox_icp_decimation->value(),
|
ui_->spinBox_icp_decimation->value(),
|
||||||
ui_->doubleSpinBox_icp_maxDepth->value());
|
ui_->doubleSpinBox_icp_maxDepth->value(),
|
||||||
|
ui_->doubleSpinBox_icp_minDepth->value());
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudTo = util3d::cloudFromSensorData(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudTo = util3d::cloudFromSensorData(
|
||||||
dataTo,
|
dataTo,
|
||||||
ui_->spinBox_icp_decimation->value(),
|
ui_->spinBox_icp_decimation->value(),
|
||||||
ui_->doubleSpinBox_icp_maxDepth->value());
|
ui_->doubleSpinBox_icp_maxDepth->value(),
|
||||||
|
ui_->doubleSpinBox_icp_minDepth->value());
|
||||||
int maxLaserScans = cloudFrom->size();
|
int maxLaserScans = cloudFrom->size();
|
||||||
dataFrom.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudFrom), Transform()), maxLaserScans, 0);
|
dataFrom.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudFrom), Transform()), maxLaserScans, 0);
|
||||||
dataTo.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudTo), Transform()), maxLaserScans, 0);
|
dataTo.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudTo), Transform()), maxLaserScans, 0);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ ExportCloudsDialog::ExportCloudsDialog(QWidget *parent) :
|
|||||||
connect(_ui->groupBox_regenerate, SIGNAL(clicked(bool)), this, SIGNAL(configChanged()));
|
connect(_ui->groupBox_regenerate, SIGNAL(clicked(bool)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->spinBox_decimation, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
connect(_ui->spinBox_decimation, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->doubleSpinBox_maxDepth, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
connect(_ui->doubleSpinBox_maxDepth, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->doubleSpinBox_minDepth, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
|
||||||
connect(_ui->groupBox_filtering, SIGNAL(clicked(bool)), this, SIGNAL(configChanged()));
|
connect(_ui->groupBox_filtering, SIGNAL(clicked(bool)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->doubleSpinBox_filteringRadius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
connect(_ui->doubleSpinBox_filteringRadius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
@@ -143,6 +144,7 @@ void ExportCloudsDialog::saveSettings(QSettings & settings, const QString & grou
|
|||||||
settings.setValue("regenerate", _ui->groupBox_regenerate->isChecked());
|
settings.setValue("regenerate", _ui->groupBox_regenerate->isChecked());
|
||||||
settings.setValue("regenerate_decimation", _ui->spinBox_decimation->value());
|
settings.setValue("regenerate_decimation", _ui->spinBox_decimation->value());
|
||||||
settings.setValue("regenerate_max_depth", _ui->doubleSpinBox_maxDepth->value());
|
settings.setValue("regenerate_max_depth", _ui->doubleSpinBox_maxDepth->value());
|
||||||
|
settings.setValue("regenerate_min_depth", _ui->doubleSpinBox_minDepth->value());
|
||||||
|
|
||||||
|
|
||||||
settings.setValue("filtering", _ui->groupBox_filtering->isChecked());
|
settings.setValue("filtering", _ui->groupBox_filtering->isChecked());
|
||||||
@@ -197,6 +199,7 @@ void ExportCloudsDialog::loadSettings(QSettings & settings, const QString & grou
|
|||||||
_ui->groupBox_regenerate->setChecked(settings.value("regenerate", _ui->groupBox_regenerate->isChecked()).toBool());
|
_ui->groupBox_regenerate->setChecked(settings.value("regenerate", _ui->groupBox_regenerate->isChecked()).toBool());
|
||||||
_ui->spinBox_decimation->setValue(settings.value("regenerate_decimation", _ui->spinBox_decimation->value()).toInt());
|
_ui->spinBox_decimation->setValue(settings.value("regenerate_decimation", _ui->spinBox_decimation->value()).toInt());
|
||||||
_ui->doubleSpinBox_maxDepth->setValue(settings.value("regenerate_max_depth", _ui->doubleSpinBox_maxDepth->value()).toDouble());
|
_ui->doubleSpinBox_maxDepth->setValue(settings.value("regenerate_max_depth", _ui->doubleSpinBox_maxDepth->value()).toDouble());
|
||||||
|
_ui->doubleSpinBox_minDepth->setValue(settings.value("regenerate_min_depth", _ui->doubleSpinBox_minDepth->value()).toDouble());
|
||||||
|
|
||||||
_ui->groupBox_filtering->setChecked(settings.value("filtering", _ui->groupBox_filtering->isChecked()).toBool());
|
_ui->groupBox_filtering->setChecked(settings.value("filtering", _ui->groupBox_filtering->isChecked()).toBool());
|
||||||
_ui->doubleSpinBox_filteringRadius->setValue(settings.value("filtering_radius", _ui->doubleSpinBox_filteringRadius->value()).toDouble());
|
_ui->doubleSpinBox_filteringRadius->setValue(settings.value("filtering_radius", _ui->doubleSpinBox_filteringRadius->value()).toDouble());
|
||||||
@@ -245,6 +248,7 @@ void ExportCloudsDialog::restoreDefaults()
|
|||||||
_ui->groupBox_regenerate->setChecked(false);
|
_ui->groupBox_regenerate->setChecked(false);
|
||||||
_ui->spinBox_decimation->setValue(1);
|
_ui->spinBox_decimation->setValue(1);
|
||||||
_ui->doubleSpinBox_maxDepth->setValue(4);
|
_ui->doubleSpinBox_maxDepth->setValue(4);
|
||||||
|
_ui->doubleSpinBox_minDepth->setValue(0);
|
||||||
|
|
||||||
_ui->groupBox_filtering->setChecked(false);
|
_ui->groupBox_filtering->setChecked(false);
|
||||||
_ui->doubleSpinBox_filteringRadius->setValue(0.02);
|
_ui->doubleSpinBox_filteringRadius->setValue(0.02);
|
||||||
@@ -1015,11 +1019,19 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
d,
|
d,
|
||||||
_ui->spinBox_decimation->value(),
|
_ui->spinBox_decimation->value(),
|
||||||
_ui->doubleSpinBox_maxDepth->value(),
|
_ui->doubleSpinBox_maxDepth->value(),
|
||||||
// Don't voxelize if we create organized mesh
|
_ui->doubleSpinBox_minDepth->value(),
|
||||||
_ui->comboBox_pipeline->currentIndex()==0 && _ui->groupBox_meshing->isChecked()?0:_ui->doubleSpinBox_voxelSize_assembled->value(),
|
|
||||||
0,
|
|
||||||
indices.get());
|
indices.get());
|
||||||
|
|
||||||
|
// Don't voxelize if we create organized mesh
|
||||||
|
if(!(_ui->comboBox_pipeline->currentIndex()==0 && _ui->groupBox_meshing->isChecked()))
|
||||||
|
{
|
||||||
|
cloudWithoutNormals = util3d::voxelize(cloudWithoutNormals, indices, _ui->doubleSpinBox_voxelSize_assembled->value());
|
||||||
|
indices->resize(cloudWithoutNormals->size());
|
||||||
|
for(unsigned int i=0; i<indices->size(); ++i)
|
||||||
|
{
|
||||||
|
indices->at(i) = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cloud = util3d::computeNormals(
|
cloud = util3d::computeNormals(
|
||||||
cloudWithoutNormals,
|
cloudWithoutNormals,
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ LoopClosureViewer::LoopClosureViewer(QWidget * parent) :
|
|||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
decimation_(1),
|
decimation_(1),
|
||||||
maxDepth_(0),
|
maxDepth_(0),
|
||||||
samples_(0)
|
minDepth_(0)
|
||||||
{
|
{
|
||||||
ui_ = new Ui_loopClosureViewer();
|
ui_ = new Ui_loopClosureViewer();
|
||||||
ui_->setupUi(this);
|
ui_->setupUi(this);
|
||||||
@@ -73,17 +73,17 @@ void LoopClosureViewer::updateView(const Transform & transform)
|
|||||||
{
|
{
|
||||||
int decimation = 1;
|
int decimation = 1;
|
||||||
float maxDepth = 0;
|
float maxDepth = 0;
|
||||||
int samples = 0;
|
float minDepth = 0;
|
||||||
|
|
||||||
if(!ui_->checkBox_rawCloud->isChecked())
|
if(!ui_->checkBox_rawCloud->isChecked())
|
||||||
{
decimation = decimation_;
|
{
decimation = decimation_;
|
||||||
maxDepth = maxDepth_;
|
maxDepth = maxDepth_;
|
||||||
samples = samples_;
|
minDepth = minDepth_;
|
||||||
}
|
}
|
||||||
|
|
||||||
UDEBUG("decimation = %d", decimation);
|
UDEBUG("decimation = %d", decimation);
|
||||||
UDEBUG("maxDepth = %f", maxDepth);
|
UDEBUG("maxDepth = %f", maxDepth);
|
||||||
UDEBUG("samples = %d", samples);
|
UDEBUG("minDepth = %d", minDepth);
|
||||||
|
|
||||||
Transform t;
|
Transform t;
|
||||||
if(!transform.isNull())
|
if(!transform.isNull())
|
||||||
@@ -106,8 +106,8 @@ void LoopClosureViewer::updateView(const Transform & transform)
|
|||||||
{
|
{
|
||||||
//cloud 3d
|
//cloud 3d
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudA, cloudB;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudA, cloudB;
|
||||||
cloudA = util3d::cloudRGBFromSensorData(sA_.sensorData(), decimation, maxDepth, 0.0f, samples);
|
cloudA = util3d::cloudRGBFromSensorData(sA_.sensorData(), decimation, maxDepth, minDepth);
|
||||||
cloudB = util3d::cloudRGBFromSensorData(sB_.sensorData(), decimation, maxDepth, 0.0f, samples);
|
cloudB = util3d::cloudRGBFromSensorData(sB_.sensorData(), decimation, maxDepth, minDepth);
|
||||||
|
|
||||||
//cloud 2d
|
//cloud 2d
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr scanA, scanB;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr scanA, scanB;
|
||||||
|
|||||||
@@ -861,8 +861,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom)
|
|||||||
cloud = util3d::cloudRGBFromSensorData(odom.data(),
|
cloud = util3d::cloudRGBFromSensorData(odom.data(),
|
||||||
_preferencesDialog->getCloudDecimation(1),
|
_preferencesDialog->getCloudDecimation(1),
|
||||||
_preferencesDialog->getCloudMaxDepth(1),
|
_preferencesDialog->getCloudMaxDepth(1),
|
||||||
0,
|
_preferencesDialog->getCloudMinDepth(1),
|
||||||
0,
|
|
||||||
indices.get());
|
indices.get());
|
||||||
if(indices->size())
|
if(indices->size())
|
||||||
{
|
{
|
||||||
@@ -1726,8 +1725,6 @@ void MainWindow::updateMapCloud(
|
|||||||
float radius = _preferencesDialog->getCloudFilteringRadius();
|
float radius = _preferencesDialog->getCloudFilteringRadius();
|
||||||
float angle = _preferencesDialog->getCloudFilteringAngle()*CV_PI/180.0; // convert to rad
|
float angle = _preferencesDialog->getCloudFilteringAngle()*CV_PI/180.0; // convert to rad
|
||||||
poses = rtabmap::graph::radiusPosesFiltering(posesIn, radius, angle);
|
poses = rtabmap::graph::radiusPosesFiltering(posesIn, radius, angle);
|
||||||
// make sure the last is here
|
|
||||||
poses.insert(*posesIn.rbegin());
|
|
||||||
for(std::map<int, Transform>::iterator iter= poses.begin(); iter!=poses.end(); ++iter)
|
for(std::map<int, Transform>::iterator iter= poses.begin(); iter!=poses.end(); ++iter)
|
||||||
{
|
{
|
||||||
std::map<int, int>::const_iterator jter = mapIdsIn.find(iter->first);
|
std::map<int, int>::const_iterator jter = mapIdsIn.find(iter->first);
|
||||||
@@ -2167,8 +2164,7 @@ void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose, int
|
|||||||
cloudWithoutNormals = util3d::cloudRGBFromSensorData(data,
|
cloudWithoutNormals = util3d::cloudRGBFromSensorData(data,
|
||||||
_preferencesDialog->getCloudDecimation(0),
|
_preferencesDialog->getCloudDecimation(0),
|
||||||
_preferencesDialog->getCloudMaxDepth(0),
|
_preferencesDialog->getCloudMaxDepth(0),
|
||||||
0,
|
_preferencesDialog->getCloudMinDepth(0),
|
||||||
0,
|
|
||||||
indices.get());
|
indices.get());
|
||||||
|
|
||||||
//compute normals
|
//compute normals
|
||||||
|
|||||||
@@ -235,11 +235,18 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
|
|||||||
// visualization: buffering the clouds
|
// visualization: buffering the clouds
|
||||||
// Create the new cloud
|
// Create the new cloud
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
||||||
|
pcl::IndicesPtr validIndices(new std::vector<int>);
|
||||||
cloud = util3d::cloudRGBFromSensorData(
|
cloud = util3d::cloudRGBFromSensorData(
|
||||||
odom.data(),
|
odom.data(),
|
||||||
validDecimationValue_,
|
validDecimationValue_,
|
||||||
0.0f,
|
0,
|
||||||
voxelSpin_->value());
|
0,
|
||||||
|
validIndices.get());
|
||||||
|
|
||||||
|
if(voxelSpin_->value())
|
||||||
|
{
|
||||||
|
cloud = util3d::voxelize(cloud, validIndices, voxelSpin_->value());
|
||||||
|
}
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -281,6 +281,10 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_3dRenderingMaxDepth[0] = _ui->doubleSpinBox_maxDepth;
|
_3dRenderingMaxDepth[0] = _ui->doubleSpinBox_maxDepth;
|
||||||
_3dRenderingMaxDepth[1] = _ui->doubleSpinBox_maxDepth_odom;
|
_3dRenderingMaxDepth[1] = _ui->doubleSpinBox_maxDepth_odom;
|
||||||
|
|
||||||
|
_3dRenderingMinDepth.resize(2);
|
||||||
|
_3dRenderingMinDepth[0] = _ui->doubleSpinBox_minDepth;
|
||||||
|
_3dRenderingMinDepth[1] = _ui->doubleSpinBox_minDepth_odom;
|
||||||
|
|
||||||
_3dRenderingOpacity.resize(2);
|
_3dRenderingOpacity.resize(2);
|
||||||
_3dRenderingOpacity[0] = _ui->doubleSpinBox_opacity;
|
_3dRenderingOpacity[0] = _ui->doubleSpinBox_opacity;
|
||||||
_3dRenderingOpacity[1] = _ui->doubleSpinBox_opacity_odom;
|
_3dRenderingOpacity[1] = _ui->doubleSpinBox_opacity_odom;
|
||||||
@@ -322,6 +326,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
connect(_3dRenderingShowClouds[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowClouds[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingDecimation[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingDecimation[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingMaxDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingMaxDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_3dRenderingMinDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingShowScans[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowScans[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingShowFeatures[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowFeatures[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
|
||||||
@@ -1138,6 +1143,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
_3dRenderingShowClouds[i]->setChecked(true);
|
_3dRenderingShowClouds[i]->setChecked(true);
|
||||||
_3dRenderingDecimation[i]->setValue(8);
|
_3dRenderingDecimation[i]->setValue(8);
|
||||||
_3dRenderingMaxDepth[i]->setValue(0.0);
|
_3dRenderingMaxDepth[i]->setValue(0.0);
|
||||||
|
_3dRenderingMinDepth[i]->setValue(0.0);
|
||||||
_3dRenderingShowScans[i]->setChecked(true);
|
_3dRenderingShowScans[i]->setChecked(true);
|
||||||
_3dRenderingShowFeatures[i]->setChecked(i==0?false:true);
|
_3dRenderingShowFeatures[i]->setChecked(i==0?false:true);
|
||||||
|
|
||||||
@@ -1477,6 +1483,7 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
|
|||||||
_3dRenderingShowClouds[i]->setChecked(settings.value(QString("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked()).toBool());
|
_3dRenderingShowClouds[i]->setChecked(settings.value(QString("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked()).toBool());
|
||||||
_3dRenderingDecimation[i]->setValue(settings.value(QString("decimation%1").arg(i), _3dRenderingDecimation[i]->value()).toInt());
|
_3dRenderingDecimation[i]->setValue(settings.value(QString("decimation%1").arg(i), _3dRenderingDecimation[i]->value()).toInt());
|
||||||
_3dRenderingMaxDepth[i]->setValue(settings.value(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value()).toDouble());
|
_3dRenderingMaxDepth[i]->setValue(settings.value(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value()).toDouble());
|
||||||
|
_3dRenderingMinDepth[i]->setValue(settings.value(QString("minDepth%1").arg(i), _3dRenderingMinDepth[i]->value()).toDouble());
|
||||||
_3dRenderingShowScans[i]->setChecked(settings.value(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked()).toBool());
|
_3dRenderingShowScans[i]->setChecked(settings.value(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked()).toBool());
|
||||||
_3dRenderingShowFeatures[i]->setChecked(settings.value(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked()).toBool());
|
_3dRenderingShowFeatures[i]->setChecked(settings.value(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked()).toBool());
|
||||||
|
|
||||||
@@ -1859,6 +1866,7 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath) const
|
|||||||
settings.setValue(QString("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked());
|
settings.setValue(QString("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked());
|
||||||
settings.setValue(QString("decimation%1").arg(i), _3dRenderingDecimation[i]->value());
|
settings.setValue(QString("decimation%1").arg(i), _3dRenderingDecimation[i]->value());
|
||||||
settings.setValue(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value());
|
settings.setValue(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value());
|
||||||
|
settings.setValue(QString("minDepth%1").arg(i), _3dRenderingMinDepth[i]->value());
|
||||||
settings.setValue(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked());
|
settings.setValue(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked());
|
||||||
settings.setValue(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked());
|
settings.setValue(QString("showFeatures%1").arg(i), _3dRenderingShowFeatures[i]->isChecked());
|
||||||
|
|
||||||
@@ -3550,6 +3558,11 @@ double PreferencesDialog::getCloudMaxDepth(int index) const
|
|||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
return _3dRenderingMaxDepth[index]->value();
|
return _3dRenderingMaxDepth[index]->value();
|
||||||
}
|
}
|
||||||
|
double PreferencesDialog::getCloudMinDepth(int index) const
|
||||||
|
{
|
||||||
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
return _3dRenderingMinDepth[index]->value();
|
||||||
|
}
|
||||||
double PreferencesDialog::getCloudOpacity(int index) const
|
double PreferencesDialog::getCloudOpacity(int index) const
|
||||||
{
|
{
|
||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
|||||||
@@ -976,7 +976,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QToolBox" name="toolBox">
|
<widget class="QToolBox" name="toolBox">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_3">
|
<widget class="QWidget" name="page_3">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
@@ -1118,9 +1118,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-51</y>
|
||||||
<width>278</width>
|
<width>278</width>
|
||||||
<height>578</height>
|
<height>611</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
@@ -1229,7 +1229,7 @@
|
|||||||
<double>0.400000000000000</double>
|
<double>0.400000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>15.000000000000000</double>
|
<double>999.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="singleStep">
|
<property name="singleStep">
|
||||||
<double>1.000000000000000</double>
|
<double>1.000000000000000</double>
|
||||||
@@ -1246,21 +1246,21 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_66">
|
<widget class="QLabel" name="label_66">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Cluster size</string>
|
<string>Cluster size</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QLabel" name="label_67">
|
<widget class="QLabel" name="label_67">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Max ground angle</string>
|
<string>Max ground angle</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_projMaxAngle">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_projMaxAngle">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> rad</string>
|
<string> rad</string>
|
||||||
@@ -1282,7 +1282,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_projClusterSize">
|
<widget class="QSpinBox" name="spinBox_projClusterSize">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -1295,6 +1295,35 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLabel" name="label_40">
|
||||||
|
<property name="text">
|
||||||
|
<string>Cloud min depth</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_projMinDepth">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>999.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -1501,8 +1530,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>289</width>
|
<width>201</width>
|
||||||
<height>182</height>
|
<height>117</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="label">
|
<attribute name="label">
|
||||||
@@ -1656,7 +1685,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@@ -1669,6 +1698,19 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<widget class="QLabel" name="label_19">
|
||||||
|
<property name="text">
|
||||||
|
<string>Min depth</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_icp_minDepth"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
|||||||
@@ -24,8 +24,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>773</width>
|
<width>778</width>
|
||||||
<height>1394</height>
|
<height>1318</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_13">
|
<layout class="QVBoxLayout" name="verticalLayout_13">
|
||||||
@@ -203,6 +203,35 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLabel" name="label_133">
|
||||||
|
<property name="text">
|
||||||
|
<string>3D cloud minimum depth.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-466</y>
|
||||||
<width>686</width>
|
<width>686</width>
|
||||||
<height>2023</height>
|
<height>2023</height>
|
||||||
</rect>
|
</rect>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>14</number>
|
<number>1</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">
|
||||||
@@ -773,7 +773,17 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
||||||
<item row="11" 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="12" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_scan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_scan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -792,7 +802,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="9" column="2">
|
||||||
<widget class="QLabel" name="label_110">
|
<widget class="QLabel" name="label_110">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show scans.</string>
|
<string>Show scans.</string>
|
||||||
@@ -818,7 +828,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="1">
|
<item row="14" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_showOdomFeatures">
|
<widget class="QCheckBox" name="checkBox_showOdomFeatures">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -828,7 +838,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="0">
|
<item row="14" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_showFeatures">
|
<widget class="QCheckBox" name="checkBox_showFeatures">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -902,7 +912,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>
|
||||||
@@ -915,7 +925,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="1">
|
<item row="12" 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/>
|
||||||
@@ -934,16 +944,6 @@ 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">
|
|
||||||
<widget class="QCheckBox" name="checkBox_showScans">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="2">
|
<item row="3" column="2">
|
||||||
<widget class="QLabel" name="label_108">
|
<widget class="QLabel" name="label_108">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -970,7 +970,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>
|
||||||
@@ -983,7 +983,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>
|
||||||
@@ -996,7 +996,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="1">
|
<item row="13" 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>
|
||||||
@@ -1006,7 +1006,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="13" column="2">
|
||||||
<widget class="QLabel" name="label_158">
|
<widget class="QLabel" name="label_158">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Scan point size (1..64).</string>
|
<string>Scan point size (1..64).</string>
|
||||||
@@ -1019,7 +1019,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="0">
|
<item row="11" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSizeScan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSizeScan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1038,7 +1038,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="11" column="2">
|
||||||
<widget class="QLabel" name="label_271">
|
<widget class="QLabel" name="label_271">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Scan voxel size.</string>
|
<string>Scan voxel size.</string>
|
||||||
@@ -1051,7 +1051,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="10" column="1">
|
||||||
<widget class="QSpinBox" name="spinBox_downsamplingScan_odom">
|
<widget class="QSpinBox" name="spinBox_downsamplingScan_odom">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -1061,7 +1061,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="12" column="2">
|
||||||
<widget class="QLabel" name="label_156">
|
<widget class="QLabel" name="label_156">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Scan opacity.</string>
|
<string>Scan opacity.</string>
|
||||||
@@ -1097,7 +1097,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/>
|
||||||
@@ -1116,7 +1116,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="1">
|
<item row="9" column="1">
|
||||||
<widget class="QCheckBox" name="checkBox_showOdomScans">
|
<widget class="QCheckBox" name="checkBox_showOdomScans">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1126,7 +1126,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="16" column="2">
|
||||||
<widget class="QLabel" name="label_213">
|
<widget class="QLabel" name="label_213">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show graphs.</string>
|
<string>Show graphs.</string>
|
||||||
@@ -1139,7 +1139,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="16" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_showGraphs">
|
<widget class="QCheckBox" name="checkBox_showGraphs">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1149,7 +1149,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/>
|
||||||
@@ -1168,7 +1168,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="13" 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>
|
||||||
@@ -1188,7 +1188,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="2">
|
<item row="17" column="2">
|
||||||
<widget class="QLabel" name="label_243">
|
<widget class="QLabel" name="label_243">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show labels.</string>
|
<string>Show labels.</string>
|
||||||
@@ -1201,7 +1201,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="0">
|
<item row="17" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_showLabels">
|
<widget class="QCheckBox" name="checkBox_showLabels">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1211,7 +1211,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="1">
|
<item row="11" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSizeScan_odom">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSizeScan_odom">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1230,7 +1230,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="10" column="2">
|
||||||
<widget class="QLabel" name="label_273">
|
<widget class="QLabel" name="label_273">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Scan downsampling step size.</string>
|
<string>Scan downsampling step size.</string>
|
||||||
@@ -1243,7 +1243,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="0">
|
<item row="10" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_downsamplingScan">
|
<widget class="QSpinBox" name="spinBox_downsamplingScan">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -1253,7 +1253,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>
|
||||||
@@ -1279,7 +1279,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="2">
|
<item row="14" column="2">
|
||||||
<widget class="QLabel" name="label_123">
|
<widget class="QLabel" name="label_123">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show 3D features.</string>
|
<string>Show 3D features.</string>
|
||||||
@@ -1292,7 +1292,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="15" column="2">
|
||||||
<widget class="QLabel" name="label_166">
|
<widget class="QLabel" name="label_166">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Feature point size.</string>
|
<string>Feature point size.</string>
|
||||||
@@ -1305,7 +1305,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="1">
|
<item row="15" column="1">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize_odom_features">
|
<widget class="QSpinBox" name="spinBox_ptsize_odom_features">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -1315,7 +1315,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="15" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize_features">
|
<widget class="QSpinBox" name="spinBox_ptsize_features">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@@ -1325,6 +1325,60 @@ 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">
|
||||||
|
<widget class="QLabel" name="label_150">
|
||||||
|
<property name="text">
|
||||||
|
<string>3D cloud minimum depth.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minDepth_odom">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user