Roomba Controller Dashboard 1
A GUI and TCP client application that is used to control a Roomba for Computer Engineering 2880 @ Iowa State
Loading...
Searching...
No Matches
Field.hpp
Go to the documentation of this file.
1//
2// Created by caleb on 10/25/2024
3//
4
5#ifndef FIELD_H
6#define FIELD_H
7
8#include "Pillar.hpp"
9#include "vector"
10#include <cstdint>
11#include <memory>
12
13#include "Graph.hpp"
14#include "HoleManager.hpp"
15#include "Pose2D.hpp"
16
20#define MAX_X 426.72
21
25#define MAX_Y 242.57
26
31 N = 'N',
32 S = 'S',
33 E = 'E',
34 W = 'W',
35};
36
40class Field {
41 protected:
46 std::unique_ptr<std::vector<Pillar>> pillars;
47
52
58
63
68
74
83
87 int32_t desiredIndex = -1;
88
93 std::vector<Pillar> newPillars;
94
95 public:
102 Field(const std::vector<Pillar>& pillars, const Pose2D& desiredDestination, const Pillar& botPose);
103
109 Field(const std::vector<Pillar>& pillars, const Pose2D& desiredDestination);
110
114 Field();
115
123 Field(const std::unique_ptr<std::vector<Pillar>> &pillars, const Pose2D &desired_destination,
124 const Pillar &bot_pose, const Graph<Pose2D> &graph);
125
131 void addEdgeMeasurement(double rawPosition, Cardinality cardinality);
132
138
144 void applyOffsetToEdge(double x, double y);
145
149 [[nodiscard]] int32_t getDesiredIndex() const;
150
154 void clearField();
155
161
166
172 static bool outOfBounds(const Pose2D& location);
173
177 static bool lineIntersectsCircle(double cx, double cy, double r, double x1, double y1, double x2, double y2);
178
182 static bool lineIntersectsCircle(Pillar p1, const Pose2D& one, const Pose2D& two) {return lineIntersectsCircle(p1.getX(), p1.getY(), p1.getRadius() + BOT_RADIUS, one.getX(), one.getY(), two.getX(), two.getY()); }
183
187 void discretizeGraph();
188
192 void weightGraph();
193
198 std::vector<Pose2D> makePath();
199
204 void addPillar(Pillar& newPillar);
205
210 void updateBotPose(const Pose2D& updatedPosition);
211
216 std::unique_ptr<std::vector<Pillar>> getPillars();
217
222 void setPillars(std::unique_ptr<std::vector<Pillar>> pillars);
223
227 std::vector<Pillar> getCopyPillars();
228
234 bool validLocationForNode(const Pose2D& location);
235
241
245 void updateDesired(const Pose2D& other);
246
251 void setDesiredIndex(int32_t index);
252
258 static double roundRadius(double radius) {
259 const double possibleRadii[] = {5.1, 7.62, 10.16, 12.7};
260 double closest = possibleRadii[0];
261 double minDiff = std::abs(radius - possibleRadii[0]);
262
263 for (double r : possibleRadii) {
264 double diff = std::abs(radius - r);
265 if (diff < minDiff) {
266 minDiff = diff;
267 closest = r;
268 }
269 }
270 return closest;
271 }
272
273 };
274
275#endif //FIELD_H
Cardinality
Definition Field.hpp:30
@ N
Definition Field.hpp:31
@ E
Definition Field.hpp:33
@ W
Definition Field.hpp:34
@ S
Definition Field.hpp:32
#define BOT_RADIUS
Definition Pose2D.hpp:17
std::unique_ptr< std::vector< Pillar > > pillars
Definition Field.hpp:46
int32_t getDesiredIndex() const
Definition Field.cpp:257
void updateBotPose(const Pose2D &updatedPosition)
Definition Field.cpp:179
static bool lineIntersectsCircle(Pillar p1, const Pose2D &one, const Pose2D &two)
Definition Field.hpp:182
int32_t desiredIndex
Definition Field.hpp:87
std::vector< Pillar > getCopyPillars()
Definition Field.cpp:191
std::unique_ptr< std::vector< Pillar > > getPillars()
Definition Field.cpp:142
Field()
Definition Field.cpp:24
void discretizeGraph()
Definition Field.cpp:32
bool validLocationForNode(const Pose2D &location)
Definition Field.cpp:118
std::vector< Pillar > newPillars
Definition Field.hpp:93
Pillar getBotPose()
Definition Field.cpp:155
Pose2D runningError
Definition Field.hpp:73
Field(const std::unique_ptr< std::vector< Pillar > > &pillars, const Pose2D &desired_destination, const Pillar &bot_pose, const Graph< Pose2D > &graph)
Pose2D getDesiredDestination()
Definition Field.cpp:274
static bool lineIntersectsCircle(double cx, double cy, double r, double x1, double y1, double x2, double y2)
Definition Field.cpp:236
void clearField()
Definition Field.cpp:138
HoleManager & getManager()
Definition Field.cpp:134
void addPillar(Pillar &newPillar)
Definition Field.cpp:159
void setPillars(std::unique_ptr< std::vector< Pillar > > pillars)
Definition Field.cpp:151
void updateDesired(const Pose2D &other)
Definition Field.cpp:265
Pillar botPose
Definition Field.hpp:67
std::vector< Pose2D > makePath()
Definition Field.cpp:109
void weightGraph()
Definition Field.cpp:75
Graph< Pose2D > graph
Definition Field.hpp:82
void addEdgeMeasurement(double rawPosition, Cardinality cardinality)
Definition Field.cpp:203
HoleManager holeManager
Definition Field.hpp:51
void setDesiredIndex(int32_t index)
Definition Field.cpp:146
static bool outOfBounds(const Pose2D &location)
Definition Field.cpp:199
static double roundRadius(double radius)
Definition Field.hpp:258
Pose2D offset
Definition Field.hpp:57
Graph< Pose2D > & getGraph()
Definition Field.cpp:261
void applyOffsetToEdge(double x, double y)
Definition Field.cpp:228
Pose2D desiredDestination
Definition Field.hpp:62
double getRadius() const
Definition Pillar.cpp:41
double getY()
Definition Pillar.cpp:37
double getX()
Definition Pillar.cpp:33
double getY() const
Definition Pose2D.cpp:151
double getX() const
Definition Pose2D.cpp:147