PathPlannerLib
Loading...
Searching...
No Matches
LocalADStar.h
1#pragma once
2
3#include "pathplanner/lib/pathfinding/Pathfinder.h"
4#include "pathplanner/lib/path/PathPoint.h"
5#include "pathplanner/lib/path/Waypoint.h"
6#include <unordered_map>
7#include <unordered_set>
8#include <vector>
9#include <atomic>
10#include <thread>
11#include <wpi/mutex.h>
12#include <frc/geometry/Translation2d.h>
13#include <optional>
14
15namespace pathplanner {
17public:
18 int x;
19 int y;
20
21 constexpr GridPosition() : x(0), y(0) {
22 }
23
24 constexpr GridPosition(const int xPos, const int yPos) : x(xPos), y(yPos) {
25 }
26
27 constexpr bool operator==(const GridPosition &other) const {
28 return x == other.x && y == other.y;
29 }
30};
31}
32
33namespace std {
34template<>
35struct hash<pathplanner::GridPosition> {
36 size_t operator()(const pathplanner::GridPosition &gridPos) const {
37 return ((hash<int>()(gridPos.x) ^ ((hash<int>()(gridPos.y) << 1) >> 1)));
38 }
39};
40}
41
42namespace pathplanner {
43class LocalADStar: public Pathfinder {
44public:
46
47 ~LocalADStar() {
48 }
49
50 inline bool isNewPathAvailable() override {
51 return newPathAvailable;
52 }
53
54 std::shared_ptr<PathPlannerPath> getCurrentPath(PathConstraints constraints,
55 GoalEndState goalEndState) override;
56
57 void setStartPosition(const frc::Translation2d &start) override;
58
59 void setGoalPosition(const frc::Translation2d &goal) override;
60
62 const std::vector<std::pair<frc::Translation2d, frc::Translation2d>> &obs,
63 const frc::Translation2d &currentRobotPos) override;
64
65 inline GridPosition getGridPos(const frc::Translation2d &pos) {
66 return GridPosition(static_cast<int>(std::floor(pos.X()() / nodeSize)),
67 static_cast<int>(std::floor(pos.Y()() / nodeSize)));
68 }
69
70private:
71 const double SMOOTHING_ANCHOR_PCT = 0.8;
72 const double EPS = 2.5;
73
74 double fieldLength;
75 double fieldWidth;
76
77 double nodeSize;
78
79 int nodesX;
80 int nodesY;
81
82 std::unordered_map<GridPosition, double> g;
83 std::unordered_map<GridPosition, double> rhs;
84 std::unordered_map<GridPosition, std::pair<double, double>> open;
85 std::unordered_map<GridPosition, std::pair<double, double>> incons;
86 std::unordered_set<GridPosition> closed;
87 std::unordered_set<GridPosition> staticObstacles;
88 std::unordered_set<GridPosition> dynamicObstacles;
89 std::unordered_set<GridPosition> requestObstacles;
90
91 GridPosition requestStart;
92 frc::Translation2d requestRealStartPos;
93 GridPosition requestGoal;
94 frc::Translation2d requestRealGoalPos;
95
96 double eps;
97
98 std::thread planningThread;
99 wpi::mutex pathMutex;
100 wpi::mutex requestMutex;
101
102 bool requestMinor;
103 bool requestMajor;
104 bool requestReset;
105 bool newPathAvailable;
106
107 std::vector<Waypoint> currentWaypoints;
108 std::vector<GridPosition> currentPathFull;
109
110 void runThread();
111
112 void doWork(const bool needsReset, const bool doMinor, const bool doMajor,
113 const GridPosition &sStart, const GridPosition &sGoal,
114 const frc::Translation2d &realStartPos,
115 const frc::Translation2d &realGoalPos,
116 const std::unordered_set<GridPosition> &obstacles);
117
118 GridPosition findClosestNonObstacle(const GridPosition &pos,
119 const std::unordered_set<GridPosition> &obstacles);
120
121 std::vector<GridPosition> extractPath(const GridPosition &sStart,
122 const GridPosition &sGoal,
123 const std::unordered_set<GridPosition> &obstacles);
124
125 std::vector<Waypoint> createWaypoints(const std::vector<GridPosition> &path,
126 const frc::Translation2d &realStartPos,
127 const frc::Translation2d &realGoalPos,
128 const std::unordered_set<GridPosition> &obstacles);
129
130 bool walkable(const GridPosition &s1, const GridPosition &s2,
131 const std::unordered_set<GridPosition> &obstacles);
132
133 void reset(const GridPosition &sStart, const GridPosition &sGoal);
134
135 void computeOrImprovePath(const GridPosition &sStart,
136 const GridPosition &sGoal,
137 const std::unordered_set<GridPosition> &obstacles);
138
139 void updateState(const GridPosition &s, const GridPosition &sStart,
140 const GridPosition &sGoal,
141 const std::unordered_set<GridPosition> &obstacles);
142
143 inline double cost(const GridPosition &sStart, const GridPosition &sGoal,
144 const std::unordered_set<GridPosition> &obstacles) {
145 if (isCollision(sStart, sGoal, obstacles)) {
146 return std::numeric_limits<double>::infinity();
147 }
148 return heuristic(sStart, sGoal);
149 }
150
151 bool isCollision(const GridPosition &sStart, const GridPosition &sEnd,
152 const std::unordered_set<GridPosition> &obstacles);
153
154 std::unordered_set<GridPosition> getOpenNeighbors(const GridPosition &s,
155 const std::unordered_set<GridPosition> &obstacles);
156
157 std::unordered_set<GridPosition> getAllNeighbors(const GridPosition &s);
158
159 std::pair<double, double> key(const GridPosition &s,
160 const GridPosition &sStart);
161
162 std::optional<std::pair<GridPosition, std::pair<double, double>>> topKey();
163
164 inline double heuristic(const GridPosition &sStart,
165 const GridPosition &sGoal) {
166 return std::hypot(sGoal.x - sStart.x, sGoal.y - sStart.y);
167 }
168
169 constexpr int comparePair(const std::pair<double, double> &a,
170 const std::pair<double, double> &b) {
171 int first = compareDouble(a.first, b.first);
172 if (first == 0) {
173 return compareDouble(a.second, b.second);
174 } else {
175 return first;
176 }
177 }
178
179 constexpr int compareDouble(const double a, const double b) {
180 if (a < b) {
181 return -1;
182 } else if (a > b) {
183 return 1;
184 }
185 return 0;
186 }
187
188 inline frc::Translation2d gridPosToTranslation2d(const GridPosition &pos) {
189 return frc::Translation2d(
190 units::meter_t { (pos.x * nodeSize) + (nodeSize / 2.0) },
191 units::meter_t { (pos.y * nodeSize) + (nodeSize / 2.0) });
192 }
193};
194}
Definition: GoalEndState.h:9
Definition: LocalADStar.h:16
Definition: LocalADStar.h:43
void setStartPosition(const frc::Translation2d &start) override
Definition: LocalADStar.cpp:196
bool isNewPathAvailable() override
Definition: LocalADStar.h:50
void setGoalPosition(const frc::Translation2d &goal) override
Definition: LocalADStar.cpp:210
void setDynamicObstacles(const std::vector< std::pair< frc::Translation2d, frc::Translation2d > > &obs, const frc::Translation2d &currentRobotPos) override
Definition: LocalADStar.cpp:262
std::shared_ptr< PathPlannerPath > getCurrentPath(PathConstraints constraints, GoalEndState goalEndState) override
Definition: LocalADStar.cpp:175
Definition: PathConstraints.h:12
Definition: Pathfinder.h:12