Fixed saved grid map wrongly cleared when RGBD/OptimizeFromGraphEnd is true

This commit is contained in:
matlabbe
2018-08-02 17:07:48 -04:00
parent bc4b7a860e
commit a97be68897
3 changed files with 47 additions and 4 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ public:
bool hasSubscribers() const;
void backwardCompatibilityParameters(ros::NodeHandle & pnh, rtabmap::ParametersMap & parameters) const;
void setParameters(const rtabmap::ParametersMap & parameters);
void set2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize, const std::map<int, rtabmap::Transform> & poses);
void set2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize, const std::map<int, rtabmap::Transform> & poses, const rtabmap::Memory * memory = 0);
std::map<int, rtabmap::Transform> getFilteredPoses(
const std::map<int, rtabmap::Transform> & poses);
+2 -2
View File
@@ -502,8 +502,8 @@ void CoreWrapper::onInit()
cv::Mat map = rtabmap_.getMemory()->load2DMap(xMin, yMin, gridCellSize);
if(!map.empty())
{
NODELET_INFO("rtabmap: 2D occupancy grid map loaded.\n");
mapsManager_.set2DMap(map, xMin, yMin, gridCellSize, rtabmap_.getLocalOptimizedPoses());
NODELET_INFO("rtabmap: 2D occupancy grid map loaded (%dx%d).", map.cols, map.rows);
mapsManager_.set2DMap(map, xMin, yMin, gridCellSize, rtabmap_.getLocalOptimizedPoses(), rtabmap_.getMemory());
}
}
+44 -1
View File
@@ -289,9 +289,52 @@ void MapsManager::setParameters(const rtabmap::ParametersMap & parameters)
#endif
}
void MapsManager::set2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize, const std::map<int, rtabmap::Transform> & poses)
void MapsManager::set2DMap(
const cv::Mat & map,
float xMin,
float yMin,
float cellSize,
const std::map<int, rtabmap::Transform> & poses,
const rtabmap::Memory * memory)
{
occupancyGrid_->setMap(map, xMin, yMin, cellSize, poses);
//update cache in case the map should be updated
if(memory)
{
for(std::map<int, rtabmap::Transform>::const_iterator iter=poses.begin(); iter!=poses.end(); ++iter)
{
std::map<int, std::pair< std::pair<cv::Mat, cv::Mat>, cv::Mat> >::iterator jter = gridMaps_.find(iter->first);
if(!uContains(gridMaps_, iter->first))
{
rtabmap::SensorData data;
data = memory->getSignatureDataConst(iter->first, false, false, false, true);
if(data.gridCellSize() == 0.0f)
{
ROS_WARN("Local occupancy grid doesn't exist for node %d", iter->first);
}
else
{
cv::Mat ground, obstacles, emptyCells;
data.uncompressData(
0,
0,
0,
0,
&ground,
&obstacles,
&emptyCells);
uInsert(gridMaps_, std::make_pair(iter->first, std::make_pair(std::make_pair(ground, obstacles), emptyCells)));
uInsert(gridMapsViewpoints_, std::make_pair(iter->first, data.gridViewPoint()));
occupancyGrid_->addToCache(iter->first, ground, obstacles, emptyCells);
}
}
else
{
occupancyGrid_->addToCache(iter->first, jter->second.first.first, jter->second.first.second, jter->second.second);
}
}
}
}
void MapsManager::clear()