mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-03 16:27:46 +08:00
Found a workaround for Issue 5 to avoid segmentation faults. The data included in the created window are cleared, but the window itself is not destroyed, only when its parent is deleted -> here the MainWindow. It seems that child CloudViewer windows don't crash when deleted on application exit.
git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1826 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
@@ -155,6 +155,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();}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void keyReleaseEvent(QKeyEvent * event);
|
virtual void keyReleaseEvent(QKeyEvent * event);
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ public:
|
|||||||
OdometryViewer(int maxClouds = 10, int decimation = 2, float voxelSize = 0.0f, int qualityWarningThr=0, QWidget * parent = 0);
|
OdometryViewer(int maxClouds = 10, int decimation = 2, float voxelSize = 0.0f, int qualityWarningThr=0, QWidget * parent = 0);
|
||||||
virtual ~OdometryViewer() {}
|
virtual ~OdometryViewer() {}
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
virtual void clear();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void handleAction(QAction * a);
|
void handleAction(QAction * a);
|
||||||
virtual void handleEvent(UEvent * event);
|
virtual void handleEvent(UEvent * event);
|
||||||
|
|||||||
@@ -407,8 +407,9 @@ void DatabaseViewer::updateIds()
|
|||||||
std::map<int, int> nids = memory_->getNeighborsId(memory_->getLastWorkingSignature()->id(), 0, -1, true);
|
std::map<int, int> nids = memory_->getNeighborsId(memory_->getLastWorkingSignature()->id(), 0, -1, true);
|
||||||
memory_->getMetricConstraints(uKeys(nids), poses_, links_, true);
|
memory_->getMetricConstraints(uKeys(nids), poses_, links_, true);
|
||||||
|
|
||||||
ui_->spinBox_optimizationsFrom->setRange(1, memory_->getLastWorkingSignature()->id());
|
int first = nids.begin()->first;
|
||||||
ui_->spinBox_optimizationsFrom->setValue(memory_->getLastWorkingSignature()->id());
|
ui_->spinBox_optimizationsFrom->setRange(first, memory_->getLastWorkingSignature()->id());
|
||||||
|
ui_->spinBox_optimizationsFrom->setValue(first);
|
||||||
}
|
}
|
||||||
|
|
||||||
ui_->actionGenerate_TORO_graph_graph->setEnabled(false);
|
ui_->actionGenerate_TORO_graph_graph->setEnabled(false);
|
||||||
@@ -740,8 +741,8 @@ void DatabaseViewer::view3DMap()
|
|||||||
progressDialog.incrementStep();
|
progressDialog.incrementStep();
|
||||||
|
|
||||||
// create a window
|
// create a window
|
||||||
QWidget * window = new QWidget(this, Qt::Window);
|
QDialog * window = new QDialog(this, Qt::Window);
|
||||||
window->setAttribute(Qt::WA_DeleteOnClose);
|
window->setModal(this->isModal());
|
||||||
window->setWindowTitle(tr("3D Map"));
|
window->setWindowTitle(tr("3D Map"));
|
||||||
window->setMinimumWidth(800);
|
window->setMinimumWidth(800);
|
||||||
window->setMinimumHeight(600);
|
window->setMinimumHeight(600);
|
||||||
@@ -752,8 +753,9 @@ void DatabaseViewer::view3DMap()
|
|||||||
layout->addWidget(viewer);
|
layout->addWidget(viewer);
|
||||||
viewer->setCameraLockZ(false);
|
viewer->setCameraLockZ(false);
|
||||||
window->setLayout(layout);
|
window->setLayout(layout);
|
||||||
|
connect(window, SIGNAL(finished(int)), viewer, SLOT(clear()));
|
||||||
|
|
||||||
window->showNormal();
|
window->show();
|
||||||
|
|
||||||
for(std::map<int, Transform>::iterator iter = optimizedPoses.begin(); iter!=optimizedPoses.end(); ++iter)
|
for(std::map<int, Transform>::iterator iter = optimizedPoses.begin(); iter!=optimizedPoses.end(); ++iter)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3056,8 +3056,7 @@ void MainWindow::viewScans()
|
|||||||
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr> scans;
|
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr> scans;
|
||||||
if(getExportedScans(scans))
|
if(getExportedScans(scans))
|
||||||
{
|
{
|
||||||
QWidget * window = new QWidget(this, Qt::Window);
|
QDialog * window = new QDialog(this, Qt::Window);
|
||||||
window->setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
window->setWindowFlags(Qt::Dialog);
|
window->setWindowFlags(Qt::Dialog);
|
||||||
window->setWindowTitle(tr("Scans (%1 nodes)").arg(scans.size()));
|
window->setWindowTitle(tr("Scans (%1 nodes)").arg(scans.size()));
|
||||||
window->setMinimumWidth(800);
|
window->setMinimumWidth(800);
|
||||||
@@ -3069,6 +3068,7 @@ void MainWindow::viewScans()
|
|||||||
QVBoxLayout *layout = new QVBoxLayout();
|
QVBoxLayout *layout = new QVBoxLayout();
|
||||||
layout->addWidget(viewer);
|
layout->addWidget(viewer);
|
||||||
window->setLayout(layout);
|
window->setLayout(layout);
|
||||||
|
connect(window, SIGNAL(finished(int)), viewer, SLOT(clear()));
|
||||||
|
|
||||||
window->show();
|
window->show();
|
||||||
|
|
||||||
@@ -3208,8 +3208,7 @@ void MainWindow::viewClouds()
|
|||||||
|
|
||||||
if(getExportedClouds(clouds, meshes, false))
|
if(getExportedClouds(clouds, meshes, false))
|
||||||
{
|
{
|
||||||
QWidget * window = new QWidget(this, Qt::Window);
|
QDialog * window = new QDialog(this, Qt::Window);
|
||||||
window->setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
if(meshes.size())
|
if(meshes.size())
|
||||||
{
|
{
|
||||||
window->setWindowTitle(tr("Meshes (%1 nodes)").arg(meshes.size()));
|
window->setWindowTitle(tr("Meshes (%1 nodes)").arg(meshes.size()));
|
||||||
@@ -3227,6 +3226,7 @@ void MainWindow::viewClouds()
|
|||||||
QVBoxLayout *layout = new QVBoxLayout();
|
QVBoxLayout *layout = new QVBoxLayout();
|
||||||
layout->addWidget(viewer);
|
layout->addWidget(viewer);
|
||||||
window->setLayout(layout);
|
window->setLayout(layout);
|
||||||
|
connect(window, SIGNAL(finished(int)), viewer, SLOT(clear()));
|
||||||
|
|
||||||
window->show();
|
window->show();
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,15 @@ OdometryViewer::OdometryViewer(int maxClouds, int decimation, float voxelSize, i
|
|||||||
menu()->addAction(_aPause);
|
menu()->addAction(_aPause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OdometryViewer::clear()
|
||||||
|
{
|
||||||
|
dataMutex_.lock();
|
||||||
|
data_.clear();
|
||||||
|
dataMutex_.unlock();
|
||||||
|
clouds_.clear();
|
||||||
|
CloudViewer::clear();
|
||||||
|
}
|
||||||
|
|
||||||
void OdometryViewer::processData()
|
void OdometryViewer::processData()
|
||||||
{
|
{
|
||||||
rtabmap::SensorData data;
|
rtabmap::SensorData data;
|
||||||
|
|||||||
@@ -1798,7 +1798,6 @@ void PreferencesDialog::selectSourceRGBD(Src src)
|
|||||||
void PreferencesDialog::openDatabaseViewer()
|
void PreferencesDialog::openDatabaseViewer()
|
||||||
{
|
{
|
||||||
DatabaseViewer * viewer = new DatabaseViewer(this);
|
DatabaseViewer * viewer = new DatabaseViewer(this);
|
||||||
viewer->setAttribute(Qt::WA_DeleteOnClose, true);
|
|
||||||
viewer->setWindowModality(Qt::WindowModal);
|
viewer->setWindowModality(Qt::WindowModal);
|
||||||
if(viewer->openDatabase(_ui->source_database_lineEdit_path->text()))
|
if(viewer->openDatabase(_ui->source_database_lineEdit_path->text()))
|
||||||
{
|
{
|
||||||
@@ -2978,16 +2977,19 @@ void PreferencesDialog::testOdometry(int type)
|
|||||||
|
|
||||||
_odomThread = new OdometryThread(odometry); // take ownership of odometry
|
_odomThread = new OdometryThread(odometry); // take ownership of odometry
|
||||||
|
|
||||||
QWidget * window = new QWidget(this, Qt::Popup);
|
QDialog * window = new QDialog(this);
|
||||||
window->setWindowModality(Qt::WindowModal);
|
window->setWindowModality(Qt::WindowModal);
|
||||||
window->setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
window->setWindowFlags(Qt::Dialog);
|
|
||||||
window->setWindowTitle(tr("Odometry viewer"));
|
window->setWindowTitle(tr("Odometry viewer"));
|
||||||
window->setMinimumWidth(800);
|
window->setMinimumWidth(800);
|
||||||
window->setMinimumHeight(600);
|
window->setMinimumHeight(600);
|
||||||
connect( window, SIGNAL(destroyed(QObject*)), this, SLOT(cleanOdometryTest()) );
|
connect( window, SIGNAL(finished(int)), this, SLOT(cleanOdometryTest()) );
|
||||||
|
|
||||||
OdometryViewer * odomViewer = new OdometryViewer(10, 2, 0.0, this->getOdomQualityWarnThr(), window);
|
OdometryViewer * odomViewer = new OdometryViewer(10,
|
||||||
|
_ui->spinBox_decimation_odom->value(),
|
||||||
|
_ui->doubleSpinBox_voxelSize_odom->value(),
|
||||||
|
this->getOdomQualityWarnThr(),
|
||||||
|
window);
|
||||||
|
connect( window, SIGNAL(finished(int)), odomViewer, SLOT(clear()) );
|
||||||
|
|
||||||
odomViewer->setCameraFree();
|
odomViewer->setCameraFree();
|
||||||
odomViewer->setGridShown(true);
|
odomViewer->setGridShown(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user