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>
12#include <frc/geometry/Translation2d.h>
15namespace pathplanner {
24 constexpr GridPosition(
const int xPos,
const int yPos) : x(xPos), y(yPos) {
27 constexpr bool operator==(
const GridPosition &other)
const {
28 return x == other.x && y == other.y;
35struct hash<pathplanner::GridPosition> {
37 return ((hash<int>()(gridPos.x) ^ ((hash<int>()(gridPos.y) << 1) >> 1)));
42namespace pathplanner {
51 return newPathAvailable;
62 const std::vector<std::pair<frc::Translation2d, frc::Translation2d>> &obs,
63 const frc::Translation2d ¤tRobotPos)
override;
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)));
71 const double SMOOTHING_ANCHOR_PCT = 0.8;
72 const double EPS = 2.5;
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;
91 GridPosition requestStart;
92 frc::Translation2d requestRealStartPos;
93 GridPosition requestGoal;
94 frc::Translation2d requestRealGoalPos;
98 std::thread planningThread;
100 wpi::mutex requestMutex;
105 bool newPathAvailable;
107 std::vector<Waypoint> currentWaypoints;
108 std::vector<GridPosition> currentPathFull;
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);
118 GridPosition findClosestNonObstacle(
const GridPosition &pos,
119 const std::unordered_set<GridPosition> &obstacles);
121 std::vector<GridPosition> extractPath(
const GridPosition &sStart,
122 const GridPosition &sGoal,
123 const std::unordered_set<GridPosition> &obstacles);
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);
130 bool walkable(
const GridPosition &s1,
const GridPosition &s2,
131 const std::unordered_set<GridPosition> &obstacles);
133 void reset(
const GridPosition &sStart,
const GridPosition &sGoal);
135 void computeOrImprovePath(
const GridPosition &sStart,
136 const GridPosition &sGoal,
137 const std::unordered_set<GridPosition> &obstacles);
139 void updateState(
const GridPosition &s,
const GridPosition &sStart,
140 const GridPosition &sGoal,
141 const std::unordered_set<GridPosition> &obstacles);
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();
148 return heuristic(sStart, sGoal);
151 bool isCollision(
const GridPosition &sStart,
const GridPosition &sEnd,
152 const std::unordered_set<GridPosition> &obstacles);
154 std::unordered_set<GridPosition> getOpenNeighbors(
const GridPosition &s,
155 const std::unordered_set<GridPosition> &obstacles);
157 std::unordered_set<GridPosition> getAllNeighbors(
const GridPosition &s);
159 std::pair<double, double> key(
const GridPosition &s,
160 const GridPosition &sStart);
162 std::optional<std::pair<GridPosition, std::pair<double, double>>> topKey();
164 inline double heuristic(
const GridPosition &sStart,
165 const GridPosition &sGoal) {
166 return std::hypot(sGoal.x - sStart.x, sGoal.y - sStart.y);
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);
173 return compareDouble(a.second, b.second);
179 constexpr int compareDouble(
const double a,
const double b) {
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) });
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 ¤tRobotPos) 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