mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-05 01:27:46 +08:00
0.18.2: Added Odom/GuessSmoothingDelay parameter
This commit is contained in:
+1
-1
@@ -21,7 +21,7 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 18)
|
SET(RTABMAP_MINOR_VERSION 18)
|
||||||
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})
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,8 @@ public:
|
|||||||
//getters
|
//getters
|
||||||
const Transform & getPose() const {return _pose;}
|
const Transform & getPose() const {return _pose;}
|
||||||
bool isInfoDataFilled() const {return _fillInfoData;}
|
bool isInfoDataFilled() const {return _fillInfoData;}
|
||||||
const Transform & previousVelocityTransform() const {return previousVelocityTransform_;}
|
RTABMAP_DEPRECATED(const Transform & previousVelocityTransform() const, "Use getVelocityGuess() instead.");
|
||||||
|
const Transform & getVelocityGuess() const {return velocityGuess_;}
|
||||||
double previousStamp() const {return previousStamp_;}
|
double previousStamp() const {return previousStamp_;}
|
||||||
unsigned int framesProcessed() const {return framesProcessed_;}
|
unsigned int framesProcessed() const {return framesProcessed_;}
|
||||||
bool imagesAlreadyRectified() const {return _imagesAlreadyRectified;}
|
bool imagesAlreadyRectified() const {return _imagesAlreadyRectified;}
|
||||||
@@ -87,6 +88,7 @@ private:
|
|||||||
bool _force3DoF;
|
bool _force3DoF;
|
||||||
bool _holonomic;
|
bool _holonomic;
|
||||||
bool guessFromMotion_;
|
bool guessFromMotion_;
|
||||||
|
bool guessSmoothingDelay_;
|
||||||
int _filteringStrategy;
|
int _filteringStrategy;
|
||||||
int _particleSize;
|
int _particleSize;
|
||||||
float _particleNoiseT;
|
float _particleNoiseT;
|
||||||
@@ -103,7 +105,8 @@ private:
|
|||||||
Transform _pose;
|
Transform _pose;
|
||||||
int _resetCurrentCount;
|
int _resetCurrentCount;
|
||||||
double previousStamp_;
|
double previousStamp_;
|
||||||
Transform previousVelocityTransform_;
|
std::list<std::pair<std::vector<float>, double> > previousVelocities_;
|
||||||
|
Transform velocityGuess_;
|
||||||
Transform previousGroundTruthPose_;
|
Transform previousGroundTruthPose_;
|
||||||
float distanceTravelled_;
|
float distanceTravelled_;
|
||||||
unsigned int framesProcessed_;
|
unsigned int framesProcessed_;
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ public:
|
|||||||
Transform transform;
|
Transform transform;
|
||||||
Transform transformFiltered;
|
Transform transformFiltered;
|
||||||
Transform transformGroundTruth;
|
Transform transformGroundTruth;
|
||||||
|
Transform guessVelocity;
|
||||||
float distanceTravelled;
|
float distanceTravelled;
|
||||||
int memoryUsage; //MB
|
int memoryUsage; //MB
|
||||||
|
|
||||||
|
|||||||
@@ -413,6 +413,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Odom, KalmanProcessNoise, float, 0.001, "Process noise covariance value.");
|
RTABMAP_PARAM(Odom, KalmanProcessNoise, float, 0.001, "Process noise covariance value.");
|
||||||
RTABMAP_PARAM(Odom, KalmanMeasurementNoise, float, 0.01, "Process measurement covariance value.");
|
RTABMAP_PARAM(Odom, KalmanMeasurementNoise, float, 0.01, "Process measurement covariance value.");
|
||||||
RTABMAP_PARAM(Odom, GuessMotion, bool, true, "Guess next transformation from the last motion computed.");
|
RTABMAP_PARAM(Odom, GuessMotion, bool, true, "Guess next transformation from the last motion computed.");
|
||||||
|
RTABMAP_PARAM(Odom, GuessSmoothingDelay, float, 1.0, uFormat("Guess smoothing delay (s). Estimated velocity is averaged based on last transforms up to this maximum delay. This can help to get smoother velocity prediction. Last velocity computed is used directly if \"%s\" is set or the delay is below the odometry rate.", kOdomFilteringStrategy().c_str()));
|
||||||
RTABMAP_PARAM(Odom, KeyFrameThr, float, 0.3, "[Visual] Create a new keyframe when the number of inliers drops under this ratio of features in last frame. Setting the value to 0 means that a keyframe is created for each processed frame.");
|
RTABMAP_PARAM(Odom, KeyFrameThr, float, 0.3, "[Visual] Create a new keyframe when the number of inliers drops under this ratio of features in last frame. Setting the value to 0 means that a keyframe is created for each processed frame.");
|
||||||
RTABMAP_PARAM(Odom, VisKeyFrameThr, int, 150, "[Visual] Create a new keyframe when the number of inliers drops under this threshold. Setting the value to 0 means that a keyframe is created for each processed frame.");
|
RTABMAP_PARAM(Odom, VisKeyFrameThr, int, 150, "[Visual] Create a new keyframe when the number of inliers drops under this threshold. Setting the value to 0 means that a keyframe is created for each processed frame.");
|
||||||
RTABMAP_PARAM(Odom, ScanKeyFrameThr, float, 0.9, "[Geometry] Create a new keyframe when the number of ICP inliers drops under this ratio of points in last frame's scan. Setting the value to 0 means that a keyframe is created for each processed frame.");
|
RTABMAP_PARAM(Odom, ScanKeyFrameThr, float, 0.9, "[Geometry] Create a new keyframe when the number of ICP inliers drops under this ratio of points in last frame's scan. Setting the value to 0 means that a keyframe is created for each processed frame.");
|
||||||
|
|||||||
+75
-13
@@ -101,6 +101,7 @@ Odometry::Odometry(const rtabmap::ParametersMap & parameters) :
|
|||||||
_force3DoF(Parameters::defaultRegForce3DoF()),
|
_force3DoF(Parameters::defaultRegForce3DoF()),
|
||||||
_holonomic(Parameters::defaultOdomHolonomic()),
|
_holonomic(Parameters::defaultOdomHolonomic()),
|
||||||
guessFromMotion_(Parameters::defaultOdomGuessMotion()),
|
guessFromMotion_(Parameters::defaultOdomGuessMotion()),
|
||||||
|
guessSmoothingDelay_(Parameters::defaultOdomGuessSmoothingDelay()),
|
||||||
_filteringStrategy(Parameters::defaultOdomFilteringStrategy()),
|
_filteringStrategy(Parameters::defaultOdomFilteringStrategy()),
|
||||||
_particleSize(Parameters::defaultOdomParticleSize()),
|
_particleSize(Parameters::defaultOdomParticleSize()),
|
||||||
_particleNoiseT(Parameters::defaultOdomParticleNoiseT()),
|
_particleNoiseT(Parameters::defaultOdomParticleNoiseT()),
|
||||||
@@ -125,6 +126,7 @@ Odometry::Odometry(const rtabmap::ParametersMap & parameters) :
|
|||||||
Parameters::parse(parameters, Parameters::kRegForce3DoF(), _force3DoF);
|
Parameters::parse(parameters, Parameters::kRegForce3DoF(), _force3DoF);
|
||||||
Parameters::parse(parameters, Parameters::kOdomHolonomic(), _holonomic);
|
Parameters::parse(parameters, Parameters::kOdomHolonomic(), _holonomic);
|
||||||
Parameters::parse(parameters, Parameters::kOdomGuessMotion(), guessFromMotion_);
|
Parameters::parse(parameters, Parameters::kOdomGuessMotion(), guessFromMotion_);
|
||||||
|
Parameters::parse(parameters, Parameters::kOdomGuessSmoothingDelay(), guessSmoothingDelay_);
|
||||||
Parameters::parse(parameters, Parameters::kOdomFillInfoData(), _fillInfoData);
|
Parameters::parse(parameters, Parameters::kOdomFillInfoData(), _fillInfoData);
|
||||||
Parameters::parse(parameters, Parameters::kOdomFilteringStrategy(), _filteringStrategy);
|
Parameters::parse(parameters, Parameters::kOdomFilteringStrategy(), _filteringStrategy);
|
||||||
Parameters::parse(parameters, Parameters::kOdomParticleSize(), _particleSize);
|
Parameters::parse(parameters, Parameters::kOdomParticleSize(), _particleSize);
|
||||||
@@ -182,7 +184,8 @@ Odometry::~Odometry()
|
|||||||
void Odometry::reset(const Transform & initialPose)
|
void Odometry::reset(const Transform & initialPose)
|
||||||
{
|
{
|
||||||
UASSERT(!initialPose.isNull());
|
UASSERT(!initialPose.isNull());
|
||||||
previousVelocityTransform_.setNull();
|
previousVelocities_.clear();
|
||||||
|
velocityGuess_.setNull();
|
||||||
previousGroundTruthPose_.setNull();
|
previousGroundTruthPose_.setNull();
|
||||||
_resetCurrentCount = 0;
|
_resetCurrentCount = 0;
|
||||||
previousStamp_ = 0;
|
previousStamp_ = 0;
|
||||||
@@ -232,6 +235,37 @@ void Odometry::reset(const Transform & initialPose)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Transform & Odometry::previousVelocityTransform() const
|
||||||
|
{
|
||||||
|
return getVelocityGuess();
|
||||||
|
}
|
||||||
|
|
||||||
|
Transform getMeanVelocity(const std::list<std::pair<std::vector<float>, double> > & transforms)
|
||||||
|
{
|
||||||
|
if(transforms.size())
|
||||||
|
{
|
||||||
|
float tvx=0.0f,tvy=0.0f,tvz=0.0f, tvroll=0.0f,tvpitch=0.0f,tvyaw=0.0f;
|
||||||
|
for(std::list<std::pair<std::vector<float>, double> >::const_iterator iter=transforms.begin(); iter!=transforms.end(); ++iter)
|
||||||
|
{
|
||||||
|
UASSERT(iter->first.size() == 6);
|
||||||
|
tvx+=iter->first[0];
|
||||||
|
tvy+=iter->first[1];
|
||||||
|
tvz+=iter->first[2];
|
||||||
|
tvroll+=iter->first[3];
|
||||||
|
tvpitch+=iter->first[4];
|
||||||
|
tvyaw+=iter->first[5];
|
||||||
|
}
|
||||||
|
tvx/=float(transforms.size());
|
||||||
|
tvy/=float(transforms.size());
|
||||||
|
tvz/=float(transforms.size());
|
||||||
|
tvroll/=float(transforms.size());
|
||||||
|
tvpitch/=float(transforms.size());
|
||||||
|
tvyaw/=float(transforms.size());
|
||||||
|
return Transform(tvx, tvy, tvz, tvroll, tvpitch, tvyaw);
|
||||||
|
}
|
||||||
|
return Transform();
|
||||||
|
}
|
||||||
|
|
||||||
Transform Odometry::process(SensorData & data, OdometryInfo * info)
|
Transform Odometry::process(SensorData & data, OdometryInfo * info)
|
||||||
{
|
{
|
||||||
return process(data, Transform(), info);
|
return process(data, Transform(), info);
|
||||||
@@ -313,21 +347,22 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
|
|
||||||
// KITTI datasets start with stamp=0
|
// KITTI datasets start with stamp=0
|
||||||
double dt = previousStamp_>0.0f || (previousStamp_==0.0f && framesProcessed()==1)?data.stamp() - previousStamp_:0.0;
|
double dt = previousStamp_>0.0f || (previousStamp_==0.0f && framesProcessed()==1)?data.stamp() - previousStamp_:0.0;
|
||||||
Transform guess = dt>0.0 && guessFromMotion_ && !previousVelocityTransform_.isNull()?Transform::getIdentity():Transform();
|
Transform guess = dt>0.0 && guessFromMotion_ && !velocityGuess_.isNull()?Transform::getIdentity():Transform();
|
||||||
if(!(dt>0.0 || (dt == 0.0 && previousVelocityTransform_.isNull())))
|
if(!(dt>0.0 || (dt == 0.0 && velocityGuess_.isNull())))
|
||||||
{
|
{
|
||||||
if(guessFromMotion_ && (!data.imageRaw().empty() || !data.laserScanRaw().isEmpty()))
|
if(guessFromMotion_ && (!data.imageRaw().empty() || !data.laserScanRaw().isEmpty()))
|
||||||
{
|
{
|
||||||
UERROR("Guess from motion is set but dt is invalid! Odometry is then computed without guess. (dt=%f previous transform=%s)", dt, previousVelocityTransform_.prettyPrint().c_str());
|
UERROR("Guess from motion is set but dt is invalid! Odometry is then computed without guess. (dt=%f previous transform=%s)", dt, velocityGuess_.prettyPrint().c_str());
|
||||||
}
|
}
|
||||||
else if(_filteringStrategy==1)
|
else if(_filteringStrategy==1)
|
||||||
{
|
{
|
||||||
UERROR("Kalman filtering is enabled but dt is invalid! Odometry is then computed without Kalman filtering. (dt=%f previous transform=%s)", dt, previousVelocityTransform_.prettyPrint().c_str());
|
UERROR("Kalman filtering is enabled but dt is invalid! Odometry is then computed without Kalman filtering. (dt=%f previous transform=%s)", dt, velocityGuess_.prettyPrint().c_str());
|
||||||
}
|
}
|
||||||
dt=0;
|
dt=0;
|
||||||
previousVelocityTransform_.setNull();
|
previousVelocities_.clear();
|
||||||
|
velocityGuess_.setNull();
|
||||||
}
|
}
|
||||||
if(!previousVelocityTransform_.isNull())
|
if(!velocityGuess_.isNull())
|
||||||
{
|
{
|
||||||
if(guessFromMotion_)
|
if(guessFromMotion_)
|
||||||
{
|
{
|
||||||
@@ -341,7 +376,7 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
float vx,vy,vz, vroll,vpitch,vyaw;
|
float vx,vy,vz, vroll,vpitch,vyaw;
|
||||||
previousVelocityTransform_.getTranslationAndEulerAngles(vx,vy,vz, vroll,vpitch,vyaw);
|
velocityGuess_.getTranslationAndEulerAngles(vx,vy,vz, vroll,vpitch,vyaw);
|
||||||
guess = Transform(vx*dt, vy*dt, vz*dt, vroll*dt, vpitch*dt, vyaw*dt);
|
guess = Transform(vx*dt, vy*dt, vz*dt, vroll*dt, vpitch*dt, vyaw*dt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -460,7 +495,7 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
{
|
{
|
||||||
if(_filteringStrategy == 1)
|
if(_filteringStrategy == 1)
|
||||||
{
|
{
|
||||||
if(previousVelocityTransform_.isNull())
|
if(velocityGuess_.isNull())
|
||||||
{
|
{
|
||||||
// reset Kalman
|
// reset Kalman
|
||||||
if(dt)
|
if(dt)
|
||||||
@@ -482,7 +517,7 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
{
|
{
|
||||||
// Particle filtering
|
// Particle filtering
|
||||||
UASSERT(particleFilters_.size()==6);
|
UASSERT(particleFilters_.size()==6);
|
||||||
if(previousVelocityTransform_.isNull())
|
if(velocityGuess_.isNull())
|
||||||
{
|
{
|
||||||
particleFilters_[0]->init(vx);
|
particleFilters_[0]->init(vx);
|
||||||
particleFilters_[1]->init(vy);
|
particleFilters_[1]->init(vy);
|
||||||
@@ -564,17 +599,43 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
}
|
}
|
||||||
|
|
||||||
previousStamp_ = data.stamp();
|
previousStamp_ = data.stamp();
|
||||||
previousVelocityTransform_.setNull();
|
|
||||||
|
|
||||||
if(dt)
|
if(dt)
|
||||||
{
|
{
|
||||||
previousVelocityTransform_ = Transform(vx, vy, vz, vroll, vpitch, vyaw);
|
if(dt >=guessSmoothingDelay_/2.0 || particleFilters_.size() || _filteringStrategy==1)
|
||||||
|
{
|
||||||
|
velocityGuess_ = Transform(vx, vy, vz, vroll, vpitch, vyaw);
|
||||||
|
previousVelocities_.clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// smooth velocity estimation over the past X seconds
|
||||||
|
std::vector<float> v(6);
|
||||||
|
v[0] = vx;
|
||||||
|
v[1] = vy;
|
||||||
|
v[2] = vz;
|
||||||
|
v[3] = vroll;
|
||||||
|
v[4] = vpitch;
|
||||||
|
v[5] = vyaw;
|
||||||
|
previousVelocities_.push_back(std::make_pair(v, data.stamp()));
|
||||||
|
while(previousVelocities_.size() > 1 && previousVelocities_.front().second < previousVelocities_.back().second-guessSmoothingDelay_)
|
||||||
|
{
|
||||||
|
previousVelocities_.pop_front();
|
||||||
|
}
|
||||||
|
velocityGuess_ = getMeanVelocity(previousVelocities_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
previousVelocities_.clear();
|
||||||
|
velocityGuess_.setNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(info)
|
if(info)
|
||||||
{
|
{
|
||||||
distanceTravelled_ += t.getNorm();
|
distanceTravelled_ += t.getNorm();
|
||||||
info->distanceTravelled = distanceTravelled_;
|
info->distanceTravelled = distanceTravelled_;
|
||||||
|
info->guessVelocity = velocityGuess_;
|
||||||
}
|
}
|
||||||
++framesProcessed_;
|
++framesProcessed_;
|
||||||
|
|
||||||
@@ -592,7 +653,8 @@ Transform Odometry::process(SensorData & data, const Transform & guessIn, Odomet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
previousVelocityTransform_.setNull();
|
previousVelocities_.clear();
|
||||||
|
velocityGuess_.setNull();
|
||||||
previousStamp_ = 0;
|
previousStamp_ = 0;
|
||||||
|
|
||||||
return Transform();
|
return Transform();
|
||||||
|
|||||||
@@ -466,7 +466,14 @@ Transform OdometryF2M::computeTransform(
|
|||||||
}
|
}
|
||||||
if(!regInfo.rejectedMsg.empty())
|
if(!regInfo.rejectedMsg.empty())
|
||||||
{
|
{
|
||||||
UWARN("Registration failed: \"%s\"", regInfo.rejectedMsg.c_str());
|
if(guess.isNull())
|
||||||
|
{
|
||||||
|
UWARN("Registration failed: \"%s\"", regInfo.rejectedMsg.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UWARN("Registration failed: \"%s\" (guess=%s)", regInfo.rejectedMsg.c_str(), guess.prettyPrint().c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -272,13 +272,14 @@ GraphViewer::GraphViewer(QWidget * parent) :
|
|||||||
_originReferential = new QGraphicsItemGroup();
|
_originReferential = new QGraphicsItemGroup();
|
||||||
this->scene()->addItem(_originReferential); // ownership transfered
|
this->scene()->addItem(_originReferential); // ownership transfered
|
||||||
QGraphicsLineItem * item = this->scene()->addLine(0,0,0,-100, QPen(QBrush(Qt::red), _linkWidth));
|
QGraphicsLineItem * item = this->scene()->addLine(0,0,0,-100, QPen(QBrush(Qt::red), _linkWidth));
|
||||||
item->setZValue(100);
|
item->setZValue(1);
|
||||||
item->setParentItem(_root);
|
item->setParentItem(_root);
|
||||||
_originReferential->addToGroup(item);
|
_originReferential->addToGroup(item);
|
||||||
item = this->scene()->addLine(0,0,-100,0, QPen(QBrush(Qt::green), _linkWidth));
|
item = this->scene()->addLine(0,0,-100,0, QPen(QBrush(Qt::green), _linkWidth));
|
||||||
item->setZValue(100);
|
item->setZValue(1);
|
||||||
item->setParentItem(_root);
|
item->setParentItem(_root);
|
||||||
_originReferential->addToGroup(item);
|
_originReferential->addToGroup(item);
|
||||||
|
_originReferential->setZValue(1);
|
||||||
_originReferential->setParentItem(_root);
|
_originReferential->setParentItem(_root);
|
||||||
|
|
||||||
// current pose
|
// current pose
|
||||||
@@ -292,6 +293,7 @@ GraphViewer::GraphViewer(QWidget * parent) :
|
|||||||
item->setZValue(100);
|
item->setZValue(100);
|
||||||
item->setParentItem(_root);
|
item->setParentItem(_root);
|
||||||
_referential->addToGroup(item);
|
_referential->addToGroup(item);
|
||||||
|
_referential->setZValue(100);
|
||||||
_referential->setParentItem(_root);
|
_referential->setParentItem(_root);
|
||||||
|
|
||||||
_localRadius = this->scene()->addEllipse(-0.0001,-0.0001,0.0001,0.0001);
|
_localRadius = this->scene()->addEllipse(-0.0001,-0.0001,0.0001,0.0001);
|
||||||
|
|||||||
@@ -599,6 +599,9 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent, bool sh
|
|||||||
_ui->statsToolBox->updateStat("Odometry/KeyFrameAdded/", false);
|
_ui->statsToolBox->updateStat("Odometry/KeyFrameAdded/", false);
|
||||||
_ui->statsToolBox->updateStat("Odometry/Interval/ms", false);
|
_ui->statsToolBox->updateStat("Odometry/Interval/ms", false);
|
||||||
_ui->statsToolBox->updateStat("Odometry/Speed/kph", false);
|
_ui->statsToolBox->updateStat("Odometry/Speed/kph", false);
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/Speed/mps", false);
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/SpeedGuess/kph", false);
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/SpeedGuess/mps", false);
|
||||||
_ui->statsToolBox->updateStat("Odometry/Distance/m", false);
|
_ui->statsToolBox->updateStat("Odometry/Distance/m", false);
|
||||||
_ui->statsToolBox->updateStat("Odometry/Tx/m", false);
|
_ui->statsToolBox->updateStat("Odometry/Tx/m", false);
|
||||||
_ui->statsToolBox->updateStat("Odometry/Ty/m", false);
|
_ui->statsToolBox->updateStat("Odometry/Ty/m", false);
|
||||||
@@ -1484,6 +1487,14 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
{
|
{
|
||||||
_ui->statsToolBox->updateStat("Odometry/Interval/ms", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), odom.info().interval*1000.f, _preferencesDialog->isCacheSavedInFigures());
|
_ui->statsToolBox->updateStat("Odometry/Interval/ms", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), odom.info().interval*1000.f, _preferencesDialog->isCacheSavedInFigures());
|
||||||
_ui->statsToolBox->updateStat("Odometry/Speed/kph", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x/odom.info().interval*3.6f, _preferencesDialog->isCacheSavedInFigures());
|
_ui->statsToolBox->updateStat("Odometry/Speed/kph", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x/odom.info().interval*3.6f, _preferencesDialog->isCacheSavedInFigures());
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/Speed/mps", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x/odom.info().interval, _preferencesDialog->isCacheSavedInFigures());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!odom.info().guessVelocity.isNull())
|
||||||
|
{
|
||||||
|
odom.info().guessVelocity.getTranslationAndEulerAngles(x,y,z,roll,pitch,yaw);
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/SpeedGuess/kph", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x*3.6f, _preferencesDialog->isCacheSavedInFigures());
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/SpeedGuess/mps", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x, _preferencesDialog->isCacheSavedInFigures());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!odom.info().transformGroundTruth.isNull())
|
if(!odom.info().transformGroundTruth.isNull())
|
||||||
@@ -1498,6 +1509,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
|
|||||||
if(odom.info().interval > 0)
|
if(odom.info().interval > 0)
|
||||||
{
|
{
|
||||||
_ui->statsToolBox->updateStat("Odometry/SpeedG/kph", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x/odom.info().interval*3.6f, _preferencesDialog->isCacheSavedInFigures());
|
_ui->statsToolBox->updateStat("Odometry/SpeedG/kph", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x/odom.info().interval*3.6f, _preferencesDialog->isCacheSavedInFigures());
|
||||||
|
_ui->statsToolBox->updateStat("Odometry/SpeedG/mps", _preferencesDialog->isTimeUsedInFigures()?odom.data().stamp()-_firstStamp:(float)odom.data().id(), x/odom.info().interval, _preferencesDialog->isCacheSavedInFigures());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4068,7 +4080,7 @@ void MainWindow::applyPrefSettings(const rtabmap::ParametersMap & parameters)
|
|||||||
void MainWindow::applyPrefSettings(const rtabmap::ParametersMap & parameters, bool postParamEvent)
|
void MainWindow::applyPrefSettings(const rtabmap::ParametersMap & parameters, bool postParamEvent)
|
||||||
{
|
{
|
||||||
ULOGGER_DEBUG("");
|
ULOGGER_DEBUG("");
|
||||||
_occupancyGrid->parseParameters(parameters);
|
_occupancyGrid->parseParameters(_preferencesDialog->getAllParameters());
|
||||||
if(parameters.size())
|
if(parameters.size())
|
||||||
{
|
{
|
||||||
for(rtabmap::ParametersMap::const_iterator iter = parameters.begin(); iter!=parameters.end(); ++iter)
|
for(rtabmap::ParametersMap::const_iterator iter = parameters.begin(); iter!=parameters.end(); ++iter)
|
||||||
|
|||||||
@@ -1026,6 +1026,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->odom_VisKeyFrameThr->setObjectName(Parameters::kOdomVisKeyFrameThr().c_str());
|
_ui->odom_VisKeyFrameThr->setObjectName(Parameters::kOdomVisKeyFrameThr().c_str());
|
||||||
_ui->odom_flow_scanKeyframeThr->setObjectName(Parameters::kOdomScanKeyFrameThr().c_str());
|
_ui->odom_flow_scanKeyframeThr->setObjectName(Parameters::kOdomScanKeyFrameThr().c_str());
|
||||||
_ui->odom_flow_guessMotion->setObjectName(Parameters::kOdomGuessMotion().c_str());
|
_ui->odom_flow_guessMotion->setObjectName(Parameters::kOdomGuessMotion().c_str());
|
||||||
|
_ui->odom_guess_smoothing_delay->setObjectName(Parameters::kOdomGuessSmoothingDelay().c_str());
|
||||||
_ui->odom_imageDecimation->setObjectName(Parameters::kOdomImageDecimation().c_str());
|
_ui->odom_imageDecimation->setObjectName(Parameters::kOdomImageDecimation().c_str());
|
||||||
_ui->odom_alignWithGround->setObjectName(Parameters::kOdomAlignWithGround().c_str());
|
_ui->odom_alignWithGround->setObjectName(Parameters::kOdomAlignWithGround().c_str());
|
||||||
|
|
||||||
|
|||||||
@@ -94,9 +94,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-812</y>
|
<y>0</y>
|
||||||
<width>681</width>
|
<width>680</width>
|
||||||
<height>2983</height>
|
<height>2986</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>5</number>
|
<number>18</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">
|
||||||
@@ -11101,7 +11101,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QLabel" name="label_196">
|
<widget class="QLabel" name="label_196">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>[Visual] Create a new keyframe when the number of inliers drops under this ratio of features in last frame. Setting the value to 0 means that a keyframe is created for each processed frame.</string>
|
<string>[Visual] Create a new keyframe when the number of inliers drops under this ratio of features in last frame. Setting the value to 0 means that a keyframe is created for each processed frame.</string>
|
||||||
@@ -11114,7 +11114,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="1">
|
<item row="12" column="1">
|
||||||
<widget class="QLabel" name="label_246">
|
<widget class="QLabel" name="label_246">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>[Geometry] Create a new keyframe when the number of inliers drops under this threshold. Setting value to 0 means that a keyframe is created for each processed frame.</string>
|
<string>[Geometry] Create a new keyframe when the number of inliers drops under this threshold. Setting value to 0 means that a keyframe is created for each processed frame.</string>
|
||||||
@@ -11232,14 +11232,14 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="0">
|
<item row="13" column="0">
|
||||||
<widget class="QSpinBox" name="odom_dataBufferSize">
|
<widget class="QSpinBox" name="odom_dataBufferSize">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>999999</number>
|
<number>999999</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="0">
|
<item row="14" column="0">
|
||||||
<widget class="QPushButton" name="pushButton_testOdometry">
|
<widget class="QPushButton" name="pushButton_testOdometry">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Test odometry</string>
|
<string>Test odometry</string>
|
||||||
@@ -11259,7 +11259,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="1">
|
<item row="13" column="1">
|
||||||
<widget class="QLabel" name="label_232">
|
<widget class="QLabel" name="label_232">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Data buffer size (0 means inf).</string>
|
<string>Data buffer size (0 means inf).</string>
|
||||||
@@ -11272,6 +11272,16 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="9" column="0">
|
||||||
|
<widget class="QSpinBox" name="odom_imageDecimation">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-32</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>32</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_47">
|
<widget class="QLabel" name="label_47">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -11285,7 +11295,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QLabel" name="label_248">
|
<widget class="QLabel" name="label_248">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Decimation of images before features extraction. Negative decimation is done from RGB size instead of depth size (if depth is smaller than RGB, it may be interpolated depending of the decimation value).</string>
|
<string>Decimation of images before features extraction. Negative decimation is done from RGB size instead of depth size (if depth is smaller than RGB, it may be interpolated depending of the decimation value).</string>
|
||||||
@@ -11298,16 +11308,6 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QSpinBox" name="odom_imageDecimation">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>-32</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>32</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QComboBox" name="odom_filteringStrategy">
|
<widget class="QComboBox" name="odom_filteringStrategy">
|
||||||
<property name="sizeAdjustPolicy">
|
<property name="sizeAdjustPolicy">
|
||||||
@@ -11330,7 +11330,14 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="6" column="0">
|
||||||
|
<widget class="QCheckBox" name="odom_fillInfoData">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="odom_flow_keyframeThr">
|
<widget class="QDoubleSpinBox" name="odom_flow_keyframeThr">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>1.000000000000000</double>
|
<double>1.000000000000000</double>
|
||||||
@@ -11343,6 +11350,13 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="odom_holonomic">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QLabel" name="label_233">
|
<widget class="QLabel" name="label_233">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -11356,21 +11370,14 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QCheckBox" name="odom_fillInfoData">
|
<widget class="QSpinBox" name="odom_countdown">
|
||||||
<property name="text">
|
<property name="maximum">
|
||||||
<string/>
|
<number>999999</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="12" column="0">
|
||||||
<widget class="QCheckBox" name="odom_holonomic">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="11" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="odom_flow_scanKeyframeThr">
|
<widget class="QDoubleSpinBox" name="odom_flow_scanKeyframeThr">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>1.000000000000000</double>
|
<double>1.000000000000000</double>
|
||||||
@@ -11383,13 +11390,6 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QSpinBox" name="odom_countdown">
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999999</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QLabel" name="label_351">
|
<widget class="QLabel" name="label_351">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -11433,7 +11433,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_354">
|
<widget class="QLabel" name="label_354">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>[Visual] Create a new keyframe when the number of inliers drops under this threshold. Setting the value to 0 means that a keyframe is created for each processed frame.</string>
|
<string>[Visual] Create a new keyframe when the number of inliers drops under this threshold. Setting the value to 0 means that a keyframe is created for each processed frame.</string>
|
||||||
@@ -11446,7 +11446,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QSpinBox" name="odom_VisKeyFrameThr">
|
<widget class="QSpinBox" name="odom_VisKeyFrameThr">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>9999</number>
|
<number>9999</number>
|
||||||
@@ -11456,6 +11456,38 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="8" column="1">
|
||||||
|
<widget class="QLabel" name="label_520">
|
||||||
|
<property name="text">
|
||||||
|
<string>Guess smoothing delay (s). Estimated velocity is averaged based on last transforms up to this maximum delay. This can help to get smoother velocity prediction. Last velocity computed is used directly if a filtering strategy is set or the delay is below the odometry rate.</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="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="odom_guess_smoothing_delay">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> s</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package>
|
<package>
|
||||||
<name>rtabmap</name>
|
<name>rtabmap</name>
|
||||||
<version>0.18.1</version>
|
<version>0.18.2</version>
|
||||||
<description>RTAB-Map's standalone library. RTAB-Map is a RGB-D SLAM approach with real-time constraints.</description>
|
<description>RTAB-Map's standalone library. RTAB-Map is a RGB-D SLAM approach with real-time constraints.</description>
|
||||||
<maintainer email="[email protected]">Mathieu Labbe</maintainer>
|
<maintainer email="[email protected]">Mathieu Labbe</maintainer>
|
||||||
<author>Mathieu Labbe</author>
|
<author>Mathieu Labbe</author>
|
||||||
|
|||||||
Reference in New Issue
Block a user