mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 08:47:45 +08:00
Labels shown in the GUI (added also "Label current location..." action in Detection menu)
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 10)
|
SET(RTABMAP_MINOR_VERSION 10)
|
||||||
SET(RTABMAP_PATCH_VERSION 1)
|
SET(RTABMAP_PATCH_VERSION 2)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,8 @@ public:
|
|||||||
kCmdTriggerNewMap,
|
kCmdTriggerNewMap,
|
||||||
kCmdPause,
|
kCmdPause,
|
||||||
kCmdGoal, // params: label or location ID
|
kCmdGoal, // params: label or location ID
|
||||||
kCmdCancelGoal};
|
kCmdCancelGoal,
|
||||||
|
kCmdLabel}; // // params: label or location ID
|
||||||
public:
|
public:
|
||||||
RtabmapEventCmd(Cmd cmd, const std::string & strValue = "", int intValue = 0, const ParametersMap & parameters = ParametersMap()) :
|
RtabmapEventCmd(Cmd cmd, const std::string & strValue = "", int intValue = 0, const ParametersMap & parameters = ParametersMap()) :
|
||||||
UEvent(0),
|
UEvent(0),
|
||||||
@@ -190,6 +191,22 @@ private:
|
|||||||
std::vector<std::pair<int, Transform> > _poses;
|
std::vector<std::pair<int, Transform> > _poses;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class RtabmapLabelErrorEvent : public UEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RtabmapLabelErrorEvent(int id, const std::string & label):
|
||||||
|
UEvent(id),
|
||||||
|
_label(label){}
|
||||||
|
|
||||||
|
virtual ~RtabmapLabelErrorEvent() {}
|
||||||
|
int id() const {return this->getCode();}
|
||||||
|
const std::string & label() const {return _label;}
|
||||||
|
virtual std::string getClassName() const {return std::string("RtabmapLabelErrorEvent");}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string _label;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|
||||||
#endif /* RTABMAPEVENT_H_ */
|
#endif /* RTABMAPEVENT_H_ */
|
||||||
|
|||||||
@@ -75,7 +75,8 @@ public:
|
|||||||
kStateTriggeringMap,
|
kStateTriggeringMap,
|
||||||
kStateAddingUserData,
|
kStateAddingUserData,
|
||||||
kStateSettingGoal,
|
kStateSettingGoal,
|
||||||
kStateCancellingGoal
|
kStateCancellingGoal,
|
||||||
|
kStateLabelling
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -289,6 +289,12 @@ void RtabmapThread::mainLoop()
|
|||||||
case kStateCancellingGoal:
|
case kStateCancellingGoal:
|
||||||
_rtabmap->clearPath();
|
_rtabmap->clearPath();
|
||||||
break;
|
break;
|
||||||
|
case kStateLabelling:
|
||||||
|
if(!_rtabmap->labelLocation(atoi(parameters.at("id").c_str()), parameters.at("label").c_str()))
|
||||||
|
{
|
||||||
|
this->post(new RtabmapLabelErrorEvent(atoi(parameters.at("id").c_str()), parameters.at("label").c_str()));
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
UFATAL("Invalid state !?!?");
|
UFATAL("Invalid state !?!?");
|
||||||
break;
|
break;
|
||||||
@@ -500,6 +506,14 @@ void RtabmapThread::handleEvent(UEvent* event)
|
|||||||
ULOGGER_DEBUG("CMD_CANCEL_GOAL");
|
ULOGGER_DEBUG("CMD_CANCEL_GOAL");
|
||||||
pushNewState(kStateCancellingGoal);
|
pushNewState(kStateCancellingGoal);
|
||||||
}
|
}
|
||||||
|
else if(cmd == RtabmapEventCmd::kCmdLabel)
|
||||||
|
{
|
||||||
|
ULOGGER_DEBUG("CMD_LABEL");
|
||||||
|
ParametersMap param;
|
||||||
|
param.insert(ParametersPair("label", rtabmapEvent->getStr()));
|
||||||
|
param.insert(ParametersPair("id", uNumber2Str(rtabmapEvent->getInt())));
|
||||||
|
pushNewState(kStateLabelling, param);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UWARN("Cmd %d unknown!", cmd);
|
UWARN("Cmd %d unknown!", cmd);
|
||||||
|
|||||||
@@ -151,6 +151,15 @@ public:
|
|||||||
void removeGraph(const std::string & id);
|
void removeGraph(const std::string & id);
|
||||||
void removeAllGraphs();
|
void removeAllGraphs();
|
||||||
|
|
||||||
|
void addOrUpdateText(
|
||||||
|
const std::string & id,
|
||||||
|
const std::string & text,
|
||||||
|
const Transform & position,
|
||||||
|
double scale,
|
||||||
|
const QColor & color);
|
||||||
|
void removeText(const std::string & id);
|
||||||
|
void removeAllTexts();
|
||||||
|
|
||||||
bool isTrajectoryShown() const;
|
bool isTrajectoryShown() const;
|
||||||
unsigned int getTrajectorySize() const;
|
unsigned int getTrajectorySize() const;
|
||||||
void setTrajectoryShown(bool shown);
|
void setTrajectoryShown(bool shown);
|
||||||
@@ -198,7 +207,7 @@ public slots:
|
|||||||
void setCloudVisibility(const std::string & id, bool isVisible);
|
void setCloudVisibility(const std::string & id, bool isVisible);
|
||||||
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() {removeAllClouds(); clearTrajectory();}
|
virtual void clear();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void configChanged();
|
void configChanged();
|
||||||
@@ -234,6 +243,7 @@ private:
|
|||||||
QMenu * _menu;
|
QMenu * _menu;
|
||||||
std::set<std::string> _graphes;
|
std::set<std::string> _graphes;
|
||||||
std::set<std::string> _coordinates;
|
std::set<std::string> _coordinates;
|
||||||
|
std::set<std::string> _texts;
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr _trajectory;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr _trajectory;
|
||||||
unsigned int _maxTrajectorySize;
|
unsigned int _maxTrajectorySize;
|
||||||
unsigned int _gridCellCount;
|
unsigned int _gridCellCount;
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ private slots:
|
|||||||
void dumpThePrediction();
|
void dumpThePrediction();
|
||||||
void sendGoal();
|
void sendGoal();
|
||||||
void cancelGoal();
|
void cancelGoal();
|
||||||
|
void label();
|
||||||
void downloadAllClouds();
|
void downloadAllClouds();
|
||||||
void downloadPoseGraph();
|
void downloadPoseGraph();
|
||||||
void clearTheCache();
|
void clearTheCache();
|
||||||
@@ -162,6 +163,7 @@ private slots:
|
|||||||
void processRtabmapEventInit(int status, const QString & info);
|
void processRtabmapEventInit(int status, const QString & info);
|
||||||
void processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap & event);
|
void processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap & event);
|
||||||
void processRtabmapGlobalPathEvent(const rtabmap::RtabmapGlobalPathEvent & event);
|
void processRtabmapGlobalPathEvent(const rtabmap::RtabmapGlobalPathEvent & event);
|
||||||
|
void processRtabmapLabelErrorEvent(int id, const QString & label);
|
||||||
void changeImgRateSetting();
|
void changeImgRateSetting();
|
||||||
void changeDetectionRateSetting();
|
void changeDetectionRateSetting();
|
||||||
void changeTimeLimitSetting();
|
void changeTimeLimitSetting();
|
||||||
@@ -195,6 +197,7 @@ signals:
|
|||||||
void rtabmapEventInitReceived(int status, const QString & info);
|
void rtabmapEventInitReceived(int status, const QString & info);
|
||||||
void rtabmapEvent3DMapReceived(const rtabmap::RtabmapEvent3DMap & event);
|
void rtabmapEvent3DMapReceived(const rtabmap::RtabmapEvent3DMap & event);
|
||||||
void rtabmapGlobalPathEventReceived(const rtabmap::RtabmapGlobalPathEvent & event);
|
void rtabmapGlobalPathEventReceived(const rtabmap::RtabmapGlobalPathEvent & event);
|
||||||
|
void rtabmapLabelErrorReceived(int id, const QString & label);
|
||||||
void imgRateChanged(double);
|
void imgRateChanged(double);
|
||||||
void detectionRateChanged(double);
|
void detectionRateChanged(double);
|
||||||
void timeLimitChanged(float);
|
void timeLimitChanged(float);
|
||||||
@@ -205,7 +208,13 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void update3DMapVisibility(bool cloudsShown, bool scansShown);
|
void update3DMapVisibility(bool cloudsShown, bool scansShown);
|
||||||
void updateMapCloud(const std::map<int, Transform> & poses, const Transform & pose, const std::multimap<int, Link> & constraints, const std::map<int, int> & mapIds, bool verboseProgress = false);
|
void updateMapCloud(
|
||||||
|
const std::map<int, Transform> & poses,
|
||||||
|
const Transform & pose,
|
||||||
|
const std::multimap<int, Link> & constraints,
|
||||||
|
const std::map<int, int> & mapIds,
|
||||||
|
const std::map<int, std::string> & labels,
|
||||||
|
bool verboseProgress = false);
|
||||||
void createAndAddCloudToMap(int nodeId, const Transform & pose, int mapId);
|
void createAndAddCloudToMap(int nodeId, const Transform & pose, int mapId);
|
||||||
void createAndAddScanToMap(int nodeId, const Transform & pose, int mapId);
|
void createAndAddScanToMap(int nodeId, const Transform & pose, int mapId);
|
||||||
void drawKeypoints(const std::multimap<int, cv::KeyPoint> & refWords, const std::multimap<int, cv::KeyPoint> & loopWords);
|
void drawKeypoints(const std::multimap<int, cv::KeyPoint> & refWords, const std::multimap<int, cv::KeyPoint> & loopWords);
|
||||||
@@ -266,6 +275,7 @@ private:
|
|||||||
std::map<int, Transform> _currentPosesMap; // <nodeId, pose>
|
std::map<int, Transform> _currentPosesMap; // <nodeId, pose>
|
||||||
std::multimap<int, Link> _currentLinksMap; // <nodeFromId, link>
|
std::multimap<int, Link> _currentLinksMap; // <nodeFromId, link>
|
||||||
std::map<int, int> _currentMapIds; // <nodeId, mapId>
|
std::map<int, int> _currentMapIds; // <nodeId, mapId>
|
||||||
|
std::map<int, std::string> _curentLabels; // <nodeId, label>
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > _createdClouds;
|
std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > _createdClouds;
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > _createdScans;
|
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr > _createdScans;
|
||||||
std::map<int, std::pair<cv::Mat, cv::Mat> > _projectionLocalMaps; // <ground, obstacles>
|
std::map<int, std::pair<cv::Mat, cv::Mat> > _projectionLocalMaps; // <ground, obstacles>
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ public:
|
|||||||
bool isPosteriorGraphView() const;
|
bool isPosteriorGraphView() const;
|
||||||
|
|
||||||
bool isGraphsShown() const;
|
bool isGraphsShown() const;
|
||||||
|
bool isLabelsShown() const;
|
||||||
bool isCloudMeshing() const;
|
bool isCloudMeshing() const;
|
||||||
bool isCloudsShown(int index) const; // 0=map, 1=odom
|
bool isCloudsShown(int index) const; // 0=map, 1=odom
|
||||||
double getCloudVoxelSize(int index) const; // 0=map, 1=odom
|
double getCloudVoxelSize(int index) const; // 0=map, 1=odom
|
||||||
|
|||||||
@@ -146,9 +146,17 @@ CloudViewer::CloudViewer(QWidget *parent) :
|
|||||||
CloudViewer::~CloudViewer()
|
CloudViewer::~CloudViewer()
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
|
this->clear();
|
||||||
|
delete _visualizer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudViewer::clear()
|
||||||
|
{
|
||||||
this->removeAllClouds();
|
this->removeAllClouds();
|
||||||
this->removeAllGraphs();
|
this->removeAllGraphs();
|
||||||
delete _visualizer;
|
this->removeAllCoordinates();
|
||||||
|
this->removeAllTexts();
|
||||||
|
this->clearTrajectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloudViewer::createMenu()
|
void CloudViewer::createMenu()
|
||||||
@@ -695,6 +703,60 @@ void CloudViewer::removeAllGraphs()
|
|||||||
UASSERT(_graphes.empty());
|
UASSERT(_graphes.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CloudViewer::addOrUpdateText(
|
||||||
|
const std::string & id,
|
||||||
|
const std::string & text,
|
||||||
|
const Transform & position,
|
||||||
|
double scale,
|
||||||
|
const QColor & color)
|
||||||
|
{
|
||||||
|
if(id.empty())
|
||||||
|
{
|
||||||
|
UERROR("id should not be empty!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
removeCoordinate(id);
|
||||||
|
|
||||||
|
if(!position.isNull())
|
||||||
|
{
|
||||||
|
_texts.insert(id);
|
||||||
|
_visualizer->addText3D(
|
||||||
|
text,
|
||||||
|
pcl::PointXYZ(position.x(), position.y(), position.z()),
|
||||||
|
scale,
|
||||||
|
color.redF(),
|
||||||
|
color.greenF(),
|
||||||
|
color.blueF(),
|
||||||
|
id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudViewer::removeText(const std::string & id)
|
||||||
|
{
|
||||||
|
if(id.empty())
|
||||||
|
{
|
||||||
|
UERROR("id should not be empty!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_texts.find(id) != _coordinates.end())
|
||||||
|
{
|
||||||
|
_visualizer->removeText3D(id);
|
||||||
|
_texts.erase(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudViewer::removeAllTexts()
|
||||||
|
{
|
||||||
|
std::set<std::string> texts = _texts;
|
||||||
|
for(std::set<std::string>::iterator iter = texts.begin(); iter!=texts.end(); ++iter)
|
||||||
|
{
|
||||||
|
this->removeText(*iter);
|
||||||
|
}
|
||||||
|
UASSERT(_texts.empty());
|
||||||
|
}
|
||||||
|
|
||||||
bool CloudViewer::isTrajectoryShown() const
|
bool CloudViewer::isTrajectoryShown() const
|
||||||
{
|
{
|
||||||
return _aShowTrajectory->isChecked();
|
return _aShowTrajectory->isChecked();
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent) :
|
|||||||
connect(this, SIGNAL(rtabmapEvent3DMapReceived(const rtabmap::RtabmapEvent3DMap &)), this, SLOT(processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap &)));
|
connect(this, SIGNAL(rtabmapEvent3DMapReceived(const rtabmap::RtabmapEvent3DMap &)), this, SLOT(processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap &)));
|
||||||
qRegisterMetaType<rtabmap::RtabmapGlobalPathEvent>("rtabmap::RtabmapGlobalPathEvent");
|
qRegisterMetaType<rtabmap::RtabmapGlobalPathEvent>("rtabmap::RtabmapGlobalPathEvent");
|
||||||
connect(this, SIGNAL(rtabmapGlobalPathEventReceived(const rtabmap::RtabmapGlobalPathEvent &)), this, SLOT(processRtabmapGlobalPathEvent(const rtabmap::RtabmapGlobalPathEvent &)));
|
connect(this, SIGNAL(rtabmapGlobalPathEventReceived(const rtabmap::RtabmapGlobalPathEvent &)), this, SLOT(processRtabmapGlobalPathEvent(const rtabmap::RtabmapGlobalPathEvent &)));
|
||||||
|
connect(this, SIGNAL(rtabmapLabelErrorReceived(int, const QString &)), this, SLOT(processRtabmapLabelErrorEvent(int, const QString &)));
|
||||||
// Dock Widget view actions (Menu->Window)
|
// Dock Widget view actions (Menu->Window)
|
||||||
_ui->menuShow_view->addAction(_ui->dockWidget_imageView->toggleViewAction());
|
_ui->menuShow_view->addAction(_ui->dockWidget_imageView->toggleViewAction());
|
||||||
_ui->menuShow_view->addAction(_ui->dockWidget_posterior->toggleViewAction());
|
_ui->menuShow_view->addAction(_ui->dockWidget_posterior->toggleViewAction());
|
||||||
@@ -295,6 +295,7 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent) :
|
|||||||
connect(_ui->actionDump_the_prediction_matrix, SIGNAL(triggered()), this, SLOT(dumpThePrediction()));
|
connect(_ui->actionDump_the_prediction_matrix, SIGNAL(triggered()), this, SLOT(dumpThePrediction()));
|
||||||
connect(_ui->actionSend_goal, SIGNAL(triggered()), this, SLOT(sendGoal()));
|
connect(_ui->actionSend_goal, SIGNAL(triggered()), this, SLOT(sendGoal()));
|
||||||
connect(_ui->actionCancel_goal, SIGNAL(triggered()), this, SLOT(cancelGoal()));
|
connect(_ui->actionCancel_goal, SIGNAL(triggered()), this, SLOT(cancelGoal()));
|
||||||
|
connect(_ui->actionLabel_current_location, SIGNAL(triggered()), this, SLOT(label()));
|
||||||
connect(_ui->actionClear_cache, SIGNAL(triggered()), this, SLOT(clearTheCache()));
|
connect(_ui->actionClear_cache, SIGNAL(triggered()), this, SLOT(clearTheCache()));
|
||||||
connect(_ui->actionAbout, SIGNAL(triggered()), _aboutDialog , SLOT(exec()));
|
connect(_ui->actionAbout, SIGNAL(triggered()), _aboutDialog , SLOT(exec()));
|
||||||
connect(_ui->actionPrint_loop_closure_IDs_to_console, SIGNAL(triggered()), this, SLOT(printLoopClosureIds()));
|
connect(_ui->actionPrint_loop_closure_IDs_to_console, SIGNAL(triggered()), this, SLOT(printLoopClosureIds()));
|
||||||
@@ -648,6 +649,11 @@ void MainWindow::handleEvent(UEvent* anEvent)
|
|||||||
RtabmapGlobalPathEvent * rtabmapGlobalPathEvent = (RtabmapGlobalPathEvent*)anEvent;
|
RtabmapGlobalPathEvent * rtabmapGlobalPathEvent = (RtabmapGlobalPathEvent*)anEvent;
|
||||||
emit rtabmapGlobalPathEventReceived(*rtabmapGlobalPathEvent);
|
emit rtabmapGlobalPathEventReceived(*rtabmapGlobalPathEvent);
|
||||||
}
|
}
|
||||||
|
else if(anEvent->getClassName().compare("RtabmapLabelErrorEvent") == 0)
|
||||||
|
{
|
||||||
|
RtabmapLabelErrorEvent * rtabmapLabelErrorEvent = (RtabmapLabelErrorEvent*)anEvent;
|
||||||
|
emit rtabmapLabelErrorReceived(rtabmapLabelErrorEvent->id(), QString(rtabmapLabelErrorEvent->label().c_str()));
|
||||||
|
}
|
||||||
else if(anEvent->getClassName().compare("CameraEvent") == 0)
|
else if(anEvent->getClassName().compare("CameraEvent") == 0)
|
||||||
{
|
{
|
||||||
CameraEvent * cameraEvent = (CameraEvent*)anEvent;
|
CameraEvent * cameraEvent = (CameraEvent*)anEvent;
|
||||||
@@ -1222,14 +1228,20 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
{
|
{
|
||||||
// update pose only if odometry is not received
|
// update pose only if odometry is not received
|
||||||
std::map<int, int> mapIds;
|
std::map<int, int> mapIds;
|
||||||
|
std::map<int, std::string> labels;
|
||||||
for(std::map<int, Signature>::const_iterator iter=stat.getSignatures().begin(); iter!=stat.getSignatures().end();++iter)
|
for(std::map<int, Signature>::const_iterator iter=stat.getSignatures().begin(); iter!=stat.getSignatures().end();++iter)
|
||||||
{
|
{
|
||||||
mapIds.insert(std::make_pair(iter->first, iter->second.mapId()));
|
mapIds.insert(std::make_pair(iter->first, iter->second.mapId()));
|
||||||
|
if(!iter->second.getLabel().empty())
|
||||||
|
{
|
||||||
|
labels.insert(std::make_pair(iter->first, iter->second.getLabel()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
updateMapCloud(stat.poses(),
|
updateMapCloud(stat.poses(),
|
||||||
_odometryReceived||stat.poses().size()==0?Transform():stat.poses().rbegin()->second,
|
_odometryReceived||stat.poses().size()==0?Transform():stat.poses().rbegin()->second,
|
||||||
stat.constraints(),
|
stat.constraints(),
|
||||||
mapIds);
|
mapIds,
|
||||||
|
labels);
|
||||||
|
|
||||||
_odometryReceived = false;
|
_odometryReceived = false;
|
||||||
|
|
||||||
@@ -1309,15 +1321,17 @@ void MainWindow::updateMapCloud(
|
|||||||
const Transform & currentPose,
|
const Transform & currentPose,
|
||||||
const std::multimap<int, Link> & constraints,
|
const std::multimap<int, Link> & constraints,
|
||||||
const std::map<int, int> & mapIdsIn,
|
const std::map<int, int> & mapIdsIn,
|
||||||
|
const std::map<int, std::string> & labels,
|
||||||
bool verboseProgress)
|
bool verboseProgress)
|
||||||
{
|
{
|
||||||
UDEBUG("posesIn=%d constraints=%d mapIdsIn=%d currentPose=%s",
|
UDEBUG("posesIn=%d constraints=%d mapIdsIn=%d labelsIn=%d currentPose=%s",
|
||||||
(int)posesIn.size(), (int)constraints.size(), (int)mapIdsIn.size(), currentPose.prettyPrint().c_str());
|
(int)posesIn.size(), (int)constraints.size(), (int)mapIdsIn.size(), (int)labels.size(), currentPose.prettyPrint().c_str());
|
||||||
if(posesIn.size())
|
if(posesIn.size())
|
||||||
{
|
{
|
||||||
_currentPosesMap = posesIn;
|
_currentPosesMap = posesIn;
|
||||||
_currentLinksMap = constraints;
|
_currentLinksMap = constraints;
|
||||||
_currentMapIds = mapIdsIn;
|
_currentMapIds = mapIdsIn;
|
||||||
|
_curentLabels = labels;
|
||||||
if(_currentPosesMap.size())
|
if(_currentPosesMap.size())
|
||||||
{
|
{
|
||||||
if(!_ui->actionSave_point_cloud->isEnabled() &&
|
if(!_ui->actionSave_point_cloud->isEnabled() &&
|
||||||
@@ -1542,6 +1556,30 @@ void MainWindow::updateMapCloud(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update labels
|
||||||
|
_ui->widget_cloudViewer->removeAllTexts();
|
||||||
|
if(_preferencesDialog->isLabelsShown() && labels.size())
|
||||||
|
{
|
||||||
|
for(std::map<int, std::string>::const_iterator iter=labels.begin(); iter!=labels.end(); ++iter)
|
||||||
|
{
|
||||||
|
if(posesIn.find(iter->first)!=posesIn.end())
|
||||||
|
{
|
||||||
|
int mapId = uValue(mapIdsIn, iter->first, -1);
|
||||||
|
QColor color = Qt::gray;
|
||||||
|
if(mapId >= 0)
|
||||||
|
{
|
||||||
|
color = (Qt::GlobalColor)((mapId+3) % 12 + 7 );
|
||||||
|
}
|
||||||
|
_ui->widget_cloudViewer->addOrUpdateText(
|
||||||
|
std::string("label_") + uNumber2Str(iter->first),
|
||||||
|
iter->second,
|
||||||
|
_currentPosesMap.at(iter->first),
|
||||||
|
0.1,
|
||||||
|
color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update occupancy grid map in 3D map view and graph view
|
// Update occupancy grid map in 3D map view and graph view
|
||||||
if(_ui->graphicsView_graphView->isVisible())
|
if(_ui->graphicsView_graphView->isVisible())
|
||||||
{
|
{
|
||||||
@@ -2059,11 +2097,16 @@ void MainWindow::processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap & eve
|
|||||||
|
|
||||||
int addedSignatures = 0;
|
int addedSignatures = 0;
|
||||||
std::map<int, int> mapIds;
|
std::map<int, int> mapIds;
|
||||||
|
std::map<int, std::string> labels;
|
||||||
for(std::map<int, Signature>::const_iterator iter = event.getSignatures().begin();
|
for(std::map<int, Signature>::const_iterator iter = event.getSignatures().begin();
|
||||||
iter!=event.getSignatures().end();
|
iter!=event.getSignatures().end();
|
||||||
++iter)
|
++iter)
|
||||||
{
|
{
|
||||||
mapIds.insert(std::make_pair(iter->first, iter->second.mapId()));
|
mapIds.insert(std::make_pair(iter->first, iter->second.mapId()));
|
||||||
|
if(!iter->second.getLabel().empty())
|
||||||
|
{
|
||||||
|
labels.insert(std::make_pair(iter->first, iter->second.getLabel()));
|
||||||
|
}
|
||||||
if(!_cachedSignatures.contains(iter->first) ||
|
if(!_cachedSignatures.contains(iter->first) ||
|
||||||
(_cachedSignatures.value(iter->first).sensorData().imageCompressed().empty() && !iter->second.sensorData().imageCompressed().empty()))
|
(_cachedSignatures.value(iter->first).sensorData().imageCompressed().empty() && !iter->second.sensorData().imageCompressed().empty()))
|
||||||
{
|
{
|
||||||
@@ -2084,7 +2127,7 @@ void MainWindow::processRtabmapEvent3DMap(const rtabmap::RtabmapEvent3DMap & eve
|
|||||||
_initProgressDialog->appendText("Updating the 3D map cloud...");
|
_initProgressDialog->appendText("Updating the 3D map cloud...");
|
||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
QApplication::processEvents();
|
QApplication::processEvents();
|
||||||
this->updateMapCloud(event.getPoses(), Transform(), event.getConstraints(), mapIds, true);
|
this->updateMapCloud(event.getPoses(), Transform(), event.getConstraints(), mapIds, labels, true);
|
||||||
_initProgressDialog->appendText("Updating the 3D map cloud... done.");
|
_initProgressDialog->appendText("Updating the 3D map cloud... done.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2142,6 +2185,21 @@ void MainWindow::processRtabmapGlobalPathEvent(const rtabmap::RtabmapGlobalPathE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::processRtabmapLabelErrorEvent(int id, const QString & label)
|
||||||
|
{
|
||||||
|
QMessageBox * warn = new QMessageBox(
|
||||||
|
QMessageBox::Warning,
|
||||||
|
tr("Setting label failed!"),
|
||||||
|
tr("Setting label %1 to location %2 failed. "
|
||||||
|
"Some reasons: \n"
|
||||||
|
"1) the location doesn't exist in the map,\n"
|
||||||
|
"2) the location has already a label.").arg(label).arg(id),
|
||||||
|
QMessageBox::Ok,
|
||||||
|
this);
|
||||||
|
warn->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
warn->show();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::applyPrefSettings(PreferencesDialog::PANEL_FLAGS flags)
|
void MainWindow::applyPrefSettings(PreferencesDialog::PANEL_FLAGS flags)
|
||||||
{
|
{
|
||||||
ULOGGER_DEBUG("");
|
ULOGGER_DEBUG("");
|
||||||
@@ -2197,7 +2255,8 @@ void MainWindow::applyPrefSettings(PreferencesDialog::PANEL_FLAGS flags)
|
|||||||
std::map<int, Transform>(_currentPosesMap),
|
std::map<int, Transform>(_currentPosesMap),
|
||||||
Transform(),
|
Transform(),
|
||||||
std::multimap<int, Link>(_currentLinksMap),
|
std::multimap<int, Link>(_currentLinksMap),
|
||||||
std::map<int, int>(_currentMapIds));
|
std::map<int, int>(_currentMapIds),
|
||||||
|
std::map<int, std::string>(_curentLabels));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3687,7 +3746,12 @@ void MainWindow::postProcessing()
|
|||||||
_initProgressDialog->incrementStep();
|
_initProgressDialog->incrementStep();
|
||||||
|
|
||||||
_initProgressDialog->appendText(tr("Updating map..."));
|
_initProgressDialog->appendText(tr("Updating map..."));
|
||||||
this->updateMapCloud(optimizedPoses, Transform(), std::multimap<int, Link>(_currentLinksMap), std::map<int, int>(_currentMapIds), false);
|
this->updateMapCloud(
|
||||||
|
optimizedPoses, Transform(),
|
||||||
|
std::multimap<int, Link>(_currentLinksMap),
|
||||||
|
std::map<int, int>(_currentMapIds),
|
||||||
|
std::map<int, std::string>(_curentLabels),
|
||||||
|
false);
|
||||||
_initProgressDialog->appendText(tr("Updating map... done!"));
|
_initProgressDialog->appendText(tr("Updating map... done!"));
|
||||||
|
|
||||||
_initProgressDialog->setValue(_initProgressDialog->maximumSteps());
|
_initProgressDialog->setValue(_initProgressDialog->maximumSteps());
|
||||||
@@ -3848,6 +3912,17 @@ void MainWindow::cancelGoal()
|
|||||||
this->post(new RtabmapEventCmd(RtabmapEventCmd::kCmdCancelGoal));
|
this->post(new RtabmapEventCmd(RtabmapEventCmd::kCmdCancelGoal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::label()
|
||||||
|
{
|
||||||
|
UINFO("Labelling current location...");
|
||||||
|
bool ok = false;
|
||||||
|
QString label = QInputDialog::getText(this, tr("Label current location"), tr("Label: "), QLineEdit::Normal, "", &ok);
|
||||||
|
if(ok && !label.isEmpty())
|
||||||
|
{
|
||||||
|
this->post(new RtabmapEventCmd(RtabmapEventCmd::kCmdLabel, label.toStdString(), 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::downloadAllClouds()
|
void MainWindow::downloadAllClouds()
|
||||||
{
|
{
|
||||||
QStringList items;
|
QStringList items;
|
||||||
@@ -3957,14 +4032,14 @@ void MainWindow::clearTheCache()
|
|||||||
_createdScans.clear();
|
_createdScans.clear();
|
||||||
_gridLocalMaps.clear();
|
_gridLocalMaps.clear();
|
||||||
_projectionLocalMaps.clear();
|
_projectionLocalMaps.clear();
|
||||||
_ui->widget_cloudViewer->removeAllClouds();
|
_ui->widget_cloudViewer->clear();
|
||||||
_ui->widget_cloudViewer->removeAllGraphs();
|
|
||||||
_ui->widget_cloudViewer->setBackgroundColor(_ui->widget_cloudViewer->getDefaultBackgroundColor());
|
_ui->widget_cloudViewer->setBackgroundColor(_ui->widget_cloudViewer->getDefaultBackgroundColor());
|
||||||
_ui->widget_cloudViewer->clearTrajectory();
|
_ui->widget_cloudViewer->clearTrajectory();
|
||||||
_ui->widget_mapVisibility->clear();
|
_ui->widget_mapVisibility->clear();
|
||||||
_currentPosesMap.clear();
|
_currentPosesMap.clear();
|
||||||
_currentLinksMap.clear();
|
_currentLinksMap.clear();
|
||||||
_currentMapIds.clear();
|
_currentMapIds.clear();
|
||||||
|
_curentLabels.clear();
|
||||||
_odometryCorrection = Transform::getIdentity();
|
_odometryCorrection = Transform::getIdentity();
|
||||||
_lastOdomPose.setNull();
|
_lastOdomPose.setNull();
|
||||||
//disable save cloud action
|
//disable save cloud action
|
||||||
|
|||||||
@@ -292,6 +292,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
connect(_ui->checkBox_showGraphs, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->checkBox_showGraphs, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
connect(_ui->checkBox_showLabels, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
|
|
||||||
connect(_ui->checkBox_meshing, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->checkBox_meshing, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
|
||||||
@@ -1007,6 +1008,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
}
|
}
|
||||||
|
|
||||||
_ui->checkBox_showGraphs->setChecked(true);
|
_ui->checkBox_showGraphs->setChecked(true);
|
||||||
|
_ui->checkBox_showLabels->setChecked(true);
|
||||||
|
|
||||||
_ui->checkBox_meshing->setChecked(false);
|
_ui->checkBox_meshing->setChecked(false);
|
||||||
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
|
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
|
||||||
@@ -1289,6 +1291,7 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
|
|||||||
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
|
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
|
||||||
}
|
}
|
||||||
_ui->checkBox_showGraphs->setChecked(settings.value("showGraphs", _ui->checkBox_showGraphs->isChecked()).toBool());
|
_ui->checkBox_showGraphs->setChecked(settings.value("showGraphs", _ui->checkBox_showGraphs->isChecked()).toBool());
|
||||||
|
_ui->checkBox_showLabels->setChecked(settings.value("showLabels", _ui->checkBox_showLabels->isChecked()).toBool());
|
||||||
|
|
||||||
_ui->checkBox_meshing->setChecked(settings.value("meshing", _ui->checkBox_meshing->isChecked()).toBool());
|
_ui->checkBox_meshing->setChecked(settings.value("meshing", _ui->checkBox_meshing->isChecked()).toBool());
|
||||||
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
|
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
|
||||||
@@ -1589,6 +1592,7 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath) const
|
|||||||
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
|
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
|
||||||
}
|
}
|
||||||
settings.setValue("showGraphs", _ui->checkBox_showGraphs->isChecked());
|
settings.setValue("showGraphs", _ui->checkBox_showGraphs->isChecked());
|
||||||
|
settings.setValue("showLabels", _ui->checkBox_showLabels->isChecked());
|
||||||
|
|
||||||
settings.setValue("meshing", _ui->checkBox_meshing->isChecked());
|
settings.setValue("meshing", _ui->checkBox_meshing->isChecked());
|
||||||
settings.setValue("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value());
|
settings.setValue("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value());
|
||||||
@@ -3076,6 +3080,10 @@ bool PreferencesDialog::isGraphsShown() const
|
|||||||
{
|
{
|
||||||
return _ui->checkBox_showGraphs->isChecked();
|
return _ui->checkBox_showGraphs->isChecked();
|
||||||
}
|
}
|
||||||
|
bool PreferencesDialog::isLabelsShown() const
|
||||||
|
{
|
||||||
|
return _ui->checkBox_showLabels->isChecked();
|
||||||
|
}
|
||||||
bool PreferencesDialog::isCloudMeshing() const
|
bool PreferencesDialog::isCloudMeshing() const
|
||||||
{
|
{
|
||||||
return _ui->checkBox_meshing->isChecked();
|
return _ui->checkBox_meshing->isChecked();
|
||||||
|
|||||||
@@ -63,6 +63,7 @@
|
|||||||
<addaction name="actionGenerate_TORO_graph_graph"/>
|
<addaction name="actionGenerate_TORO_graph_graph"/>
|
||||||
<addaction name="actionExport_poses_txt"/>
|
<addaction name="actionExport_poses_txt"/>
|
||||||
<addaction name="actionPrint_loop_closure_IDs_to_console"/>
|
<addaction name="actionPrint_loop_closure_IDs_to_console"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
<addaction name="actionSend_goal"/>
|
<addaction name="actionSend_goal"/>
|
||||||
<addaction name="actionCancel_goal"/>
|
<addaction name="actionCancel_goal"/>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -202,6 +203,8 @@
|
|||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionReset_Odometry"/>
|
<addaction name="actionReset_Odometry"/>
|
||||||
<addaction name="actionTrigger_a_new_map"/>
|
<addaction name="actionTrigger_a_new_map"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionLabel_current_location"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuWindow">
|
<widget class="QMenu" name="menuWindow">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
@@ -1233,6 +1236,11 @@
|
|||||||
<string>More options...</string>
|
<string>More options...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionLabel_current_location">
|
||||||
|
<property name="text">
|
||||||
|
<string>Label current location...</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-625</y>
|
||||||
<width>755</width>
|
<width>760</width>
|
||||||
<height>1591</height>
|
<height>1570</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>3</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29">
|
<layout class="QVBoxLayout" name="verticalLayout_29">
|
||||||
@@ -676,6 +676,25 @@ 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="6" column="1">
|
||||||
|
<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="9" column="0">
|
<item row="9" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_showScans">
|
<widget class="QCheckBox" name="checkBox_showScans">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -915,25 +934,6 @@ 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">
|
|
||||||
<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="6" 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">
|
||||||
@@ -1022,7 +1022,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_meshing">
|
<widget class="QCheckBox" name="checkBox_meshing">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1084,7 +1084,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_168">
|
<widget class="QLabel" name="label_168">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sphere radius that is to be used for determining the k-nearest neighbors used for triangulating (GP3). Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
<string>Sphere radius that is to be used for determining the k-nearest neighbors used for triangulating (GP3). Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
||||||
@@ -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="17" column="2">
|
<item row="18" column="2">
|
||||||
<widget class="QLabel" name="label_85">
|
<widget class="QLabel" name="label_85">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Mesh smoothing using Moving Least Squares algorithm (MLS).</string>
|
<string>Mesh smoothing using Moving Least Squares algorithm (MLS).</string>
|
||||||
@@ -1110,7 +1110,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="QDoubleSpinBox" name="doubleSpinBox_gp3Radius">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_gp3Radius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1129,7 +1129,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="18" column="0">
|
<item row="19" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -1148,7 +1148,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_169">
|
<widget class="QLabel" name="label_169">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Online meshing using Greedy Projection Triangulation (GP3).</string>
|
<string>Online meshing using Greedy Projection Triangulation (GP3).</string>
|
||||||
@@ -1161,7 +1161,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="18" column="2">
|
<item row="19" column="2">
|
||||||
<widget class="QLabel" name="label_87">
|
<widget class="QLabel" name="label_87">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>MLS search radius: Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting. Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
<string>MLS search radius: Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting. Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
||||||
@@ -1174,7 +1174,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="17" column="0">
|
<item row="18" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_mls">
|
<widget class="QCheckBox" name="checkBox_mls">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -1184,7 +1184,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_71">
|
<widget class="QLabel" name="label_71">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Set the number of k nearest neighbors to use for the normal estimation to create the mesh. Not used when mesh smoothing below is used.</string>
|
<string>Set the number of k nearest neighbors to use for the normal estimation to create the mesh. Not used when mesh smoothing below is used.</string>
|
||||||
@@ -1197,7 +1197,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_normalKSearch">
|
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>20</number>
|
<number>20</number>
|
||||||
@@ -1227,6 +1227,29 @@ 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">
|
||||||
|
<widget class="QLabel" name="label_243">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show labels.</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="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_showLabels">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user