Skip to content

Commit 2b711c2

Browse files
authored
Merge pull request #35 from dfki-ric/use_travmap3d
Major updates
2 parents 966ee7a + dcbc3ad commit 2b711c2

15 files changed

+314
-370
lines changed

src/Dijkstra.cpp

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,61 @@
11
#include "Dijkstra.hpp"
22
#include <maps/grid/TraversabilityMap3d.hpp>
33
#include <traversability_generator3d/TraversabilityConfig.hpp>
4-
4+
#include <queue>
55
using namespace maps::grid;
66

77
namespace ugv_nav4d
88
{
99
void Dijkstra::computeCost(const TraversabilityNodeBase* source,
1010
std::unordered_map<const TraversabilityNodeBase*, double>& outDistances,
1111
const traversability_generator3d::TraversabilityConfig& config)
12-
{
12+
{
1313
outDistances.clear();
1414
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())
2025
{
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+
2635
const Eigen::Vector3d uPos(u->getIndex().x() * config.gridResolution,
2736
u->getIndex().y() * config.gridResolution,
2837
u->getHeight());
29-
38+
3039
// 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)
3543
continue;
36-
44+
3745
const Eigen::Vector3d vPos(v->getIndex().x() * config.gridResolution,
3846
v->getIndex().y() * config.gridResolution,
3947
v->getHeight());
4048

4149
const double distance = (vPos - uPos).norm();
4250
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])
4653
{
47-
vertexQ.erase(std::make_pair(outDistances[v], v));
4854
outDistances[v] = distance_through_u;
49-
vertexQ.insert(std::make_pair(outDistances[v], v));
55+
vertexQ.emplace(outDistances[v], v);
5056
}
5157
}
5258
}
5359
}
5460
}
61+

0 commit comments

Comments
 (0)