20 #include "nav2_costmap_2d/clear_costmap_service.hpp"
21 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
28 using std::shared_ptr;
30 using ClearExceptRegion = nav2_msgs::srv::ClearCostmapExceptRegion;
31 using ClearAroundRobot = nav2_msgs::srv::ClearCostmapAroundRobot;
32 using ClearAroundPose = nav2_msgs::srv::ClearCostmapAroundPose;
33 using ClearEntirely = nav2_msgs::srv::ClearEntireCostmap;
36 const nav2_util::LifecycleNode::WeakPtr & parent,
40 auto node = parent.lock();
41 logger_ = node->get_logger();
44 clear_except_service_ = node->create_service<ClearExceptRegion>(
45 "clear_except_" + costmap_.
getName(),
47 &ClearCostmapService::clearExceptRegionCallback,
this,
48 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
50 clear_around_service_ = node->create_service<ClearAroundRobot>(
51 "clear_around_" + costmap.
getName(),
53 &ClearCostmapService::clearAroundRobotCallback,
this,
54 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
56 clear_around_pose_service_ = node->create_service<ClearAroundPose>(
57 std::string(
"clear_around_pose_") + costmap_.
getName(),
59 &ClearCostmapService::clearAroundPoseCallback,
this,
60 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
62 clear_entire_service_ = node->create_service<ClearEntirely>(
63 "clear_entirely_" + costmap_.
getName(),
65 &ClearCostmapService::clearEntireCallback,
this,
66 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
72 clear_except_service_.reset();
73 clear_around_service_.reset();
74 clear_around_pose_service_.reset();
75 clear_entire_service_.reset();
78 void ClearCostmapService::clearExceptRegionCallback(
79 const shared_ptr<rmw_request_id_t>,
80 const shared_ptr<ClearExceptRegion::Request> request,
81 const shared_ptr<ClearExceptRegion::Response>)
85 (
"Received request to clear except a region the " + costmap_.
getName()).c_str());
90 void ClearCostmapService::clearAroundRobotCallback(
91 const shared_ptr<rmw_request_id_t>,
92 const shared_ptr<ClearAroundRobot::Request> request,
93 const shared_ptr<ClearAroundRobot::Response>)
98 void ClearCostmapService::clearAroundPoseCallback(
99 const shared_ptr<rmw_request_id_t>,
100 const shared_ptr<ClearAroundPose::Request> request,
101 const shared_ptr<ClearAroundPose::Response>)
105 (
"Received request to clear around pose for " + costmap_.
getName()).c_str());
110 void ClearCostmapService::clearEntireCallback(
111 const std::shared_ptr<rmw_request_id_t>,
112 const std::shared_ptr<ClearEntirely::Request>,
113 const std::shared_ptr<ClearEntirely::Response>)
117 (
"Received request to clear entirely the " + costmap_.
getName()).c_str());
123 const geometry_msgs::msg::PoseStamped & pose,
124 const double reset_distance)
129 geometry_msgs::msg::PoseStamped global_pose;
134 costmap_.getTfBuffer()->transform(pose, global_pose, costmap_.
getGlobalFrameID());
136 }
catch (tf2::TransformException & ex) {
139 "Cannot clear map around pose because pose cannot be transformed to costmap frame: %s",
144 x = global_pose.pose.position.x;
145 y = global_pose.pose.position.y;
149 for (
auto & layer : *layers) {
150 if (layer->isClearable()) {
151 auto costmap_layer = std::static_pointer_cast<CostmapLayer>(layer);
152 clearLayerRegion(costmap_layer, x, y, reset_distance,
false);
161 if (!getPosition(x, y)) {
164 "Cannot clear map because robot pose cannot be retrieved.");
170 for (
auto & layer : *layers) {
171 if (layer->isClearable()) {
172 auto costmap_layer = std::static_pointer_cast<CostmapLayer>(layer);
173 clearLayerRegion(costmap_layer, x, y, reset_distance, invert);
181 void ClearCostmapService::clearLayerRegion(
182 shared_ptr<CostmapLayer> & costmap,
double pose_x,
double pose_y,
double reset_distance,
185 std::unique_lock<Costmap2D::mutex_t> lock(*(costmap->getMutex()));
187 double start_point_x = pose_x - reset_distance / 2;
188 double start_point_y = pose_y - reset_distance / 2;
189 double end_point_x = start_point_x + reset_distance;
190 double end_point_y = start_point_y + reset_distance;
192 int start_x, start_y, end_x, end_y;
193 costmap->worldToMapEnforceBounds(start_point_x, start_point_y, start_x, start_y);
194 costmap->worldToMapEnforceBounds(end_point_x, end_point_y, end_x, end_y);
196 costmap->clearArea(start_x, start_y, end_x, end_y, invert);
198 double ox = costmap->getOriginX(), oy = costmap->getOriginY();
199 double width = costmap->getSizeInMetersX(), height = costmap->getSizeInMetersY();
200 costmap->addExtraBounds(ox, oy, ox + width, oy + height);
205 std::unique_lock<Costmap2D::mutex_t> lock(*(costmap_.
getCostmap()->getMutex()));
209 bool ClearCostmapService::getPosition(
double & x,
double & y)
const
211 geometry_msgs::msg::PoseStamped pose;
216 x = pose.pose.position.x;
217 y = pose.pose.position.y;
~ClearCostmapService()
A destructor.
void clearAroundPose(const geometry_msgs::msg::PoseStamped &pose, double reset_distance)
Clears the region around a specific pose.
ClearCostmapService()=delete
A constructor.
void clearRegion(double reset_distance, bool invert)
Clears the region outside of a user-specified area reverting to the static map.
void clearEntirely()
Clears all layers.
A ROS wrapper for a 2D Costmap. Handles subscribing to topics that provide observations about obstacl...
bool getRobotPose(geometry_msgs::msg::PoseStamped &global_pose)
Get the pose of the robot in the global frame of the costmap.
std::string getName() const
Returns costmap name.
LayeredCostmap * getLayeredCostmap()
Get the layered costmap object used in the node.
void resetLayers()
Reset each individual layer.
std::string getGlobalFrameID()
Returns the global frame of the costmap.
Costmap2D * getCostmap()
Return a pointer to the "master" costmap which receives updates from all the layers.
unsigned char getDefaultValue()
Get the default background value of the costmap.
std::vector< std::shared_ptr< Layer > > * getPlugins()
Get the vector of pointers to the costmap plugins.