45 Costmap2D::Costmap2D(
unsigned int cells_size_x,
unsigned int cells_size_y,
double resolution,
46 double origin_x,
double origin_y,
unsigned char default_value) :
47 size_x_(cells_size_x), size_y_(cells_size_y), resolution_(resolution), origin_x_(origin_x),
48 origin_y_(origin_y), costmap_(NULL), timestamps_(NULL), default_value_(default_value)
71 costmap_ =
new unsigned char[size_x * size_y];
76 double origin_x,
double origin_y)
100 unsigned int len = xn - x0;
122 unsigned int lower_left_x, lower_left_y, upper_right_x, upper_right_y;
123 if (!
map.worldToMap(win_origin_x, win_origin_y, lower_left_x, lower_left_y)
124 || !
map.worldToMap(win_origin_x + win_size_x, win_origin_y + win_size_y, upper_right_x, upper_right_y))
130 size_x_ = upper_right_x - lower_left_x;
131 size_y_ = upper_right_y - lower_left_y;
180 size_x_(0), size_y_(0), resolution_(0.0), origin_x_(0.0), origin_y_(0.0), costmap_(NULL), timestamps_(NULL)
194 return (
unsigned int)cells_dist;
279 int cell_ox, cell_oy;
284 if (cell_ox == 0 && cell_oy == 0)
289 double new_grid_ox, new_grid_oy;
298 int lower_left_x, lower_left_y, upper_right_x, upper_right_y;
299 lower_left_x =
min(
max(cell_ox, 0), size_x);
300 lower_left_y =
min(
max(cell_oy, 0), size_y);
301 upper_right_x =
min(
max(cell_ox + size_x, 0), size_x);
302 upper_right_y =
min(
max(cell_oy + size_y, 0), size_y);
304 unsigned int cell_size_x = upper_right_x - lower_left_x;
305 unsigned int cell_size_y = upper_right_y - lower_left_y;
308 unsigned char* local_map =
new unsigned char[cell_size_x * cell_size_y];
309 double* local_map_timestamps =
new double[cell_size_x * cell_size_y];
323 int start_x = lower_left_x - cell_ox;
324 int start_y = lower_left_y - cell_oy;
332 delete[] local_map_timestamps;
339 for (
unsigned int i = 0; i < polygon.
size(); ++i)
342 if (!
worldToMap(polygon[i].x, polygon[i].y, loc.
x, loc.
y))
356 for (
unsigned int i = 0; i < polygon_cells.
size(); ++i)
358 unsigned int index =
getIndex(polygon_cells[i].x, polygon_cells[i].y);
368 for (
unsigned int i = 0; i < polygon.
size() - 1; ++i)
370 raytraceLine(cell_gatherer, polygon[i].x, polygon[i].y, polygon[i + 1].x, polygon[i + 1].y);
372 if (!polygon.
empty())
374 unsigned int last_index = polygon.
size() - 1;
376 raytraceLine(cell_gatherer, polygon[last_index].x, polygon[last_index].y, polygon[0].x, polygon[0].y);
383 if (polygon.
size() < 3)
392 while (i < polygon_cells.
size() - 1)
394 if (polygon_cells[i].x > polygon_cells[i + 1].x)
396 swap = polygon_cells[i];
397 polygon_cells[i] = polygon_cells[i + 1];
398 polygon_cells[i + 1] =
swap;
410 unsigned int min_x = polygon_cells[0].x;
411 unsigned int max_x = polygon_cells[polygon_cells.
size() - 1].x;
414 for (
unsigned int x = min_x; x <= max_x; ++x)
416 if (i >= polygon_cells.
size() - 1)
419 if (polygon_cells[i].y < polygon_cells[i + 1].y)
421 min_pt = polygon_cells[i];
422 max_pt = polygon_cells[i + 1];
426 min_pt = polygon_cells[i + 1];
427 max_pt = polygon_cells[i];
431 while (i < polygon_cells.
size() && polygon_cells[i].x == x)
433 if (polygon_cells[i].y < min_pt.
y)
434 min_pt = polygon_cells[i];
435 else if (polygon_cells[i].y > max_pt.
y)
436 max_pt = polygon_cells[i];
442 for (
unsigned int y = min_pt.
y; y <= max_pt.
y; ++y)
496 for (
unsigned int iy = 0; iy <
size_y_; iy++)
498 for (
unsigned int ix = 0; ix <
size_x_; ix++)
500 unsigned char cost =
getCost(ix, iy);