mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-11 12:09:51 +08:00
Fixed Stereo parameters not used for OdometryBOW. Saving parameters in Memory and Feature2D to re-use old parameters when underlaying algorithm strategies are re-created.
This commit is contained in:
@@ -148,6 +148,7 @@ public:
|
|||||||
const std::vector<cv::KeyPoint> & keypoints) const;
|
const std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual const ParametersMap & getParameters() const {return parameters_;}
|
||||||
virtual Feature2D::Type getType() const = 0;
|
virtual Feature2D::Type getType() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -158,6 +159,7 @@ private:
|
|||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const = 0;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
ParametersMap parameters_;
|
||||||
int maxFeatures_;
|
int maxFeatures_;
|
||||||
float _wordsMaxDepth; // 0=inf
|
float _wordsMaxDepth; // 0=inf
|
||||||
float _wordsMinDepth;
|
float _wordsMinDepth;
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ public:
|
|||||||
virtual ~Memory();
|
virtual ~Memory();
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual const ParametersMap & getParameters() const {return parameters_;}
|
||||||
bool update(const SensorData & data,
|
bool update(const SensorData & data,
|
||||||
Statistics * stats = 0);
|
Statistics * stats = 0);
|
||||||
bool update(const SensorData & data,
|
bool update(const SensorData & data,
|
||||||
@@ -222,6 +223,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// parameters
|
// parameters
|
||||||
|
ParametersMap parameters_;
|
||||||
float _similarityThreshold;
|
float _similarityThreshold;
|
||||||
bool _rawDataKept;
|
bool _rawDataKept;
|
||||||
bool _binDataKept;
|
bool _binDataKept;
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ public:
|
|||||||
void dumpPrediction() const;
|
void dumpPrediction() const;
|
||||||
void dumpData() const;
|
void dumpData() const;
|
||||||
void parseParameters(const ParametersMap & parameters);
|
void parseParameters(const ParametersMap & parameters);
|
||||||
|
const ParametersMap & getParameters() const {return _parameters;}
|
||||||
void setWorkingDirectory(std::string path);
|
void setWorkingDirectory(std::string path);
|
||||||
void rejectLoopClosure(int oldId, int newId);
|
void rejectLoopClosure(int oldId, int newId);
|
||||||
void get3DMap(std::map<int, Signature> & signatures,
|
void get3DMap(std::map<int, Signature> & signatures,
|
||||||
@@ -215,7 +216,7 @@ private:
|
|||||||
EpipolarGeometry * _epipolarGeometry;
|
EpipolarGeometry * _epipolarGeometry;
|
||||||
BayesFilter * _bayesFilter;
|
BayesFilter * _bayesFilter;
|
||||||
Optimizer * _graphOptimizer;
|
Optimizer * _graphOptimizer;
|
||||||
ParametersMap _modifiedParameters;
|
ParametersMap _parameters;
|
||||||
|
|
||||||
Memory * _memory;
|
Memory * _memory;
|
||||||
|
|
||||||
|
|||||||
@@ -354,6 +354,8 @@ Feature2D::~Feature2D()
|
|||||||
}
|
}
|
||||||
void Feature2D::parseParameters(const ParametersMap & parameters)
|
void Feature2D::parseParameters(const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
|
uInsert(parameters_, parameters);
|
||||||
|
|
||||||
Parameters::parse(parameters, Parameters::kKpMaxFeatures(), maxFeatures_);
|
Parameters::parse(parameters, Parameters::kKpMaxFeatures(), maxFeatures_);
|
||||||
Parameters::parse(parameters, Parameters::kKpMaxDepth(), _wordsMaxDepth);
|
Parameters::parse(parameters, Parameters::kKpMaxDepth(), _wordsMaxDepth);
|
||||||
Parameters::parse(parameters, Parameters::kKpMinDepth(), _wordsMinDepth);
|
Parameters::parse(parameters, Parameters::kKpMinDepth(), _wordsMinDepth);
|
||||||
@@ -399,7 +401,7 @@ void Feature2D::parseParameters(const ParametersMap & parameters)
|
|||||||
if((iter=parameters.find(Parameters::kStereoOpticalFlow())) != parameters.end())
|
if((iter=parameters.find(Parameters::kStereoOpticalFlow())) != parameters.end())
|
||||||
{
|
{
|
||||||
delete _stereo;
|
delete _stereo;
|
||||||
_stereo = Stereo::create(parameters);
|
_stereo = Stereo::create(parameters_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -377,6 +377,8 @@ Memory::~Memory()
|
|||||||
|
|
||||||
void Memory::parseParameters(const ParametersMap & parameters)
|
void Memory::parseParameters(const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
|
uInsert(parameters_, parameters);
|
||||||
|
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
ParametersMap::const_iterator iter;
|
ParametersMap::const_iterator iter;
|
||||||
|
|
||||||
@@ -438,7 +440,7 @@ void Memory::parseParameters(const ParametersMap & parameters)
|
|||||||
_feature2D = 0;
|
_feature2D = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_feature2D = Feature2D::create(detectorStrategy, parameters);
|
_feature2D = Feature2D::create(detectorStrategy, parameters_);
|
||||||
}
|
}
|
||||||
else if(_feature2D)
|
else if(_feature2D)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -96,14 +96,8 @@ OdometryBOW::OdometryBOW(const ParametersMap & parameters) :
|
|||||||
for(ParametersMap::const_iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
|
for(ParametersMap::const_iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
|
||||||
{
|
{
|
||||||
std::string group = uSplit(iter->first, '/').front();
|
std::string group = uSplit(iter->first, '/').front();
|
||||||
if(group.compare("SURF") == 0 ||
|
if(Parameters::isFeatureParameter(iter->first) ||
|
||||||
group.compare("SIFT") == 0 ||
|
group.compare("Stereo") == 0)
|
||||||
group.compare("BRIEF") == 0 ||
|
|
||||||
group.compare("FAST") == 0 ||
|
|
||||||
group.compare("ORB") == 0 ||
|
|
||||||
group.compare("FREAK") == 0 ||
|
|
||||||
group.compare("GFTT") == 0 ||
|
|
||||||
group.compare("BRISK") == 0)
|
|
||||||
{
|
{
|
||||||
customParameters.insert(*iter);
|
customParameters.insert(*iter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,15 +60,6 @@ RegistrationVis::RegistrationVis(const ParametersMap & parameters) :
|
|||||||
_flowMaxLevel(Parameters::defaultVisCorFlowMaxLevel())
|
_flowMaxLevel(Parameters::defaultVisCorFlowMaxLevel())
|
||||||
{
|
{
|
||||||
_featureParameters = Parameters::getDefaultParameters();
|
_featureParameters = Parameters::getDefaultParameters();
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kMemIncrementalMemory(), "true")); // make sure it is incremental
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kMemBinDataKept(), "false"));
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kMemSTMSize(), "0"));
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kKpIncrementalDictionary(), "true")); // make sure it is incremental
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kKpBadSignRatio(), "0"));
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kMemGenerateIds(), "true"));
|
|
||||||
|
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kKpNNStrategy(), _featureParameters.at(Parameters::kVisCorNNType())));
|
uInsert(_featureParameters, ParametersPair(Parameters::kKpNNStrategy(), _featureParameters.at(Parameters::kVisCorNNType())));
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kKpNndrRatio(), _featureParameters.at(Parameters::kVisCorNNDR())));
|
uInsert(_featureParameters, ParametersPair(Parameters::kKpNndrRatio(), _featureParameters.at(Parameters::kVisCorNNDR())));
|
||||||
uInsert(_featureParameters, ParametersPair(Parameters::kKpDetectorStrategy(), _featureParameters.at(Parameters::kVisFeatureType())));
|
uInsert(_featureParameters, ParametersPair(Parameters::kKpDetectorStrategy(), _featureParameters.at(Parameters::kVisFeatureType())));
|
||||||
|
|||||||
@@ -362,11 +362,13 @@ void Rtabmap::close(bool databaseSaved)
|
|||||||
}
|
}
|
||||||
_databasePath.clear();
|
_databasePath.clear();
|
||||||
parseParameters(Parameters::getDefaultParameters()); // reset to default parameters
|
parseParameters(Parameters::getDefaultParameters()); // reset to default parameters
|
||||||
_modifiedParameters.clear();
|
_parameters.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rtabmap::parseParameters(const ParametersMap & parameters)
|
void Rtabmap::parseParameters(const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
|
uInsert(_parameters, parameters);
|
||||||
|
|
||||||
ULOGGER_DEBUG("");
|
ULOGGER_DEBUG("");
|
||||||
ParametersMap::const_iterator iter;
|
ParametersMap::const_iterator iter;
|
||||||
if((iter=parameters.find(Parameters::kRtabmapWorkingDirectory())) != parameters.end())
|
if((iter=parameters.find(Parameters::kRtabmapWorkingDirectory())) != parameters.end())
|
||||||
@@ -481,7 +483,7 @@ void Rtabmap::parseParameters(const ParametersMap & parameters)
|
|||||||
|
|
||||||
for(ParametersMap::const_iterator iter = parameters.begin(); iter!=parameters.end(); ++iter)
|
for(ParametersMap::const_iterator iter = parameters.begin(); iter!=parameters.end(); ++iter)
|
||||||
{
|
{
|
||||||
uInsert(_modifiedParameters, ParametersPair(iter->first, iter->second));
|
uInsert(_parameters, ParametersPair(iter->first, iter->second));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -776,7 +778,7 @@ void Rtabmap::resetMemory()
|
|||||||
|
|
||||||
if(_memory)
|
if(_memory)
|
||||||
{
|
{
|
||||||
_memory->init(_databasePath, true, _modifiedParameters, true);
|
_memory->init(_databasePath, true, _parameters, true);
|
||||||
if(_memory->getLastWorkingSignature())
|
if(_memory->getLastWorkingSignature())
|
||||||
{
|
{
|
||||||
optimizeCurrentMap(_memory->getLastWorkingSignature()->id(), false, _optimizedPoses, &_constraints);
|
optimizeCurrentMap(_memory->getLastWorkingSignature()->id(), false, _optimizedPoses, &_constraints);
|
||||||
|
|||||||
@@ -225,7 +225,6 @@ std::vector<cv::Point2f> calcStereoCorrespondences(
|
|||||||
{
|
{
|
||||||
if(level>0)
|
if(level>0)
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
|
||||||
tmpMaxDisparity = tmpMinDisparity+(bestScoreIndex+1)*(1<<level);
|
tmpMaxDisparity = tmpMinDisparity+(bestScoreIndex+1)*(1<<level);
|
||||||
tmpMaxDisparity+=tmpMaxDisparity%level;
|
tmpMaxDisparity+=tmpMaxDisparity%level;
|
||||||
if(tmpMaxDisparity > maxDisparity)
|
if(tmpMaxDisparity > maxDisparity)
|
||||||
@@ -247,7 +246,6 @@ std::vector<cv::Point2f> calcStereoCorrespondences(
|
|||||||
|
|
||||||
if(bestScoreIndex>=0)
|
if(bestScoreIndex>=0)
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
|
||||||
//subpixel refining
|
//subpixel refining
|
||||||
int d = -(tmpMinDisparity+bestScoreIndex);
|
int d = -(tmpMinDisparity+bestScoreIndex);
|
||||||
|
|
||||||
|
|||||||
@@ -3669,7 +3669,7 @@ void DatabaseViewer::refineConstraintVisually(int from, int to, bool silent, boo
|
|||||||
RegistrationVis reg(parameters);
|
RegistrationVis reg(parameters);
|
||||||
Signature fromS(dataFrom);
|
Signature fromS(dataFrom);
|
||||||
Signature toS(dataTo);
|
Signature toS(dataTo);
|
||||||
t = reg.computeTransformationMod(fromS, toS, Transform::getIdentity(), &rejectedMsg, &inliers, &variance);
|
t = reg.computeTransformationMod(fromS, toS, currentLink.transform(), &rejectedMsg, &inliers, &variance);
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
|
|
||||||
if(!silent)
|
if(!silent)
|
||||||
|
|||||||
@@ -449,6 +449,23 @@ inline void uInsert(std::map<K, V> & map, const std::pair<K, V> & pair)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert items in the map. Contrary to the insert in the STL,
|
||||||
|
* if the key already exists, the value will be replaced by the new one.
|
||||||
|
*/
|
||||||
|
template<class K, class V>
|
||||||
|
inline void uInsert(std::map<K, V> & map, const std::map<K, V> & items)
|
||||||
|
{
|
||||||
|
for(typename std::map<K, V>::const_iterator iter=items.begin(); iter!=items.end(); ++iter)
|
||||||
|
{
|
||||||
|
std::pair<typename std::map<K, V>::iterator, bool> inserted = map.insert(*iter);
|
||||||
|
if(inserted.second == false)
|
||||||
|
{
|
||||||
|
inserted.first->second = iter->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a std::list to a std::vector.
|
* Convert a std::list to a std::vector.
|
||||||
* @param list the list
|
* @param list the list
|
||||||
|
|||||||
Reference in New Issue
Block a user