Skip to content

Commit 40391e5

Browse files
doisygGuillaume Doisy
authored andcommitted
[AMCL] 50% initialisation (and reset) speed improvement (ros-navigation#4941)
* index lookup and comparator optimisation Signed-off-by: Guillaume Doisy <[email protected]> * lint Signed-off-by: Guillaume Doisy <[email protected]> --------- Signed-off-by: Guillaume Doisy <[email protected]> Co-authored-by: Guillaume Doisy <[email protected]>
1 parent 2f60185 commit 40391e5

File tree

1 file changed

+30
-33
lines changed

1 file changed

+30
-33
lines changed

nav2_amcl/src/map/map_cspace.cpp

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@
2626
#include "nav2_amcl/map/map.hpp"
2727

2828
/*
29-
* @class CellData
29+
* @struct CellData
3030
* @brief Data about map cells
3131
*/
32-
class CellData
32+
struct CellData
3333
{
34-
public:
3534
map_t * map_;
3635
unsigned int i_, j_;
3736
unsigned int src_i_, src_j_;
37+
float occ_dist;
3838
};
3939

4040
/*
@@ -83,9 +83,7 @@ class CachedDistanceMap
8383
*/
8484
bool operator<(const CellData & a, const CellData & b)
8585
{
86-
return a.map_->cells[MAP_INDEX(
87-
a.map_, a.i_,
88-
a.j_)].occ_dist > a.map_->cells[MAP_INDEX(b.map_, b.i_, b.j_)].occ_dist;
86+
return a.occ_dist > b.occ_dist;
8987
}
9088

9189
/*
@@ -119,7 +117,9 @@ void enqueue(
119117
CachedDistanceMap * cdm,
120118
unsigned char * marked)
121119
{
122-
if (marked[MAP_INDEX(map, i, j)]) {
120+
const int map_index = MAP_INDEX(map, i, j);
121+
122+
if (marked[map_index]) {
123123
return;
124124
}
125125

@@ -131,18 +131,13 @@ void enqueue(
131131
return;
132132
}
133133

134-
map->cells[MAP_INDEX(map, i, j)].occ_dist = distance * map->scale;
135-
136-
CellData cell;
137-
cell.map_ = map;
138-
cell.i_ = i;
139-
cell.j_ = j;
140-
cell.src_i_ = src_i;
141-
cell.src_j_ = src_j;
134+
map->cells[map_index].occ_dist = distance * map->scale;
142135

143-
Q.push(cell);
136+
Q.emplace(CellData{map, static_cast<unsigned int>(i), static_cast<unsigned int>(j),
137+
static_cast<unsigned int>(src_i), static_cast<unsigned int>(src_j),
138+
map->cells[map_index].occ_dist});
144139

145-
marked[MAP_INDEX(map, i, j)] = 1;
140+
marked[map_index] = 1;
146141
}
147142

148143
/*
@@ -165,16 +160,18 @@ void map_update_cspace(map_t * map, double max_occ_dist)
165160
// Enqueue all the obstacle cells
166161
CellData cell;
167162
cell.map_ = map;
163+
int loop_map_index;
168164
for (int i = 0; i < map->size_x; i++) {
169165
cell.src_i_ = cell.i_ = i;
170166
for (int j = 0; j < map->size_y; j++) {
171-
if (map->cells[MAP_INDEX(map, i, j)].occ_state == +1) {
172-
map->cells[MAP_INDEX(map, i, j)].occ_dist = 0.0;
167+
loop_map_index = MAP_INDEX(map, i, j);
168+
if (map->cells[loop_map_index].occ_state == +1) {
169+
map->cells[loop_map_index].occ_dist = 0.0;
173170
cell.src_j_ = cell.j_ = j;
174-
marked[MAP_INDEX(map, i, j)] = 1;
171+
marked[loop_map_index] = 1;
175172
Q.push(cell);
176173
} else {
177-
map->cells[MAP_INDEX(map, i, j)].occ_dist = max_occ_dist;
174+
map->cells[loop_map_index].occ_dist = max_occ_dist;
178175
}
179176
}
180177
}
@@ -183,27 +180,27 @@ void map_update_cspace(map_t * map, double max_occ_dist)
183180
CellData current_cell = Q.top();
184181
if (current_cell.i_ > 0) {
185182
enqueue(
186-
map, current_cell.i_ - 1, current_cell.j_,
187-
current_cell.src_i_, current_cell.src_j_,
188-
Q, cdm, marked);
183+
map, current_cell.i_ - 1, current_cell.j_,
184+
current_cell.src_i_, current_cell.src_j_,
185+
Q, cdm, marked);
189186
}
190187
if (current_cell.j_ > 0) {
191188
enqueue(
192-
map, current_cell.i_, current_cell.j_ - 1,
193-
current_cell.src_i_, current_cell.src_j_,
194-
Q, cdm, marked);
189+
map, current_cell.i_, current_cell.j_ - 1,
190+
current_cell.src_i_, current_cell.src_j_,
191+
Q, cdm, marked);
195192
}
196193
if (static_cast<int>(current_cell.i_) < map->size_x - 1) {
197194
enqueue(
198-
map, current_cell.i_ + 1, current_cell.j_,
199-
current_cell.src_i_, current_cell.src_j_,
200-
Q, cdm, marked);
195+
map, current_cell.i_ + 1, current_cell.j_,
196+
current_cell.src_i_, current_cell.src_j_,
197+
Q, cdm, marked);
201198
}
202199
if (static_cast<int>(current_cell.j_) < map->size_y - 1) {
203200
enqueue(
204-
map, current_cell.i_, current_cell.j_ + 1,
205-
current_cell.src_i_, current_cell.src_j_,
206-
Q, cdm, marked);
201+
map, current_cell.i_, current_cell.j_ + 1,
202+
current_cell.src_i_, current_cell.src_j_,
203+
Q, cdm, marked);
207204
}
208205

209206
Q.pop();

0 commit comments

Comments
 (0)