Added Rtabmap::getSignatureCopy()

This commit is contained in:
matlabbe
2020-05-05 13:26:40 -04:00
parent 7041d5fd34
commit 7d377d26df
6 changed files with 90 additions and 124 deletions

View File

@@ -197,15 +197,15 @@ public:
EnvSensors & sensors, EnvSensors & sensors,
bool lookInDatabase = false) const; bool lookInDatabase = false) const;
cv::Mat getImageCompressed(int signatureId) const; cv::Mat getImageCompressed(int signatureId) const;
SensorData getNodeData(int nodeId, bool uncompressedData = false) const; SensorData getNodeData(int locationId, bool images, bool scan, bool userData, bool occupancyGrid) const;
void getNodeWords(int nodeId, void getNodeWordsAndGlobalDescriptors(int nodeId,
std::multimap<int, cv::KeyPoint> & words, std::multimap<int, cv::KeyPoint> & words,
std::multimap<int, cv::Point3f> & words3, std::multimap<int, cv::Point3f> & words3,
std::multimap<int, cv::Mat> & wordsDescriptors); std::multimap<int, cv::Mat> & wordsDescriptors,
std::vector<GlobalDescriptor> & globalDescriptors) const;
void getNodeCalibration(int nodeId, void getNodeCalibration(int nodeId,
std::vector<CameraModel> & models, std::vector<CameraModel> & models,
StereoCameraModel & stereoModel); StereoCameraModel & stereoModel) const;
SensorData getSignatureDataConst(int locationId, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
std::set<int> getAllSignatureIds() const; std::set<int> getAllSignatureIds() const;
bool memoryChanged() const {return _memoryChanged;} bool memoryChanged() const {return _memoryChanged;}
bool isIncremental() const {return _incrementalMemory;} bool isIncremental() const {return _incrementalMemory;}

View File

@@ -156,6 +156,7 @@ public:
void rejectLastLoopClosure(); void rejectLastLoopClosure();
void deleteLastLocation(); void deleteLastLocation();
void setOptimizedPoses(const std::map<int, Transform> & poses); void setOptimizedPoses(const std::map<int, Transform> & poses);
Signature getSignatureCopy(int id, bool images, bool scan, bool userData, bool occupancyGrid) const;
void get3DMap(std::map<int, Signature> & signatures, void get3DMap(std::map<int, Signature> & signatures,
std::map<int, Transform> & poses, std::map<int, Transform> & poses,
std::multimap<int, Link> & constraints, std::multimap<int, Link> & constraints,

View File

@@ -683,11 +683,11 @@ void DBDriver::getNodeData(
if(uContains(_trashSignatures, signatureId)) if(uContains(_trashSignatures, signatureId))
{ {
const Signature * s = _trashSignatures.at(signatureId); const Signature * s = _trashSignatures.at(signatureId);
if(!s->sensorData().imageCompressed().empty() || if((!s->isSaved() ||
!s->sensorData().laserScanCompressed().isEmpty() || ((!images || !s->sensorData().imageCompressed().empty()) &&
!s->sensorData().userDataCompressed().empty() || (!scan || !s->sensorData().laserScanCompressed().isEmpty()) &&
s->sensorData().gridCellSize() != 0.0f || (!userData || !s->sensorData().userDataCompressed().empty()) &&
!s->isSaved()) (!occupancyGrid || s->sensorData().gridCellSize() != 0.0f))))
{ {
data = (SensorData)s->sensorData(); data = (SensorData)s->sensorData();
found = true; found = true;

View File

@@ -2698,13 +2698,13 @@ Transform Memory::computeTransform(
(_registrationPipeline->isScanRequired() && fromS.sensorData().imageCompressed().empty() && fromS.sensorData().laserScanCompressed().isEmpty()) || (_registrationPipeline->isScanRequired() && fromS.sensorData().imageCompressed().empty() && fromS.sensorData().laserScanCompressed().isEmpty()) ||
(_registrationPipeline->isUserDataRequired() && fromS.sensorData().imageCompressed().empty() && fromS.sensorData().userDataCompressed().empty())) (_registrationPipeline->isUserDataRequired() && fromS.sensorData().imageCompressed().empty() && fromS.sensorData().userDataCompressed().empty()))
{ {
fromS.sensorData() = getNodeData(fromS.id()); fromS.sensorData() = getNodeData(fromS.id(), true, true, true, true);
} }
if(((_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired()) && toS.sensorData().imageCompressed().empty()) || if(((_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired()) && toS.sensorData().imageCompressed().empty()) ||
(_registrationPipeline->isScanRequired() && toS.sensorData().imageCompressed().empty() && toS.sensorData().laserScanCompressed().isEmpty()) || (_registrationPipeline->isScanRequired() && toS.sensorData().imageCompressed().empty() && toS.sensorData().laserScanCompressed().isEmpty()) ||
(_registrationPipeline->isUserDataRequired() && toS.sensorData().imageCompressed().empty() && toS.sensorData().userDataCompressed().empty())) (_registrationPipeline->isUserDataRequired() && toS.sensorData().imageCompressed().empty() && toS.sensorData().userDataCompressed().empty()))
{ {
toS.sensorData() = getNodeData(toS.id()); toS.sensorData() = getNodeData(toS.id(), true, true, true, true);
} }
// uncompress only what we need // uncompress only what we need
cv::Mat imgBuf, depthBuf, userBuf; cv::Mat imgBuf, depthBuf, userBuf;
@@ -3815,33 +3815,33 @@ cv::Mat Memory::getImageCompressed(int signatureId) const
return image; return image;
} }
SensorData Memory::getNodeData(int nodeId, bool uncompressedData) const SensorData Memory::getNodeData(int locationId, bool images, bool scan, bool userData, bool occupancyGrid) const
{ {
//UDEBUG("nodeId=%d", nodeId); //UDEBUG("");
SensorData r; SensorData r;
Signature * s = this->_getSignature(nodeId); const Signature * s = this->getSignature(locationId);
if(s && !s->sensorData().imageCompressed().empty()) if(s && (!s->isSaved() ||
((!images || !s->sensorData().imageCompressed().empty()) &&
(!scan || !s->sensorData().laserScanCompressed().isEmpty()) &&
(!userData || !s->sensorData().userDataCompressed().empty()) &&
(!occupancyGrid || s->sensorData().gridCellSize() != 0.0f))))
{ {
r = s->sensorData(); r = s->sensorData();
} }
else if(_dbDriver) else if(_dbDriver)
{ {
// load from database // load from database
_dbDriver->getNodeData(nodeId, r); _dbDriver->getNodeData(locationId, r, images, scan, userData, occupancyGrid);
}
if(uncompressedData)
{
r.uncompressData();
} }
return r; return r;
} }
void Memory::getNodeWords(int nodeId, void Memory::getNodeWordsAndGlobalDescriptors(int nodeId,
std::multimap<int, cv::KeyPoint> & words, std::multimap<int, cv::KeyPoint> & words,
std::multimap<int, cv::Point3f> & words3, std::multimap<int, cv::Point3f> & words3,
std::multimap<int, cv::Mat> & wordsDescriptors) std::multimap<int, cv::Mat> & wordsDescriptors,
std::vector<GlobalDescriptor> & globalDescriptors) const
{ {
//UDEBUG("nodeId=%d", nodeId); //UDEBUG("nodeId=%d", nodeId);
Signature * s = this->_getSignature(nodeId); Signature * s = this->_getSignature(nodeId);
@@ -3850,6 +3850,7 @@ void Memory::getNodeWords(int nodeId,
words = s->getWords(); words = s->getWords();
words3 = s->getWords3(); words3 = s->getWords3();
wordsDescriptors = s->getWordsDescriptors(); wordsDescriptors = s->getWordsDescriptors();
globalDescriptors = s->sensorData().globalDescriptors();
} }
else if(_dbDriver) else if(_dbDriver)
{ {
@@ -3864,6 +3865,7 @@ void Memory::getNodeWords(int nodeId,
words = signatures.front()->getWords(); words = signatures.front()->getWords();
words3 = signatures.front()->getWords3(); words3 = signatures.front()->getWords3();
wordsDescriptors = signatures.front()->getWordsDescriptors(); wordsDescriptors = signatures.front()->getWordsDescriptors();
globalDescriptors = signatures.front()->sensorData().globalDescriptors();
if(loadedFromTrash.size()) if(loadedFromTrash.size())
{ {
//put back //put back
@@ -3879,7 +3881,7 @@ void Memory::getNodeWords(int nodeId,
void Memory::getNodeCalibration(int nodeId, void Memory::getNodeCalibration(int nodeId,
std::vector<CameraModel> & models, std::vector<CameraModel> & models,
StereoCameraModel & stereoModel) StereoCameraModel & stereoModel) const
{ {
//UDEBUG("nodeId=%d", nodeId); //UDEBUG("nodeId=%d", nodeId);
Signature * s = this->_getSignature(nodeId); Signature * s = this->_getSignature(nodeId);
@@ -3895,28 +3897,6 @@ void Memory::getNodeCalibration(int nodeId,
} }
} }
SensorData Memory::getSignatureDataConst(int locationId,
bool images, bool scan, bool userData, bool occupancyGrid) const
{
//UDEBUG("");
SensorData r;
const Signature * s = this->getSignature(locationId);
if(s && (!s->sensorData().imageCompressed().empty() ||
!s->sensorData().laserScanCompressed().isEmpty() ||
!s->sensorData().userDataCompressed().empty() ||
s->sensorData().gridCellSize() != 0.0f))
{
r = s->sensorData();
}
else if(_dbDriver)
{
// load from database
_dbDriver->getNodeData(locationId, r, images, scan, userData, occupancyGrid);
}
return r;
}
void Memory::generateGraph(const std::string & fileName, const std::set<int> & ids) void Memory::generateGraph(const std::string & fileName, const std::set<int> & ids)
{ {
if(!_dbDriver) if(!_dbDriver)

View File

@@ -4268,6 +4268,62 @@ void Rtabmap::dumpPrediction() const
} }
} }
Signature Rtabmap::getSignatureCopy(int id, bool images, bool scan, bool userData, bool occupancyGrid) const
{
Signature s;
if(_memory)
{
Transform odomPoseLocal;
int weight = -1;
int mapId = -1;
std::string label;
double stamp = 0;
Transform groundTruth;
std::vector<float> velocity;
GPS gps;
EnvSensors sensors;
_memory->getNodeInfo(id, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, true);
SensorData data;
data.setId(id);
if(images || scan || userData || occupancyGrid)
{
data = _memory->getNodeData(id, images, scan, userData, occupancyGrid);
}
if(!images)
{
std::vector<CameraModel> models;
StereoCameraModel stereoModel;
_memory->getNodeCalibration(id, models, stereoModel);
data.setCameraModels(models);
data.setStereoCameraModel(stereoModel);
}
std::multimap<int, cv::KeyPoint> words;
std::multimap<int, cv::Point3f> words3;
std::multimap<int, cv::Mat> wordsDescriptors;
std::vector<rtabmap::GlobalDescriptor> globalDescriptors;
_memory->getNodeWordsAndGlobalDescriptors(id, words, words3, wordsDescriptors, globalDescriptors);
s=Signature(id,
mapId,
weight,
stamp,
label,
odomPoseLocal,
groundTruth,
data);
s.setWords(words);
s.setWords3(words3);
s.setWordsDescriptors(wordsDescriptors);
s.sensorData().setGlobalDescriptors(globalDescriptors);
if(velocity.size()==6)
{
s.setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
}
s.sensorData().setGPS(gps);
s.sensorData().setEnvSensors(sensors);
}
return s;
}
void Rtabmap::get3DMap( void Rtabmap::get3DMap(
std::map<int, Signature> & signatures, std::map<int, Signature> & signatures,
std::map<int, Transform> & poses, std::map<int, Transform> & poses,
@@ -4313,40 +4369,7 @@ void Rtabmap::get3DMap(
for(std::set<int>::iterator iter = ids.begin(); iter!=ids.end(); ++iter) for(std::set<int>::iterator iter = ids.begin(); iter!=ids.end(); ++iter)
{ {
Transform odomPoseLocal; signatures.insert(std::make_pair(*iter, getSignatureCopy(*iter, true, true, true, true)));
int weight = -1;
int mapId = -1;
std::string label;
double stamp = 0;
Transform groundTruth;
std::vector<float> velocity;
GPS gps;
EnvSensors sensors;
_memory->getNodeInfo(*iter, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, true);
SensorData data = _memory->getNodeData(*iter);
data.setId(*iter);
std::multimap<int, cv::KeyPoint> words;
std::multimap<int, cv::Point3f> words3;
std::multimap<int, cv::Mat> wordsDescriptors;
_memory->getNodeWords(*iter, words, words3, wordsDescriptors);
signatures.insert(std::make_pair(*iter,
Signature(*iter,
mapId,
weight,
stamp,
label,
odomPoseLocal,
groundTruth,
data)));
signatures.at(*iter).setWords(words);
signatures.at(*iter).setWords3(words3);
signatures.at(*iter).setWordsDescriptors(wordsDescriptors);
if(velocity.size()==6)
{
signatures.at(*iter).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
}
signatures.at(*iter).sensorData().setGPS(gps);
signatures.at(*iter).sensorData().setEnvSensors(sensors);
} }
} }
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1)) else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1))
@@ -4393,49 +4416,11 @@ void Rtabmap::getGraph(
{ {
for(std::map<int, Transform>::iterator iter=poses.lower_bound(1); iter!=poses.end(); ++iter) for(std::map<int, Transform>::iterator iter=poses.lower_bound(1); iter!=poses.end(); ++iter)
{ {
Transform odomPoseLocal; signatures->insert(std::make_pair(iter->first, getSignatureCopy(iter->first, false, false, false, false)));
int weight = -1;
int mapId = -1;
std::string label;
double stamp = 0;
Transform groundTruth;
std::vector<float> velocity;
GPS gps;
EnvSensors sensors;
_memory->getNodeInfo(iter->first, odomPoseLocal, mapId, weight, label, stamp, groundTruth, velocity, gps, sensors, global);
signatures->insert(std::make_pair(iter->first,
Signature(iter->first,
mapId,
weight,
stamp,
label,
odomPoseLocal,
groundTruth)));
std::multimap<int, cv::KeyPoint> words;
std::multimap<int, cv::Point3f> words3;
std::multimap<int, cv::Mat> wordsDescriptors;
_memory->getNodeWords(iter->first, words, words3, wordsDescriptors);
signatures->at(iter->first).setWords(words);
signatures->at(iter->first).setWords3(words3);
signatures->at(iter->first).setWordsDescriptors(wordsDescriptors);
std::vector<CameraModel> models;
StereoCameraModel stereoModel;
_memory->getNodeCalibration(iter->first, models, stereoModel);
signatures->at(iter->first).sensorData().setCameraModels(models);
signatures->at(iter->first).sensorData().setStereoCameraModel(stereoModel);
if(!velocity.empty())
{
signatures->at(iter->first).setVelocity(velocity[0], velocity[1], velocity[2], velocity[3], velocity[4], velocity[5]);
}
signatures->at(iter->first).sensorData().setGPS(gps);
signatures->at(iter->first).sensorData().setEnvSensors(sensors);
} }
} }
} }
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size())) else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1))
{ {
UERROR("Last working signature is null!?"); UERROR("Last working signature is null!?");
} }

View File

@@ -1553,7 +1553,7 @@ cv::Mat mergeTextures(
} }
else if(memory) else if(memory)
{ {
SensorData data = memory->getSignatureDataConst(textureId, true, false, false, false); SensorData data = memory->getNodeData(textureId, true, false, false, false);
std::vector<CameraModel> models = data.cameraModels(); std::vector<CameraModel> models = data.cameraModels();
StereoCameraModel stereoModel = data.stereoCameraModel(); StereoCameraModel stereoModel = data.stereoCameraModel();
if(models.size()>=1 && if(models.size()>=1 &&
@@ -1682,7 +1682,7 @@ cv::Mat mergeTextures(
} }
else if(memory) else if(memory)
{ {
SensorData data = memory->getSignatureDataConst(textures[t].first, true, false, false, false); SensorData data = memory->getNodeData(textures[t].first, true, false, false, false);
models = data.cameraModels(); models = data.cameraModels();
data.uncompressDataConst(&image, 0); data.uncompressDataConst(&image, 0);
} }
@@ -2291,7 +2291,7 @@ bool multiBandTexturing(
} }
else if(memory) else if(memory)
{ {
SensorData data = memory->getSignatureDataConst(camId, true, false, false, false); SensorData data = memory->getNodeData(camId, true, false, false, false);
models = data.cameraModels(); models = data.cameraModels();
if(models.empty() && data.stereoCameraModel().isValidForProjection()) if(models.empty() && data.stereoCameraModel().isValidForProjection())
{ {