19 #include "nav2_costmap_2d/costmap_subscriber.hpp"
24 constexpr
int costmapUpdateQueueDepth = 10;
27 const nav2_util::LifecycleNode::WeakPtr & parent,
28 const std::string & topic_name)
29 : topic_name_(topic_name)
31 auto node = parent.lock();
32 logger_ = node->get_logger();
33 costmap_sub_ = node->create_subscription<nav2_msgs::msg::Costmap>(
35 rclcpp::QoS(rclcpp::KeepLast(1)).transient_local().reliable(),
37 costmap_update_sub_ = node->create_subscription<nav2_msgs::msg::CostmapUpdate>(
38 topic_name_ +
"_updates",
39 rclcpp::QoS(rclcpp::KeepLast(costmapUpdateQueueDepth)).transient_local().reliable(),
44 const rclcpp::Node::WeakPtr & parent,
45 const std::string & topic_name)
46 : topic_name_(topic_name)
48 auto node = parent.lock();
49 logger_ = node->get_logger();
50 costmap_sub_ = node->create_subscription<nav2_msgs::msg::Costmap>(
52 rclcpp::QoS(rclcpp::KeepLast(1)).transient_local().reliable(),
54 costmap_update_sub_ = node->create_subscription<nav2_msgs::msg::CostmapUpdate>(
55 topic_name_ +
"_updates",
56 rclcpp::QoS(rclcpp::KeepLast(costmapUpdateQueueDepth)).transient_local().reliable(),
62 if (!isCostmapReceived()) {
63 throw std::runtime_error(
"Costmap is not available");
66 processCurrentCostmapMsg();
74 std::lock_guard<std::mutex> lock(costmap_msg_mutex_);
76 frame_id_ = costmap_msg_->header.frame_id;
78 if (!isCostmapReceived()) {
79 costmap_ = std::make_shared<Costmap2D>(
80 msg->metadata.size_x, msg->metadata.size_y,
81 msg->metadata.resolution, msg->metadata.origin.position.x,
82 msg->metadata.origin.position.y);
84 processCurrentCostmapMsg();
89 const nav2_msgs::msg::CostmapUpdate::SharedPtr update_msg)
91 if (isCostmapReceived()) {
93 processCurrentCostmapMsg();
96 std::lock_guard<Costmap2D::mutex_t> lock(*(costmap_->getMutex()));
98 auto map_cell_size_x = costmap_->getSizeInCellsX();
99 auto map_call_size_y = costmap_->getSizeInCellsY();
101 if (map_cell_size_x < update_msg->x + update_msg->size_x ||
102 map_call_size_y < update_msg->y + update_msg->size_y)
105 logger_,
"Update area outside of original map area. Costmap bounds: %d X %d, "
106 "Update origin: %d, %d bounds: %d X %d", map_cell_size_x, map_call_size_y,
107 update_msg->x, update_msg->y, update_msg->size_x, update_msg->size_y);
110 unsigned char * master_array = costmap_->getCharMap();
112 for (
size_t y = 0; y < update_msg->size_y; ++y) {
113 auto starting_index_of_row_update_in_costmap = (y + update_msg->y) * map_cell_size_x +
117 update_msg->data.begin() + (y * update_msg->size_x),
118 update_msg->size_x, &master_array[starting_index_of_row_update_in_costmap]);
121 RCLCPP_WARN(logger_,
"No costmap received.");
125 void CostmapSubscriber::processCurrentCostmapMsg()
127 std::scoped_lock lock(*(costmap_->getMutex()), costmap_msg_mutex_);
128 if (haveCostmapParametersChanged()) {
130 costmap_msg_->metadata.size_x, costmap_msg_->metadata.size_y,
131 costmap_msg_->metadata.resolution,
132 costmap_msg_->metadata.origin.position.x,
133 costmap_msg_->metadata.origin.position.y);
136 unsigned char * master_array = costmap_->getCharMap();
137 std::copy(costmap_msg_->data.begin(), costmap_msg_->data.end(), master_array);
138 costmap_msg_.reset();
141 bool CostmapSubscriber::haveCostmapParametersChanged()
143 return hasCostmapSizeChanged() ||
144 hasCostmapResolutionChanged() ||
145 hasCostmapOriginPositionChanged();
148 bool CostmapSubscriber::hasCostmapSizeChanged()
150 return costmap_->getSizeInCellsX() != costmap_msg_->metadata.size_x ||
151 costmap_->getSizeInCellsY() != costmap_msg_->metadata.size_y;
154 bool CostmapSubscriber::hasCostmapResolutionChanged()
156 return costmap_->getResolution() != costmap_msg_->metadata.resolution;
159 bool CostmapSubscriber::hasCostmapOriginPositionChanged()
161 return costmap_->getOriginX() != costmap_msg_->metadata.origin.position.x ||
162 costmap_->getOriginY() != costmap_msg_->metadata.origin.position.y;
CostmapSubscriber(const nav2_util::LifecycleNode::WeakPtr &parent, const std::string &topic_name)
A constructor.
void costmapUpdateCallback(const nav2_msgs::msg::CostmapUpdate::SharedPtr update_msg)
Callback for the costmap's update topic.
void costmapCallback(const nav2_msgs::msg::Costmap::SharedPtr msg)
Callback for the costmap topic.
std::shared_ptr< Costmap2D > getCostmap()
Get current costmap.