mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-03 16:27:46 +08:00
Fixed saved grid map wrongly cleared when RGBD/OptimizeFromGraphEnd is true
This commit is contained in:
@@ -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
@@ -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
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user