sending words too when getting map

This commit is contained in:
matlabbe
2015-07-15 18:15:27 -04:00
parent 82ef6231c4
commit 185bc12cae
3 changed files with 45 additions and 0 deletions

View File

@@ -42,6 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "rtabmap/utilite/UStl.h"
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <pcl/point_types.h>
namespace rtabmap {
@@ -140,6 +141,9 @@ public:
bool lookInDatabase = false) const;
cv::Mat getImageCompressed(int signatureId) const;
SensorData getNodeData(int nodeId, bool uncompressedData = false);
void getNodeWords(int nodeId,
std::multimap<int, cv::KeyPoint> & words,
std::multimap<int, pcl::PointXYZ> & words3);
SensorData getSignatureDataConst(int locationId) const;
std::set<int> getAllSignatureIds() const;
bool memoryChanged() const {return _memoryChanged;}

View File

@@ -3354,6 +3354,42 @@ SensorData Memory::getNodeData(int nodeId, bool uncompressedData)
return r;
}
void Memory::getNodeWords(int nodeId,
std::multimap<int, cv::KeyPoint> & words,
std::multimap<int, pcl::PointXYZ> & words3)
{
UDEBUG("nodeId=%d", nodeId);
Signature * s = this->_getSignature(nodeId);
if(s)
{
words = s->getWords();
words3 = s->getWords3();
}
else if(_dbDriver)
{
// load from database
std::list<Signature*> signatures;
std::list<int> ids;
ids.push_back(nodeId);
std::set<int> loadedFromTrash;
_dbDriver->loadSignatures(ids, signatures, &loadedFromTrash);
if(signatures.size())
{
words = signatures.front()->getWords();
words3 = signatures.front()->getWords3();
if(loadedFromTrash.size())
{
//put back
_dbDriver->asyncSave(signatures.front());
}
else
{
delete signatures.front();
}
}
}
}
SensorData Memory::getSignatureDataConst(int locationId) const
{
UDEBUG("");

View File

@@ -2880,6 +2880,9 @@ void Rtabmap::get3DMap(
_memory->getNodeInfo(*iter, odomPose, mapId, weight, label, stamp, true);
SensorData data = _memory->getNodeData(*iter);
data.setId(*iter);
std::multimap<int, cv::KeyPoint> words;
std::multimap<int, pcl::PointXYZ> words3;
_memory->getNodeWords(*iter, words, words3);
signatures.insert(std::make_pair(*iter,
Signature(*iter,
mapId,
@@ -2888,6 +2891,8 @@ void Rtabmap::get3DMap(
label,
odomPose,
data)));
signatures.at(*iter).setWords(words);
signatures.at(*iter).setWords3(words3);
}
}
else if(_memory && (_memory->getStMem().size() || _memory->getWorkingMem().size() > 1))