DBReader now inherits from Camera (so that CameraThread's post processing stuff can be used with a database stream)

This commit is contained in:
matlabbe
2016-06-21 11:22:24 -04:00
parent cdddb1209e
commit 0ec39e3c77
20 changed files with 435 additions and 642 deletions
-4
View File
@@ -47,9 +47,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace rtabmap {
class CameraThread;
class DBReader;
class CameraOpenni;
class CameraFreenect;
class OdometryThread;
class CloudViewer;
class LoopClosureViewer;
@@ -254,7 +251,6 @@ private:
State _state;
rtabmap::CameraThread * _camera;
rtabmap::DBReader * _dbReader;
rtabmap::OdometryThread * _odomThread;
//Dialogs
@@ -203,13 +203,7 @@ public:
QString getSourceDriverStr() const;
QString getSourceDevice() const;
QString getSourceDatabasePath() const; //Database group
bool getSourceDatabaseOdometryIgnored() const; //Database group
bool getSourceDatabaseGoalDelayIgnored() const; //Database group
bool getSourceDatabaseGoalsIgnored() const; //Database group
int getSourceDatabaseStartPos() const; //Database group
bool getSourceDatabaseStampsUsed() const;//Database group
int getSourceDatabaseCameraIndex() const; //Database group
bool getSourceDatabaseStampsUsed() const;
bool isSourceRGBDColorOnly() const;
int getSourceImageDecimation() const;
bool isSourceStereoDepthGenerated() const;
+58 -149
View File
@@ -126,7 +126,6 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent) :
_ui(0),
_state(kIdle),
_camera(0),
_dbReader(0),
_odomThread(0),
_preferencesDialog(0),
_aboutDialog(0),
@@ -671,12 +670,6 @@ void MainWindow::closeEvent(QCloseEvent* event)
delete _camera;
_camera = 0;
}
if(_dbReader)
{
UERROR("DBReader must be already deleted here!");
delete _dbReader;
_dbReader = 0;
}
if(_odomThread)
{
UERROR("OdomThread must be already deleted here!");
@@ -3131,12 +3124,16 @@ void MainWindow::applyPrefSettings(PreferencesDialog::PANEL_FLAGS flags)
if(_camera)
{
_camera->setImageRate(_preferencesDialog->getGeneralInputRate());
}
if(_dbReader)
{
_dbReader->setFrameRate( _preferencesDialog->getSourceDatabaseStampsUsed()?-1:_preferencesDialog->getGeneralInputRate());
if(dynamic_cast<DBReader*>(_camera->camera()) != 0)
{
_camera->setImageRate( _preferencesDialog->getSourceDatabaseStampsUsed()?-1:_preferencesDialog->getGeneralInputRate());
}
else
{
_camera->setImageRate(_preferencesDialog->getGeneralInputRate());
}
}
}//This will update the statistics toolbox
if(flags & PreferencesDialog::kPanelGeneral)
@@ -3798,15 +3795,6 @@ void MainWindow::startDetection()
emit stateChanged(kInitialized);
return;
}
if(_dbReader != 0)
{
QMessageBox::warning(this,
tr("RTAB-Map"),
tr("A database reader is running, stop it first."));
UWARN("_dbReader is not null... it must be stopped first");
emit stateChanged(kInitialized);
return;
}
// Adjust pre-requirements
if(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcUndef)
@@ -3820,56 +3808,58 @@ void MainWindow::startDetection()
}
if(_preferencesDialog->getSourceDriver() < PreferencesDialog::kSrcDatabase)
Camera * camera = _preferencesDialog->createCamera();
if(!camera)
{
Camera * camera = _preferencesDialog->createCamera();
if(!camera)
emit stateChanged(kInitialized);
return;
}
_camera = new CameraThread(camera, parameters);
_camera->setMirroringEnabled(_preferencesDialog->isSourceMirroring());
_camera->setColorOnly(_preferencesDialog->isSourceRGBDColorOnly());
_camera->setImageDecimation(_preferencesDialog->getSourceImageDecimation());
_camera->setStereoToDepth(_preferencesDialog->isSourceStereoDepthGenerated());
_camera->setScanFromDepth(
_preferencesDialog->isSourceScanFromDepth(),
_preferencesDialog->getSourceScanFromDepthDecimation(),
_preferencesDialog->getSourceScanFromDepthMaxDepth(),
_preferencesDialog->getSourceScanVoxelSize(),
_preferencesDialog->getSourceScanNormalsK());
//Create odometry thread if rgbd slam
if(uStr2Bool(parameters.at(Parameters::kRGBDEnabled()).c_str()))
{
// Require calibrated camera
if(!camera->isCalibrated())
{
UWARN("Camera is not calibrated!");
emit stateChanged(kInitialized);
delete _camera;
_camera = 0;
int button = QMessageBox::question(this,
tr("Camera is not calibrated!"),
tr("RTAB-Map cannot run with an uncalibrated camera. Do you want to calibrate the camera now?"),
QMessageBox::Yes | QMessageBox::No);
if(button == QMessageBox::Yes)
{
QTimer::singleShot(0, _preferencesDialog, SLOT(calibrate()));
}
return;
}
_camera = new CameraThread(camera, parameters);
_camera->setMirroringEnabled(_preferencesDialog->isSourceMirroring());
_camera->setColorOnly(_preferencesDialog->isSourceRGBDColorOnly());
_camera->setImageDecimation(_preferencesDialog->getSourceImageDecimation());
_camera->setStereoToDepth(_preferencesDialog->isSourceStereoDepthGenerated());
_camera->setScanFromDepth(
_preferencesDialog->isSourceScanFromDepth(),
_preferencesDialog->getSourceScanFromDepthDecimation(),
_preferencesDialog->getSourceScanFromDepthMaxDepth(),
_preferencesDialog->getSourceScanVoxelSize(),
_preferencesDialog->getSourceScanNormalsK());
//Create odometry thread if rgbd slam
if(uStr2Bool(parameters.at(Parameters::kRGBDEnabled()).c_str()))
else
{
// Require calibrated camera
if(!camera->isCalibrated())
if(_odomThread)
{
UWARN("Camera is not calibrated!");
emit stateChanged(kInitialized);
delete _camera;
_camera = 0;
int button = QMessageBox::question(this,
tr("Camera is not calibrated!"),
tr("RTAB-Map cannot run with an uncalibrated camera. Do you want to calibrate the camera now?"),
QMessageBox::Yes | QMessageBox::No);
if(button == QMessageBox::Yes)
{
QTimer::singleShot(0, _preferencesDialog, SLOT(calibrate()));
}
return;
UERROR("OdomThread must be already deleted here?!");
delete _odomThread;
_odomThread = 0;
}
else
DBReader* dbReader = dynamic_cast<DBReader*>(camera);
if(dbReader == 0 || dbReader->isOdometryIgnored())
{
if(_odomThread)
{
UERROR("OdomThread must be already deleted here?!");
delete _odomThread;
_odomThread = 0;
}
Odometry * odom = Odometry::create(parameters);
_odomThread = new OdometryThread(odom, _preferencesDialog->getOdomBufferSize());
@@ -3880,65 +3870,10 @@ void MainWindow::startDetection()
}
}
}
else if(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcDatabase)
if(_dataRecorder && _camera)
{
_dbReader = new DBReader(_preferencesDialog->getSourceDatabasePath().toStdString(),
_preferencesDialog->getSourceDatabaseStampsUsed()?-1:_preferencesDialog->getGeneralInputRate(),
_preferencesDialog->getSourceDatabaseOdometryIgnored(),
_preferencesDialog->getSourceDatabaseGoalDelayIgnored(),
_preferencesDialog->getSourceDatabaseGoalsIgnored(),
_preferencesDialog->getSourceDatabaseCameraIndex());
//Create odometry thread if rgdb slam
if(uStr2Bool(parameters.at(Parameters::kRGBDEnabled()).c_str()) &&
_preferencesDialog->getSourceDatabaseOdometryIgnored())
{
if(_odomThread)
{
UERROR("OdomThread must be already deleted here?!");
delete _odomThread;
}
Odometry * odom = Odometry::create(parameters);
_odomThread = new OdometryThread(odom, _preferencesDialog->getOdomBufferSize());
UEventsManager::addHandler(_odomThread);
_odomThread->start();
}
if(!_dbReader->init(_preferencesDialog->getSourceDatabaseStartPos()))
{
ULOGGER_WARN("init DBReader failed... ");
QMessageBox::warning(this,
tr("RTAB-Map"),
tr("Database reader initialization failed..."));
emit stateChanged(kInitialized);
delete _dbReader;
_dbReader = 0;
if(_odomThread)
{
delete _odomThread;
_odomThread = 0;
}
return;
}
if(_odomThread)
{
UEventsManager::createPipe(_dbReader, _odomThread, "CameraEvent");
UEventsManager::createPipe(_dbReader, this, "CameraEvent");
}
}
if(_dataRecorder)
{
if(_camera)
{
UEventsManager::createPipe(_camera, _dataRecorder, "CameraEvent");
}
else if(_dbReader)
{
UEventsManager::createPipe(_dbReader, _dataRecorder, "CameraEvent");
}
UEventsManager::createPipe(_camera, _dataRecorder, "CameraEvent");
}
_lastOdomPose.setNull();
@@ -3964,7 +3899,7 @@ void MainWindow::startDetection()
// Could not be in the main thread here! (see handleEvents())
void MainWindow::pauseDetection()
{
if(_camera || _dbReader)
if(_camera)
{
if(_state == kPaused && (QApplication::keyboardModifiers() & Qt::ShiftModifier))
{
@@ -3998,14 +3933,13 @@ void MainWindow::pauseDetection()
void MainWindow::stopDetection()
{
if(!_camera && !_dbReader && !_odomThread)
if(!_camera && !_odomThread)
{
return;
}
if(_state == kDetecting &&
( (_camera && _camera->isRunning()) ||
(_dbReader && _dbReader->isRunning()) ) )
(_camera && _camera->isRunning()) )
{
QMessageBox::StandardButton button = QMessageBox::question(this, tr("Stopping process..."), tr("Are you sure you want to stop the process?"), QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
@@ -4022,11 +3956,6 @@ void MainWindow::stopDetection()
_camera->join(true);
}
if(_dbReader)
{
_dbReader->join(true);
}
if(_odomThread)
{
_ui->actionReset_Odometry->setEnabled(false);
@@ -4039,11 +3968,6 @@ void MainWindow::stopDetection()
delete _camera;
_camera = 0;
}
if(_dbReader)
{
delete _dbReader;
_dbReader = 0;
}
if(_odomThread)
{
delete _odomThread;
@@ -5923,11 +5847,6 @@ void MainWindow::changeState(MainWindow::State newState)
{
_camera->start();
}
if(_dbReader)
{
_dbReader->start();
}
break;
case kPaused:
@@ -5959,11 +5878,6 @@ void MainWindow::changeState(MainWindow::State newState)
{
_camera->start();
}
if(_dbReader)
{
_dbReader->start();
}
}
else if(_state == kDetecting)
{
@@ -5993,11 +5907,6 @@ void MainWindow::changeState(MainWindow::State newState)
{
_camera->join(true);
}
if(_dbReader)
{
_dbReader->join(true);
}
}
break;
case kMonitoring:
+50 -133
View File
@@ -3520,7 +3520,7 @@ void PreferencesDialog::updateSourceGrpVisibility()
_ui->groupBox_sourceRGB->setVisible(_ui->comboBox_sourceType->currentIndex() == 2);
_ui->groupBox_sourceDatabase->setVisible(_ui->comboBox_sourceType->currentIndex() == 3);
_ui->groupBox_scanFromDepth->setVisible(_ui->comboBox_sourceType->currentIndex() <= 1);
_ui->groupBox_scanFromDepth->setVisible(_ui->comboBox_sourceType->currentIndex() <= 1 || _ui->comboBox_sourceType->currentIndex() == 3);
_ui->stackedWidget_rgbd->setVisible(_ui->comboBox_sourceType->currentIndex() == 0 &&
(_ui->comboBox_cameraRGBD->currentIndex() == kSrcOpenNI2-kSrcRGBD ||
@@ -3549,7 +3549,7 @@ void PreferencesDialog::updateSourceGrpVisibility()
(_ui->comboBox_sourceType->currentIndex() == 1 && _ui->comboBox_cameraStereo->currentIndex() == kSrcStereoImages-kSrcStereo) ||
(_ui->comboBox_sourceType->currentIndex() == 2 && _ui->source_comboBox_image_type->currentIndex() == kSrcImages-kSrcRGB));
_ui->groupBox_scan->setVisible(_ui->comboBox_sourceType->currentIndex() != 3);
//_ui->groupBox_scan->setVisible(_ui->comboBox_sourceType->currentIndex() != 3);
_ui->groupBox_depthFromScan->setVisible(_ui->comboBox_sourceType->currentIndex() == 2 && _ui->source_comboBox_image_type->currentIndex() == kSrcImages-kSrcRGB);
}
@@ -3891,30 +3891,6 @@ Transform PreferencesDialog::getLaserLocalTransform() const
return t;
}
QString PreferencesDialog::getSourceDatabasePath() const
{
return _ui->source_database_lineEdit_path->text();
}
bool PreferencesDialog::getSourceDatabaseOdometryIgnored() const
{
return _ui->source_checkBox_ignoreOdometry->isChecked();
}
bool PreferencesDialog::getSourceDatabaseGoalDelayIgnored() const
{
return _ui->source_checkBox_ignoreGoalDelay->isChecked();
}
bool PreferencesDialog::getSourceDatabaseGoalsIgnored() const
{
return _ui->source_checkBox_ignoreGoals->isChecked();
}
int PreferencesDialog::getSourceDatabaseStartPos() const
{
return _ui->source_spinBox_databaseStartPos->value();
}
int PreferencesDialog::getSourceDatabaseCameraIndex() const
{
return _ui->source_spinBox_database_cameraIndex->value();
}
bool PreferencesDialog::getSourceDatabaseStampsUsed() const
{
return _ui->source_checkBox_useDbStamps->isChecked();
@@ -4193,8 +4169,13 @@ Camera * PreferencesDialog::createCamera(bool useRawImages)
}
else if(driver == kSrcDatabase)
{
UERROR("Call directly DBReader for kSrcDatabase.");
return 0;
camera = new DBReader(_ui->source_database_lineEdit_path->text().toStdString(),
_ui->source_checkBox_useDbStamps->isChecked()?-1:this->getGeneralInputRate(),
_ui->source_checkBox_ignoreOdometry->isChecked(),
_ui->source_checkBox_ignoreGoalDelay->isChecked(),
_ui->source_checkBox_ignoreGoals->isChecked(),
_ui->source_spinBox_databaseStartPos->value(),
_ui->source_spinBox_database_cameraIndex->value());
}
else
{
@@ -4376,30 +4357,11 @@ void PreferencesDialog::setSLAMMode(bool enabled)
void PreferencesDialog::testOdometry()
{
DBReader dbReader(_ui->source_database_lineEdit_path->text().toStdString(),
_ui->source_checkBox_useDbStamps->isChecked()?-1:this->getGeneralInputRate(),
true,
true,
true,
_ui->source_spinBox_database_cameraIndex->value());
Camera * camera = 0;
if(this->getSourceType() == kSrcDatabase)
Camera * camera = this->createCamera();
if(!camera)
{
if(!dbReader.init())
{
QMessageBox::warning(this, tr("Camera viewer"), tr("Failed to initialize the database reader!"));
return;
}
return;
}
else
{
camera = this->createCamera();
if(!camera)
{
return;
}
}
ParametersMap parameters = this->getAllParameters();
Odometry * odometry = Odometry::create(parameters);
@@ -4420,9 +4382,42 @@ void PreferencesDialog::testOdometry()
odomViewer->resize(1280, 480+QPushButton().minimumHeight());
odomViewer->registerToEventsManager();
CameraThread cameraThread(camera, this->getAllParameters()); // take ownership of camera
cameraThread.setMirroringEnabled(isSourceMirroring());
cameraThread.setColorOnly(_ui->checkbox_rgbd_colorOnly->isChecked());
cameraThread.setImageDecimation(_ui->spinBox_source_imageDecimation->value());
cameraThread.setStereoToDepth(_ui->checkbox_stereo_depthGenerated->isChecked());
cameraThread.setScanFromDepth(
_ui->groupBox_scanFromDepth->isChecked(),
_ui->spinBox_cameraScanFromDepth_decimation->value(),
_ui->doubleSpinBox_cameraSCanFromDepth_maxDepth->value(),
_ui->doubleSpinBox_cameraImages_scanVoxelSize->value(),
_ui->spinBox_cameraImages_scanNormalsK->value());
UEventsManager::createPipe(&cameraThread, &odomThread, "CameraEvent");
UEventsManager::createPipe(&odomThread, odomViewer, "OdometryEvent");
UEventsManager::createPipe(odomViewer, &odomThread, "OdometryResetEvent");
odomThread.start();
cameraThread.start();
odomViewer->exec();
delete odomViewer;
cameraThread.join(true);
odomThread.join(true);
}
void PreferencesDialog::testCamera()
{
CameraViewer * window = new CameraViewer(this, this->getAllParameters());
window->setWindowTitle(tr("Camera viewer"));
window->resize(1280, 480+QPushButton().minimumHeight());
window->registerToEventsManager();
Camera * camera = this->createCamera();
if(camera)
{
CameraThread cameraThread(camera, this->getAllParameters()); // take ownership of camera
CameraThread cameraThread(camera, this->getAllParameters());
cameraThread.setMirroringEnabled(isSourceMirroring());
cameraThread.setColorOnly(_ui->checkbox_rgbd_colorOnly->isChecked());
cameraThread.setImageDecimation(_ui->spinBox_source_imageDecimation->value());
@@ -4433,97 +4428,19 @@ void PreferencesDialog::testOdometry()
_ui->doubleSpinBox_cameraSCanFromDepth_maxDepth->value(),
_ui->doubleSpinBox_cameraImages_scanVoxelSize->value(),
_ui->spinBox_cameraImages_scanNormalsK->value());
UEventsManager::createPipe(&cameraThread, &odomThread, "CameraEvent");
UEventsManager::createPipe(&odomThread, odomViewer, "OdometryEvent");
UEventsManager::createPipe(odomViewer, &odomThread, "OdometryResetEvent");
UEventsManager::createPipe(&cameraThread, window, "CameraEvent");
odomThread.start();
cameraThread.start();
odomViewer->exec();
delete odomViewer;
window->exec();
delete window;
cameraThread.join(true);
odomThread.join(true);
}
else
{
UEventsManager::createPipe(&dbReader, &odomThread, "CameraEvent");
UEventsManager::createPipe(&odomThread, odomViewer, "OdometryEvent");
UEventsManager::createPipe(odomViewer, &odomThread, "OdometryResetEvent");
odomThread.start();
dbReader.start();
odomViewer->exec();
delete odomViewer;
dbReader.join(true);
odomThread.join(true);
delete window;
}
}
void PreferencesDialog::testCamera()
{
CameraViewer * window = new CameraViewer(this, this->getAllParameters());
window->setWindowTitle(tr("Camera viewer"));
window->resize(1280, 480+QPushButton().minimumHeight());
window->registerToEventsManager();
if(this->getSourceType() == kSrcDatabase)
{
DBReader dbReader(_ui->source_database_lineEdit_path->text().toStdString(),
_ui->source_checkBox_useDbStamps->isChecked()?-1:this->getGeneralInputRate(),
true,
true,
true,
_ui->source_spinBox_database_cameraIndex->value());
if(!dbReader.init(_ui->source_images_spinBox_startPos->value()))
{
QMessageBox::warning(this, tr("Camera viewer"), tr("Failed to initialize the database reader!"));
delete window;
}
else
{
UEventsManager::createPipe(&dbReader, window, "CameraEvent");
dbReader.start();
window->exec();
delete window;
dbReader.join(true);
}
}
else
{
Camera * camera = this->createCamera();
if(camera)
{
CameraThread cameraThread(camera, this->getAllParameters());
cameraThread.setMirroringEnabled(isSourceMirroring());
cameraThread.setColorOnly(_ui->checkbox_rgbd_colorOnly->isChecked());
cameraThread.setImageDecimation(_ui->spinBox_source_imageDecimation->value());
cameraThread.setStereoToDepth(_ui->checkbox_stereo_depthGenerated->isChecked());
cameraThread.setScanFromDepth(
_ui->groupBox_scanFromDepth->isChecked(),
_ui->spinBox_cameraScanFromDepth_decimation->value(),
_ui->doubleSpinBox_cameraSCanFromDepth_maxDepth->value(),
_ui->doubleSpinBox_cameraImages_scanVoxelSize->value(),
_ui->spinBox_cameraImages_scanNormalsK->value());
UEventsManager::createPipe(&cameraThread, window, "CameraEvent");
cameraThread.start();
window->exec();
delete window;
cameraThread.join(true);
}
else
{
delete window;
}
}
}
void PreferencesDialog::calibrate()
{
if(this->getSourceType() == kSrcDatabase)