25 #include "nav2_amcl/map/map.hpp"
35 unsigned int src_i_, src_j_;
50 : distances_(NULL), scale_(scale), max_dist_(max_dist)
52 cell_radius_ = max_dist / scale;
53 distances_ =
new double *[cell_radius_ + 2];
54 for (
int i = 0; i <= cell_radius_ + 1; i++) {
55 distances_[i] =
new double[cell_radius_ + 2];
56 for (
int j = 0; j <= cell_radius_ + 1; j++) {
57 distances_[i][j] = sqrt(i * i + j * j);
68 for (
int i = 0; i <= cell_radius_ + 1; i++) {
69 delete[] distances_[i];
85 return a.occ_dist > b.occ_dist;
95 get_distance_map(
double scale,
double max_dist)
99 if (!cdm || (cdm->scale_ != scale) || (cdm->max_dist_ != max_dist)) {
113 map_t * map,
int i,
int j,
114 int src_i,
int src_j,
115 std::priority_queue<CellData> & Q,
117 unsigned char * marked)
119 const int map_index = MAP_INDEX(map, i, j);
121 if (marked[map_index]) {
125 int di = abs(i - src_i);
126 int dj = abs(j - src_j);
127 double distance = cdm->distances_[di][dj];
129 if (distance > cdm->cell_radius_) {
133 map->cells[map_index].occ_dist = distance * map->scale;
135 Q.emplace(
CellData{map,
static_cast<unsigned int>(i),
static_cast<unsigned int>(j),
136 static_cast<unsigned int>(src_i),
static_cast<unsigned int>(src_j),
137 map->cells[map_index].occ_dist});
139 marked[map_index] = 1;
147 void map_update_cspace(
map_t * map,
double max_occ_dist)
149 unsigned char * marked;
150 std::priority_queue<CellData> Q;
152 marked =
new unsigned char[map->size_x * map->size_y];
153 memset(marked, 0,
sizeof(
unsigned char) * map->size_x * map->size_y);
155 map->max_occ_dist = max_occ_dist;
163 for (
int i = 0; i < map->size_x; i++) {
164 cell.src_i_ = cell.i_ = i;
165 for (
int j = 0; j < map->size_y; j++) {
166 loop_map_index = MAP_INDEX(map, i, j);
167 if (map->cells[loop_map_index].occ_state == +1) {
168 map->cells[loop_map_index].occ_dist = 0.0;
169 cell.src_j_ = cell.j_ = j;
170 marked[loop_map_index] = 1;
173 map->cells[loop_map_index].occ_dist = max_occ_dist;
180 if (current_cell.i_ > 0) {
182 map, current_cell.i_ - 1, current_cell.j_,
183 current_cell.src_i_, current_cell.src_j_,
186 if (current_cell.j_ > 0) {
188 map, current_cell.i_, current_cell.j_ - 1,
189 current_cell.src_i_, current_cell.src_j_,
192 if (
static_cast<int>(current_cell.i_) < map->size_x - 1) {
194 map, current_cell.i_ + 1, current_cell.j_,
195 current_cell.src_i_, current_cell.src_j_,
198 if (
static_cast<int>(current_cell.j_) < map->size_y - 1) {
200 map, current_cell.i_, current_cell.j_ + 1,
201 current_cell.src_i_, current_cell.src_j_,