21 #include "nav2_map_server/map_mode.hpp"
22 #include "nav2_map_server/map_saver.hpp"
24 #include "rclcpp/logger.hpp"
25 #include "rclcpp/logging.hpp"
26 #include "rclcpp/parameter.hpp"
27 #include "rclcpp/utilities.hpp"
29 using namespace nav2_map_server;
31 const char * USAGE_STRING{
33 " map_saver_cli [arguments] [--ros-args ROS remapping args]\n"
39 " --occ <threshold_occupied>\n"
40 " --free <threshold_free>\n"
41 " --fmt <image_format>\n"
42 " --mode trinary(default)/scale/raw\n"
44 "NOTE: --ros-args should be passed at the end of command line"};
49 COMMAND_MAP_FILE_NAME,
51 COMMAND_OCCUPIED_THRESH,
59 COMMAND_TYPE command_type;
72 ARGUMENTS_STATUS parse_arguments(
73 const rclcpp::Logger & logger,
int argc,
char ** argv,
77 {
"-t", COMMAND_MAP_TOPIC},
78 {
"-f", COMMAND_MAP_FILE_NAME},
79 {
"--occ", COMMAND_OCCUPIED_THRESH},
80 {
"--free", COMMAND_FREE_THRESH},
81 {
"--mode", COMMAND_MODE},
82 {
"--fmt", COMMAND_IMAGE_FORMAT},
85 std::vector<std::string> arguments(argv + 1, argv + argc);
86 std::vector<rclcpp::Parameter> params_from_args;
89 size_t cmd_size =
sizeof(commands) /
sizeof(commands[0]);
91 for (
auto it = arguments.begin(); it != arguments.end(); it++) {
92 if (*it ==
"-h" || *it ==
"--help") {
93 std::cout << USAGE_STRING << std::endl;
96 if (*it ==
"--ros-args") {
99 for (i = 0; i < cmd_size; i++) {
100 if (commands[i].cmd == *it) {
101 if ((it + 1) == arguments.end()) {
102 RCLCPP_ERROR(logger,
"Wrong argument: %s should be followed by a value.", it->c_str());
103 return ARGUMENTS_INVALID;
106 switch (commands[i].command_type) {
107 case COMMAND_MAP_TOPIC:
110 case COMMAND_MAP_FILE_NAME:
111 save_parameters.map_file_name = *it;
113 case COMMAND_FREE_THRESH:
114 save_parameters.free_thresh = atof(it->c_str());
116 case COMMAND_OCCUPIED_THRESH:
117 save_parameters.occupied_thresh = atof(it->c_str());
119 case COMMAND_IMAGE_FORMAT:
120 save_parameters.image_format = *it;
124 save_parameters.mode = map_mode_from_string(*it);
125 }
catch (std::invalid_argument &) {
126 save_parameters.mode = MapMode::Trinary;
129 "Map mode parameter not recognized: %s, using default value (trinary)",
138 RCLCPP_ERROR(logger,
"Wrong argument: %s", it->c_str());
139 return ARGUMENTS_INVALID;
143 return ARGUMENTS_VALID;
146 int main(
int argc,
char ** argv)
149 rclcpp::init(argc, argv);
150 auto logger = rclcpp::get_logger(
"map_saver_cli");
154 std::string map_topic =
"map";
155 switch (parse_arguments(logger, argc, argv, map_topic, save_parameters)) {
156 case ARGUMENTS_INVALID:
162 case ARGUMENTS_VALID:
169 auto map_saver = std::make_shared<nav2_map_server::MapSaver>();
170 map_saver->on_configure(rclcpp_lifecycle::State());
171 if (map_saver->saveMapTopicToFile(map_topic, save_parameters)) {
176 }
catch (std::exception & e) {
177 RCLCPP_ERROR(logger,
"Unexpected problem appear: %s", e.what());