2525#include " nav2_amcl/map/map.hpp"
2626
2727/*
28- * @class CellData
28+ * @struct CellData
2929 * @brief Data about map cells
3030 */
31- class CellData
31+ struct CellData
3232{
33- public:
3433 map_t * map_;
3534 unsigned int i_, j_;
3635 unsigned int src_i_, src_j_;
36+ float occ_dist;
3737};
3838
3939/*
@@ -82,9 +82,7 @@ class CachedDistanceMap
8282 */
8383bool operator <(const CellData & a, const CellData & b)
8484{
85- return a.map_ ->cells [MAP_INDEX (
86- a.map_ , a.i_ ,
87- a.j_ )].occ_dist > a.map_ ->cells [MAP_INDEX (b.map_ , b.i_ , b.j_ )].occ_dist ;
85+ return a.occ_dist > b.occ_dist ;
8886}
8987
9088/*
@@ -118,7 +116,9 @@ void enqueue(
118116 CachedDistanceMap * cdm,
119117 unsigned char * marked)
120118{
121- if (marked[MAP_INDEX (map, i, j)]) {
119+ const int map_index = MAP_INDEX (map, i, j);
120+
121+ if (marked[map_index]) {
122122 return ;
123123 }
124124
@@ -130,18 +130,13 @@ void enqueue(
130130 return ;
131131 }
132132
133- map->cells [MAP_INDEX (map, i, j)].occ_dist = distance * map->scale ;
134-
135- CellData cell;
136- cell.map_ = map;
137- cell.i_ = i;
138- cell.j_ = j;
139- cell.src_i_ = src_i;
140- cell.src_j_ = src_j;
133+ map->cells [map_index].occ_dist = distance * map->scale ;
141134
142- Q.push (cell);
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 });
143138
144- marked[MAP_INDEX (map, i, j) ] = 1 ;
139+ marked[map_index ] = 1 ;
145140}
146141
147142/*
@@ -164,16 +159,18 @@ void map_update_cspace(map_t * map, double max_occ_dist)
164159 // Enqueue all the obstacle cells
165160 CellData cell;
166161 cell.map_ = map;
162+ int loop_map_index;
167163 for (int i = 0 ; i < map->size_x ; i++) {
168164 cell.src_i_ = cell.i_ = i;
169165 for (int j = 0 ; j < map->size_y ; j++) {
170- if (map->cells [MAP_INDEX (map, i, j)].occ_state == +1 ) {
171- map->cells [MAP_INDEX (map, i, j)].occ_dist = 0.0 ;
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 ;
172169 cell.src_j_ = cell.j_ = j;
173- marked[MAP_INDEX (map, i, j) ] = 1 ;
170+ marked[loop_map_index ] = 1 ;
174171 Q.push (cell);
175172 } else {
176- map->cells [MAP_INDEX (map, i, j) ].occ_dist = max_occ_dist;
173+ map->cells [loop_map_index ].occ_dist = max_occ_dist;
177174 }
178175 }
179176 }
@@ -182,27 +179,27 @@ void map_update_cspace(map_t * map, double max_occ_dist)
182179 CellData current_cell = Q.top ();
183180 if (current_cell.i_ > 0 ) {
184181 enqueue (
185- map, current_cell.i_ - 1 , current_cell.j_ ,
186- current_cell.src_i_ , current_cell.src_j_ ,
187- Q, cdm, marked);
182+ map, current_cell.i_ - 1 , current_cell.j_ ,
183+ current_cell.src_i_ , current_cell.src_j_ ,
184+ Q, cdm, marked);
188185 }
189186 if (current_cell.j_ > 0 ) {
190187 enqueue (
191- map, current_cell.i_ , current_cell.j_ - 1 ,
192- current_cell.src_i_ , current_cell.src_j_ ,
193- Q, cdm, marked);
188+ map, current_cell.i_ , current_cell.j_ - 1 ,
189+ current_cell.src_i_ , current_cell.src_j_ ,
190+ Q, cdm, marked);
194191 }
195192 if (static_cast <int >(current_cell.i_ ) < map->size_x - 1 ) {
196193 enqueue (
197- map, current_cell.i_ + 1 , current_cell.j_ ,
198- current_cell.src_i_ , current_cell.src_j_ ,
199- Q, cdm, marked);
194+ map, current_cell.i_ + 1 , current_cell.j_ ,
195+ current_cell.src_i_ , current_cell.src_j_ ,
196+ Q, cdm, marked);
200197 }
201198 if (static_cast <int >(current_cell.j_ ) < map->size_y - 1 ) {
202199 enqueue (
203- map, current_cell.i_ , current_cell.j_ + 1 ,
204- current_cell.src_i_ , current_cell.src_j_ ,
205- Q, cdm, marked);
200+ map, current_cell.i_ , current_cell.j_ + 1 ,
201+ current_cell.src_i_ , current_cell.src_j_ ,
202+ Q, cdm, marked);
206203 }
207204
208205 Q.pop ();
0 commit comments