diff --git a/.vscode/settings.json b/.vscode/settings.json index ff50aa4..1d9f24e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,8 @@ "strategie.h": "c", "trajectoire.h": "c", "trajet.h": "c", - "asser_position.h": "c" + "asser_position.h": "c", + "strategie_prise_cerises.h": "c", + "geometrie.h": "c" } } \ No newline at end of file diff --git a/Balise_VL53L1X.c b/Balise_VL53L1X.c index fd6a5a1..d7ed7bc 100644 --- a/Balise_VL53L1X.c +++ b/Balise_VL53L1X.c @@ -1,23 +1,29 @@ #include +#include "Geometrie_robot.h" #include "i2c_annexe.h" #include "Localisation.h" #include "math.h" #define NB_CAPTEURS 12 -#define DISTANCE_OBSTACLE_IGNORE 200 +#define DISTANCE_OBSTACLE_IGNORE_MM 2000 #define DISTANCE_CAPTEUR_CENTRE_ROBOT_CM 4 +#define DISTANCE_TROP_PRES_CM 3 +#define DEMI_CONE_CAPTEUR_RADIAN 0.2225 uint8_t distance_capteur_cm[NB_CAPTEURS]; struct capteur_VL53L1X_t{ - uint8_t distance_cm; - double angle_ref_robot; - double angle_ref_terrain; + uint8_t distance_lue_cm; // Distance entre le capteur et l'obstacle. + uint8_t distance_obstacle_robot_mm; // Distance entre l'obstacle et le centre du robot. + double angle_ref_robot; // Orientation du capteur dans le référentiel du robot + double angle_ref_terrain; // Orientation du capteur dans le référentiel du terrain + double angle_ref_terrain_min; // Cone de détection du capteur (min) + double angle_ref_terrain_max; // Cone de détection du capteur (max) uint donnee_valide; }capteurs_VL53L1X[NB_CAPTEURS]; void actualise_VL53L1X(struct capteur_VL53L1X_t * capteur_VL53L1X, uint8_t distance_capteur_cm); -void invalide_obstacle(struct capteur_VL53L1X_t *capteur_VL53L1X, struct position_t position_robot); +void invalide_obstacle(struct capteur_VL53L1X_t * capteur_VL53L1X, struct position_t position_robot); void Balise_VL53L1X_gestion(){ i2c_annexe_get_distances(distance_capteur_cm); @@ -32,13 +38,16 @@ void actualise_VL53L1X(struct capteur_VL53L1X_t * capteur_VL53L1X, uint8_t dista // Actualisation de l'angle du capteur capteur_VL53L1X->angle_ref_terrain = capteur_VL53L1X->angle_ref_robot + position_robot.angle_radian; // Maintien de l'angle entre -PI et PI - while(capteur_VL53L1X->angle_ref_terrain > 2* M_PI){ + while(capteur_VL53L1X->angle_ref_terrain > M_PI){ capteur_VL53L1X->angle_ref_terrain -= 2* M_PI; } while(capteur_VL53L1X->angle_ref_terrain < 2* -M_PI){ capteur_VL53L1X->angle_ref_terrain += 2* M_PI; } - capteur_VL53L1X->distance_cm = distance_capteur_cm + DISTANCE_CAPTEUR_CENTRE_ROBOT_CM; + + capteur_VL53L1X->distance_obstacle_robot_mm = 10 * (distance_capteur_cm + DISTANCE_CAPTEUR_CENTRE_ROBOT_CM); + capteur_VL53L1X->angle_ref_terrain_min = capteur_VL53L1X->angle_ref_terrain - DEMI_CONE_CAPTEUR_RADIAN; + capteur_VL53L1X->angle_ref_terrain_max = capteur_VL53L1X->angle_ref_terrain + DEMI_CONE_CAPTEUR_RADIAN; invalide_obstacle(capteur_VL53L1X, position_robot); @@ -50,12 +59,12 @@ void invalide_obstacle(struct capteur_VL53L1X_t *capteur_VL53L1X, struct positio // Positionne l'obstacle sur le terrain struct position_t position_obstacle; //printf("Angle:%.1f\n",capteur_VL53L1X->angle_ref_terrain); - position_obstacle.x_mm = position_robot.x_mm + cos(capteur_VL53L1X->angle_ref_terrain)* (double)(capteur_VL53L1X->distance_cm * 10); - position_obstacle.y_mm = position_robot.y_mm + sin(capteur_VL53L1X->angle_ref_terrain)* (double)(capteur_VL53L1X->distance_cm * 10); + position_obstacle.x_mm = position_robot.x_mm + cos(capteur_VL53L1X->angle_ref_terrain)* (double)(capteur_VL53L1X->distance_obstacle_robot_mm); + position_obstacle.y_mm = position_robot.y_mm + sin(capteur_VL53L1X->angle_ref_terrain)* (double)(capteur_VL53L1X->distance_obstacle_robot_mm * 10); capteur_VL53L1X->donnee_valide=1; // Si la distance vaut 0, à invalider - if(capteur_VL53L1X->distance_cm <= DISTANCE_CAPTEUR_CENTRE_ROBOT_CM){ + if(capteur_VL53L1X->distance_lue_cm <= DISTANCE_TROP_PRES_CM){ capteur_VL53L1X->donnee_valide=0; } // Si l'obstacle est à l'extérieur du terrain (on prend 50 mm de marge à l'intérieur du terrain, la balise faisant 100 mm) @@ -83,17 +92,67 @@ void Balise_VL53L1X_init(){ } uint8_t Balise_VL53L1X_get_min_distance(void){ - uint8_t min_distance = DISTANCE_OBSTACLE_IGNORE; + uint8_t min_distance_cm = DISTANCE_OBSTACLE_IGNORE_MM / 10; for(uint8_t capteur=0; capteur capteurs_VL53L1X[capteur].distance_cm){ - min_distance = capteurs_VL53L1X[capteur].distance_cm; + if(min_distance_cm> capteurs_VL53L1X[capteur].distance_lue_cm){ + min_distance_cm = capteurs_VL53L1X[capteur].distance_lue_cm; } } } - return min_distance; + return min_distance_cm; } uint8_t Balise_VL53L1X_get_capteur_cm(uint8_t capteur){ - return capteurs_VL53L1X[capteur].distance_cm; + return capteurs_VL53L1X[capteur].distance_lue_cm; +} + +/// @brief Renvoi l'obstacle le plus proche en tenant compte de la direction d'avancement du robot dans le référentiel du terrain. +/// La fonction utilise 3 cônes de détection : +/// * +/- 22°, à 800 mm +/// * +/- 50°, à 580 mm +/// * +/- 90°, à 350 mm +/// @param angle_avancement_radiant : angle d'avancement du robot entre -PI et PI +/// @return +double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant){ + const uint8_t NB_CONE=3; + struct cone_t{ + double distance_mm; + double angle; + } cone[NB_CONE]; + cone[0].angle = 22 * DEGRE_EN_RADIAN; + cone[0].distance_mm = 800; + + cone[1].angle = 50 * DEGRE_EN_RADIAN; + cone[1].distance_mm = 580; + + cone[2].angle = 90 * DEGRE_EN_RADIAN; + cone[2].distance_mm = 350; + + double angle_min, angle_max; + double distance_minimale = DISTANCE_OBSTACLE_IGNORE_MM; + + for(uint8_t capteur=0; capteur= 0.99 ){ + /*if(abscisse >= 0.99 ){ return 1; - } - /* + }*/ + if(trajet_trajectoire.type != TRAJECTOIRE_BEZIER){ if(abscisse >= 1 ){ return 1; @@ -98,7 +98,7 @@ int Trajet_terminee(double abscisse){ if(abscisse >= 0.99 ){ return 1; } - }*/ + } return 0; }