YARP
Yet Another Robot Platform
MapGrid2D.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #define _USE_MATH_DEFINES
7 
8 #include <yarp/dev/MapGrid2D.h>
9 
10 #include <yarp/os/Bottle.h>
13 #include <yarp/os/LogStream.h>
14 #include <yarp/sig/ImageFile.h>
15 #include <algorithm>
16 #include <fstream>
17 #include <cmath>
18 
19 #if defined (YARP_HAS_ZLIB)
20 #include <zlib.h>
21 #endif
22 
23 
24 using namespace yarp::dev;
25 using namespace yarp::dev::Nav2D;
26 using namespace yarp::sig;
27 using namespace yarp::os;
28 using namespace yarp::math;
29 
30 #ifndef DEG2RAD
31 #define DEG2RAD M_PI/180.0
32 #endif
33 
34 #ifndef RAD2DEG
35 #define RAD2DEG 180.0/M_PI
36 #endif
37 
38 //helper functions
39 static std::string extractPathFromFile(std::string full_filename)
40 {
41  size_t found;
42  found = full_filename.find_last_of('/');
43  if (found != std::string::npos) {
44  return full_filename.substr(0, found) + "/";
45  }
46  found = full_filename.find_last_of('\\');
47  if (found != std::string::npos) {
48  return full_filename.substr(0, found) + "\\";
49  }
50  return full_filename;
51 }
52 
53 static std::string extractExtensionFromFile(std::string full_filename)
54 {
55  int start = full_filename.length() - 3;
56  return full_filename.substr(start, 3);
57 }
58 
59 
60 bool MapGrid2D::isIdenticalTo(const MapGrid2D& other) const
61 {
62  if (m_map_name != other.m_map_name) {
63  return false;
64  }
65  if (m_origin != other.m_origin) {
66  return false;
67  }
68  if (m_resolution != other.m_resolution) {
69  return false;
70  }
71  if (m_width != other.width()) {
72  return false;
73  }
74  if (m_height != other.height()) {
75  return false;
76  }
77  for (size_t y = 0; y < m_height; y++) {
78  for (size_t x = 0; x < m_width; x++) {
79  if (m_map_occupancy.safePixel(x, y) != other.m_map_occupancy.safePixel(x, y)) {
80  return false;
81  }
82  }
83  }
84  for (size_t y = 0; y < m_height; y++) {
85  for (size_t x = 0; x < m_width; x++) {
86  if (m_map_flags.safePixel(x, y) != other.m_map_flags.safePixel(x, y)) {
87  return false;
88  }
89  }
90  }
91  return true;
92 }
93 
95 {
96  m_resolution = 1.0; //each pixel corresponds to 1 m
97  m_width = 2;
98  m_height = 2;
99  m_map_occupancy.setQuantum(1); //we do not want extra padding in map images
100  m_map_flags.setQuantum(1);
101  m_map_occupancy.resize(m_width, m_height);
102  m_map_flags.resize(m_width, m_height);
103  m_occupied_thresh = 0.80;
104  m_free_thresh = 0.20;
105  for (size_t y = 0; y < m_height; y++)
106  {
107  for (size_t x = 0; x < m_width; x++)
108  {
109  m_map_occupancy.safePixel(x, y) = 0;
110  m_map_flags.safePixel(x, y) = MapGrid2D::map_flags::MAP_CELL_FREE;
111  }
112  }
113 #if defined (YARP_HAS_ZLIB)
114  m_compressed_data_over_network = true;
115 #else
116  m_compressed_data_over_network = false;
117 #endif
118 }
119 
120 MapGrid2D::~MapGrid2D() = default;
121 
122 bool MapGrid2D::isNotFree(XYCell cell) const
123 {
124  if (isInsideMap(cell))
125  {
126  if (m_map_occupancy.safePixel(cell.x, cell.y) != 0) {
127  return true;
128  }
129  if (m_map_flags.safePixel(cell.x, cell.y) == MapGrid2D::map_flags::MAP_CELL_KEEP_OUT) {
130  return true;
131  }
132  if (m_map_flags.safePixel(cell.x, cell.y) == MapGrid2D::map_flags::MAP_CELL_TEMPORARY_OBSTACLE) {
133  return true;
134  }
135  if (m_map_flags.safePixel(cell.x, cell.y) == MapGrid2D::map_flags::MAP_CELL_ENLARGED_OBSTACLE) {
136  return true;
137  }
138  }
139  return false;
140 }
141 
142 bool MapGrid2D::isFree(XYCell cell) const
143 {
144  if (isInsideMap(cell))
145  {
146  if (m_map_occupancy.safePixel(cell.x, cell.y) == 0 && m_map_flags.safePixel(cell.x, cell.y) == MapGrid2D::map_flags::MAP_CELL_FREE) {
147  return true;
148  }
149  }
150  return false;
151 }
152 
153 bool MapGrid2D::isKeepOut(XYCell cell) const
154 {
155  if (isInsideMap(cell))
156  {
157  if (m_map_flags.safePixel(cell.x, cell.y) == MapGrid2D::map_flags::MAP_CELL_KEEP_OUT) {
158  return true;
159  }
160  }
161  return false;
162 }
163 
164 bool MapGrid2D::isWall(XYCell cell) const
165 {
166  if (isInsideMap(cell))
167  {
168  // if (m_map_occupancy.safePixel(cell.x, cell.y) == 0)
169  // return true;
170  if (m_map_flags.safePixel(cell.x, cell.y) == MapGrid2D::map_flags::MAP_CELL_WALL) {
171  return true;
172  }
173  }
174  return false;
175 }
176 
177 size_t MapGrid2D::height() const
178 {
179  return m_height;
180 }
181 
182 size_t MapGrid2D::width() const
183 {
184  return m_width;
185 }
186 
188 {
189  image.setQuantum(1);
190  image.resize(m_width, m_height);
191  image.zero();
192  for (size_t y = 0; y < m_height; y++)
193  {
194  for (size_t x = 0; x < m_width; x++)
195  {
196  image.safePixel(x, y) = CellFlagDataToPixel(m_map_flags.safePixel(x, y));
197  }
198  }
199  return true;
200 }
201 
203 {
204  if (image.width() != m_width ||
205  image.height() != m_height)
206  {
207  yError() << "The size of given image does not correspond to the current map. Use method setSize() first.";
208  return false;
209  }
210  for (size_t y = 0; y < m_height; y++)
211  {
212  for (size_t x = 0; x < m_width; x++)
213  {
214  m_map_flags.safePixel(x, y) = PixelToCellFlagData(image.safePixel(x, y));
215  }
216  }
217  return true;
218 }
219 
221 {
222  if (size <= 0)
223  {
224  for (size_t y = 0; y < m_height; y++)
225  {
226  for (size_t x = 0; x < m_width; x++)
227  {
228  if (this->m_map_flags.safePixel(x, y) == MapGrid2D::map_flags::MAP_CELL_ENLARGED_OBSTACLE)
229  {
230  this->m_map_flags.safePixel(x, y) = MapGrid2D::map_flags::MAP_CELL_FREE;
231  }
232  }
233  }
234  return true;
235  }
236  auto repeat_num = (size_t)(std::ceil(size/ m_resolution));
237  for (size_t repeat = 0; repeat < repeat_num; repeat++)
238  {
239  //contains the cells to be enlarged;
240  std::vector<XYCell> list_of_cells;
241  for (size_t y = 0; y < m_height; y++)
242  {
243  for (size_t x = 0; x < m_width; x++)
244  {
245  //this check could be optimized...
246  if (this->m_map_flags.safePixel(x, y) == MAP_CELL_KEEP_OUT ||
247  this->m_map_flags.safePixel(x, y) == MAP_CELL_ENLARGED_OBSTACLE ||
248  this->m_map_flags.safePixel(x, y) == MAP_CELL_WALL ||
249  this->m_map_flags.safePixel(x, y) == MAP_CELL_UNKNOWN ||
250  this->m_map_flags.safePixel(x, y) == MAP_CELL_TEMPORARY_OBSTACLE)
251  {
252  list_of_cells.emplace_back(x, y);
253  }
254  }
255  }
256 
257  //process each cell of the list and enlarges it
258  for (auto& list_of_cell : list_of_cells)
259  {
260  enlargeCell(list_of_cell);
261  }
262  }
263  return true;
264 }
265 
266 void MapGrid2D::enlargeCell(XYCell cell)
267 {
268  size_t i = cell.x;
269  size_t j = cell.y;
270  size_t il = cell.x > 1 ? cell.x - 1 : 0;
271  size_t ir = cell.x + 1 < (m_width)-1 ? cell.x + 1 : (m_width)-1;
272  size_t ju = cell.y > 1 ? cell.y - 1 : 0;
273  size_t jd = cell.y + 1 < (m_height)-1 ? cell.y + 1 : (m_height)-1;
274 
275  if (m_map_flags.pixel(il, j) == MAP_CELL_FREE) {
276  m_map_flags.pixel(il, j) = MAP_CELL_ENLARGED_OBSTACLE;
277  }
278  if (m_map_flags.pixel(ir, j) == MAP_CELL_FREE) {
279  m_map_flags.pixel(ir, j) = MAP_CELL_ENLARGED_OBSTACLE;
280  }
281  if (m_map_flags.pixel(i, ju) == MAP_CELL_FREE) {
282  m_map_flags.pixel(i, ju) = MAP_CELL_ENLARGED_OBSTACLE;
283  }
284  if (m_map_flags.pixel(i, jd) == MAP_CELL_FREE) {
285  m_map_flags.pixel(i, jd) = MAP_CELL_ENLARGED_OBSTACLE;
286  }
287  if (m_map_flags.pixel(il, ju) == MAP_CELL_FREE) {
288  m_map_flags.pixel(il, ju) = MAP_CELL_ENLARGED_OBSTACLE;
289  }
290  if (m_map_flags.pixel(il, jd) == MAP_CELL_FREE) {
291  m_map_flags.pixel(il, jd) = MAP_CELL_ENLARGED_OBSTACLE;
292  }
293  if (m_map_flags.pixel(ir, ju) == MAP_CELL_FREE) {
294  m_map_flags.pixel(ir, ju) = MAP_CELL_ENLARGED_OBSTACLE;
295  }
296  if (m_map_flags.pixel(ir, jd) == MAP_CELL_FREE) {
297  m_map_flags.pixel(ir, jd) = MAP_CELL_ENLARGED_OBSTACLE;
298  }
299 }
300 
301 bool MapGrid2D::loadROSParams(std::string ros_yaml_filename, std::string& pgm_occ_filename, double& resolution, double& orig_x, double& orig_y, double& orig_t )
302 {
303  std::string file_string;
304  std::ifstream file;
305  file.open(ros_yaml_filename.c_str());
306  if (!file.is_open())
307  {
308  yError() << "failed to open file" << ros_yaml_filename;
309  return false;
310  }
311 
312  std::string line;
313  while (getline(file, line))
314  {
315  if (line.find("origin") != std::string::npos)
316  {
317  std::replace(line.begin(), line.end(), ',', ' ');
318  std::replace(line.begin(), line.end(), '[', '(');
319  std::replace(line.begin(), line.end(), ']', ')');
320  /*
321  auto it = line.find('[');
322  if (it != std::string::npos) line.replace(it, 1, "(");
323  it = line.find(']');
324  if(it != std::string::npos) line.replace(it, 1, ")");*/
325  }
326  file_string += (line + '\n');
327  }
328  file.close();
329 
330  bool ret = true;
331  Bottle bbb;
332  bbb.fromString(file_string);
333  std::string debug_s = bbb.toString();
334 
335  if (bbb.check("image:") == false) { yError() << "missing image"; ret = false; }
336  pgm_occ_filename = bbb.find("image:").asString();
337  //ppm_flg_filename = (pgm_occ_filename.substr(0, pgm_occ_filename.size()-4))+"_yarpflags"+".ppm";
338 
339  if (bbb.check("resolution:") == false) { yError() << "missing resolution"; ret = false; }
340  resolution = bbb.find("resolution:").asFloat64();
341 
342  if (bbb.check("origin:") == false) { yError() << "missing origin"; ret = false; }
343  Bottle* b = bbb.find("origin:").asList();
344  if (b)
345  {
346  orig_x = b->get(0).asFloat64();
347  orig_y = b->get(1).asFloat64();
348  orig_t = b->get(2).asFloat64() * RAD2DEG;
349  }
350 
351  if (bbb.check("occupied_thresh:"))
352  {m_occupied_thresh = bbb.find("occupied_thresh:").asFloat64();}
353 
354  if (bbb.check("free_thresh:"))
355  {m_free_thresh = bbb.find("free_thresh:").asFloat64();}
356 
357  return ret;
358 }
359 
360 bool MapGrid2D::loadMapYarpAndRos(std::string yarp_filename, std::string ros_yaml_filename)
361 {
364  bool b1 = yarp::sig::file::read(yarp_img, yarp_filename);
365  if (b1 == false)
366  {
367  yError() << "Unable to load map data" << yarp_filename;
368  return false;
369  }
370  std::string pgm_occ_filename;
371  double resolution=0;
372  double orig_x = 0;
373  double orig_y = 0;
374  double orig_t = 0;
375  bool b2 = loadROSParams(ros_yaml_filename, pgm_occ_filename, resolution, orig_x, orig_y, orig_t);
376  if (b2 == false)
377  {
378  yError() << "Unable to ros params from" << ros_yaml_filename;
379  return false;
380  }
381  std::string path = extractPathFromFile(ros_yaml_filename);
382  std::string extension = extractExtensionFromFile(pgm_occ_filename);
383  std::string pgm_occ_filename_with_path = path + pgm_occ_filename;
384  bool b3 = yarp::sig::file::read(ros_img, pgm_occ_filename_with_path);
385  if (b3 == false)
386  {
387  yError() << "Unable to load occupancy grid file:" << pgm_occ_filename_with_path;
388  return false;
389  }
390 
391  if (yarp_img.width() == ros_img.width() && yarp_img.height() == ros_img.height())
392  {
393  //Everything ok, proceed to internal assignments
394  setSize_in_cells(yarp_img.width(), yarp_img.height());
395  m_resolution = resolution;
396  m_origin.setOrigin(orig_x,orig_y,orig_t);
397 
398  //set YARPS stuff
399  for (size_t y = 0; y < m_height; y++)
400  {
401  for (size_t x = 0; x < m_width; x++)
402  {
403  m_map_flags.safePixel(x, y) = PixelToCellFlagData(yarp_img.safePixel(x, y));
404  }
405  }
406 
407  //set ROS Stuff
408  for (size_t y = 0; y < m_height; y++)
409  {
410  for (size_t x = 0; x < m_width; x++)
411  {
412  m_map_occupancy.safePixel(x, y) = PixelToCellOccupancyData(ros_img.safePixel(x, y));
413  }
414  }
415  }
416  else
417  {
418  yError() << "MapGrid2D::loadFromFile() Size of YARP map and ROS do not match";
419  return false;
420  }
421 
422  return true;
423 }
424 
425 bool MapGrid2D::loadMapROSOnly(std::string ros_yaml_filename)
426 {
428  std::string pgm_occ_filename;
429  double resolution = 0;
430  double orig_x = 0;
431  double orig_y = 0;
432  double orig_t = 0;
433  bool b2 = loadROSParams(ros_yaml_filename, pgm_occ_filename, resolution, orig_x, orig_y, orig_t);
434  if (b2 == false)
435  {
436  yError() << "Unable to ros params from" << ros_yaml_filename;
437  return false;
438  }
439  std::string path = extractPathFromFile(ros_yaml_filename);
440  std::string extension = extractExtensionFromFile(pgm_occ_filename);
441  std::string pgm_occ_filename_with_path = path + pgm_occ_filename;
442  bool b3 = yarp::sig::file::read(ros_img, pgm_occ_filename_with_path);
443  if (b3 == false)
444  {
445  yError() << "Unable to load occupancy grid file:" << pgm_occ_filename;
446  return false;
447  }
448 
449  //Everything ok, proceed to internal assignments
450  setSize_in_cells(ros_img.width(), ros_img.height());
451  m_resolution = resolution;
452  m_origin.setOrigin(orig_x, orig_y, orig_t);
453 
454  //set ROS Stuff
455  for (size_t y = 0; y < m_height; y++)
456  {
457  for (size_t x = 0; x < m_width; x++)
458  {
459  m_map_occupancy.safePixel(x, y) = PixelToCellOccupancyData(ros_img.safePixel(x, y));
460  }
461  }
462 
463  //generate YARP stuff from ROS Stuff
464  for (size_t y = 0; y < (size_t)(m_map_occupancy.height()); y++)
465  {
466  for (size_t x = 0; x < (size_t)(m_map_occupancy.width()); x++)
467  {
468  //occup_prob is a probability, in the range 0-100 (-1 = 255 = unknown)
469  CellOccupancyData occup_prob = m_map_occupancy.safePixel(x, y);
470  if (occup_prob != (unsigned char)(-1) && occup_prob<50 ) {m_map_flags.safePixel(x, y) = MAP_CELL_FREE;}
471  else if (occup_prob >= 50 && occup_prob<=100) {m_map_flags.safePixel(x, y) = MAP_CELL_WALL;}
472  else if (occup_prob > 100) {m_map_flags.safePixel(x, y) = MAP_CELL_UNKNOWN;}
473  else { yError() << "Unreachable";}
474  }
475  }
476  return true;
477 }
478 
479 bool MapGrid2D::loadMapYarpOnly(std::string yarp_filename)
480 {
482  bool b1 = yarp::sig::file::read(yarp_img, yarp_filename);
483  if (b1 == false)
484  {
485  yError() << "Unable to load map" << yarp_filename;
486  return false;
487  }
488  //Everything ok, proceed to internal assignments
489  setSize_in_cells(yarp_img.width(), yarp_img.height());
490  //m_resolution = resolution; //????
491  //m_origin.x = orig_x; //????
492  //m_origin.y = orig_y; //????
493  //m_origin.theta = orig_t; //????
494 
495  //set YARPS stuff
496  for (size_t y = 0; y < m_height; y++)
497  {
498  for (size_t x = 0; x < m_width; x++)
499  {
500  m_map_flags.safePixel(x, y) = PixelToCellFlagData(yarp_img.safePixel(x, y));
501  }
502  }
503 
504  //generate ROS stuff from YARP Stuff
505  for (size_t y = 0; y < (size_t)(m_map_flags.height()); y++)
506  {
507  for (size_t x = 0; x < (size_t)(m_map_flags.width()); x++)
508  {
509  yarp::sig::PixelMono pix_flg = m_map_flags.safePixel(x, y);
510 
511  if (pix_flg == MAP_CELL_FREE) {
512  m_map_occupancy.safePixel(x, y) = 0; //@@@SET HERE
513  } else if (pix_flg == MAP_CELL_KEEP_OUT) {
514  m_map_occupancy.safePixel(x, y) = 0; //@@@SET HERE
515  } else if (pix_flg == MAP_CELL_TEMPORARY_OBSTACLE) {
516  m_map_occupancy.safePixel(x, y) = 0; //@@@SET HERE
517  } else if (pix_flg == MAP_CELL_ENLARGED_OBSTACLE) {
518  m_map_occupancy.safePixel(x, y) = 0; //@@@SET HERE
519  } else if (pix_flg == MAP_CELL_WALL) {
520  m_map_occupancy.safePixel(x, y) = 100; //@@@SET HERE
521  } else if (pix_flg == MAP_CELL_UNKNOWN) {
522  m_map_occupancy.safePixel(x, y) = 255; //@@@SET HERE
523  } else {
524  m_map_occupancy.safePixel(x, y) = 255; //@@@SET HERE
525  }
526  }
527  }
528  m_occupied_thresh = 0.80; //@@@SET HERE
529  m_free_thresh = 0.20;//@@@SET HERE
530  return true;
531 }
532 
533 bool MapGrid2D::parseMapParameters(const Property& mapfile)
534 {
535  //Map parameters.
536  //these values can eventually override values previously assigned
537  //(e.g. ROS values found in yaml data)
538  if (mapfile.check("resolution"))
539  {
540  m_resolution = mapfile.find("resolution").asFloat32();
541  }
542  if (mapfile.check("origin"))
543  {
544  Bottle* b = mapfile.find("origin").asList();
545  if (b)
546  {
547  m_origin.setOrigin(b->get(0).asFloat32(),
548  b->get(1).asFloat32(),
549  b->get(2).asFloat32());
550  }
551  }
552 
553  return true;
554 }
555 
556 bool MapGrid2D::loadFromFile(std::string map_file_with_path)
557 {
558  Property mapfile_prop;
559  std::string mapfile_path = extractPathFromFile(map_file_with_path);
560  if (mapfile_prop.fromConfigFile(map_file_with_path) == false)
561  {
562  yError() << "Unable to open .map description file:" << map_file_with_path;
563  return false;
564  }
565 
566  if (mapfile_prop.check("MapName") ==false)
567  {
568  yError() << "Unable to find 'MapName' parameter inside:" << map_file_with_path;
569  return false;
570  }
571  m_map_name = mapfile_prop.find("MapName").asString();
572 
573  bool YarpMapDataFound = false;
574  std::string ppm_flg_filename;
575  if (mapfile_prop.check("YarpMapData") == false)
576  {
577  yWarning() << "Unable to find 'YarpMapData' parameter inside:" << map_file_with_path;
578  YarpMapDataFound = false;
579  }
580  else
581  {
582  ppm_flg_filename = mapfile_prop.find("YarpMapData").asString();
583  YarpMapDataFound = true;
584  }
585 
586  bool RosMapDataFound = false;
587  std::string yaml_filename;
588  if (mapfile_prop.check("RosMapData") == false)
589  {
590  yWarning() << "Unable to find 'RosMapData' parameter inside:" << map_file_with_path;
591  RosMapDataFound = false;
592  }
593  else
594  {
595  yaml_filename = mapfile_prop.find("RosMapData").asString();
596  RosMapDataFound = true;
597  }
598 
599  m_width = -1;
600  m_height = -1;
601  std::string yarp_flg_filename_with_path = mapfile_path + ppm_flg_filename;
602  std::string ros_yaml_filename_with_path = mapfile_path + yaml_filename;
603  if (YarpMapDataFound && RosMapDataFound)
604  {
605  //yarp and ros
606  yDebug() << "Opening files: "<< yarp_flg_filename_with_path << " and " << ros_yaml_filename_with_path;
607  return this->loadMapYarpAndRos(yarp_flg_filename_with_path, ros_yaml_filename_with_path) &&
608  this->parseMapParameters(mapfile_prop);
609  }
610  else if (!YarpMapDataFound && RosMapDataFound)
611  {
612  //only ros
613  yDebug() << "Opening file:" << ros_yaml_filename_with_path;
614  return this->loadMapROSOnly(ros_yaml_filename_with_path) &&
615  this->parseMapParameters(mapfile_prop);
616  }
617  else if (YarpMapDataFound && !RosMapDataFound)
618  {
619  //only yarp
620  yDebug() << "Opening file:" << yarp_flg_filename_with_path;
621  return this->loadMapYarpOnly(yarp_flg_filename_with_path) &&
622  this->parseMapParameters(mapfile_prop);
623  }
624  else
625  {
626  yError() << "Critical error: unable to find neither 'RosMapData' nor 'YarpMapData' inside:" << map_file_with_path;
627  return false;
628  }
629  return true;
630 }
631 
632 MapGrid2D::CellFlagData MapGrid2D::PixelToCellFlagData(const yarp::sig::PixelRgb& pixin) const
633 {
634  if (pixin.r == 0 && pixin.g == 0 && pixin.b == 0) {
635  return MAP_CELL_WALL;
636  } else if (pixin.r == 205 && pixin.g == 205 && pixin.b == 205) {
637  return MAP_CELL_UNKNOWN;
638  } else if (pixin.r == 254 && pixin.g == 254 && pixin.b == 254) {
639  return MAP_CELL_FREE;
640  } else if (pixin.r == 255 && pixin.g == 0 && pixin.b == 0) {
641  return MAP_CELL_KEEP_OUT;
642  }
643  return MAP_CELL_UNKNOWN;
644 }
645 
646 yarp::sig::PixelRgb MapGrid2D::CellFlagDataToPixel(const MapGrid2D::CellFlagData& cellin) const
647 {
648  yarp::sig::PixelRgb pixout_flg;
649  if (cellin == MAP_CELL_WALL) { pixout_flg.r = 0; pixout_flg.g = 0; pixout_flg.b = 0;}
650  else if (cellin == MAP_CELL_UNKNOWN) { pixout_flg.r = 205; pixout_flg.g = 205; pixout_flg.b = 205; }
651  else if (cellin == MAP_CELL_FREE) { pixout_flg.r = 254; pixout_flg.g = 254; pixout_flg.b = 254; }
652  else if (cellin == MAP_CELL_KEEP_OUT) { pixout_flg.r = 255; pixout_flg.g = 0; pixout_flg.b = 0; }
653  else if (cellin == MAP_CELL_ENLARGED_OBSTACLE) { pixout_flg.r = 255; pixout_flg.g = 200; pixout_flg.b = 0; }
654  else if (cellin == MAP_CELL_TEMPORARY_OBSTACLE) { pixout_flg.r = 100; pixout_flg.g = 100; pixout_flg.b = 200; }
655  else
656  {
657  //invalid
658  pixout_flg.r = 200; pixout_flg.g = 0; pixout_flg.b = 200;
659  }
660  return pixout_flg;
661 }
662 
663 yarp::sig::PixelMono MapGrid2D::CellOccupancyDataToPixel(const MapGrid2D::CellOccupancyData& cellin) const
664 {
665  //convert from value to image
666 
667  //255 (-1) stands for unknown
668  if (cellin == 255)
669  {
670  return 205;
671  }
672  //values in the range 0-100 are converted in the range 0-254
673  else if (cellin != (unsigned char)(-1) && cellin <=100)
674  {
675  return (254 - (cellin * 254 / 100));
676  }
677  else
678  {
679  //invalid values are in the range 100-255.
680  //return invalid value 205
681  return 205;
682  }
683 }
684 
685 MapGrid2D::CellOccupancyData MapGrid2D::PixelToCellOccupancyData(const yarp::sig::PixelMono& pixin) const
686 {
687  //convert from image to value
688 
689  //205 is a special code, used for unknown
690  if (pixin == 205)
691  {
692  return 255;
693  }
694  //values in the range 0-254 are converted in the range 0-100
695  else if (pixin != (unsigned char)(-1))
696  {
697  auto occ = (unsigned char)((254 - pixin) / 254.0);
698  return occ * 100;
699  }
700  else
701  {
702  //255 is an invalid value
703  return 255;
704  }
705 }
706 
707 bool MapGrid2D::crop (int left, int top, int right, int bottom)
708 {
709  if (top < 0)
710  {
711  for (size_t j=0;j<height();j++){
712  for (size_t i=0;i<width();i++){
713  yarp::sig::PixelMono pix = m_map_occupancy.safePixel(i,j);
714  if ( pix != 255)
715  {
716  top = j;
717  goto topFound;
718  }
719  }
720  }
721  }
722  topFound:
723 
724  if (bottom < 0)
725  {
726  for (int j=height()-1; j>0; j--){
727  for (int i=width()-1; i>0 ;i--){
728  yarp::sig::PixelMono pix = m_map_occupancy.safePixel(i,j);
729  if ( pix != 255)
730  {
731  bottom = j+1;
732  goto bottomFound;
733  }
734  }
735  }
736  }
737  bottomFound:
738 
739  if (left<0)
740  {
741  for (size_t i=0;i<width();i++){
742  for (size_t j=0;j<height();j++){
743  yarp::sig::PixelMono pix = m_map_occupancy.safePixel(i,j);
744  if ( pix != 255)
745  {
746  left = i;
747  goto leftFound;
748  }
749  }
750  }
751  }
752  leftFound:
753 
754  if (right<0)
755  {
756  for (size_t i=width()-1;i>0;i--){
757  for (size_t j=0;j<height();j++){
758  yarp::sig::PixelMono pix = m_map_occupancy.safePixel(i,j);
759  if ( pix != 255)
760  {
761  right = i;
762  goto rightFound;
763  }
764  }
765  }
766  }
767  rightFound:
768 
769  if (left > (int)this->width()) {
770  return false;
771  }
772  if (right > (int)this->width()) {
773  return false;
774  }
775  if (top > (int)this->height()) {
776  return false;
777  }
778  if (bottom > (int)this->height()) {
779  return false;
780  }
781 
782  yarp::sig::ImageOf<CellOccupancyData> new_map_occupancy;
783  yarp::sig::ImageOf<CellFlagData> new_map_flags;
784 
785  new_map_occupancy.setQuantum(1);
786  new_map_flags.setQuantum(1);
787  new_map_occupancy.resize(right-left,bottom-top);
788  new_map_flags.resize(right-left,bottom-top);
789 
790 // size_t original_width = m_map_occupancy.width();
791  size_t original_height = m_map_occupancy.height();
792 
793  for (int j = top, y = 0; j < bottom; j++, y++) {
794  for (int i=left, x=0; i<right; i++, x++)
795  {
796  new_map_occupancy.safePixel(x,y) = m_map_occupancy.safePixel(i,j);
797  new_map_flags.safePixel(x,y) = m_map_flags.safePixel(i,j);
798  }
799  }
800  m_map_occupancy.copy(new_map_occupancy);
801  m_map_flags.copy(new_map_flags);
802  this->m_width=m_map_occupancy.width();
803  this->m_height=m_map_occupancy.height();
804  yDebug() << m_origin.get_x() << m_origin.get_y();
805  double new_x0 = m_origin.get_x() +(left*m_resolution);
806  double new_y0 = m_origin.get_y() +(double(original_height)-double(bottom))*m_resolution;
807  m_origin.setOrigin(new_x0,new_y0, m_origin.get_theta());
808  return true;
809 }
810 
811 bool MapGrid2D::saveToFile(std::string map_file_with_path) const
812 {
813  std::string mapfile_path = extractPathFromFile(map_file_with_path);
814 
815  std::string yarp_filename = this->getMapName() + "_yarpflags.ppm";
816  std::string yaml_filename = this->getMapName() + "_grid.yaml";
817  std::string pgm_occ_filename = this->getMapName() + "_grid.pgm";
818 
819  std::ofstream map_file;
820  map_file.open(map_file_with_path.c_str());
821  if (!map_file.is_open())
822  {
823  return false;
824  }
825  map_file << "MapName: "<< this->getMapName() << '\n';
826  map_file << "YarpMapData: "<< yarp_filename << '\n';
827  map_file << "RosMapData: "<< yaml_filename << '\n';
828  map_file.close();
829 
830  std::ofstream yaml_file;
831  yaml_file.open(mapfile_path + yaml_filename.c_str());
832  if (!yaml_file.is_open())
833  {
834  return false;
835  }
836  yaml_file << "image: " << pgm_occ_filename << '\n';
837  yaml_file << "resolution: " << m_resolution << '\n';
838  yaml_file << "origin: [ " << m_origin.get_x() << " " << m_origin.get_y() << " " << m_origin.get_theta() << " ]"<< '\n';
839  yaml_file << "negate: 0" << '\n';
840  yaml_file << "occupied_thresh: " << m_occupied_thresh << '\n';
841  yaml_file << "free_thresh: " << m_free_thresh << '\n';
842 
843  yaml_file.close();
844 
847 
848  img_flg.resize(m_width, m_height);
849  img_occ.resize(m_width, m_height);
850  for (size_t y = 0; y < m_height; y++)
851  {
852  for (size_t x = 0; x < m_width; x++)
853  {
854  yarp::sig::PixelMono pix_flg = m_map_flags.safePixel(x, y);
855  yarp::sig::PixelMono pix_occ = m_map_occupancy.safePixel(x,y);
856  img_flg.safePixel(x, y) = CellFlagDataToPixel(pix_flg);
857  img_occ.safePixel(x, y) = CellOccupancyDataToPixel(pix_occ);
858  }
859  }
860 
861  //std::string ppm_flg_filename = (pgm_occ_filename.substr(0, pgm_occ_filename.size() - 4)) + "_yarpflags" + ".ppm";
862  std::string ppm_flg_filename = yarp_filename;
863  bool ret = true;
864  ret &= yarp::sig::file::write(img_occ, mapfile_path + pgm_occ_filename);
865  ret &= yarp::sig::file::write(img_flg, mapfile_path + ppm_flg_filename);
866  return ret;
867 }
868 
870 {
871  // auto-convert text mode interaction
872  connection.convertTextMode();
873 
874  connection.expectInt32();
875  connection.expectInt32();
876 
877  connection.expectInt32();
878  m_width = connection.expectInt32();
879  connection.expectInt32();
880  m_height = connection.expectInt32();
881  connection.expectInt32();
882  double x0 = connection.expectFloat64();
883  connection.expectInt32();
884  double y0 = connection.expectFloat64();
885  connection.expectInt32();
886  double theta0 = connection.expectFloat64();
887  m_origin.setOrigin(x0,y0,theta0);
888  connection.expectInt32();
889  m_resolution = connection.expectFloat64();
890  connection.expectInt32();
891  int siz = connection.expectInt32();
892  char buff[255]; memset(buff, 0, 255);
893  connection.expectBlock((char*)buff, siz);
894  m_map_name = buff;
895  connection.expectInt32();
896  m_compressed_data_over_network = connection.expectInt8();
897  m_map_occupancy.resize(m_width, m_height);
898  m_map_flags.resize(m_width, m_height);
899 
900  if (m_compressed_data_over_network)
901  {
902 #if defined (YARP_HAS_ZLIB)
903  bool ok = true;
904  {
905  connection.expectInt32();
906  size_t sizeCompressed = connection.expectInt32();
907  unsigned char* dataCompressed = new unsigned char[sizeCompressed];
908  ok &= connection.expectBlock((char*)dataCompressed, sizeCompressed);
909  size_t sizeUncompressed = m_map_occupancy.getRawImageSize();
910  unsigned char* dataUncompressed = m_map_occupancy.getRawImage();
911  int z_result = uncompress((Bytef*)dataUncompressed, (uLongf*)&sizeUncompressed, (const Bytef*) dataCompressed, sizeCompressed);
912  YARP_UNUSED(z_result);
913  delete[] dataCompressed;
914  }
915  {
916  connection.expectInt32();
917  size_t sizeCompressed = connection.expectInt32();
918  unsigned char* dataCompressed = new unsigned char[sizeCompressed];
919  ok &= connection.expectBlock((char*)dataCompressed, sizeCompressed);
920  size_t sizeUncompressed = m_map_flags.getRawImageSize();
921  unsigned char* dataUncompressed = m_map_flags.getRawImage();
922  int z_result = uncompress((Bytef*)dataUncompressed, (uLongf*)&sizeUncompressed, (const Bytef*)dataCompressed, sizeCompressed);
923  YARP_UNUSED(z_result);
924  delete[] dataCompressed;
925  }
926 #endif
927  }
928  else
929  {
930  bool ok = true;
931  {
932  connection.expectInt32();
933  size_t memsize = connection.expectInt32();
934  if (memsize != m_map_occupancy.getRawImageSize()) { return false; }
935  unsigned char* mem = m_map_occupancy.getRawImage();
936  ok &= connection.expectBlock((char*)mem, memsize);
937  }
938  {
939  connection.expectInt32();
940  size_t memsize = connection.expectInt32();
941  if (memsize != m_map_flags.getRawImageSize()) { return false; }
942  unsigned char* mem = m_map_flags.getRawImage();
943  ok &= connection.expectBlock((char*)mem, memsize);
944  }
945  if (!ok) {
946  return false;
947  }
948  }
949  return !connection.isError();
950 }
951 
953 {
954  connection.appendInt32(BOTTLE_TAG_LIST);
955  connection.appendInt32(10);
956  connection.appendInt32(BOTTLE_TAG_INT32);
957  connection.appendInt32(m_width);
958  connection.appendInt32(BOTTLE_TAG_INT32);
959  connection.appendInt32(m_height);
960  connection.appendInt32(BOTTLE_TAG_FLOAT64);
961  connection.appendFloat64(m_origin.get_x());
962  connection.appendInt32(BOTTLE_TAG_FLOAT64);
963  connection.appendFloat64(m_origin.get_y());
964  connection.appendInt32(BOTTLE_TAG_FLOAT64);
965  connection.appendFloat64(m_origin.get_theta());
966  connection.appendInt32(BOTTLE_TAG_FLOAT64);
967  connection.appendFloat64(m_resolution);
968  connection.appendInt32(BOTTLE_TAG_STRING);
969  connection.appendString(m_map_name);
970  connection.appendInt32(BOTTLE_TAG_INT8);
971  connection.appendInt8(m_compressed_data_over_network);
972 
973  if (m_compressed_data_over_network)
974  {
975 #if defined (YARP_HAS_ZLIB)
976  {
977  size_t sizeUncompressed = m_map_occupancy.getRawImageSize();
978  unsigned char* dataUncompressed = m_map_occupancy.getRawImage();
979  size_t sizeCompressed = compressBound(sizeUncompressed);
980  unsigned char* dataCompressed = new unsigned char[sizeCompressed];
981  int z_result = compress((Bytef*)dataCompressed, (uLongf*)&sizeCompressed, (Bytef*)dataUncompressed, sizeUncompressed);
982  YARP_UNUSED(z_result);
983  connection.appendInt32(BOTTLE_TAG_BLOB);
984  connection.appendInt32(sizeCompressed);
985  connection.appendBlock((char*)dataCompressed, sizeCompressed);
986  delete [] dataCompressed;
987  }
988  {
989  size_t sizeUncompressed = m_map_flags.getRawImageSize();
990  unsigned char* dataUncompressed = m_map_flags.getRawImage();
991  size_t sizeCompressed = compressBound(sizeUncompressed);
992  unsigned char* dataCompressed = new unsigned char[sizeCompressed];
993  int z_result = compress((Bytef*)dataCompressed, (uLongf*)&sizeCompressed, (Bytef*)dataUncompressed, sizeUncompressed);
994  YARP_UNUSED(z_result);
995  connection.appendInt32(BOTTLE_TAG_BLOB);
996  connection.appendInt32(sizeCompressed);
997  connection.appendBlock((char*)dataCompressed, sizeCompressed);
998  delete[] dataCompressed;
999  }
1000 #endif
1001  }
1002  else
1003  {
1004  {
1005  unsigned char* mem = m_map_occupancy.getRawImage();
1006  int memsize = m_map_occupancy.getRawImageSize();
1007  connection.appendInt32(BOTTLE_TAG_BLOB);
1008  connection.appendInt32(memsize);
1009  connection.appendExternalBlock((char*)mem, memsize);
1010  }
1011  {
1012  unsigned char* mem = m_map_flags.getRawImage();
1013  int memsize = m_map_flags.getRawImageSize();
1014  connection.appendInt32(BOTTLE_TAG_BLOB);
1015  connection.appendInt32(memsize);
1016  connection.appendExternalBlock((char*)mem, memsize);
1017  }
1018  }
1019 
1020  connection.convertTextMode();
1021  return !connection.isError();
1022 }
1023 
1024 bool MapGrid2D::setOrigin(double x, double y, double theta)
1025 {
1026  //the given x and y are referred to the bottom left corner, pointing outwards.
1027  //To check if it is inside the map, I have to convert it to a cell with x and y referred to the upper left corner, pointing inwards
1028  if (m_resolution<=0)
1029  {
1030  yWarning() << "MapGrid2D::setOrigin() requested is not inside map!";
1031  return false;
1032  }
1033 
1034  int xc = (int)(x/ m_resolution);
1035  int yc = (int)(y / m_resolution);
1036 
1037  XYCell orig(-xc, (m_height-1) + yc);
1038  if (isInsideMap(orig))
1039  {
1040  m_origin.setOrigin(x,y, theta);
1041  return true;
1042  }
1043  else
1044  {
1045  yWarning() << "MapGrid2D::setOrigin() requested is not inside map!";
1046  m_origin.setOrigin(x, y, theta);
1047  return true;
1048  }
1049 }
1050 
1051 void MapGrid2D::getOrigin(double& x, double& y, double& theta) const
1052 {
1053  x = m_origin.get_x();
1054  y = m_origin.get_y();
1055  theta = m_origin.get_theta();
1056 }
1057 
1058 bool MapGrid2D::setResolution(double resolution)
1059 {
1060  if (resolution <= 0)
1061  {
1062  yError() << "MapGrid2D::setResolution() invalid value:" << resolution;
1063  return false;
1064  }
1065  m_resolution = resolution;
1066  return true;
1067 }
1068 
1069 void MapGrid2D::getResolution(double& resolution) const
1070 {
1071  resolution = m_resolution;
1072 }
1073 
1074 bool MapGrid2D::setMapName(std::string map_name)
1075 {
1076  if (map_name != "")
1077  {
1078  m_map_name = map_name;
1079  return true;
1080  }
1081  yError() << "MapGrid2D::setMapName() invalid map name";
1082  return false;
1083 }
1084 
1085 std::string MapGrid2D::getMapName() const
1086 {
1087  return m_map_name;
1088 }
1089 
1090 bool MapGrid2D::setSize_in_meters(double x, double y)
1091 {
1092  if (x <= 0 && y <= 0)
1093  {
1094  yError() << "MapGrid2D::setSize() invalid size";
1095  return false;
1096  }
1097  if (m_resolution <= 0)
1098  {
1099  yError() << "MapGrid2D::setSize() invalid map resolution.";
1100  return false;
1101  }
1102  auto w = (size_t)(x/m_resolution);
1103  auto h = (size_t)(y/m_resolution);
1104  setSize_in_cells(w,h);
1105  return true;
1106 }
1107 
1108 bool MapGrid2D::setSize_in_cells(size_t x, size_t y)
1109 {
1110  if (x == 0 && y == 0)
1111  {
1112  yError() << "MapGrid2D::setSize() invalid size";
1113  return false;
1114  }
1115  m_map_occupancy.resize(x, y);
1116  m_map_flags.resize(x, y);
1117  m_map_occupancy.zero();
1118  m_map_flags.zero();
1119  m_width = x;
1120  m_height = y;
1121  return true;
1122 }
1123 
1124 void MapGrid2D::getSize_in_meters(double& x, double& y) const
1125 {
1126  x = m_width* m_resolution;
1127  y = m_height* m_resolution;
1128 }
1129 
1130 void MapGrid2D::getSize_in_cells(size_t&x, size_t& y) const
1131 {
1132  x = m_width;
1133  y = m_height;
1134 }
1135 
1137 {
1138  if (isInsideMap(cell) == false)
1139  {
1140  yError() << "Invalid cell requested " << cell.x << " " << cell.y;
1141  return false;
1142  }
1143  m_map_flags.safePixel(cell.x, cell.y) = flag;
1144  return true;
1145 }
1146 
1147 bool MapGrid2D::getMapFlag(XYCell cell, map_flags& flag) const
1148 {
1149  if (isInsideMap(cell) == false)
1150  {
1151  yError() << "Invalid cell requested " << cell.x << " " << cell.y;
1152  return false;
1153  }
1154  flag = (MapGrid2D::map_flags) m_map_flags.safePixel(cell.x, cell.y);
1155  return true;
1156 }
1157 
1158 bool MapGrid2D::setOccupancyData(XYCell cell, double occupancy)
1159 {
1160  if (isInsideMap(cell) == false)
1161  {
1162  yError() << "Invalid cell requested " << cell.x << " " << cell.y;
1163  return false;
1164  }
1165  if (occupancy <0)
1166  {
1167  m_map_occupancy.safePixel(cell.x, cell.y) = 255;
1168  }
1169  else
1170  {
1171  m_map_occupancy.safePixel(cell.x, cell.y) = (yarp::sig::PixelMono)(occupancy);
1172  }
1173  return true;
1174 }
1175 
1176 bool MapGrid2D::getOccupancyData(XYCell cell, double& occupancy) const
1177 {
1178  if (isInsideMap(cell) == false)
1179  {
1180  yError() << "Invalid cell requested " << cell.x << " " << cell.y;
1181  return false;
1182  }
1183  if (m_map_occupancy.safePixel(cell.x, cell.y)==255)
1184  {
1185  occupancy =-1;
1186  }
1187  else
1188  {
1189  occupancy = m_map_occupancy.safePixel(cell.x, cell.y);
1190  }
1191  return true;
1192 }
1193 
1195 {
1196  if ((size_t) image.width() != m_width ||
1197  (size_t) image.height() != m_height)
1198  {
1199  yError() << "The size of given occupancy grid does not correspond to the current map. Use method setSize() first.";
1200  return false;
1201  }
1202  m_map_occupancy = image;
1203  return true;
1204 }
1205 
1207 {
1208  image = m_map_occupancy;
1209  return true;
1210 }
1211 
1213 {
1214  for (size_t y = 0; y < m_height; y++)
1215  {
1216  for (size_t x = 0; x < m_width; x++)
1217  {
1218  switch (m_map_flags.safePixel(x, y))
1219  {
1220  case MapGrid2D::map_flags::MAP_CELL_TEMPORARY_OBSTACLE:
1221  case MapGrid2D::map_flags::MAP_CELL_ENLARGED_OBSTACLE:
1222  m_map_flags.safePixel(x, y) = MAP_CELL_FREE;
1223  break;
1224  }
1225  }
1226  }
1227 }
1228 
1230 {
1231 #if defined (YARP_HAS_ZLIB)
1232  m_compressed_data_over_network = val;
1233  return true;
1234 #else
1235  yWarning() << "Zlib library not found, unable to set compression";
1236  return false;
1237 #endif
1238 }
#define BOTTLE_TAG_INT8
Definition: Bottle.h:19
#define BOTTLE_TAG_FLOAT64
Definition: Bottle.h:25
#define BOTTLE_TAG_INT32
Definition: Bottle.h:21
#define BOTTLE_TAG_STRING
Definition: Bottle.h:26
#define BOTTLE_TAG_BLOB
Definition: Bottle.h:27
#define BOTTLE_TAG_LIST
Definition: Bottle.h:28
bool ret
#define yError(...)
Definition: Log.h:279
#define yDebug(...)
Definition: Log.h:234
#define yWarning(...)
Definition: Log.h:268
static std::string extractExtensionFromFile(std::string full_filename)
Definition: MapGrid2D.cpp:53
static std::string extractPathFromFile(std::string full_filename)
Definition: MapGrid2D.cpp:39
#define RAD2DEG
Definition: MapGrid2D.cpp:35
contains the definition of a map type
MapGrid2DOrigin m_origin
pose of the map frame w.r.t. the bottom left corner of the map image
Definition: MapGrid2DInfo.h:57
double m_resolution
meters/pixel
Definition: MapGrid2DInfo.h:56
void getSize_in_cells(size_t &x, size_t &y) const
Returns the size of the map in cells.
Definition: MapGrid2D.cpp:1130
bool getMapFlag(XYCell cell, map_flags &flag) const
Get the flag of a specific cell of the map.
Definition: MapGrid2D.cpp:1147
void clearMapTemporaryFlags()
Clear map temporary flags, such as: MAP_CELL_TEMPORARY_OBSTACLE, MAP_CELL_ENLARGED_OBSTACLE etc.
Definition: MapGrid2D.cpp:1212
bool isIdenticalTo(const MapGrid2D &otherMap) const
Checks is two maps are identical.
Definition: MapGrid2D.cpp:60
bool getMapImage(yarp::sig::ImageOf< yarp::sig::PixelRgb > &image) const
Definition: MapGrid2D.cpp:187
bool write(yarp::os::ConnectionWriter &connection) const override
Write vector to a connection.
Definition: MapGrid2D.cpp:952
bool read(yarp::os::ConnectionReader &connection) override
Read this object from a network connection.
Definition: MapGrid2D.cpp:869
size_t height() const
Retrieves the map height, expressed in cells.
Definition: MapGrid2D.cpp:177
bool setResolution(double resolution)
Sets the resolution of the map, i.e.
Definition: MapGrid2D.cpp:1058
bool setOrigin(double x, double y, double theta)
Sets the origin of the map reference frame (according to ROS convention)
Definition: MapGrid2D.cpp:1024
bool getOccupancyGrid(yarp::sig::ImageOf< yarp::sig::PixelMono > &image) const
Definition: MapGrid2D.cpp:1206
std::string getMapName() const
Retrieves the map name.
Definition: MapGrid2D.cpp:1085
bool setSize_in_cells(size_t x, size_t y)
Sets the size of the map in cells.
Definition: MapGrid2D.cpp:1108
bool enable_map_compression_over_network(bool val)
Definition: MapGrid2D.cpp:1229
void getOrigin(double &x, double &y, double &theta) const
Retrieves the origin of the map reference frame (according to ROS convention)
Definition: MapGrid2D.cpp:1051
bool setMapImage(yarp::sig::ImageOf< yarp::sig::PixelRgb > &image)
Definition: MapGrid2D.cpp:202
bool setMapName(std::string map_name)
Sets the map name.
Definition: MapGrid2D.cpp:1074
bool setMapFlag(XYCell cell, map_flags flag)
Set the flag of a specific cell of the map.
Definition: MapGrid2D.cpp:1136
bool crop(int left, int top, int right, int bottom)
Modifies the map, cropping pixels at the boundaries.
Definition: MapGrid2D.cpp:707
bool isKeepOut(XYCell cell) const
Checks if a specific cell of the map is marked as keep-out.
Definition: MapGrid2D.cpp:153
bool isFree(XYCell cell) const
Checks if a specific cell of the map is free, i.e.
Definition: MapGrid2D.cpp:142
bool isNotFree(XYCell cell) const
Checks if a specific cell of the map contains is not free.
Definition: MapGrid2D.cpp:122
size_t width() const
Retrieves the map width, expressed in cells.
Definition: MapGrid2D.cpp:182
yarp::sig::PixelMono CellFlagData
Definition: MapGrid2D.h:31
void getSize_in_meters(double &x, double &y) const
Returns the size of the map in meters, according to the current map resolution.
Definition: MapGrid2D.cpp:1124
bool enlargeObstacles(double size)
Performs the obstacle enlargement operation.
Definition: MapGrid2D.cpp:220
bool setOccupancyData(XYCell cell, double occupancy)
Set the occupancy data of a specific cell of the map.
Definition: MapGrid2D.cpp:1158
bool loadFromFile(std::string map_filename)
Loads a yarp map file from disk.
Definition: MapGrid2D.cpp:556
bool setSize_in_meters(double x, double y)
Sets the size of the map in meters, according to the current map resolution.
Definition: MapGrid2D.cpp:1090
yarp::sig::PixelMono CellOccupancyData
Definition: MapGrid2D.h:32
bool setOccupancyGrid(yarp::sig::ImageOf< yarp::sig::PixelMono > &image)
Definition: MapGrid2D.cpp:1194
bool saveToFile(std::string map_filename) const
Store a yarp map file to disk.
Definition: MapGrid2D.cpp:811
bool getOccupancyData(XYCell cell, double &occupancy) const
Retrieves the occupancy data of a specific cell of the map.
Definition: MapGrid2D.cpp:1176
bool isWall(XYCell cell) const
Checks if a specific cell of the map contains a wall.
Definition: MapGrid2D.cpp:164
void getResolution(double &resolution) const
Retrieves the resolution of the map, i.e.
Definition: MapGrid2D.cpp:1069
A simple collection of objects that can be described and transmitted in a portable way.
Definition: Bottle.h:74
void fromString(const std::string &text)
Initializes bottle from a string.
Definition: Bottle.cpp:204
Value & get(size_type index) const
Reads a Value v from a certain part of the list.
Definition: Bottle.cpp:246
bool check(const std::string &key) const override
Check if there exists a property of the given name.
Definition: Bottle.cpp:277
std::string toString() const override
Gives a human-readable textual representation of the bottle.
Definition: Bottle.cpp:211
Value & find(const std::string &key) const override
Gets a value corresponding to a given keyword.
Definition: Bottle.cpp:287
An interface for reading from a network connection.
virtual bool expectBlock(char *data, size_t len)=0
Read a block of data from the network connection.
virtual std::int32_t expectInt32()=0
Read a 32-bit integer from the network connection.
virtual bool convertTextMode()=0
Reads in a standard description in text mode, and converts it to a standard description in binary.
virtual bool isError() const =0
virtual std::int8_t expectInt8()=0
Read a 8-bit integer from the network connection.
virtual yarp::conf::float64_t expectFloat64()=0
Read a 64-bit floating point number from the network connection.
An interface for writing to a network connection.
virtual bool isError() const =0
virtual void appendInt8(std::int8_t data)=0
Send a representation of a 8-bit integer to the network connection.
virtual void appendExternalBlock(const char *data, size_t len)=0
Send a block of data to the network connection, without making a copy.
virtual bool convertTextMode()=0
Converts a standard description in binary into a textual description, if the connection is in text-mo...
virtual void appendInt32(std::int32_t data)=0
Send a representation of a 32-bit integer to the network connection.
virtual void appendFloat64(yarp::conf::float64_t data)=0
Send a representation of a 64-bit floating point number to the network connection.
virtual void appendBlock(const char *data, size_t len)=0
Send a block of data to the network connection.
virtual void appendString(const char *str, const char terminate='\n') final
Send a character sequence to the network connection.
A class for storing options and configuration information.
Definition: Property.h:34
Value & find(const std::string &key) const override
Gets a value corresponding to a given keyword.
Definition: Property.cpp:1051
bool fromConfigFile(const std::string &fname, bool wipe=true)
Interprets a file as a list of properties.
Definition: Property.cpp:1098
bool check(const std::string &key) const override
Check if there exists a property of the given name.
Definition: Property.cpp:1041
virtual yarp::conf::float64_t asFloat64() const
Get 64-bit floating point value.
Definition: Value.cpp:222
virtual Bottle * asList() const
Get list value.
Definition: Value.cpp:240
virtual yarp::conf::float32_t asFloat32() const
Get 32-bit floating point value.
Definition: Value.cpp:216
virtual std::string asString() const
Get string value.
Definition: Value.cpp:234
T & safePixel(size_t x, size_t y)
Definition: Image.h:690
void setQuantum(size_t imgQuantum)
Definition: Image.cpp:501
size_t width() const
Gets width of image in pixels.
Definition: Image.h:166
void resize(size_t imgWidth, size_t imgHeight)
Reallocate an image to be of a desired size, throwing away its current contents.
Definition: Image.cpp:452
void zero()
Set all pixels to 0.
Definition: Image.cpp:445
size_t height() const
Gets height of image in pixels.
Definition: Image.h:172
An interface for the device drivers.
An interface to the operating system, including Port based communication.
bool read(ImageOf< PixelRgb > &dest, const std::string &src, image_fileformat format=FORMAT_ANY)
Definition: ImageFile.cpp:922
bool write(const ImageOf< PixelRgb > &src, const std::string &dest, image_fileformat format=FORMAT_PPM)
Definition: ImageFile.cpp:1098
Signal processing.
Definition: Image.h:22
unsigned char PixelMono
Monochrome pixel type.
Definition: Image.h:447
Packed RGB pixel type.
Definition: Image.h:464
unsigned char g
Definition: Image.h:466
unsigned char r
Definition: Image.h:465
unsigned char b
Definition: Image.h:467
#define YARP_UNUSED(var)
Definition: api.h:162