|
1 | 1 | #include "Dijkstra.hpp"
|
2 | 2 | #include <maps/grid/TraversabilityMap3d.hpp>
|
3 | 3 | #include <traversability_generator3d/TraversabilityConfig.hpp>
|
4 |
| - |
| 4 | +#include <queue> |
5 | 5 | using namespace maps::grid;
|
6 | 6 |
|
7 | 7 | namespace ugv_nav4d
|
8 | 8 | {
|
9 | 9 | void Dijkstra::computeCost(const TraversabilityNodeBase* source,
|
10 | 10 | std::unordered_map<const TraversabilityNodeBase*, double>& outDistances,
|
11 | 11 | const traversability_generator3d::TraversabilityConfig& config)
|
12 |
| -{ |
| 12 | +{ |
13 | 13 | outDistances.clear();
|
14 | 14 | outDistances[source] = 0.0;
|
15 |
| - |
16 |
| - std::set<std::pair<double, const TraversabilityNodeBase*>> vertexQ; |
17 |
| - vertexQ.insert(std::make_pair(outDistances[source], source)); |
18 |
| - |
19 |
| - while (!vertexQ.empty()) |
| 15 | + |
| 16 | + // Use a priority queue for efficiency |
| 17 | + std::priority_queue<std::pair<double, const TraversabilityNodeBase*>, |
| 18 | + std::vector<std::pair<double, const TraversabilityNodeBase*>>, |
| 19 | + std::greater<>> vertexQ; |
| 20 | + vertexQ.emplace(0.0, source); |
| 21 | + |
| 22 | + std::unordered_set<const TraversabilityNodeBase*> visited; |
| 23 | + |
| 24 | + while (!vertexQ.empty()) |
20 | 25 | {
|
21 |
| - const double dist = vertexQ.begin()->first; |
22 |
| - const TraversabilityNodeBase* u = vertexQ.begin()->second; |
23 |
| - |
24 |
| - vertexQ.erase(vertexQ.begin()); |
25 |
| - |
| 26 | + const double dist = vertexQ.top().first; |
| 27 | + const TraversabilityNodeBase* u = vertexQ.top().second; |
| 28 | + vertexQ.pop(); |
| 29 | + |
| 30 | + // Skip nodes already processed |
| 31 | + if (visited.find(u) != visited.end()) |
| 32 | + continue; |
| 33 | + visited.insert(u); |
| 34 | + |
26 | 35 | const Eigen::Vector3d uPos(u->getIndex().x() * config.gridResolution,
|
27 | 36 | u->getIndex().y() * config.gridResolution,
|
28 | 37 | u->getHeight());
|
29 |
| - |
| 38 | + |
30 | 39 | // Visit each edge exiting u
|
31 |
| - for(TraversabilityNodeBase *v : u->getConnections()) |
32 |
| - { |
33 |
| - //skip all non traversable nodes. They will retain the maximum cost. |
34 |
| - if(v->getType() != TraversabilityNodeBase::TRAVERSABLE) |
| 40 | + for (TraversabilityNodeBase* v : u->getConnections()) |
| 41 | + { |
| 42 | + if (v->getType() != TraversabilityNodeBase::TRAVERSABLE) |
35 | 43 | continue;
|
36 |
| - |
| 44 | + |
37 | 45 | const Eigen::Vector3d vPos(v->getIndex().x() * config.gridResolution,
|
38 | 46 | v->getIndex().y() * config.gridResolution,
|
39 | 47 | v->getHeight());
|
40 | 48 |
|
41 | 49 | const double distance = (vPos - uPos).norm();
|
42 | 50 | double distance_through_u = dist + distance;
|
43 |
| - |
44 |
| - if (outDistances.find(v) == outDistances.end() || |
45 |
| - distance_through_u < outDistances[v]) |
| 51 | + |
| 52 | + if (outDistances.find(v) == outDistances.end() || distance_through_u < outDistances[v]) |
46 | 53 | {
|
47 |
| - vertexQ.erase(std::make_pair(outDistances[v], v)); |
48 | 54 | outDistances[v] = distance_through_u;
|
49 |
| - vertexQ.insert(std::make_pair(outDistances[v], v)); |
| 55 | + vertexQ.emplace(outDistances[v], v); |
50 | 56 | }
|
51 | 57 | }
|
52 | 58 | }
|
53 | 59 | }
|
54 | 60 | }
|
| 61 | + |
0 commit comments