mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 09:30:25 +08:00
Gui 3d rendering: added default color scheme option, added min and max range options for laser scans
This commit is contained in:
@@ -48,8 +48,8 @@ namespace util3d
|
|||||||
* operations like computing normals while the scan has already
|
* operations like computing normals while the scan has already
|
||||||
* normals and voxel filtering is not used.
|
* normals and voxel filtering is not used.
|
||||||
*/
|
*/
|
||||||
void RTABMAP_EXP commonFiltering(
|
LaserScan RTABMAP_EXP commonFiltering(
|
||||||
LaserScan & scan,
|
const LaserScan & scan,
|
||||||
int downsamplingStep,
|
int downsamplingStep,
|
||||||
float rangeMin = 0.0f,
|
float rangeMin = 0.0f,
|
||||||
float rangeMax = 0.0f,
|
float rangeMax = 0.0f,
|
||||||
@@ -99,6 +99,10 @@ pcl::PointCloud<pcl::PointXYZI>::Ptr RTABMAP_EXP voxelize(
|
|||||||
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
||||||
const pcl::IndicesPtr & indices,
|
const pcl::IndicesPtr & indices,
|
||||||
float voxelSize);
|
float voxelSize);
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr RTABMAP_EXP voxelize(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
|
||||||
|
const pcl::IndicesPtr & indices,
|
||||||
|
float voxelSize);
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP voxelize(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP voxelize(
|
||||||
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
||||||
float voxelSize);
|
float voxelSize);
|
||||||
@@ -114,6 +118,9 @@ pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr RTABMAP_EXP voxelize(
|
|||||||
pcl::PointCloud<pcl::PointXYZI>::Ptr RTABMAP_EXP voxelize(
|
pcl::PointCloud<pcl::PointXYZI>::Ptr RTABMAP_EXP voxelize(
|
||||||
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
||||||
float voxelSize);
|
float voxelSize);
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr RTABMAP_EXP voxelize(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
|
||||||
|
float voxelSize);
|
||||||
|
|
||||||
inline pcl::PointCloud<pcl::PointXYZ>::Ptr uniformSampling(
|
inline pcl::PointCloud<pcl::PointXYZ>::Ptr uniformSampling(
|
||||||
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
||||||
@@ -157,6 +164,13 @@ pcl::IndicesPtr RTABMAP_EXP passThrough(
|
|||||||
float min,
|
float min,
|
||||||
float max,
|
float max,
|
||||||
bool negative = false);
|
bool negative = false);
|
||||||
|
pcl::IndicesPtr RTABMAP_EXP passThrough(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
||||||
|
const pcl::IndicesPtr & indices,
|
||||||
|
const std::string & axis,
|
||||||
|
float min,
|
||||||
|
float max,
|
||||||
|
bool negative = false);
|
||||||
pcl::IndicesPtr RTABMAP_EXP passThrough(
|
pcl::IndicesPtr RTABMAP_EXP passThrough(
|
||||||
const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
|
||||||
const pcl::IndicesPtr & indices,
|
const pcl::IndicesPtr & indices,
|
||||||
@@ -171,6 +185,13 @@ pcl::IndicesPtr RTABMAP_EXP passThrough(
|
|||||||
float min,
|
float min,
|
||||||
float max,
|
float max,
|
||||||
bool negative = false);
|
bool negative = false);
|
||||||
|
pcl::IndicesPtr RTABMAP_EXP passThrough(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
|
||||||
|
const pcl::IndicesPtr & indices,
|
||||||
|
const std::string & axis,
|
||||||
|
float min,
|
||||||
|
float max,
|
||||||
|
bool negative = false);
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP passThrough(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP passThrough(
|
||||||
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
||||||
const std::string & axis,
|
const std::string & axis,
|
||||||
@@ -183,6 +204,12 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP passThrough(
|
|||||||
float min,
|
float min,
|
||||||
float max,
|
float max,
|
||||||
bool negative = false);
|
bool negative = false);
|
||||||
|
pcl::PointCloud<pcl::PointXYZI>::Ptr RTABMAP_EXP passThrough(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
||||||
|
const std::string & axis,
|
||||||
|
float min,
|
||||||
|
float max,
|
||||||
|
bool negative = false);
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr RTABMAP_EXP passThrough(
|
pcl::PointCloud<pcl::PointNormal>::Ptr RTABMAP_EXP passThrough(
|
||||||
const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
|
||||||
const std::string & axis,
|
const std::string & axis,
|
||||||
@@ -195,6 +222,12 @@ pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr RTABMAP_EXP passThrough(
|
|||||||
float min,
|
float min,
|
||||||
float max,
|
float max,
|
||||||
bool negative = false);
|
bool negative = false);
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr RTABMAP_EXP passThrough(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
|
||||||
|
const std::string & axis,
|
||||||
|
float min,
|
||||||
|
float max,
|
||||||
|
bool negative = false);
|
||||||
|
|
||||||
pcl::IndicesPtr RTABMAP_EXP cropBox(
|
pcl::IndicesPtr RTABMAP_EXP cropBox(
|
||||||
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
|
||||||
|
|||||||
@@ -753,7 +753,7 @@ SensorData CameraImages::captureImage(CameraInfo * info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// filter the scan after registration
|
// filter the scan after registration
|
||||||
util3d::commonFiltering(scan, _scanDownsampleStep, 0, 0, _scanVoxelSize, _scanNormalsK, _scanNormalsRadius, _scanForceGroundNormalsUp);
|
scan = util3d::commonFiltering(scan, _scanDownsampleStep, 0, 0, _scanVoxelSize, _scanNormalsK, _scanNormalsRadius, _scanForceGroundNormalsUp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -3851,7 +3851,7 @@ Signature * Memory::createSignature(const SensorData & data, const Transform & p
|
|||||||
LaserScan laserScan = data.laserScanRaw();
|
LaserScan laserScan = data.laserScanRaw();
|
||||||
if(!isIntermediateNode && laserScan.size())
|
if(!isIntermediateNode && laserScan.size())
|
||||||
{
|
{
|
||||||
util3d::commonFiltering(laserScan,
|
laserScan = util3d::commonFiltering(laserScan,
|
||||||
_laserScanDownsampleStepSize,
|
_laserScanDownsampleStepSize,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
|||||||
@@ -68,8 +68,8 @@ namespace rtabmap
|
|||||||
namespace util3d
|
namespace util3d
|
||||||
{
|
{
|
||||||
|
|
||||||
void commonFiltering(
|
LaserScan commonFiltering(
|
||||||
LaserScan & scan,
|
const LaserScan & scanIn,
|
||||||
int downsamplingStep,
|
int downsamplingStep,
|
||||||
float rangeMin,
|
float rangeMin,
|
||||||
float rangeMax,
|
float rangeMax,
|
||||||
@@ -78,6 +78,7 @@ void commonFiltering(
|
|||||||
float normalRadius,
|
float normalRadius,
|
||||||
bool forceGroundNormalsUp)
|
bool forceGroundNormalsUp)
|
||||||
{
|
{
|
||||||
|
LaserScan scan = scanIn;
|
||||||
UDEBUG("scan size=%d format=%d, step=%d, rangeMin=%f, rangeMax=%f, voxel=%f, normalK=%d, normalRadius=%f",
|
UDEBUG("scan size=%d format=%d, step=%d, rangeMin=%f, rangeMax=%f, voxel=%f, normalK=%d, normalRadius=%f",
|
||||||
scan.size(), (int)scan.format(), downsamplingStep, rangeMin, rangeMax, voxelSize, normalK, normalRadius);
|
scan.size(), (int)scan.format(), downsamplingStep, rangeMin, rangeMax, voxelSize, normalK, normalRadius);
|
||||||
if(!scan.isEmpty())
|
if(!scan.isEmpty())
|
||||||
@@ -256,6 +257,7 @@ void commonFiltering(
|
|||||||
scan = util3d::adjustNormalsToViewPoint(scan, Eigen::Vector3f(0,0,0), forceGroundNormalsUp);
|
scan = util3d::adjustNormalsToViewPoint(scan, Eigen::Vector3f(0,0,0), forceGroundNormalsUp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return scan;
|
||||||
}
|
}
|
||||||
|
|
||||||
LaserScan rangeFiltering(
|
LaserScan rangeFiltering(
|
||||||
@@ -415,6 +417,10 @@ pcl::PointCloud<pcl::PointXYZI>::Ptr voxelize(const pcl::PointCloud<pcl::PointXY
|
|||||||
{
|
{
|
||||||
return voxelizeImpl<pcl::PointXYZI>(cloud, indices, voxelSize);
|
return voxelizeImpl<pcl::PointXYZI>(cloud, indices, voxelSize);
|
||||||
}
|
}
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr voxelize(const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud, const pcl::IndicesPtr & indices, float voxelSize)
|
||||||
|
{
|
||||||
|
return voxelizeImpl<pcl::PointXYZINormal>(cloud, indices, voxelSize);
|
||||||
|
}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr voxelize(const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud, float voxelSize)
|
pcl::PointCloud<pcl::PointXYZ>::Ptr voxelize(const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud, float voxelSize)
|
||||||
{
|
{
|
||||||
@@ -441,6 +447,11 @@ pcl::PointCloud<pcl::PointXYZI>::Ptr voxelize(const pcl::PointCloud<pcl::PointXY
|
|||||||
pcl::IndicesPtr indices(new std::vector<int>);
|
pcl::IndicesPtr indices(new std::vector<int>);
|
||||||
return voxelize(cloud, indices, voxelSize);
|
return voxelize(cloud, indices, voxelSize);
|
||||||
}
|
}
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr voxelize(const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud, float voxelSize)
|
||||||
|
{
|
||||||
|
pcl::IndicesPtr indices(new std::vector<int>);
|
||||||
|
return voxelize(cloud, indices, voxelSize);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename PointT>
|
template<typename PointT>
|
||||||
typename pcl::PointCloud<PointT>::Ptr randomSamplingImpl(
|
typename pcl::PointCloud<PointT>::Ptr randomSamplingImpl(
|
||||||
@@ -494,6 +505,10 @@ pcl::IndicesPtr passThrough(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud
|
|||||||
{
|
{
|
||||||
return passThroughImpl<pcl::PointXYZRGB>(cloud, indices, axis, min, max, negative);
|
return passThroughImpl<pcl::PointXYZRGB>(cloud, indices, axis, min, max, negative);
|
||||||
}
|
}
|
||||||
|
pcl::IndicesPtr passThrough(const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud, const pcl::IndicesPtr & indices, const std::string & axis, float min, float max, bool negative)
|
||||||
|
{
|
||||||
|
return passThroughImpl<pcl::PointXYZI>(cloud, indices, axis, min, max, negative);
|
||||||
|
}
|
||||||
pcl::IndicesPtr passThrough(const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud, const pcl::IndicesPtr & indices, const std::string & axis, float min, float max, bool negative)
|
pcl::IndicesPtr passThrough(const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud, const pcl::IndicesPtr & indices, const std::string & axis, float min, float max, bool negative)
|
||||||
{
|
{
|
||||||
return passThroughImpl<pcl::PointNormal>(cloud, indices, axis, min, max, negative);
|
return passThroughImpl<pcl::PointNormal>(cloud, indices, axis, min, max, negative);
|
||||||
@@ -502,6 +517,10 @@ pcl::IndicesPtr passThrough(const pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr &
|
|||||||
{
|
{
|
||||||
return passThroughImpl<pcl::PointXYZRGBNormal>(cloud, indices, axis, min, max, negative);
|
return passThroughImpl<pcl::PointXYZRGBNormal>(cloud, indices, axis, min, max, negative);
|
||||||
}
|
}
|
||||||
|
pcl::IndicesPtr passThrough(const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud, const pcl::IndicesPtr & indices, const std::string & axis, float min, float max, bool negative)
|
||||||
|
{
|
||||||
|
return passThroughImpl<pcl::PointXYZINormal>(cloud, indices, axis, min, max, negative);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename PointT>
|
template<typename PointT>
|
||||||
typename pcl::PointCloud<PointT>::Ptr passThroughImpl(
|
typename pcl::PointCloud<PointT>::Ptr passThroughImpl(
|
||||||
@@ -531,6 +550,10 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr passThrough(const pcl::PointCloud<pcl::Po
|
|||||||
{
|
{
|
||||||
return passThroughImpl<pcl::PointXYZRGB>(cloud, axis, min ,max, negative);
|
return passThroughImpl<pcl::PointXYZRGB>(cloud, axis, min ,max, negative);
|
||||||
}
|
}
|
||||||
|
pcl::PointCloud<pcl::PointXYZI>::Ptr passThrough(const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud, const std::string & axis, float min, float max, bool negative)
|
||||||
|
{
|
||||||
|
return passThroughImpl<pcl::PointXYZI>(cloud, axis, min ,max, negative);
|
||||||
|
}
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr passThrough(const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud, const std::string & axis, float min, float max, bool negative)
|
pcl::PointCloud<pcl::PointNormal>::Ptr passThrough(const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud, const std::string & axis, float min, float max, bool negative)
|
||||||
{
|
{
|
||||||
return passThroughImpl<pcl::PointNormal>(cloud, axis, min ,max, negative);
|
return passThroughImpl<pcl::PointNormal>(cloud, axis, min ,max, negative);
|
||||||
@@ -539,6 +562,10 @@ pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr passThrough(const pcl::PointCloud<p
|
|||||||
{
|
{
|
||||||
return passThroughImpl<pcl::PointXYZRGBNormal>(cloud, axis, min ,max, negative);
|
return passThroughImpl<pcl::PointXYZRGBNormal>(cloud, axis, min ,max, negative);
|
||||||
}
|
}
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr passThrough(const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud, const std::string & axis, float min, float max, bool negative)
|
||||||
|
{
|
||||||
|
return passThroughImpl<pcl::PointXYZINormal>(cloud, axis, min ,max, negative);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename PointT>
|
template<typename PointT>
|
||||||
pcl::IndicesPtr cropBoxImpl(
|
pcl::IndicesPtr cropBoxImpl(
|
||||||
|
|||||||
@@ -85,7 +85,8 @@ public:
|
|||||||
const pcl::PCLPointCloud2Ptr & binaryCloud,
|
const pcl::PCLPointCloud2Ptr & binaryCloud,
|
||||||
const Transform & pose,
|
const Transform & pose,
|
||||||
bool rgb,
|
bool rgb,
|
||||||
bool haveNormals,
|
bool hasNormals,
|
||||||
|
bool hasIntensity,
|
||||||
const QColor & color = QColor());
|
const QColor & color = QColor());
|
||||||
|
|
||||||
bool addCloud(
|
bool addCloud(
|
||||||
@@ -100,6 +101,18 @@ public:
|
|||||||
const Transform & pose = Transform::getIdentity(),
|
const Transform & pose = Transform::getIdentity(),
|
||||||
const QColor & color = QColor());
|
const QColor & color = QColor());
|
||||||
|
|
||||||
|
bool addCloud(
|
||||||
|
const std::string & id,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
|
||||||
|
const Transform & pose = Transform::getIdentity(),
|
||||||
|
const QColor & color = QColor());
|
||||||
|
|
||||||
|
bool addCloud(
|
||||||
|
const std::string & id,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
||||||
|
const Transform & pose = Transform::getIdentity(),
|
||||||
|
const QColor & color = QColor());
|
||||||
|
|
||||||
bool addCloud(
|
bool addCloud(
|
||||||
const std::string & id,
|
const std::string & id,
|
||||||
const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
|
||||||
@@ -287,6 +300,7 @@ public slots:
|
|||||||
void setDefaultBackgroundColor(const QColor & color);
|
void setDefaultBackgroundColor(const QColor & color);
|
||||||
void setBackgroundColor(const QColor & color);
|
void setBackgroundColor(const QColor & color);
|
||||||
void setCloudVisibility(const std::string & id, bool isVisible);
|
void setCloudVisibility(const std::string & id, bool isVisible);
|
||||||
|
void setCloudColorIndex(const std::string & id, int index);
|
||||||
void setCloudOpacity(const std::string & id, double opacity = 1.0);
|
void setCloudOpacity(const std::string & id, double opacity = 1.0);
|
||||||
void setCloudPointSize(const std::string & id, int size);
|
void setCloudPointSize(const std::string & id, int size);
|
||||||
virtual void clear();
|
virtual void clear();
|
||||||
|
|||||||
@@ -181,12 +181,16 @@ public:
|
|||||||
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 getCloudMinDepth(int index) const; // 0=map, 1=odom
|
||||||
std::vector<float> getCloudRoiRatios(int index) const; // 0=map, 1=odom
|
std::vector<float> getCloudRoiRatios(int index) const; // 0=map, 1=odom
|
||||||
|
int getCloudColorScheme(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
|
||||||
|
|
||||||
bool isScansShown(int index) const; // 0=map, 1=odom
|
bool isScansShown(int index) const; // 0=map, 1=odom
|
||||||
int getDownsamplingStepScan(int index) const; // 0=map, 1=odom
|
int getDownsamplingStepScan(int index) const; // 0=map, 1=odom
|
||||||
|
double getScanMaxRange(int index) const; // 0=map, 1=odom
|
||||||
|
double getScanMinRange(int index) const; // 0=map, 1=odom
|
||||||
double getCloudVoxelSizeScan(int index) const; // 0=map, 1=odom
|
double getCloudVoxelSizeScan(int index) const; // 0=map, 1=odom
|
||||||
|
int getScanColorScheme(int index) const; // 0=map, 1=odom
|
||||||
double getScanOpacity(int index) const; // 0=map, 1=odom
|
double getScanOpacity(int index) const; // 0=map, 1=odom
|
||||||
int getScanPointSize(int index) const; // 0=map, 1=odom
|
int getScanPointSize(int index) const; // 0=map, 1=odom
|
||||||
|
|
||||||
@@ -390,11 +394,15 @@ private:
|
|||||||
QVector<QDoubleSpinBox*> _3dRenderingMaxDepth;
|
QVector<QDoubleSpinBox*> _3dRenderingMaxDepth;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingMinDepth;
|
QVector<QDoubleSpinBox*> _3dRenderingMinDepth;
|
||||||
QVector<QLineEdit*> _3dRenderingRoiRatios;
|
QVector<QLineEdit*> _3dRenderingRoiRatios;
|
||||||
|
QVector<QSpinBox*> _3dRenderingColorScheme;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingOpacity;
|
QVector<QDoubleSpinBox*> _3dRenderingOpacity;
|
||||||
QVector<QSpinBox*> _3dRenderingPtSize;
|
QVector<QSpinBox*> _3dRenderingPtSize;
|
||||||
QVector<QCheckBox*> _3dRenderingShowScans;
|
QVector<QCheckBox*> _3dRenderingShowScans;
|
||||||
QVector<QSpinBox*> _3dRenderingDownsamplingScan;
|
QVector<QSpinBox*> _3dRenderingDownsamplingScan;
|
||||||
|
QVector<QDoubleSpinBox*> _3dRenderingMaxRange;
|
||||||
|
QVector<QDoubleSpinBox*> _3dRenderingMinRange;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingVoxelSizeScan;
|
QVector<QDoubleSpinBox*> _3dRenderingVoxelSizeScan;
|
||||||
|
QVector<QSpinBox*> _3dRenderingColorSchemeScan;
|
||||||
QVector<QDoubleSpinBox*> _3dRenderingOpacityScan;
|
QVector<QDoubleSpinBox*> _3dRenderingOpacityScan;
|
||||||
QVector<QSpinBox*> _3dRenderingPtSizeScan;
|
QVector<QSpinBox*> _3dRenderingPtSizeScan;
|
||||||
QVector<QCheckBox*> _3dRenderingShowFeatures;
|
QVector<QCheckBox*> _3dRenderingShowFeatures;
|
||||||
|
|||||||
@@ -528,7 +528,8 @@ bool CloudViewer::addCloud(
|
|||||||
const pcl::PCLPointCloud2Ptr & binaryCloud,
|
const pcl::PCLPointCloud2Ptr & binaryCloud,
|
||||||
const Transform & pose,
|
const Transform & pose,
|
||||||
bool rgb,
|
bool rgb,
|
||||||
bool haveNormals,
|
bool hasNormals,
|
||||||
|
bool hasIntensity,
|
||||||
const QColor & color)
|
const QColor & color)
|
||||||
{
|
{
|
||||||
int previousColorIndex = -1;
|
int previousColorIndex = -1;
|
||||||
@@ -541,7 +542,7 @@ bool CloudViewer::addCloud(
|
|||||||
Eigen::Vector4f origin(pose.x(), pose.y(), pose.z(), 0.0f);
|
Eigen::Vector4f origin(pose.x(), pose.y(), pose.z(), 0.0f);
|
||||||
Eigen::Quaternionf orientation = Eigen::Quaternionf(pose.toEigen3f().linear());
|
Eigen::Quaternionf orientation = Eigen::Quaternionf(pose.toEigen3f().linear());
|
||||||
|
|
||||||
if(haveNormals && _aShowNormals->isChecked())
|
if(hasNormals && _aShowNormals->isChecked())
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointNormal>);
|
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointNormal>);
|
||||||
pcl::fromPCLPointCloud2 (*binaryCloud, *cloud_xyz);
|
pcl::fromPCLPointCloud2 (*binaryCloud, *cloud_xyz);
|
||||||
@@ -580,12 +581,18 @@ bool CloudViewer::addCloud(
|
|||||||
colorHandler.reset(new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2>(binaryCloud));
|
colorHandler.reset(new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2>(binaryCloud));
|
||||||
_visualizer->addPointCloud (binaryCloud, colorHandler, origin, orientation, id);
|
_visualizer->addPointCloud (binaryCloud, colorHandler, origin, orientation, id);
|
||||||
}
|
}
|
||||||
|
else if(hasIntensity)
|
||||||
|
{
|
||||||
|
//rgb
|
||||||
|
colorHandler.reset(new pcl::visualization::PointCloudColorHandlerGenericField<pcl::PCLPointCloud2>(binaryCloud, "intensity"));
|
||||||
|
_visualizer->addPointCloud (binaryCloud, colorHandler, origin, orientation, id);
|
||||||
|
}
|
||||||
else if(previousColorIndex == 5)
|
else if(previousColorIndex == 5)
|
||||||
{
|
{
|
||||||
previousColorIndex = -1;
|
previousColorIndex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(haveNormals)
|
if(hasNormals)
|
||||||
{
|
{
|
||||||
//normals
|
//normals
|
||||||
colorHandler.reset (new pcl::visualization::PointCloudColorHandlerGenericField<pcl::PCLPointCloud2> (binaryCloud, "normal_x"));
|
colorHandler.reset (new pcl::visualization::PointCloudColorHandlerGenericField<pcl::PCLPointCloud2> (binaryCloud, "normal_x"));
|
||||||
@@ -604,7 +611,7 @@ bool CloudViewer::addCloud(
|
|||||||
{
|
{
|
||||||
_visualizer->updateColorHandlerIndex(id, previousColorIndex);
|
_visualizer->updateColorHandlerIndex(id, previousColorIndex);
|
||||||
}
|
}
|
||||||
else if(rgb)
|
else if(rgb || hasIntensity)
|
||||||
{
|
{
|
||||||
_visualizer->updateColorHandlerIndex(id, 5);
|
_visualizer->updateColorHandlerIndex(id, 5);
|
||||||
}
|
}
|
||||||
@@ -627,7 +634,7 @@ bool CloudViewer::addCloud(
|
|||||||
{
|
{
|
||||||
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
||||||
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
||||||
return addCloud(id, binaryCloud, pose, true, true, color);
|
return addCloud(id, binaryCloud, pose, true, true, false, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CloudViewer::addCloud(
|
bool CloudViewer::addCloud(
|
||||||
@@ -638,7 +645,29 @@ bool CloudViewer::addCloud(
|
|||||||
{
|
{
|
||||||
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
||||||
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
||||||
return addCloud(id, binaryCloud, pose, true, false, color);
|
return addCloud(id, binaryCloud, pose, true, false, false, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CloudViewer::addCloud(
|
||||||
|
const std::string & id,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
|
||||||
|
const Transform & pose,
|
||||||
|
const QColor & color)
|
||||||
|
{
|
||||||
|
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
||||||
|
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
||||||
|
return addCloud(id, binaryCloud, pose, false, true, true, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CloudViewer::addCloud(
|
||||||
|
const std::string & id,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
|
||||||
|
const Transform & pose,
|
||||||
|
const QColor & color)
|
||||||
|
{
|
||||||
|
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
||||||
|
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
||||||
|
return addCloud(id, binaryCloud, pose, false, false, true, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CloudViewer::addCloud(
|
bool CloudViewer::addCloud(
|
||||||
@@ -649,7 +678,7 @@ bool CloudViewer::addCloud(
|
|||||||
{
|
{
|
||||||
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
||||||
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
||||||
return addCloud(id, binaryCloud, pose, false, true, color);
|
return addCloud(id, binaryCloud, pose, false, true, false, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CloudViewer::addCloud(
|
bool CloudViewer::addCloud(
|
||||||
@@ -660,7 +689,7 @@ bool CloudViewer::addCloud(
|
|||||||
{
|
{
|
||||||
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
pcl::PCLPointCloud2Ptr binaryCloud(new pcl::PCLPointCloud2);
|
||||||
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
pcl::toPCLPointCloud2(*cloud, *binaryCloud);
|
||||||
return addCloud(id, binaryCloud, pose, false, false, color);
|
return addCloud(id, binaryCloud, pose, false, false, false, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CloudViewer::addCloudMesh(
|
bool CloudViewer::addCloudMesh(
|
||||||
@@ -2132,6 +2161,14 @@ bool CloudViewer::getCloudVisibility(const std::string & id)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CloudViewer::setCloudColorIndex(const std::string & id, int index)
|
||||||
|
{
|
||||||
|
if(index>0)
|
||||||
|
{
|
||||||
|
_visualizer->updateColorHandlerIndex(id, index-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CloudViewer::setCloudOpacity(const std::string & id, double opacity)
|
void CloudViewer::setCloudOpacity(const std::string & id, double opacity)
|
||||||
{
|
{
|
||||||
double lastOpacity;
|
double lastOpacity;
|
||||||
|
|||||||
@@ -3195,6 +3195,15 @@ void DatabaseViewer::update(int value,
|
|||||||
}
|
}
|
||||||
cloudViewer_->addCloud("scan", scan, pose, Qt::yellow);
|
cloudViewer_->addCloud("scan", scan, pose, Qt::yellow);
|
||||||
}
|
}
|
||||||
|
else if(data.laserScanRaw().hasIntensity() && data.laserScanRaw().hasNormals())
|
||||||
|
{
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr scan = util3d::laserScanToPointCloudINormal(data.laserScanRaw(), data.laserScanRaw().localTransform());
|
||||||
|
if(ui_->doubleSpinBox_voxelSize->value() > 0.0)
|
||||||
|
{
|
||||||
|
scan = util3d::voxelize(scan, ui_->doubleSpinBox_voxelSize->value());
|
||||||
|
}
|
||||||
|
cloudViewer_->addCloud("scan", scan, pose, Qt::yellow);
|
||||||
|
}
|
||||||
else if(data.laserScanRaw().hasNormals())
|
else if(data.laserScanRaw().hasNormals())
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr scan = util3d::laserScanToPointCloudNormal(data.laserScanRaw(), data.laserScanRaw().localTransform());
|
pcl::PointCloud<pcl::PointNormal>::Ptr scan = util3d::laserScanToPointCloudNormal(data.laserScanRaw(), data.laserScanRaw().localTransform());
|
||||||
|
|||||||
@@ -1099,6 +1099,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_cloudViewer->setCloudVisibility("cloudOdom", true);
|
_cloudViewer->setCloudVisibility("cloudOdom", true);
|
||||||
|
_cloudViewer->setCloudColorIndex("cloudOdom", _preferencesDialog->getCloudColorScheme(1));
|
||||||
_cloudViewer->setCloudOpacity("cloudOdom", _preferencesDialog->getCloudOpacity(1));
|
_cloudViewer->setCloudOpacity("cloudOdom", _preferencesDialog->getCloudOpacity(1));
|
||||||
_cloudViewer->setCloudPointSize("cloudOdom", _preferencesDialog->getCloudPointSize(1));
|
_cloudViewer->setCloudPointSize("cloudOdom", _preferencesDialog->getCloudPointSize(1));
|
||||||
|
|
||||||
@@ -1122,6 +1123,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_cloudViewer->setCloudVisibility("scanMapOdom", true);
|
_cloudViewer->setCloudVisibility("scanMapOdom", true);
|
||||||
|
_cloudViewer->setCloudColorIndex("scanMapOdom", _preferencesDialog->getScanColorScheme(1));
|
||||||
_cloudViewer->setCloudOpacity("scanMapOdom", _preferencesDialog->getScanOpacity(1));
|
_cloudViewer->setCloudOpacity("scanMapOdom", _preferencesDialog->getScanOpacity(1));
|
||||||
_cloudViewer->setCloudPointSize("scanMapOdom", _preferencesDialog->getScanPointSize(1));
|
_cloudViewer->setCloudPointSize("scanMapOdom", _preferencesDialog->getScanPointSize(1));
|
||||||
}
|
}
|
||||||
@@ -1133,9 +1135,14 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
{
|
{
|
||||||
LaserScan scan = odom.data().laserScanRaw();
|
LaserScan scan = odom.data().laserScanRaw();
|
||||||
|
|
||||||
if(_preferencesDialog->getDownsamplingStepScan(1) > 0)
|
if(_preferencesDialog->getDownsamplingStepScan(1) > 1 ||
|
||||||
|
_preferencesDialog->getScanMaxRange(1) > 0.0f ||
|
||||||
|
_preferencesDialog->getScanMinRange(1) > 0.0f)
|
||||||
{
|
{
|
||||||
scan = util3d::downsample(scan, _preferencesDialog->getDownsamplingStepScan(1));
|
scan = util3d::commonFiltering(scan,
|
||||||
|
_preferencesDialog->getDownsamplingStepScan(1),
|
||||||
|
_preferencesDialog->getScanMinRange(1),
|
||||||
|
_preferencesDialog->getScanMaxRange(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr cloud;
|
pcl::PointCloud<pcl::PointNormal>::Ptr cloud;
|
||||||
@@ -1152,6 +1159,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_cloudViewer->setCloudVisibility("scanOdom", true);
|
_cloudViewer->setCloudVisibility("scanOdom", true);
|
||||||
|
_cloudViewer->setCloudColorIndex("scanOdom", _preferencesDialog->getScanColorScheme(1));
|
||||||
_cloudViewer->setCloudOpacity("scanOdom", _preferencesDialog->getScanOpacity(1));
|
_cloudViewer->setCloudOpacity("scanOdom", _preferencesDialog->getScanOpacity(1));
|
||||||
_cloudViewer->setCloudPointSize("scanOdom", _preferencesDialog->getScanPointSize(1));
|
_cloudViewer->setCloudPointSize("scanOdom", _preferencesDialog->getScanPointSize(1));
|
||||||
scanUpdated = true;
|
scanUpdated = true;
|
||||||
@@ -2169,6 +2177,7 @@ void MainWindow::updateMapCloud(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_cloudViewer->setCloudVisibility(cloudName, (_cloudViewer->isVisible() && _preferencesDialog->isCloudsShown(0)));
|
_cloudViewer->setCloudVisibility(cloudName, (_cloudViewer->isVisible() && _preferencesDialog->isCloudsShown(0)));
|
||||||
|
_cloudViewer->setCloudColorIndex(cloudName, _preferencesDialog->getCloudColorScheme(0));
|
||||||
_cloudViewer->setCloudOpacity(cloudName, _preferencesDialog->getCloudOpacity(0));
|
_cloudViewer->setCloudOpacity(cloudName, _preferencesDialog->getCloudOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
||||||
}
|
}
|
||||||
@@ -2210,6 +2219,7 @@ void MainWindow::updateMapCloud(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_cloudViewer->setCloudVisibility(scanName, _preferencesDialog->isScansShown(0));
|
_cloudViewer->setCloudVisibility(scanName, _preferencesDialog->isScansShown(0));
|
||||||
|
_cloudViewer->setCloudColorIndex(scanName, _preferencesDialog->getScanColorScheme(0));
|
||||||
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
||||||
}
|
}
|
||||||
@@ -2643,6 +2653,7 @@ void MainWindow::updateMapCloud(
|
|||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
_cloudViewer->updateCloudPose("cloudOdom", _odometryCorrection);
|
_cloudViewer->updateCloudPose("cloudOdom", _odometryCorrection);
|
||||||
|
_cloudViewer->setCloudColorIndex("cloudOdom", _preferencesDialog->getCloudColorScheme(1));
|
||||||
_cloudViewer->setCloudOpacity("cloudOdom", _preferencesDialog->getCloudOpacity(1));
|
_cloudViewer->setCloudOpacity("cloudOdom", _preferencesDialog->getCloudOpacity(1));
|
||||||
_cloudViewer->setCloudPointSize("cloudOdom", _preferencesDialog->getCloudPointSize(1));
|
_cloudViewer->setCloudPointSize("cloudOdom", _preferencesDialog->getCloudPointSize(1));
|
||||||
}
|
}
|
||||||
@@ -2658,6 +2669,7 @@ void MainWindow::updateMapCloud(
|
|||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
_cloudViewer->updateCloudPose("scanOdom", _odometryCorrection);
|
_cloudViewer->updateCloudPose("scanOdom", _odometryCorrection);
|
||||||
|
_cloudViewer->setCloudColorIndex("scanOdom", _preferencesDialog->getScanColorScheme(1));
|
||||||
_cloudViewer->setCloudOpacity("scanOdom", _preferencesDialog->getScanOpacity(1));
|
_cloudViewer->setCloudOpacity("scanOdom", _preferencesDialog->getScanOpacity(1));
|
||||||
_cloudViewer->setCloudPointSize("scanOdom", _preferencesDialog->getScanPointSize(1));
|
_cloudViewer->setCloudPointSize("scanOdom", _preferencesDialog->getScanPointSize(1));
|
||||||
}
|
}
|
||||||
@@ -2673,6 +2685,7 @@ void MainWindow::updateMapCloud(
|
|||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
_cloudViewer->updateCloudPose("scanMapOdom", _odometryCorrection);
|
_cloudViewer->updateCloudPose("scanMapOdom", _odometryCorrection);
|
||||||
|
_cloudViewer->setCloudColorIndex("scanMapOdom", _preferencesDialog->getScanColorScheme(1));
|
||||||
_cloudViewer->setCloudOpacity("scanMapOdom", _preferencesDialog->getScanOpacity(1));
|
_cloudViewer->setCloudOpacity("scanMapOdom", _preferencesDialog->getScanOpacity(1));
|
||||||
_cloudViewer->setCloudPointSize("scanMapOdom", _preferencesDialog->getScanPointSize(1));
|
_cloudViewer->setCloudPointSize("scanMapOdom", _preferencesDialog->getScanPointSize(1));
|
||||||
}
|
}
|
||||||
@@ -3016,6 +3029,7 @@ std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> MainWindow::c
|
|||||||
_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));
|
||||||
}
|
}
|
||||||
|
_cloudViewer->setCloudColorIndex(cloudName, _preferencesDialog->getCloudColorScheme(0));
|
||||||
_cloudViewer->setCloudOpacity(cloudName, _preferencesDialog->getCloudOpacity(0));
|
_cloudViewer->setCloudOpacity(cloudName, _preferencesDialog->getCloudOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
_cloudViewer->setCloudPointSize(cloudName, _preferencesDialog->getCloudPointSize(0));
|
||||||
}
|
}
|
||||||
@@ -3054,19 +3068,30 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
LaserScan scan;
|
LaserScan scan;
|
||||||
iter->sensorData().uncompressData(0, 0, &scan);
|
iter->sensorData().uncompressData(0, 0, &scan);
|
||||||
|
|
||||||
if(_preferencesDialog->getDownsamplingStepScan(0) > 0)
|
if(_preferencesDialog->getDownsamplingStepScan(0) > 1 ||
|
||||||
|
_preferencesDialog->getScanMaxRange(0) > 0.0f ||
|
||||||
|
_preferencesDialog->getScanMinRange(0) > 0.0f)
|
||||||
{
|
{
|
||||||
scan = util3d::downsample(scan, _preferencesDialog->getDownsamplingStepScan(0));
|
scan = util3d::commonFiltering(scan,
|
||||||
|
_preferencesDialog->getDownsamplingStepScan(0),
|
||||||
|
_preferencesDialog->getScanMinRange(0),
|
||||||
|
_preferencesDialog->getScanMaxRange(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudRGB;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudRGB;
|
||||||
|
pcl::PointCloud<pcl::PointXYZI>::Ptr cloudI;
|
||||||
pcl::PointCloud<pcl::PointNormal>::Ptr cloudWithNormals;
|
pcl::PointCloud<pcl::PointNormal>::Ptr cloudWithNormals;
|
||||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloudRGBWithNormals;
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloudRGBWithNormals;
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr cloudIWithNormals;
|
||||||
if(scan.hasNormals() && scan.hasRGB() && _preferencesDialog->getCloudVoxelSizeScan(0) <= 0.0)
|
if(scan.hasNormals() && scan.hasRGB() && _preferencesDialog->getCloudVoxelSizeScan(0) <= 0.0)
|
||||||
{
|
{
|
||||||
cloudRGBWithNormals = util3d::laserScanToPointCloudRGBNormal(scan, scan.localTransform());
|
cloudRGBWithNormals = util3d::laserScanToPointCloudRGBNormal(scan, scan.localTransform());
|
||||||
}
|
}
|
||||||
|
else if(scan.hasNormals() && scan.hasIntensity() && _preferencesDialog->getCloudVoxelSizeScan(0) <= 0.0)
|
||||||
|
{
|
||||||
|
cloudIWithNormals = util3d::laserScanToPointCloudINormal(scan, scan.localTransform());
|
||||||
|
}
|
||||||
else if((scan.hasNormals()) && _preferencesDialog->getCloudVoxelSizeScan(0) <= 0.0)
|
else if((scan.hasNormals()) && _preferencesDialog->getCloudVoxelSizeScan(0) <= 0.0)
|
||||||
{
|
{
|
||||||
cloudWithNormals = util3d::laserScanToPointCloudNormal(scan, scan.localTransform());
|
cloudWithNormals = util3d::laserScanToPointCloudNormal(scan, scan.localTransform());
|
||||||
@@ -3075,6 +3100,10 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
{
|
{
|
||||||
cloudRGB = util3d::laserScanToPointCloudRGB(scan, scan.localTransform());
|
cloudRGB = util3d::laserScanToPointCloudRGB(scan, scan.localTransform());
|
||||||
}
|
}
|
||||||
|
else if(scan.hasIntensity())
|
||||||
|
{
|
||||||
|
cloudI = util3d::laserScanToPointCloudI(scan, scan.localTransform());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cloud = util3d::laserScanToPointCloud(scan, scan.localTransform());
|
cloud = util3d::laserScanToPointCloud(scan, scan.localTransform());
|
||||||
@@ -3090,6 +3119,10 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
{
|
{
|
||||||
cloudRGB = util3d::voxelize(cloudRGB, _preferencesDialog->getCloudVoxelSizeScan(0));
|
cloudRGB = util3d::voxelize(cloudRGB, _preferencesDialog->getCloudVoxelSizeScan(0));
|
||||||
}
|
}
|
||||||
|
if(cloudI.get())
|
||||||
|
{
|
||||||
|
cloudI = util3d::voxelize(cloudI, _preferencesDialog->getCloudVoxelSizeScan(0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do ceiling/floor filtering
|
// Do ceiling/floor filtering
|
||||||
@@ -3110,6 +3143,19 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
//transform back in sensor frame
|
//transform back in sensor frame
|
||||||
cloudRGBWithNormals = util3d::transformPointCloud(cloudTransformed, pose.inverse());
|
cloudRGBWithNormals = util3d::transformPointCloud(cloudTransformed, pose.inverse());
|
||||||
}
|
}
|
||||||
|
if(cloudIWithNormals.get())
|
||||||
|
{
|
||||||
|
// perform in /map frame
|
||||||
|
pcl::PointCloud<pcl::PointXYZINormal>::Ptr cloudTransformed = util3d::transformPointCloud(cloudIWithNormals, pose);
|
||||||
|
cloudTransformed = rtabmap::util3d::passThrough(
|
||||||
|
cloudTransformed,
|
||||||
|
"z",
|
||||||
|
_preferencesDialog->getScanFloorFilteringHeight()==0.0?(float)std::numeric_limits<int>::min():_preferencesDialog->getScanFloorFilteringHeight(),
|
||||||
|
_preferencesDialog->getScanCeilingFilteringHeight()==0.0?(float)std::numeric_limits<int>::max():_preferencesDialog->getScanCeilingFilteringHeight());
|
||||||
|
|
||||||
|
//transform back in sensor frame
|
||||||
|
cloudIWithNormals = util3d::transformPointCloud(cloudTransformed, pose.inverse());
|
||||||
|
}
|
||||||
if(cloudWithNormals.get())
|
if(cloudWithNormals.get())
|
||||||
{
|
{
|
||||||
// perform in /map frame
|
// perform in /map frame
|
||||||
@@ -3136,6 +3182,19 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
//transform back in sensor frame
|
//transform back in sensor frame
|
||||||
cloudRGB = util3d::transformPointCloud(cloudTransformed, pose.inverse());
|
cloudRGB = util3d::transformPointCloud(cloudTransformed, pose.inverse());
|
||||||
}
|
}
|
||||||
|
if(cloudI.get())
|
||||||
|
{
|
||||||
|
// perform in /map frame
|
||||||
|
pcl::PointCloud<pcl::PointXYZI>::Ptr cloudTransformed = util3d::transformPointCloud(cloudI, pose);
|
||||||
|
cloudTransformed = rtabmap::util3d::passThrough(
|
||||||
|
cloudTransformed,
|
||||||
|
"z",
|
||||||
|
_preferencesDialog->getScanFloorFilteringHeight()==0.0?(float)std::numeric_limits<int>::min():_preferencesDialog->getScanFloorFilteringHeight(),
|
||||||
|
_preferencesDialog->getScanCeilingFilteringHeight()==0.0?(float)std::numeric_limits<int>::max():_preferencesDialog->getScanCeilingFilteringHeight());
|
||||||
|
|
||||||
|
//transform back in sensor frame
|
||||||
|
cloudI = util3d::transformPointCloud(cloudTransformed, pose.inverse());
|
||||||
|
}
|
||||||
if(cloud.get())
|
if(cloud.get())
|
||||||
{
|
{
|
||||||
// perform in /map frame
|
// perform in /map frame
|
||||||
@@ -3151,7 +3210,7 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (cloud.get() || cloudRGB.get()) &&
|
if( (cloud.get() || cloudRGB.get() || cloudI.get()) &&
|
||||||
(_preferencesDialog->getScanNormalKSearch() > 0 || _preferencesDialog->getScanNormalRadiusSearch() > 0.0))
|
(_preferencesDialog->getScanNormalKSearch() > 0 || _preferencesDialog->getScanNormalRadiusSearch() > 0.0))
|
||||||
{
|
{
|
||||||
Eigen::Vector3f scanViewpoint(
|
Eigen::Vector3f scanViewpoint(
|
||||||
@@ -3174,14 +3233,28 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
pcl::concatenateFields(*cloud, *normals, *cloudWithNormals);
|
pcl::concatenateFields(*cloud, *normals, *cloudWithNormals);
|
||||||
cloud.reset();
|
cloud.reset();
|
||||||
}
|
}
|
||||||
else
|
else if(cloudRGB.get() && cloudRGB->size())
|
||||||
{
|
{
|
||||||
UASSERT(cloudRGB.get() && cloudRGB->size()); // Assuming 4 channels cannot be 2D
|
// Assuming 3D
|
||||||
normals = util3d::computeNormals(cloudRGB, _preferencesDialog->getScanNormalKSearch(), _preferencesDialog->getScanNormalRadiusSearch(), scanViewpoint);
|
normals = util3d::computeNormals(cloudRGB, _preferencesDialog->getScanNormalKSearch(), _preferencesDialog->getScanNormalRadiusSearch(), scanViewpoint);
|
||||||
cloudRGBWithNormals.reset(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
cloudRGBWithNormals.reset(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
||||||
pcl::concatenateFields(*cloudRGB, *normals, *cloudRGBWithNormals);
|
pcl::concatenateFields(*cloudRGB, *normals, *cloudRGBWithNormals);
|
||||||
cloudRGB.reset();
|
cloudRGB.reset();
|
||||||
}
|
}
|
||||||
|
else if(cloudI.get())
|
||||||
|
{
|
||||||
|
if(scan.is2d())
|
||||||
|
{
|
||||||
|
normals = util3d::computeFastOrganizedNormals2D(cloudI, _preferencesDialog->getScanNormalKSearch(), _preferencesDialog->getScanNormalRadiusSearch(), scanViewpoint);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
normals = util3d::computeNormals(cloudI, _preferencesDialog->getScanNormalKSearch(), _preferencesDialog->getScanNormalRadiusSearch(), scanViewpoint);
|
||||||
|
}
|
||||||
|
cloudIWithNormals.reset(new pcl::PointCloud<pcl::PointXYZINormal>);
|
||||||
|
pcl::concatenateFields(*cloud, *normals, *cloudIWithNormals);
|
||||||
|
cloudI.reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QColor color = Qt::gray;
|
QColor color = Qt::gray;
|
||||||
@@ -3198,6 +3271,21 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGBWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZRGBNormal, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGBWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZRGBNormal, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(cloudIWithNormals.get())
|
||||||
|
{
|
||||||
|
added = _cloudViewer->addCloud(scanName, cloudIWithNormals, pose, color);
|
||||||
|
if(added && nodeId > 0)
|
||||||
|
{
|
||||||
|
if(scan.is2d())
|
||||||
|
{
|
||||||
|
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudIWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYINormal, scan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudIWithNormals, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZINormal, scan.localTransform());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(cloudWithNormals.get())
|
else if(cloudWithNormals.get())
|
||||||
{
|
{
|
||||||
added = _cloudViewer->addCloud(scanName, cloudWithNormals, pose, color);
|
added = _cloudViewer->addCloud(scanName, cloudWithNormals, pose, color);
|
||||||
@@ -3221,6 +3309,21 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGB, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZRGB, scan.localTransform());
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudRGB, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZRGB, scan.localTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(cloudI.get())
|
||||||
|
{
|
||||||
|
added = _cloudViewer->addCloud(scanName, cloudI, pose, color);
|
||||||
|
if(added && nodeId > 0)
|
||||||
|
{
|
||||||
|
if(scan.is2d())
|
||||||
|
{
|
||||||
|
scan = LaserScan(util3d::laserScan2dFromPointCloud(*cloudI, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYI, scan.localTransform());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scan = LaserScan(util3d::laserScanFromPointCloud(*cloudI, scan.localTransform().inverse()), scan.maxPoints(), scan.maxRange(), LaserScan::kXYZI, scan.localTransform());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UASSERT(cloud.get());
|
UASSERT(cloud.get());
|
||||||
@@ -3248,6 +3351,7 @@ void MainWindow::createAndAddScanToMap(int nodeId, const Transform & pose, int m
|
|||||||
_createdScans.insert(std::make_pair(nodeId, scan)); // keep scan in scan frame
|
_createdScans.insert(std::make_pair(nodeId, scan)); // keep scan in scan frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cloudViewer->setCloudColorIndex(scanName, _preferencesDialog->getScanColorScheme(0));
|
||||||
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
_cloudViewer->setCloudOpacity(scanName, _preferencesDialog->getScanOpacity(0));
|
||||||
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
_cloudViewer->setCloudPointSize(scanName, _preferencesDialog->getScanPointSize(0));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -363,6 +363,10 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_3dRenderingRoiRatios[0] = _ui->lineEdit_roiRatios;
|
_3dRenderingRoiRatios[0] = _ui->lineEdit_roiRatios;
|
||||||
_3dRenderingRoiRatios[1] = _ui->lineEdit_roiRatios_odom;
|
_3dRenderingRoiRatios[1] = _ui->lineEdit_roiRatios_odom;
|
||||||
|
|
||||||
|
_3dRenderingColorScheme.resize(2);
|
||||||
|
_3dRenderingColorScheme[0] = _ui->spinBox_colorScheme;
|
||||||
|
_3dRenderingColorScheme[1] = _ui->spinBox_colorScheme_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;
|
||||||
@@ -379,10 +383,22 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_3dRenderingDownsamplingScan[0] = _ui->spinBox_downsamplingScan;
|
_3dRenderingDownsamplingScan[0] = _ui->spinBox_downsamplingScan;
|
||||||
_3dRenderingDownsamplingScan[1] = _ui->spinBox_downsamplingScan_odom;
|
_3dRenderingDownsamplingScan[1] = _ui->spinBox_downsamplingScan_odom;
|
||||||
|
|
||||||
|
_3dRenderingMaxRange.resize(2);
|
||||||
|
_3dRenderingMaxRange[0] = _ui->doubleSpinBox_maxRange;
|
||||||
|
_3dRenderingMaxRange[1] = _ui->doubleSpinBox_maxRange_odom;
|
||||||
|
|
||||||
|
_3dRenderingMinRange.resize(2);
|
||||||
|
_3dRenderingMinRange[0] = _ui->doubleSpinBox_minRange;
|
||||||
|
_3dRenderingMinRange[1] = _ui->doubleSpinBox_minRange_odom;
|
||||||
|
|
||||||
_3dRenderingVoxelSizeScan.resize(2);
|
_3dRenderingVoxelSizeScan.resize(2);
|
||||||
_3dRenderingVoxelSizeScan[0] = _ui->doubleSpinBox_voxelSizeScan;
|
_3dRenderingVoxelSizeScan[0] = _ui->doubleSpinBox_voxelSizeScan;
|
||||||
_3dRenderingVoxelSizeScan[1] = _ui->doubleSpinBox_voxelSizeScan_odom;
|
_3dRenderingVoxelSizeScan[1] = _ui->doubleSpinBox_voxelSizeScan_odom;
|
||||||
|
|
||||||
|
_3dRenderingColorSchemeScan.resize(2);
|
||||||
|
_3dRenderingColorSchemeScan[0] = _ui->spinBox_colorSchemeScan;
|
||||||
|
_3dRenderingColorSchemeScan[1] = _ui->spinBox_colorSchemeScan_odom;
|
||||||
|
|
||||||
_3dRenderingOpacityScan.resize(2);
|
_3dRenderingOpacityScan.resize(2);
|
||||||
_3dRenderingOpacityScan[0] = _ui->doubleSpinBox_opacity_scan;
|
_3dRenderingOpacityScan[0] = _ui->doubleSpinBox_opacity_scan;
|
||||||
_3dRenderingOpacityScan[1] = _ui->doubleSpinBox_opacity_odom_scan;
|
_3dRenderingOpacityScan[1] = _ui->doubleSpinBox_opacity_odom_scan;
|
||||||
@@ -415,9 +431,13 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
connect(_3dRenderingShowFrustums[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingShowFrustums[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
|
||||||
connect(_3dRenderingDownsamplingScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingDownsamplingScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_3dRenderingMaxRange[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_3dRenderingMinRange[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingVoxelSizeScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingVoxelSizeScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_3dRenderingColorScheme[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingOpacity[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingOpacity[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingPtSize[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingPtSize[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_3dRenderingColorSchemeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingOpacityScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingOpacityScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingPtSizeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingPtSizeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_3dRenderingPtSizeFeatures[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_3dRenderingPtSizeFeatures[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
@@ -1414,9 +1434,13 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
_3dRenderingShowFrustums[i]->setChecked(false);
|
_3dRenderingShowFrustums[i]->setChecked(false);
|
||||||
|
|
||||||
_3dRenderingDownsamplingScan[i]->setValue(1);
|
_3dRenderingDownsamplingScan[i]->setValue(1);
|
||||||
|
_3dRenderingMaxRange[i]->setValue(0.0);
|
||||||
|
_3dRenderingMinRange[i]->setValue(0.0);
|
||||||
_3dRenderingVoxelSizeScan[i]->setValue(0.0);
|
_3dRenderingVoxelSizeScan[i]->setValue(0.0);
|
||||||
|
_3dRenderingColorScheme[i]->setValue(0);
|
||||||
_3dRenderingOpacity[i]->setValue(i==0?1.0:0.75);
|
_3dRenderingOpacity[i]->setValue(i==0?1.0:0.75);
|
||||||
_3dRenderingPtSize[i]->setValue(2);
|
_3dRenderingPtSize[i]->setValue(2);
|
||||||
|
_3dRenderingColorSchemeScan[i]->setValue(0);
|
||||||
_3dRenderingOpacityScan[i]->setValue(i==0?1.0:0.5);
|
_3dRenderingOpacityScan[i]->setValue(i==0?1.0:0.5);
|
||||||
_3dRenderingPtSizeScan[i]->setValue(2);
|
_3dRenderingPtSizeScan[i]->setValue(2);
|
||||||
_3dRenderingPtSizeFeatures[i]->setValue(3);
|
_3dRenderingPtSizeFeatures[i]->setValue(3);
|
||||||
@@ -1818,9 +1842,13 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
|
|||||||
_3dRenderingShowFrustums[i]->setChecked(settings.value(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked()).toBool());
|
_3dRenderingShowFrustums[i]->setChecked(settings.value(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked()).toBool());
|
||||||
|
|
||||||
_3dRenderingDownsamplingScan[i]->setValue(settings.value(QString("downsamplingScan%1").arg(i), _3dRenderingDownsamplingScan[i]->value()).toInt());
|
_3dRenderingDownsamplingScan[i]->setValue(settings.value(QString("downsamplingScan%1").arg(i), _3dRenderingDownsamplingScan[i]->value()).toInt());
|
||||||
|
_3dRenderingMaxRange[i]->setValue(settings.value(QString("maxRange%1").arg(i), _3dRenderingMaxRange[i]->value()).toDouble());
|
||||||
|
_3dRenderingMinRange[i]->setValue(settings.value(QString("minRange%1").arg(i), _3dRenderingMinRange[i]->value()).toDouble());
|
||||||
_3dRenderingVoxelSizeScan[i]->setValue(settings.value(QString("voxelSizeScan%1").arg(i), _3dRenderingVoxelSizeScan[i]->value()).toDouble());
|
_3dRenderingVoxelSizeScan[i]->setValue(settings.value(QString("voxelSizeScan%1").arg(i), _3dRenderingVoxelSizeScan[i]->value()).toDouble());
|
||||||
|
_3dRenderingColorScheme[i]->setValue(settings.value(QString("colorScheme%1").arg(i), _3dRenderingColorScheme[i]->value()).toInt());
|
||||||
_3dRenderingOpacity[i]->setValue(settings.value(QString("opacity%1").arg(i), _3dRenderingOpacity[i]->value()).toDouble());
|
_3dRenderingOpacity[i]->setValue(settings.value(QString("opacity%1").arg(i), _3dRenderingOpacity[i]->value()).toDouble());
|
||||||
_3dRenderingPtSize[i]->setValue(settings.value(QString("ptSize%1").arg(i), _3dRenderingPtSize[i]->value()).toInt());
|
_3dRenderingPtSize[i]->setValue(settings.value(QString("ptSize%1").arg(i), _3dRenderingPtSize[i]->value()).toInt());
|
||||||
|
_3dRenderingColorSchemeScan[i]->setValue(settings.value(QString("colorSchemeScan%1").arg(i), _3dRenderingColorSchemeScan[i]->value()).toInt());
|
||||||
_3dRenderingOpacityScan[i]->setValue(settings.value(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value()).toDouble());
|
_3dRenderingOpacityScan[i]->setValue(settings.value(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value()).toDouble());
|
||||||
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
|
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
|
||||||
_3dRenderingPtSizeFeatures[i]->setValue(settings.value(QString("ptSizeFeatures%1").arg(i), _3dRenderingPtSizeFeatures[i]->value()).toInt());
|
_3dRenderingPtSizeFeatures[i]->setValue(settings.value(QString("ptSizeFeatures%1").arg(i), _3dRenderingPtSizeFeatures[i]->value()).toInt());
|
||||||
@@ -2221,9 +2249,13 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath) const
|
|||||||
settings.setValue(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked());
|
settings.setValue(QString("showFrustums%1").arg(i), _3dRenderingShowFrustums[i]->isChecked());
|
||||||
|
|
||||||
settings.setValue(QString("downsamplingScan%1").arg(i), _3dRenderingDownsamplingScan[i]->value());
|
settings.setValue(QString("downsamplingScan%1").arg(i), _3dRenderingDownsamplingScan[i]->value());
|
||||||
|
settings.setValue(QString("maxRange%1").arg(i), _3dRenderingMaxRange[i]->value());
|
||||||
|
settings.setValue(QString("minRange%1").arg(i), _3dRenderingMinRange[i]->value());
|
||||||
settings.setValue(QString("voxelSizeScan%1").arg(i), _3dRenderingVoxelSizeScan[i]->value());
|
settings.setValue(QString("voxelSizeScan%1").arg(i), _3dRenderingVoxelSizeScan[i]->value());
|
||||||
|
settings.setValue(QString("colorScheme%1").arg(i), _3dRenderingColorScheme[i]->value());
|
||||||
settings.setValue(QString("opacity%1").arg(i), _3dRenderingOpacity[i]->value());
|
settings.setValue(QString("opacity%1").arg(i), _3dRenderingOpacity[i]->value());
|
||||||
settings.setValue(QString("ptSize%1").arg(i), _3dRenderingPtSize[i]->value());
|
settings.setValue(QString("ptSize%1").arg(i), _3dRenderingPtSize[i]->value());
|
||||||
|
settings.setValue(QString("colorSchemeScan%1").arg(i), _3dRenderingColorSchemeScan[i]->value());
|
||||||
settings.setValue(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value());
|
settings.setValue(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value());
|
||||||
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
|
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
|
||||||
settings.setValue(QString("ptSizeFeatures%1").arg(i), _3dRenderingPtSizeFeatures[i]->value());
|
settings.setValue(QString("ptSizeFeatures%1").arg(i), _3dRenderingPtSizeFeatures[i]->value());
|
||||||
@@ -4431,6 +4463,11 @@ std::vector<float> PreferencesDialog::getCloudRoiRatios(int index) const
|
|||||||
}
|
}
|
||||||
return roiRatios;
|
return roiRatios;
|
||||||
}
|
}
|
||||||
|
int PreferencesDialog::getCloudColorScheme(int index) const
|
||||||
|
{
|
||||||
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
return _3dRenderingColorScheme[index]->value();
|
||||||
|
}
|
||||||
double PreferencesDialog::getCloudOpacity(int index) const
|
double PreferencesDialog::getCloudOpacity(int index) const
|
||||||
{
|
{
|
||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
@@ -4452,11 +4489,26 @@ int PreferencesDialog::getDownsamplingStepScan(int index) const
|
|||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
return _3dRenderingDownsamplingScan[index]->value();
|
return _3dRenderingDownsamplingScan[index]->value();
|
||||||
}
|
}
|
||||||
|
double PreferencesDialog::getScanMaxRange(int index) const
|
||||||
|
{
|
||||||
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
return _3dRenderingMaxRange[index]->value();
|
||||||
|
}
|
||||||
|
double PreferencesDialog::getScanMinRange(int index) const
|
||||||
|
{
|
||||||
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
return _3dRenderingMinRange[index]->value();
|
||||||
|
}
|
||||||
double PreferencesDialog::getCloudVoxelSizeScan(int index) const
|
double PreferencesDialog::getCloudVoxelSizeScan(int index) const
|
||||||
{
|
{
|
||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
return _3dRenderingVoxelSizeScan[index]->value();
|
return _3dRenderingVoxelSizeScan[index]->value();
|
||||||
}
|
}
|
||||||
|
int PreferencesDialog::getScanColorScheme(int index) const
|
||||||
|
{
|
||||||
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
return _3dRenderingColorSchemeScan[index]->value();
|
||||||
|
}
|
||||||
double PreferencesDialog::getScanOpacity(int index) const
|
double PreferencesDialog::getScanOpacity(int index) const
|
||||||
{
|
{
|
||||||
UASSERT(index >= 0 && index <= 1);
|
UASSERT(index >= 0 && index <= 1);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>976</width>
|
<width>976</width>
|
||||||
<height>739</height>
|
<height>900</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-1377</y>
|
<y>-78</y>
|
||||||
<width>673</width>
|
<width>673</width>
|
||||||
<height>2834</height>
|
<height>2834</height>
|
||||||
</rect>
|
</rect>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>5</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">
|
||||||
@@ -503,6 +503,74 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_112">
|
<layout class="QVBoxLayout" name="verticalLayout_112">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_roiRatios"/>
|
||||||
|
</item>
|
||||||
|
<item row="15" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_ptsize">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>64</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="2">
|
||||||
|
<widget class="QLabel" name="label_355">
|
||||||
|
<property name="text">
|
||||||
|
<string>Floor filtering height (0=Disabled). This is done in /map frame.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="2">
|
||||||
|
<widget class="QLabel" name="label_169">
|
||||||
|
<property name="text">
|
||||||
|
<string>Noise filtering min neighbors.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="12" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_normalRadiusSearch">
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="13" column="2">
|
||||||
|
<widget class="QLabel" name="label_459">
|
||||||
|
<property name="text">
|
||||||
|
<string>Default color scheme key.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="13" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_colorScheme_odom"/>
|
||||||
|
</item>
|
||||||
|
<item row="13" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_colorScheme"/>
|
||||||
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_odom">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_odom">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
@@ -525,9 +593,6 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<item row="5" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QLineEdit" name="lineEdit_roiRatios_odom"/>
|
<widget class="QLineEdit" name="lineEdit_roiRatios_odom"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QLineEdit" name="lineEdit_roiRatios"/>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label_154">
|
<widget class="QLabel" name="label_154">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -613,7 +678,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="QDoubleSpinBox" name="doubleSpinBox_opacity">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -632,26 +697,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="2">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom">
|
|
||||||
<property name="suffix">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="2">
|
|
||||||
<widget class="QLabel" name="label_155">
|
<widget class="QLabel" name="label_155">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Opacity.</string>
|
<string>Opacity.</string>
|
||||||
@@ -664,7 +710,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_157">
|
<widget class="QLabel" name="label_157">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Point size (1..64).</string>
|
<string>Point size (1..64).</string>
|
||||||
@@ -849,20 +895,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="1">
|
||||||
<widget class="QSpinBox" name="spinBox_ptsize">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>64</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="14" 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>
|
||||||
@@ -875,32 +908,6 @@ 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">
|
|
||||||
<widget class="QLabel" name="label_355">
|
|
||||||
<property name="text">
|
|
||||||
<string>Floor filtering height (0=Disabled). This is done in /map frame.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="2">
|
|
||||||
<widget class="QLabel" name="label_169">
|
|
||||||
<property name="text">
|
|
||||||
<string>Noise filtering min neighbors.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="2">
|
<item row="7" column="2">
|
||||||
<widget class="QLabel" name="label_168">
|
<widget class="QLabel" name="label_168">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -1014,10 +1021,22 @@ 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="14" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_normalRadiusSearch">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom">
|
||||||
|
<property name="suffix">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
<property name="singleStep">
|
<property name="singleStep">
|
||||||
<double>0.010000000000000</double>
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -1128,7 +1147,39 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
<string>Laser Scan</string>
|
<string>Laser Scan</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_79" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout_79" columnstretch="0,0,1">
|
||||||
<item row="9" column="1">
|
<item row="11" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom_scan">
|
||||||
|
<property name="suffix">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="2">
|
||||||
|
<widget class="QLabel" name="label_273">
|
||||||
|
<property name="text">
|
||||||
|
<string>Scan downsampling step size.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="12" 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>
|
||||||
@@ -1138,7 +1189,143 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="label_110">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show scans.</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="2">
|
||||||
|
<widget class="QLabel" name="label_271">
|
||||||
|
<property name="text">
|
||||||
|
<string>Scan voxel size.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_356">
|
||||||
|
<property name="text">
|
||||||
|
<string>Odometry</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_359">
|
||||||
|
<property name="text">
|
||||||
|
<string>Map</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="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_ceilingFilterHeight_scan">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>-10.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="8" column="2">
|
||||||
|
<widget class="QLabel" name="label_241">
|
||||||
|
<property name="text">
|
||||||
|
<string>Normal K search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="2">
|
||||||
|
<widget class="QLabel" name="label_458">
|
||||||
|
<property name="text">
|
||||||
|
<string>Default color scheme key.</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="2">
|
||||||
|
<widget class="QLabel" name="label_460">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum range (0 means no limit).</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="QDoubleSpinBox" name="doubleSpinBox_maxRange">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>999.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="9" column="2">
|
<item row="9" column="2">
|
||||||
|
<widget class="QLabel" name="label_428">
|
||||||
|
<property name="text">
|
||||||
|
<string>Normal radius search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="12" 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>
|
||||||
@@ -1180,7 +1367,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="11" 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>
|
||||||
@@ -1193,20 +1380,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="2">
|
<item row="12" column="0">
|
||||||
<widget class="QLabel" name="label_110">
|
|
||||||
<property name="text">
|
|
||||||
<string>Show scans.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="9" 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>
|
||||||
@@ -1246,7 +1420,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
<item row="11" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_scan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_scan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1265,51 +1439,6 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
|
||||||
<widget class="QLabel" name="label_271">
|
|
||||||
<property name="text">
|
|
||||||
<string>Scan voxel size.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="1">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_opacity_odom_scan">
|
|
||||||
<property name="suffix">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<double>1.000000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QLabel" name="label_273">
|
|
||||||
<property name="text">
|
|
||||||
<string>Scan downsampling step size.</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">
|
<item row="3" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSizeScan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSizeScan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
@@ -1329,33 +1458,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="6" column="2">
|
||||||
<widget class="QLabel" name="label_356">
|
|
||||||
<property name="text">
|
|
||||||
<string>Odometry</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_359">
|
|
||||||
<property name="text">
|
|
||||||
<string>Map</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="2">
|
|
||||||
<widget class="QLabel" name="label_367">
|
<widget class="QLabel" name="label_367">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Ceiling filtering height (0=Disabled). This is done in /map frame.</string>
|
<string>Ceiling filtering height (0=Disabled). This is done in /map frame.</string>
|
||||||
@@ -1368,7 +1471,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="7" column="2">
|
||||||
<widget class="QLabel" name="label_368">
|
<widget class="QLabel" name="label_368">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Floor filtering height (0=Disabled). This is done in /map frame.</string>
|
<string>Floor filtering height (0=Disabled). This is done in /map frame.</string>
|
||||||
@@ -1381,29 +1484,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_ceilingFilterHeight_scan">
|
|
||||||
<property name="suffix">
|
|
||||||
<string> m</string>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<double>-10.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="5" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_floorFilterHeight_scan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_floorFilterHeight_scan">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1425,20 +1506,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="8" column="0">
|
||||||
<widget class="QLabel" name="label_241">
|
|
||||||
<property name="text">
|
|
||||||
<string>Normal K search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</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="0">
|
|
||||||
<widget class="QSpinBox" name="spinBox_normalKSearch_scan">
|
<widget class="QSpinBox" name="spinBox_normalKSearch_scan">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
@@ -1451,10 +1519,23 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="2">
|
<item row="9" column="0">
|
||||||
<widget class="QLabel" name="label_428">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_normalRadiusSearch_scan">
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_colorSchemeScan"/>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_colorSchemeScan_odom"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="2">
|
||||||
|
<widget class="QLabel" name="label_461">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Normal radius search. If not 0, normals will be computed and added to created cloud for visualization (keys 7, 8 and 9).</string>
|
<string>Minimum range.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -1464,10 +1545,33 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_normalRadiusSearch_scan">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minRange">
|
||||||
<property name="singleStep">
|
<property name="suffix">
|
||||||
<double>0.010000000000000</double>
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>999.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxRange_odom">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>999.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_minRange_odom">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>999.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user