47 #include "nav2_map_server/map_server.hpp"
55 #include "yaml-cpp/yaml.h"
56 #include "lifecycle_msgs/msg/state.hpp"
57 #include "nav2_map_server/map_io.hpp"
59 using namespace std::chrono_literals;
60 using namespace std::placeholders;
62 namespace nav2_map_server
65 MapServer::MapServer(
const rclcpp::NodeOptions & options)
66 : nav2::LifecycleNode(
"map_server",
"", options), map_available_(false)
68 RCLCPP_INFO(get_logger(),
"Creating");
78 RCLCPP_INFO(get_logger(),
"Configuring");
82 std::string yaml_filename = node->declare_or_get_parameter(
83 "yaml_filename", std::string(
""));
84 std::string topic_name = node->declare_or_get_parameter(
85 "topic_name", std::string(
"map"));
86 frame_id_ = node->declare_or_get_parameter(
87 "frame_id", std::string(
"map"));
90 if (!yaml_filename.empty()) {
93 std::shared_ptr<nav2_msgs::srv::LoadMap::Response> rsp =
94 std::make_shared<nav2_msgs::srv::LoadMap::Response>();
97 throw std::runtime_error(
"Failed to load map yaml file: " + yaml_filename);
102 "yaml-filename parameter is empty, set map through '%s'-service",
103 load_map_service_name_.c_str());
107 const std::string service_prefix = get_name() + std::string(
"/");
110 occ_service_ = create_service<nav_msgs::srv::GetMap>(
111 service_prefix + std::string(service_name_),
115 occ_pub_ = create_publisher<nav_msgs::msg::OccupancyGrid>(
120 load_map_service_ = create_service<nav2_msgs::srv::LoadMap>(
121 service_prefix + std::string(load_map_service_name_),
124 return nav2::CallbackReturn::SUCCESS;
130 RCLCPP_INFO(get_logger(),
"Activating");
133 occ_pub_->on_activate();
134 if (map_available_) {
135 auto occ_grid = std::make_unique<nav_msgs::msg::OccupancyGrid>(msg_);
136 occ_pub_->publish(std::move(occ_grid));
142 return nav2::CallbackReturn::SUCCESS;
148 RCLCPP_INFO(get_logger(),
"Deactivating");
150 occ_pub_->on_deactivate();
155 return nav2::CallbackReturn::SUCCESS;
161 RCLCPP_INFO(get_logger(),
"Cleaning up");
164 occ_service_.reset();
165 load_map_service_.reset();
166 map_available_ =
false;
167 msg_ = nav_msgs::msg::OccupancyGrid();
169 return nav2::CallbackReturn::SUCCESS;
175 RCLCPP_INFO(get_logger(),
"Shutting down");
176 return nav2::CallbackReturn::SUCCESS;
180 const std::shared_ptr<rmw_request_id_t>,
181 const std::shared_ptr<nav_msgs::srv::GetMap::Request>,
182 std::shared_ptr<nav_msgs::srv::GetMap::Response> response)
185 if (get_current_state().
id() != lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) {
188 "Received GetMap request but not in ACTIVE state, ignoring!");
191 RCLCPP_INFO(get_logger(),
"Handling GetMap request");
192 response->map = msg_;
196 const std::shared_ptr<rmw_request_id_t>,
197 const std::shared_ptr<nav2_msgs::srv::LoadMap::Request> request,
198 std::shared_ptr<nav2_msgs::srv::LoadMap::Response> response)
201 if (get_current_state().
id() != lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) {
204 "Received LoadMap request but not in ACTIVE state, ignoring!");
205 response->result = response->RESULT_UNDEFINED_FAILURE;
208 RCLCPP_INFO(get_logger(),
"Handling LoadMap request");
211 auto occ_grid = std::make_unique<nav_msgs::msg::OccupancyGrid>(msg_);
212 occ_pub_->publish(std::move(occ_grid));
217 const std::string & yaml_file,
218 std::shared_ptr<nav2_msgs::srv::LoadMap::Response> response)
220 switch (loadMapFromYaml(yaml_file, msg_)) {
221 case MAP_DOES_NOT_EXIST:
222 response->result = nav2_msgs::srv::LoadMap::Response::RESULT_MAP_DOES_NOT_EXIST;
224 case INVALID_MAP_METADATA:
225 response->result = nav2_msgs::srv::LoadMap::Response::RESULT_INVALID_MAP_METADATA;
227 case INVALID_MAP_DATA:
228 response->result = nav2_msgs::srv::LoadMap::Response::RESULT_INVALID_MAP_DATA;
230 case LOAD_MAP_SUCCESS:
234 map_available_ =
true;
235 response->map = msg_;
236 response->result = nav2_msgs::srv::LoadMap::Response::RESULT_SUCCESS;
244 msg_.info.map_load_time = now();
245 msg_.header.frame_id = frame_id_;
246 msg_.header.stamp = now();
251 #include "rclcpp_components/register_node_macro.hpp"
void destroyBond()
Destroy bond connection to lifecycle manager.
nav2::LifecycleNode::SharedPtr shared_from_this()
Get a shared pointer of this.
void createBond()
Create bond connection to lifecycle manager.
A QoS profile for latched, reliable topics with a history of 1 messages.
Parses the map yaml file and creates a service and a publisher that provides occupancy grid.
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Start publishing the map using the latched topic.
void loadMapCallback(const std::shared_ptr< rmw_request_id_t > request_header, const std::shared_ptr< nav2_msgs::srv::LoadMap::Request > request, std::shared_ptr< nav2_msgs::srv::LoadMap::Response > response)
Map loading service callback.
void getMapCallback(const std::shared_ptr< rmw_request_id_t > request_header, const std::shared_ptr< nav_msgs::srv::GetMap::Request > request, std::shared_ptr< nav_msgs::srv::GetMap::Response > response)
Map getting service callback.
void updateMsgHeader()
Method correcting msg_ header when it belongs to instantiated object.
~MapServer()
A Destructor for nav2_map_server::MapServer.
bool loadMapResponseFromYaml(const std::string &yaml_file, std::shared_ptr< nav2_msgs::srv::LoadMap::Response > response)
Load the map YAML, image from map file name and generate output response containing an OccupancyGrid....
nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Called when in Shutdown state.
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Sets up required params and services. Loads map and its parameters from the file.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Stops publishing the latched topic.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Resets the member variables.