#ifndef LIDAR_LOCALIZATION_H #define LIDAR_LOCALIZATION_H #define NODES_LEN 8192 #define MAX_TABLE_X 1500 //Attention : mode demi table #define MAX_TABLE_Y 2000 #define BEACON_DETECT_RANGE 100 #define PROXIMITY_ALERT_RANGE 400 #define BORDER_DETECT_TRIGGER 50 #define AGGLOMERATES_TRIGGER 250 #define BEACONS_RADIUS 50 #define TRIANGULATION_ROUNDS 3 #define POSITION_CORRECT_RANGE 25 #define YELLOW_TEAM_BEACONS_POS {make_pair(1594,72), make_pair(1594,1928), make_pair(-94,1000)} //Attention : mode demi table #define BLUE_TEAM_BEACONS_POS {make_pair(-94,72), make_pair(-94,1928), make_pair(1594,1000)} //Attention : mode demi table #define LIDAR_LOG_DEBUG_MODE #include #include #include #include #include #include #include #ifdef LIDAR_LOG_DEBUG_MODE #include #endif using namespace std; using namespace TCPSocket; class Localization : public TCPClient{ private: int x_robot; int y_robot; int alpha_robot; pair enemyPosition = make_pair(-1, -1); int enemyPositionGap = -1; pair beaconsPositions[3]; bool lidarHealth = false; bool started = false; bool beaconsMode = true; bool proximityLastRound = false; bool positionIncorrectLastRound = false; bool triangulationMode = false; public: Localization(int x_robot, int y_robot, int alpha_robot, const char* ip = "127.0.0.1", int port = 8080) : TCPClient(ip, port) { this->x_robot = x_robot; this->y_robot = y_robot; this->alpha_robot = alpha_robot; }; void setLidarHealth(bool ok); void setRobotPosition(int x, int y, int alpha); void setBeaconsMode(bool state); void setBeaconsPosition(pair positions[3]); [[nodiscard]] bool getLidarHealth() const; [[nodiscard]] bool getBeaconsMode() const; [[nodiscard]] vector getAvoidance() const; [[nodiscard]] bool isStarted() const; [[nodiscard]] bool isTriangulating() const; static pair robotToCartesian(sl_lidar_response_measurement_node_hq_t node, int x_robot, int y_robot, int alpha_robot); static int distanceBetween(pair pos1, pair pos2); static bool isInsideMap(pair position); static pair getAveragePosition(const list> &positions); static int getMaxGap(const list>& positionList, pair referencePosition); static vector>> getAgglomerates(list> &positionsList); static int rplidarToTrigoRadians(double rplidarDegrees); static pair lineEquationFromPoints(pair p1, pair p2); static vector> intersectionBetweenCircles(pair c1, double r1, pair c2, double r2); static pair intersectionBetweenLines(pair l1, pair l2); list> getMostProbableAgglomerate(vector>> &agglomerated_points); vector determineRobotPosition(vector> beaconsDistanceAndAngleRelative, vector beaconsDetected); vector> extractBeaconsMeasuredPoints(sl_lidar_response_measurement_node_hq_t nodes[NODES_LEN], size_t count); int getBeaconNumber(pair position); void processPoints(sl_lidar_response_measurement_node_hq_t[NODES_LEN], size_t count); void processTriangulation(const vector>& overallNearestBeaconDetectedPointRelative); void handleMessage(const string &message) override; void sendMessage(const string &recipient, const string &verb, const string &data); void sendProximityAlert(int distance, int theta); }; #endif //LIDAR_LOCALIZATION_H