34 #include "nav_msgs/GetMap.h" 36 #include "geometry_msgs/Quaternion.h" 47 MapGenerator(
const std::string& mapname,
int threshold_occupied = 100,
int threshold_free = 0)
48 : mapname_(mapname), saved_map_(false), threshold_occupied_(threshold_occupied), threshold_free_(threshold_free)
57 ROS_INFO(
"Received a %d X %d map @ %.3f m/pix",
60 map->info.resolution);
63 std::string mapdatafile = mapname_ +
".pgm";
64 ROS_INFO(
"Writing map occupancy data to %s", mapdatafile.c_str());
65 FILE* out = fopen(mapdatafile.c_str(),
"w");
68 ROS_ERROR(
"Couldn't save map file to %s", mapdatafile.c_str());
72 fprintf(out,
"P5\n# CREATOR: map_saver.cpp %.3f m/pix\n%d %d\n255\n",
73 map->info.resolution, map->info.width, map->info.height);
74 for(
unsigned int y = 0; y < map->info.height; y++) {
75 for(
unsigned int x = 0; x < map->info.width; x++) {
76 unsigned int i = x + (map->info.height - y - 1) * map->info.width;
77 if (map->data[i] >= 0 && map->data[i] <= threshold_free_) {
79 }
else if (map->data[i] <= 100 && map->data[i] >= threshold_occupied_) {
90 std::string mapmetadatafile = mapname_ +
".yaml";
91 ROS_INFO(
"Writing map occupancy data to %s", mapmetadatafile.c_str());
92 FILE* yaml = fopen(mapmetadatafile.c_str(),
"w");
105 geometry_msgs::Quaternion orientation = map->info.origin.orientation;
112 double yaw, pitch, roll;
115 fprintf(yaml,
"image: %s\nresolution: %f\norigin: [%f, %f, %f]\nnegate: 0\noccupied_thresh: 0.65\nfree_thresh: 0.196\n\n",
116 mapdatafile.c_str(), map->info.resolution, map->info.origin.position.x, map->info.origin.position.y, yaw);
132 #define USAGE "Usage: \n" \ 134 " map_saver [--occ <threshold_occupied>] [--free <threshold_free>] [-f <mapname>] [ROS remapping args]" 136 int main(
int argc,
char** argv)
139 std::string mapname =
"map";
140 int threshold_occupied = 100;
141 int threshold_free = 0;
143 for(
int i=1; i<argc; i++)
145 if(!strcmp(argv[i],
"-h"))
150 else if(!strcmp(argv[i],
"-f"))
160 else if (!strcmp(argv[i],
"--occ"))
164 threshold_occupied = std::atoi(argv[i]);
165 if (threshold_occupied < 1 || threshold_occupied > 100)
167 ROS_ERROR(
"threshold_occupied must be between 1 and 100");
178 else if (!strcmp(argv[i],
"--free"))
182 threshold_free = std::atoi(argv[i]);
183 if (threshold_free < 0 || threshold_free > 100)
185 ROS_ERROR(
"threshold_free must be between 0 and 100");
203 if (threshold_occupied <= threshold_free)
205 ROS_ERROR(
"threshold_free must be smaller than threshold_occupied");
209 MapGenerator mg(mapname, threshold_occupied, threshold_free);
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
int main(int argc, char **argv)
MapGenerator(const std::string &mapname, int threshold_occupied=100, int threshold_free=0)
void mapCallback(const nav_msgs::OccupancyGridConstPtr &map)
ROSCPP_DECL void spinOnce()
void getEulerYPR(tf2Scalar &yaw, tf2Scalar &pitch, tf2Scalar &roll, unsigned int solution_number=1) const