latching /rtabmap/mapGraph topic by default

This commit is contained in:
matlabbe
2023-02-16 14:12:07 -08:00
parent 7c202de229
commit 2f4aadacbb
4 changed files with 45 additions and 12 deletions
+1
View File
@@ -257,6 +257,7 @@ private:
rtabmap::Transform currentMetricGoal_; rtabmap::Transform currentMetricGoal_;
rtabmap::Transform lastPublishedMetricGoal_; rtabmap::Transform lastPublishedMetricGoal_;
bool latestNodeWasReached_; bool latestNodeWasReached_;
bool graphLatched_;
rtabmap::ParametersMap parameters_; rtabmap::ParametersMap parameters_;
std::map<std::string, float> rtabmapROSStats_; std::map<std::string, float> rtabmapROSStats_;
+2
View File
@@ -52,6 +52,8 @@ public:
void init(ros::NodeHandle & nh, ros::NodeHandle & pnh, const std::string & name, bool usePublicNamespace); void init(ros::NodeHandle & nh, ros::NodeHandle & pnh, const std::string & name, bool usePublicNamespace);
void clear(); void clear();
bool hasSubscribers() const; bool hasSubscribers() const;
bool isLatching() const {return latching_;}
bool isMapUpdated() const;
void backwardCompatibilityParameters(ros::NodeHandle & pnh, rtabmap::ParametersMap & parameters) const; void backwardCompatibilityParameters(ros::NodeHandle & pnh, rtabmap::ParametersMap & parameters) const;
void setParameters(const rtabmap::ParametersMap & parameters); 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, const rtabmap::Memory * memory = 0); void set2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize, const std::map<int, rtabmap::Transform> & poses, const rtabmap::Memory * memory = 0);
+30 -12
View File
@@ -89,6 +89,7 @@ CoreWrapper::CoreWrapper() :
lastPose_(Transform::getIdentity()), lastPose_(Transform::getIdentity()),
lastPoseIntermediate_(false), lastPoseIntermediate_(false),
latestNodeWasReached_(false), latestNodeWasReached_(false),
graphLatched_(false),
frameId_("base_link"), frameId_("base_link"),
odomFrameId_(""), odomFrameId_(""),
mapFrameId_("map"), mapFrameId_("map"),
@@ -275,7 +276,7 @@ void CoreWrapper::onInit()
infoPub_ = nh.advertise<rtabmap_ros::Info>("info", 1); infoPub_ = nh.advertise<rtabmap_ros::Info>("info", 1);
mapDataPub_ = nh.advertise<rtabmap_ros::MapData>("mapData", 1); mapDataPub_ = nh.advertise<rtabmap_ros::MapData>("mapData", 1);
mapGraphPub_ = nh.advertise<rtabmap_ros::MapGraph>("mapGraph", 1); mapGraphPub_ = nh.advertise<rtabmap_ros::MapGraph>("mapGraph", 1, mapsManager_.isLatching());
odomCachePub_ = nh.advertise<rtabmap_ros::MapGraph>("mapOdomCache", 1); odomCachePub_ = nh.advertise<rtabmap_ros::MapGraph>("mapOdomCache", 1);
landmarksPub_ = nh.advertise<geometry_msgs::PoseArray>("landmarks", 1); landmarksPub_ = nh.advertise<geometry_msgs::PoseArray>("landmarks", 1);
labelsPub_ = nh.advertise<visualization_msgs::MarkerArray>("labels", 1); labelsPub_ = nh.advertise<visualization_msgs::MarkerArray>("labels", 1);
@@ -2042,8 +2043,6 @@ void CoreWrapper::process(
} }
else else
{ {
// Publish local graph, info
this->publishStats(stamp);
if(localizationPosePub_.getNumSubscribers() && if(localizationPosePub_.getNumSubscribers() &&
!rtabmap_.getStatistics().localizationCovariance().empty()) !rtabmap_.getStatistics().localizationCovariance().empty())
{ {
@@ -2111,6 +2110,9 @@ void CoreWrapper::process(
mapsManager_.publishMaps(filteredPoses, stamp, mapFrameId_); mapsManager_.publishMaps(filteredPoses, stamp, mapFrameId_);
// Publish local graph, info
this->publishStats(stamp);
// update goal if planning is enabled // update goal if planning is enabled
if(!currentMetricGoal_.isNull()) if(!currentMetricGoal_.isNull())
{ {
@@ -2721,6 +2723,7 @@ bool CoreWrapper::resetRtabmapCallback(std_srvs::Empty::Request&, std_srvs::Empt
lastPublishedMetricGoal_.setNull(); lastPublishedMetricGoal_.setNull();
goalFrameId_.clear(); goalFrameId_.clear();
latestNodeWasReached_ = false; latestNodeWasReached_ = false;
graphLatched_ = false;
mapsManager_.clear(); mapsManager_.clear();
previousStamp_ = ros::Time(0); previousStamp_ = ros::Time(0);
globalPose_.header.stamp = ros::Time(0); globalPose_.header.stamp = ros::Time(0);
@@ -2811,6 +2814,7 @@ bool CoreWrapper::loadDatabaseCallback(rtabmap_ros::LoadDatabase::Request& req,
lastPublishedMetricGoal_.setNull(); lastPublishedMetricGoal_.setNull();
goalFrameId_.clear(); goalFrameId_.clear();
latestNodeWasReached_ = false; latestNodeWasReached_ = false;
graphLatched_ = false;
mapsManager_.clear(); mapsManager_.clear();
previousStamp_ = ros::Time(0); previousStamp_ = ros::Time(0);
globalPose_.header.stamp = ros::Time(0); globalPose_.header.stamp = ros::Time(0);
@@ -2935,6 +2939,7 @@ bool CoreWrapper::backupDatabaseCallback(std_srvs::Empty::Request&, std_srvs::Em
lastPublishedMetricGoal_.setNull(); lastPublishedMetricGoal_.setNull();
goalFrameId_.clear(); goalFrameId_.clear();
latestNodeWasReached_ = false; latestNodeWasReached_ = false;
graphLatched_ = false;
userDataMutex_.lock(); userDataMutex_.lock();
userData_ = cv::Mat(); userData_ = cv::Mat();
userDataMutex_.unlock(); userDataMutex_.unlock();
@@ -4000,17 +4005,30 @@ void CoreWrapper::publishStats(const ros::Time & stamp)
if(mapGraphPub_.getNumSubscribers()) if(mapGraphPub_.getNumSubscribers())
{ {
rtabmap_ros::MapGraphPtr msg(new rtabmap_ros::MapGraph); if(mapsManager_.isMapUpdated())
msg->header.stamp = stamp; {
msg->header.frame_id = mapFrameId_; graphLatched_ = false;
}
if(!(mapsManager_.isLatching() && graphLatched_))
{
rtabmap_ros::MapGraphPtr msg(new rtabmap_ros::MapGraph);
msg->header.stamp = stamp;
msg->header.frame_id = mapFrameId_;
rtabmap_ros::mapGraphToROS( rtabmap_ros::mapGraphToROS(
stats.poses(), stats.poses(),
stats.constraints(), stats.constraints(),
stats.mapCorrection(), stats.mapCorrection(),
*msg); *msg);
mapGraphPub_.publish(msg); mapGraphPub_.publish(msg);
graphLatched_ = mapsManager_.isLatching();
}
// else we already published the latched graph
}
else
{
graphLatched_ = false;
} }
if(odomCachePub_.getNumSubscribers()) if(odomCachePub_.getNumSubscribers())
+12
View File
@@ -427,6 +427,18 @@ bool MapsManager::hasSubscribers() const
octoMapProj_.getNumSubscribers() != 0; octoMapProj_.getNumSubscribers() != 0;
} }
bool MapsManager::isMapUpdated() const
{
// We are currently using the check made in OccupancyGrid::update()
// to know if the map/graph changed. If there are no subscribers to
// any grid topics, we won't know it, so we will assume the graph
// changed.
return gridUpdated_ ||
(projMapPub_.getNumSubscribers() == 0 &&
gridMapPub_.getNumSubscribers() == 0 &&
gridProbMapPub_.getNumSubscribers() == 0);
}
std::map<int, Transform> MapsManager::getFilteredPoses(const std::map<int, Transform> & poses) std::map<int, Transform> MapsManager::getFilteredPoses(const std::map<int, Transform> & poses)
{ {
if(mapFilterRadius_ > 0.0) if(mapFilterRadius_ > 0.0)