mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 01:20:25 +08:00
Merge branch 'master' of https://github.com/introlab/rtabmap into devel
This commit is contained in:
@@ -113,6 +113,7 @@ private:
|
|||||||
std::queue<ParametersMap> _stateParam;
|
std::queue<ParametersMap> _stateParam;
|
||||||
|
|
||||||
std::list<OdometryEvent> _dataBuffer;
|
std::list<OdometryEvent> _dataBuffer;
|
||||||
|
std::list<double> _newMapEvents;
|
||||||
UMutex _dataMutex;
|
UMutex _dataMutex;
|
||||||
USemaphore _dataAdded;
|
USemaphore _dataAdded;
|
||||||
unsigned int _dataBufferMaxSize;
|
unsigned int _dataBufferMaxSize;
|
||||||
|
|||||||
@@ -401,6 +401,10 @@ SensorData DBReader::getNextData(CameraInfo * info)
|
|||||||
_previousStamp = stamp;
|
_previousStamp = stamp;
|
||||||
_previousMapID = mapId;
|
_previousMapID = mapId;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stamp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
data.uncompressData();
|
data.uncompressData();
|
||||||
if(data.cameraModels().size() > 1 &&
|
if(data.cameraModels().size() > 1 &&
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
UTimer alignTimer;
|
UTimer alignTimer;
|
||||||
pcl::IndicesPtr indices(new std::vector<int>);
|
pcl::IndicesPtr indices(new std::vector<int>);
|
||||||
pcl::IndicesPtr ground, obstacles;
|
pcl::IndicesPtr ground, obstacles;
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = util3d::cloudFromSensorData(data, 1, 0, 0, indices.get());
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = util3d::cloudFromSensorData(data, 1, 10, 0, indices.get());
|
||||||
bool success = false;
|
bool success = false;
|
||||||
if(indices->size())
|
if(indices->size())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ void RtabmapThread::clearBufferedData()
|
|||||||
_dataMutex.lock();
|
_dataMutex.lock();
|
||||||
{
|
{
|
||||||
_dataBuffer.clear();
|
_dataBuffer.clear();
|
||||||
|
_newMapEvents.clear();
|
||||||
lastPose_.setIdentity();
|
lastPose_.setIdentity();
|
||||||
covariance_ = cv::Mat();
|
covariance_ = cv::Mat();
|
||||||
_previousStamp = 0;
|
_previousStamp = 0;
|
||||||
@@ -572,13 +573,13 @@ void RtabmapThread::addData(const OdometryEvent & odomEvent)
|
|||||||
{
|
{
|
||||||
if(odomEvent.pose().isIdentity())
|
if(odomEvent.pose().isIdentity())
|
||||||
{
|
{
|
||||||
UWARN("Odometry is reset (identity pose detected). Increment map id!");
|
UWARN("Odometry is reset (identity pose detected). Increment map id! (stamp=%fs)", odomEvent.data().stamp());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UWARN("Odometry is reset (high variance (%f >=9999 detected). Increment map id!", odomEvent.info().reg.covariance.at<double>(0,0));
|
UWARN("Odometry is reset (high variance (%f >=9999 detected, stamp=%fs). Increment map id!", odomEvent.info().reg.covariance.at<double>(0,0), odomEvent.data().stamp());
|
||||||
}
|
}
|
||||||
pushNewState(kStateTriggeringMap);
|
_newMapEvents.push_back(odomEvent.data().stamp());
|
||||||
covariance_ = cv::Mat();
|
covariance_ = cv::Mat();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -654,7 +655,7 @@ bool RtabmapThread::getData(OdometryEvent & data)
|
|||||||
ULOGGER_INFO("wake-up");
|
ULOGGER_INFO("wake-up");
|
||||||
|
|
||||||
bool dataFilled = false;
|
bool dataFilled = false;
|
||||||
|
bool triggerNewMap = false;
|
||||||
_dataMutex.lock();
|
_dataMutex.lock();
|
||||||
{
|
{
|
||||||
if(_state.empty() && !_dataBuffer.empty())
|
if(_state.empty() && !_dataBuffer.empty())
|
||||||
@@ -672,10 +673,23 @@ bool RtabmapThread::getData(OdometryEvent & data)
|
|||||||
}
|
}
|
||||||
_userDataMutex.unlock();
|
_userDataMutex.unlock();
|
||||||
|
|
||||||
|
while(_newMapEvents.size() && _newMapEvents.front() <= data.data().stamp())
|
||||||
|
{
|
||||||
|
UWARN("Triggering new map %f<=%f...", _newMapEvents.front() , data.data().stamp());
|
||||||
|
triggerNewMap = true;
|
||||||
|
_newMapEvents.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
dataFilled = true;
|
dataFilled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_dataMutex.unlock();
|
_dataMutex.unlock();
|
||||||
|
|
||||||
|
if(triggerNewMap)
|
||||||
|
{
|
||||||
|
_rtabmap->triggerNewMap();
|
||||||
|
}
|
||||||
|
|
||||||
return dataFilled;
|
return dataFilled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ private:
|
|||||||
void saveFigures();
|
void saveFigures();
|
||||||
void loadFigures();
|
void loadFigures();
|
||||||
void exportPoses(int format);
|
void exportPoses(int format);
|
||||||
QString captureScreen(bool cacheInRAM = false);
|
QString captureScreen(bool cacheInRAM = false, bool png = true);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Ui_mainWindow * ui() { return _ui; }
|
Ui_mainWindow * ui() { return _ui; }
|
||||||
@@ -366,6 +366,7 @@ private:
|
|||||||
QMap<int, QString> _exportPosesFileName;
|
QMap<int, QString> _exportPosesFileName;
|
||||||
bool _autoScreenCaptureOdomSync;
|
bool _autoScreenCaptureOdomSync;
|
||||||
bool _autoScreenCaptureRAM;
|
bool _autoScreenCaptureRAM;
|
||||||
|
bool _autoScreenCapturePNG;
|
||||||
QMap<QString, QByteArray> _autoScreenCaptureCachedImages;
|
QMap<QString, QByteArray> _autoScreenCaptureCachedImages;
|
||||||
|
|
||||||
QVector<int> _refIds;
|
QVector<int> _refIds;
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent, bool sh
|
|||||||
_exportPosesFrame(0),
|
_exportPosesFrame(0),
|
||||||
_autoScreenCaptureOdomSync(false),
|
_autoScreenCaptureOdomSync(false),
|
||||||
_autoScreenCaptureRAM(false),
|
_autoScreenCaptureRAM(false),
|
||||||
|
_autoScreenCapturePNG(false),
|
||||||
_firstCall(true),
|
_firstCall(true),
|
||||||
_progressCanceled(false)
|
_progressCanceled(false)
|
||||||
{
|
{
|
||||||
@@ -1404,7 +1405,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
|
|
||||||
if(_ui->actionAuto_screen_capture->isChecked() && _autoScreenCaptureOdomSync)
|
if(_ui->actionAuto_screen_capture->isChecked() && _autoScreenCaptureOdomSync)
|
||||||
{
|
{
|
||||||
this->captureScreen(_autoScreenCaptureRAM);
|
this->captureScreen(_autoScreenCaptureRAM, _autoScreenCapturePNG);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Process info
|
//Process info
|
||||||
@@ -1975,7 +1976,7 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
_ui->statsToolBox->updateStat("GUI/Refresh stats/ms", _preferencesDialog->isTimeUsedInFigures()?stat.stamp()-_firstStamp:stat.refImageId(), elapsedTime, _preferencesDialog->isCacheSavedInFigures());
|
_ui->statsToolBox->updateStat("GUI/Refresh stats/ms", _preferencesDialog->isTimeUsedInFigures()?stat.stamp()-_firstStamp:stat.refImageId(), elapsedTime, _preferencesDialog->isCacheSavedInFigures());
|
||||||
if(_ui->actionAuto_screen_capture->isChecked() && !_autoScreenCaptureOdomSync)
|
if(_ui->actionAuto_screen_capture->isChecked() && !_autoScreenCaptureOdomSync)
|
||||||
{
|
{
|
||||||
this->captureScreen(_autoScreenCaptureRAM);
|
this->captureScreen(_autoScreenCaptureRAM, _autoScreenCapturePNG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!_preferencesDialog->isImagesKept())
|
if(!_preferencesDialog->isImagesKept())
|
||||||
@@ -4110,9 +4111,9 @@ void MainWindow::changeMappingMode()
|
|||||||
emit mappingModeChanged(_ui->actionSLAM_mode->isChecked());
|
emit mappingModeChanged(_ui->actionSLAM_mode->isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString MainWindow::captureScreen(bool cacheInRAM)
|
QString MainWindow::captureScreen(bool cacheInRAM, bool png)
|
||||||
{
|
{
|
||||||
QString name = (QDateTime::currentDateTime().toString("yyMMddhhmmsszzz") + ".png");
|
QString name = (QDateTime::currentDateTime().toString("yyMMddhhmmsszzz") + (png?".png":".jpg"));
|
||||||
_ui->statusbar->clearMessage();
|
_ui->statusbar->clearMessage();
|
||||||
QPixmap figure = QPixmap::grabWidget(this);
|
QPixmap figure = QPixmap::grabWidget(this);
|
||||||
|
|
||||||
@@ -4124,7 +4125,7 @@ QString MainWindow::captureScreen(bool cacheInRAM)
|
|||||||
QByteArray bytes;
|
QByteArray bytes;
|
||||||
QBuffer buffer(&bytes);
|
QBuffer buffer(&bytes);
|
||||||
buffer.open(QIODevice::WriteOnly);
|
buffer.open(QIODevice::WriteOnly);
|
||||||
figure.save(&buffer, "PNG");
|
figure.save(&buffer, png?"PNG":"JPEG");
|
||||||
_autoScreenCaptureCachedImages.insert(name, bytes);
|
_autoScreenCaptureCachedImages.insert(name, bytes);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -6152,6 +6153,16 @@ void MainWindow::selectScreenCaptureFormat(bool checked)
|
|||||||
{
|
{
|
||||||
_ui->actionAuto_screen_capture->setChecked(false);
|
_ui->actionAuto_screen_capture->setChecked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r = QMessageBox::question(this, tr("Save in JPEG?"), tr("Save in JPEG format? Otherwise they are saved in PNG."), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
|
||||||
|
if(r == QMessageBox::No || r == QMessageBox::Yes)
|
||||||
|
{
|
||||||
|
_autoScreenCapturePNG = r == QMessageBox::No;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_ui->actionAuto_screen_capture->setChecked(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -6175,20 +6186,23 @@ void MainWindow::selectScreenCaptureFormat(bool checked)
|
|||||||
}
|
}
|
||||||
targetDir += QDir::separator();
|
targetDir += QDir::separator();
|
||||||
|
|
||||||
|
_progressDialog->setCancelButtonVisible(true);
|
||||||
_progressDialog->resetProgress();
|
_progressDialog->resetProgress();
|
||||||
_progressDialog->show();
|
_progressDialog->show();
|
||||||
_progressDialog->setMaximumSteps(_autoScreenCaptureCachedImages.size());
|
_progressDialog->setMaximumSteps(_autoScreenCaptureCachedImages.size());
|
||||||
int i=0;
|
int i=0;
|
||||||
for(QMap<QString, QByteArray>::iterator iter=_autoScreenCaptureCachedImages.begin(); iter!=_autoScreenCaptureCachedImages.end(); ++iter)
|
for(QMap<QString, QByteArray>::iterator iter=_autoScreenCaptureCachedImages.begin(); iter!=_autoScreenCaptureCachedImages.end() && !_progressDialog->isCanceled(); ++iter)
|
||||||
{
|
{
|
||||||
QPixmap figure;
|
QPixmap figure;
|
||||||
figure.loadFromData(iter.value(), "PNG");
|
figure.loadFromData(iter.value(), _autoScreenCapturePNG?"PNG":"JPEG");
|
||||||
figure.save(targetDir + iter.key(), "PNG");
|
figure.save(targetDir + iter.key(), _autoScreenCapturePNG?"PNG":"JPEG");
|
||||||
_progressDialog->appendText(tr("Saved image \"%1\" (%2/%3).").arg(targetDir + iter.key()).arg(++i).arg(_autoScreenCaptureCachedImages.size()));
|
_progressDialog->appendText(tr("Saved image \"%1\" (%2/%3).").arg(targetDir + iter.key()).arg(++i).arg(_autoScreenCaptureCachedImages.size()));
|
||||||
_progressDialog->incrementStep();
|
_progressDialog->incrementStep();
|
||||||
|
QApplication::processEvents();
|
||||||
}
|
}
|
||||||
_autoScreenCaptureCachedImages.clear();
|
_autoScreenCaptureCachedImages.clear();
|
||||||
_progressDialog->setValue(_progressDialog->maximumSteps());
|
_progressDialog->setValue(_progressDialog->maximumSteps());
|
||||||
|
_progressDialog->setCancelButtonVisible(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user