Skip to content

Commit 28a6eb8

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]> Signed-off-by: Sakshay Mahna <[email protected]>
1 parent 75f4470 commit 28a6eb8

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
@@ -25,15 +25,15 @@
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
*/
8383
bool 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

Comments
 (0)