Nav2 Navigation Stack - rolling  main
ROS 2 Navigation Stack
costmap_2d_publisher.hpp
1 /*********************************************************************
2  *
3  * Software License Agreement (BSD License)
4  *
5  * Copyright (c) 2008, 2013, Willow Garage, Inc.
6  * Copyright (c) 2019, Samsung Research America, Inc.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * * Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above
16  * copyright notice, this list of conditions and the following
17  * disclaimer in the documentation and/or other materials provided
18  * with the distribution.
19  * * Neither the name of Willow Garage, Inc. nor the names of its
20  * contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * Author: Eitan Marder-Eppstein
37  * David V. Lu!!
38  *********************************************************************/
39 #ifndef NAV2_COSTMAP_2D__COSTMAP_2D_PUBLISHER_HPP_
40 #define NAV2_COSTMAP_2D__COSTMAP_2D_PUBLISHER_HPP_
41 
42 #include <algorithm>
43 #include <string>
44 #include <memory>
45 
46 #include "rclcpp_lifecycle/lifecycle_node.hpp"
47 #include "nav2_costmap_2d/costmap_2d.hpp"
48 #include "nav_msgs/msg/occupancy_grid.hpp"
49 #include "map_msgs/msg/occupancy_grid_update.hpp"
50 #include "nav2_msgs/msg/costmap.hpp"
51 #include "nav2_msgs/msg/costmap_update.hpp"
52 #include "nav2_msgs/srv/get_costmap.hpp"
53 #include "tf2/transform_datatypes.hpp"
54 #include "nav2_ros_common/lifecycle_node.hpp"
55 #include "tf2/LinearMath/Quaternion.hpp"
56 #include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
57 #include "nav2_ros_common/service_server.hpp"
58 
59 namespace nav2_costmap_2d
60 {
66 {
67 public:
72  const nav2::LifecycleNode::WeakPtr & parent,
73  Costmap2D * costmap,
74  std::string global_frame,
75  std::string topic_name,
76  bool always_send_full_costmap = false,
77  double map_vis_z = 0.0);
78 
83 
87  void on_configure() {}
88 
92  void on_activate()
93  {
94  costmap_pub_->on_activate();
95  costmap_update_pub_->on_activate();
96  costmap_raw_pub_->on_activate();
97  costmap_raw_update_pub_->on_activate();
98  }
99 
104  {
105  costmap_pub_->on_deactivate();
106  costmap_update_pub_->on_deactivate();
107  costmap_raw_pub_->on_deactivate();
108  costmap_raw_update_pub_->on_deactivate();
109  }
110 
114  void on_cleanup() {}
115 
117  void updateBounds(unsigned int x0, unsigned int xn, unsigned int y0, unsigned int yn)
118  {
119  x0_ = std::min(x0, x0_);
120  xn_ = std::max(xn, xn_);
121  y0_ = std::min(y0, y0_);
122  yn_ = std::max(yn, yn_);
123  }
124 
128  void publishCostmap();
129 
134  bool active()
135  {
136  return active_;
137  }
138 
139 private:
141  void prepareGrid();
142  void prepareCostmap();
143 
145  std::unique_ptr<map_msgs::msg::OccupancyGridUpdate> createGridUpdateMsg();
147  std::unique_ptr<nav2_msgs::msg::CostmapUpdate> createCostmapUpdateMsg();
148 
150  // void onNewSubscription(const ros::SingleSubscriberPublisher& pub);
151 
152  void updateGridParams();
153 
155  void costmap_service_callback(
156  const std::shared_ptr<rmw_request_id_t> request_header,
157  const std::shared_ptr<nav2_msgs::srv::GetCostmap::Request> request,
158  const std::shared_ptr<nav2_msgs::srv::GetCostmap::Response> response);
159 
160  rclcpp::Clock::SharedPtr clock_;
161  rclcpp::Logger logger_{rclcpp::get_logger("nav2_costmap_2d")};
162 
163  Costmap2D * costmap_;
164  std::string global_frame_;
165  std::string topic_name_;
166  unsigned int x0_, xn_, y0_, yn_;
167  double saved_origin_x_;
168  double saved_origin_y_;
169  bool active_;
170  bool always_send_full_costmap_;
171  double map_vis_z_;
172 
173  // Publisher for translated costmap values as msg::OccupancyGrid used in visualization
174  nav2::Publisher<nav_msgs::msg::OccupancyGrid>::SharedPtr costmap_pub_;
175  nav2::Publisher<map_msgs::msg::OccupancyGridUpdate>::SharedPtr
176  costmap_update_pub_;
177 
178  // Publisher for raw costmap values as msg::Costmap from layered costmap
179  nav2::Publisher<nav2_msgs::msg::Costmap>::SharedPtr costmap_raw_pub_;
180  nav2::Publisher<nav2_msgs::msg::CostmapUpdate>::SharedPtr
181  costmap_raw_update_pub_;
182 
183  // Service for getting the costmaps
184  nav2::ServiceServer<nav2_msgs::srv::GetCostmap>::SharedPtr
185  costmap_service_;
186 
187  float grid_resolution_;
188  unsigned int grid_width_, grid_height_;
189  std::unique_ptr<nav_msgs::msg::OccupancyGrid> grid_;
190  std::unique_ptr<nav2_msgs::msg::Costmap> costmap_raw_;
191  // Translate from 0-255 values in costmap to -1 to 100 values in message.
192  static char * cost_translation_table_;
193 };
194 
195 } // namespace nav2_costmap_2d
196 
197 #endif // NAV2_COSTMAP_2D__COSTMAP_2D_PUBLISHER_HPP_
A tool to periodically publish visualization data from a Costmap2D.
Costmap2DPublisher(const nav2::LifecycleNode::WeakPtr &parent, Costmap2D *costmap, std::string global_frame, std::string topic_name, bool always_send_full_costmap=false, double map_vis_z=0.0)
Constructor for the Costmap2DPublisher.
void publishCostmap()
Publishes the visualization data over ROS.
bool active()
Check if the publisher is active.
void updateBounds(unsigned int x0, unsigned int xn, unsigned int y0, unsigned int yn)
Include the given bounds in the changed-rectangle.
A 2D costmap provides a mapping between points in the world and their associated "costs".
Definition: costmap_2d.hpp:69