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 ClearEntirely = nav2_msgs::srv::ClearEntireCostmap;
35 const nav2_util::LifecycleNode::WeakPtr & parent,
39 auto node = parent.lock();
40 logger_ = node->get_logger();
44 std::shared_ptr<rclcpp_lifecycle::LifecycleNode>>>(
45 std::string(
"clear_except_") + costmap_.
getName(),
48 &ClearCostmapService::clearExceptRegionCallback,
this,
49 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
52 std::shared_ptr<rclcpp_lifecycle::LifecycleNode>>>(
53 std::string(
"clear_around_") + costmap_.
getName(),
56 &ClearCostmapService::clearAroundRobotCallback,
this,
57 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
60 std::shared_ptr<rclcpp_lifecycle::LifecycleNode>>>(
61 std::string(
"clear_entirely_") + costmap_.
getName(),
64 &ClearCostmapService::clearEntireCallback,
this,
65 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
71 clear_except_service_.reset();
72 clear_around_service_.reset();
73 clear_entire_service_.reset();
76 void ClearCostmapService::clearExceptRegionCallback(
77 const shared_ptr<rmw_request_id_t>,
78 const shared_ptr<ClearExceptRegion::Request> request,
79 const shared_ptr<ClearExceptRegion::Response>)
83 (
"Received request to clear except a region the " + costmap_.
getName()).c_str());
88 void ClearCostmapService::clearAroundRobotCallback(
89 const shared_ptr<rmw_request_id_t>,
90 const shared_ptr<ClearAroundRobot::Request> request,
91 const shared_ptr<ClearAroundRobot::Response>)
96 void ClearCostmapService::clearEntireCallback(
97 const std::shared_ptr<rmw_request_id_t>,
98 const std::shared_ptr<ClearEntirely::Request>,
99 const std::shared_ptr<ClearEntirely::Response>)
103 (
"Received request to clear entirely the " + costmap_.
getName()).c_str());
112 if (!getPosition(x, y)) {
115 "Cannot clear map because robot pose cannot be retrieved.");
121 for (
auto & layer : *layers) {
122 if (layer->isClearable()) {
123 auto costmap_layer = std::static_pointer_cast<CostmapLayer>(layer);
124 clearLayerRegion(costmap_layer, x, y, reset_distance, invert);
132 void ClearCostmapService::clearLayerRegion(
133 shared_ptr<CostmapLayer> & costmap,
double pose_x,
double pose_y,
double reset_distance,
136 std::unique_lock<Costmap2D::mutex_t> lock(*(costmap->getMutex()));
138 double start_point_x = pose_x - reset_distance / 2;
139 double start_point_y = pose_y - reset_distance / 2;
140 double end_point_x = start_point_x + reset_distance;
141 double end_point_y = start_point_y + reset_distance;
143 int start_x, start_y, end_x, end_y;
144 costmap->worldToMapNoBounds(start_point_x, start_point_y, start_x, start_y);
145 costmap->worldToMapNoBounds(end_point_x, end_point_y, end_x, end_y);
147 costmap->clearArea(start_x, start_y, end_x, end_y, invert);
149 double ox = costmap->getOriginX(), oy = costmap->getOriginY();
150 double width = costmap->getSizeInMetersX(), height = costmap->getSizeInMetersY();
151 costmap->addExtraBounds(ox, oy, ox + width, oy + height);
156 std::unique_lock<Costmap2D::mutex_t> lock(*(costmap_.
getCostmap()->getMutex()));
160 bool ClearCostmapService::getPosition(
double & x,
double & y)
const
162 geometry_msgs::msg::PoseStamped pose;
167 x = pose.pose.position.x;
168 y = pose.pose.position.y;
~ClearCostmapService()
A destructor.
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.
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.
A simple wrapper on ROS2 services server.