25
25
#include " nav2_amcl/map/map.hpp"
26
26
27
27
/*
28
- * @class CellData
28
+ * @struct CellData
29
29
* @brief Data about map cells
30
30
*/
31
- class CellData
31
+ struct CellData
32
32
{
33
- public:
34
33
map_t * map_;
35
34
unsigned int i_, j_;
36
35
unsigned int src_i_, src_j_;
36
+ float occ_dist;
37
37
};
38
38
39
39
/*
@@ -82,9 +82,7 @@ class CachedDistanceMap
82
82
*/
83
83
bool operator <(const CellData & a, const CellData & b)
84
84
{
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 ;
88
86
}
89
87
90
88
/*
@@ -118,7 +116,9 @@ void enqueue(
118
116
CachedDistanceMap * cdm,
119
117
unsigned char * marked)
120
118
{
121
- if (marked[MAP_INDEX (map, i, j)]) {
119
+ const int map_index = MAP_INDEX (map, i, j);
120
+
121
+ if (marked[map_index]) {
122
122
return ;
123
123
}
124
124
@@ -130,18 +130,13 @@ void enqueue(
130
130
return ;
131
131
}
132
132
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 ;
141
134
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 });
143
138
144
- marked[MAP_INDEX (map, i, j) ] = 1 ;
139
+ marked[map_index ] = 1 ;
145
140
}
146
141
147
142
/*
@@ -164,16 +159,18 @@ void map_update_cspace(map_t * map, double max_occ_dist)
164
159
// Enqueue all the obstacle cells
165
160
CellData cell;
166
161
cell.map_ = map;
162
+ int loop_map_index;
167
163
for (int i = 0 ; i < map->size_x ; i++) {
168
164
cell.src_i_ = cell.i_ = i;
169
165
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 ;
172
169
cell.src_j_ = cell.j_ = j;
173
- marked[MAP_INDEX (map, i, j) ] = 1 ;
170
+ marked[loop_map_index ] = 1 ;
174
171
Q.push (cell);
175
172
} 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;
177
174
}
178
175
}
179
176
}
@@ -182,27 +179,27 @@ void map_update_cspace(map_t * map, double max_occ_dist)
182
179
CellData current_cell = Q.top ();
183
180
if (current_cell.i_ > 0 ) {
184
181
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);
188
185
}
189
186
if (current_cell.j_ > 0 ) {
190
187
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);
194
191
}
195
192
if (static_cast <int >(current_cell.i_ ) < map->size_x - 1 ) {
196
193
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);
200
197
}
201
198
if (static_cast <int >(current_cell.j_ ) < map->size_y - 1 ) {
202
199
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);
206
203
}
207
204
208
205
Q.pop ();
0 commit comments