Re-modification de Trajet_terminee, recalage X lorsqu'on attrappe les cerise, Gestion de l'évitement : fonction geométriques + logique à base de cônes de détection
This commit is contained in:
		
							parent
							
								
									f5994a7f52
								
							
						
					
					
						commit
						4e898151f5
					
				
							
								
								
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -6,6 +6,8 @@ | |||||||
|         "strategie.h": "c", |         "strategie.h": "c", | ||||||
|         "trajectoire.h": "c", |         "trajectoire.h": "c", | ||||||
|         "trajet.h": "c", |         "trajet.h": "c", | ||||||
|         "asser_position.h": "c" |         "asser_position.h": "c", | ||||||
|  |         "strategie_prise_cerises.h": "c", | ||||||
|  |         "geometrie.h": "c" | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -1,23 +1,29 @@ | |||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include "Geometrie_robot.h" | ||||||
| #include "i2c_annexe.h" | #include "i2c_annexe.h" | ||||||
| #include "Localisation.h" | #include "Localisation.h" | ||||||
| #include "math.h" | #include "math.h" | ||||||
| 
 | 
 | ||||||
| #define NB_CAPTEURS 12 | #define NB_CAPTEURS 12 | ||||||
| #define DISTANCE_OBSTACLE_IGNORE 200 | #define DISTANCE_OBSTACLE_IGNORE_MM 2000 | ||||||
| #define DISTANCE_CAPTEUR_CENTRE_ROBOT_CM 4 | #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]; | uint8_t distance_capteur_cm[NB_CAPTEURS]; | ||||||
| 
 | 
 | ||||||
| struct capteur_VL53L1X_t{ | struct capteur_VL53L1X_t{ | ||||||
|     uint8_t distance_cm; |     uint8_t distance_lue_cm; // Distance entre le capteur et l'obstacle.
 | ||||||
|     double angle_ref_robot; |     uint8_t distance_obstacle_robot_mm; // Distance entre l'obstacle et le centre du robot.
 | ||||||
|     double angle_ref_terrain; |     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; |     uint donnee_valide; | ||||||
| }capteurs_VL53L1X[NB_CAPTEURS]; | }capteurs_VL53L1X[NB_CAPTEURS]; | ||||||
| 
 | 
 | ||||||
| void actualise_VL53L1X(struct capteur_VL53L1X_t * capteur_VL53L1X, uint8_t distance_capteur_cm); | 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(){ | void Balise_VL53L1X_gestion(){ | ||||||
|     i2c_annexe_get_distances(distance_capteur_cm); |     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
 |     // Actualisation de l'angle du capteur
 | ||||||
|     capteur_VL53L1X->angle_ref_terrain = capteur_VL53L1X->angle_ref_robot + position_robot.angle_radian; |     capteur_VL53L1X->angle_ref_terrain = capteur_VL53L1X->angle_ref_robot + position_robot.angle_radian; | ||||||
|     // Maintien de l'angle entre -PI et PI
 |     // 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; |         capteur_VL53L1X->angle_ref_terrain -= 2* M_PI; | ||||||
|     } |     } | ||||||
|     while(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->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); |     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
 |     // Positionne l'obstacle sur le terrain
 | ||||||
|     struct position_t position_obstacle; |     struct position_t position_obstacle; | ||||||
|     //printf("Angle:%.1f\n",capteur_VL53L1X->angle_ref_terrain);
 |     //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.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_cm * 10); |     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; |     capteur_VL53L1X->donnee_valide=1; | ||||||
|     // Si la distance vaut 0, à invalider
 |     // 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; |         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)
 |     // 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 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<NB_CAPTEURS; capteur++){ |     for(uint8_t capteur=0; capteur<NB_CAPTEURS; capteur++){ | ||||||
|         if(capteurs_VL53L1X[capteur].donnee_valide){ |         if(capteurs_VL53L1X[capteur].donnee_valide){ | ||||||
|             if(min_distance> capteurs_VL53L1X[capteur].distance_cm){ |             if(min_distance_cm> capteurs_VL53L1X[capteur].distance_lue_cm){ | ||||||
|                 min_distance = capteurs_VL53L1X[capteur].distance_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){ | 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<NB_CAPTEURS; capteur++){ | ||||||
|  |         for(uint8_t cone_index=0; cone_index<NB_CONE; cone_index++){ | ||||||
|  |             if(Geometrie_intersecte_plage_angle( | ||||||
|  |                     angle_avancement_radiant - cone[cone_index].angle, angle_avancement_radiant + cone[cone_index].angle, | ||||||
|  |                     capteurs_VL53L1X[capteur].angle_ref_terrain_min, capteurs_VL53L1X[capteur].angle_ref_terrain_max)){ | ||||||
|  |                 if(capteurs_VL53L1X[capteur].donnee_valide){ | ||||||
|  |                     if(capteurs_VL53L1X[capteur].distance_obstacle_robot_mm < distance_minimale){ | ||||||
|  |                         distance_minimale = capteurs_VL53L1X[capteur].distance_obstacle_robot_mm; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // On enlève le rayon du robot et la taille du robot adverse
 | ||||||
|  |     if(distance_minimale  < DISTANCE_OBSTACLE_IGNORE_MM){ | ||||||
|  |         distance_minimale -= (RAYON_ROBOT + RAYON_ROBOT_ADVERSE_MM); | ||||||
|  |         if(distance_minimale < 0){ | ||||||
|  |             distance_minimale = 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return distance_minimale; | ||||||
| } | } | ||||||
| @ -15,6 +15,7 @@ Asser_Position.c | |||||||
| Balise_VL53L1X.c | Balise_VL53L1X.c | ||||||
| Commande_vitesse.c | Commande_vitesse.c | ||||||
| QEI.c | QEI.c | ||||||
|  | Geometrie.c | ||||||
| gyro.c | gyro.c | ||||||
| gyro_L3GD20H.c | gyro_L3GD20H.c | ||||||
| gyro_ADXRS453.c | gyro_ADXRS453.c | ||||||
|  | |||||||
							
								
								
									
										19
									
								
								Geometrie.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								Geometrie.c
									
									
									
									
									
								
							| @ -38,3 +38,22 @@ unsigned int Geometrie_compare_angle(double angle, double angle_min, double angl | |||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /// @brief Indique si les deux plages d'angle se recoupent
 | ||||||
|  | /// @param angle1_min Début de la première plage
 | ||||||
|  | /// @param angle1_max Fin de la première plage
 | ||||||
|  | /// @param angle2_min Début de la seconde plage
 | ||||||
|  | /// @param angle2_max Fin de la seconde plage
 | ||||||
|  | /// @return 1 si les deux plages s'intersectent, 0 sinon
 | ||||||
|  | unsigned int Geometrie_intersecte_plage_angle(double angle1_min, double angle1_max, double angle2_min, double angle2_max){ | ||||||
|  |     // Pour que les plages s'intersectent, soit :
 | ||||||
|  |     // * angle1_min est compris entre angle2_min et angle2_max
 | ||||||
|  |     // * angle1_max est compris entre angle2_min et angle2_max
 | ||||||
|  |     // * angle2_min et angle2_max sont compris entre angle1_min et angle1_max (tester angle2_min ou angle2_max est suffisant)
 | ||||||
|  |     if(Geometrie_compare_angle(angle1_min, angle2_min, angle2_max) || | ||||||
|  |         Geometrie_compare_angle(angle1_max, angle2_min, angle2_max) || | ||||||
|  |         Geometrie_compare_angle(angle2_min, angle1_min, angle1_max)){ | ||||||
|  |             return 1; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @ -14,5 +14,6 @@ struct position_t{ | |||||||
| 
 | 
 | ||||||
| double Geometrie_get_angle_normalisee(double angle); | double Geometrie_get_angle_normalisee(double angle); | ||||||
| unsigned int Geometrie_compare_angle(double angle, double angle_min, double angle_max); | unsigned int Geometrie_compare_angle(double angle, double angle_min, double angle_max); | ||||||
|  | unsigned int Geometrie_intersecte_plage_angle(double angle1_min, double angle1_max, double angle2_min, double angle2_max); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -6,3 +6,6 @@ | |||||||
| // Distance entre le centre du robot et un bord du robot
 | // Distance entre le centre du robot et un bord du robot
 | ||||||
| #define PETIT_RAYON_ROBOT_MM 108.2 | #define PETIT_RAYON_ROBOT_MM 108.2 | ||||||
| #define RACINE_DE_3 1.73205081 | #define RACINE_DE_3 1.73205081 | ||||||
|  | 
 | ||||||
|  | // Géométrie liée à l'adversaire
 | ||||||
|  | #define RAYON_ROBOT_ADVERSE_MM 240 | ||||||
|  | |||||||
| @ -75,8 +75,9 @@ int main() { | |||||||
|     AsserMoteur_Init(); |     AsserMoteur_Init(); | ||||||
|     Localisation_init(); |     Localisation_init(); | ||||||
| 
 | 
 | ||||||
|     //while(mode_test());
 |     while(mode_test()); | ||||||
|     test_homologation(); |     //test_panier();
 | ||||||
|  |     //test_homologation();
 | ||||||
| 
 | 
 | ||||||
|     Gyro_Init(); |     Gyro_Init(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										35
									
								
								Strategie.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								Strategie.c
									
									
									
									
									
								
							| @ -12,7 +12,7 @@ | |||||||
| #include "math.h" | #include "math.h" | ||||||
| 
 | 
 | ||||||
| #define SEUIL_RECAL_DIST_MM 75 | #define SEUIL_RECAL_DIST_MM 75 | ||||||
| #define SEUIL_RECAL_ANGLE_RADIAN (5 * DEGREE_EN_RADIAN) | #define SEUIL_RECAL_ANGLE_RADIAN (5 * DEGRE_EN_RADIAN) | ||||||
| #define DISTANCE_OBSTACLE_CM 50 | #define DISTANCE_OBSTACLE_CM 50 | ||||||
| #define DISTANCE_PAS_OBSTACLE_MM 2000 | #define DISTANCE_PAS_OBSTACLE_MM 2000 | ||||||
| 
 | 
 | ||||||
| @ -31,7 +31,7 @@ void Homologation(uint32_t step_ms){ | |||||||
| 
 | 
 | ||||||
|     switch(etat_strategie){ |     switch(etat_strategie){ | ||||||
|         case STRATEGIE_INIT: |         case STRATEGIE_INIT: | ||||||
|             Localisation_set(775., 109., -60. * DEGREE_EN_RADIAN); |             Localisation_set(775., 109., (-60.+CORR_ANGLE_DEPART_DEGREE) * DEGRE_EN_RADIAN); | ||||||
|             etat_strategie = ATTENTE_TIRETTE; |             etat_strategie = ATTENTE_TIRETTE; | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
| @ -43,14 +43,14 @@ void Homologation(uint32_t step_ms){ | |||||||
| 
 | 
 | ||||||
|         case APPROCHE_CERISE_1_A: |         case APPROCHE_CERISE_1_A: | ||||||
|             Trajet_config(250, 500); |             Trajet_config(250, 500); | ||||||
|             Trajectoire_droite(&trajectoire,775, 109, 857, 156, -60. * DEGREE_EN_RADIAN, 30. * DEGREE_EN_RADIAN); |             Trajectoire_droite(&trajectoire,775, 109, 857, 156, -60. * DEGRE_EN_RADIAN, 30. * DEGRE_EN_RADIAN); | ||||||
|             if(parcourt_trajet_simple_sans_evitement(trajectoire, step_ms) == TRAJET_TERMINE){ |             if(parcourt_trajet_simple_sans_evitement(trajectoire, step_ms) == TRAJET_TERMINE){ | ||||||
|                 etat_strategie = ATTRAPE_CERISE_1; |                 etat_strategie = ATTRAPE_CERISE_1; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|          |          | ||||||
|         case ATTRAPE_CERISE_1: |         case ATTRAPE_CERISE_1: | ||||||
|             etat_action = cerise_attraper_bordure(LONGER_VERS_C, step_ms); |             etat_action = cerise_attraper_bordure(LONGER_VERS_C, step_ms, 1000-15-PETIT_RAYON_ROBOT_MM); | ||||||
|             if(etat_action == ACTION_TERMINEE){ |             if(etat_action == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = APPROCHE_PANIER_1; |                 etat_strategie = APPROCHE_PANIER_1; | ||||||
|             } |             } | ||||||
| @ -62,7 +62,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|                                 485, Localisation_get().y_mm, |                                 485, Localisation_get().y_mm, | ||||||
|                                 465, 857, |                                 465, 857, | ||||||
|                                 465,2830, |                                 465,2830, | ||||||
|                                 +30. * DEGREE_EN_RADIAN, +120. * DEGREE_EN_RADIAN); |                                 +30. * DEGRE_EN_RADIAN, +120. * DEGRE_EN_RADIAN); | ||||||
| 
 | 
 | ||||||
|             if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){ |             if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = CALAGE_PANIER_1; |                 etat_strategie = CALAGE_PANIER_1; | ||||||
| @ -72,7 +72,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|         case APPROCHE_PANIER_2: |         case APPROCHE_PANIER_2: | ||||||
|             Trajectoire_droite(&trajectoire,Localisation_get().x_mm, Localisation_get().y_mm,  |             Trajectoire_droite(&trajectoire,Localisation_get().x_mm, Localisation_get().y_mm,  | ||||||
|                                 265,2830, |                                 265,2830, | ||||||
|                                 +120. * DEGREE_EN_RADIAN, +120. * DEGREE_EN_RADIAN); |                                 +120. * DEGRE_EN_RADIAN, +120. * DEGRE_EN_RADIAN); | ||||||
| 
 | 
 | ||||||
|             if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){ |             if(parcourt_trajet_simple(trajectoire, step_ms) == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = CALAGE_PANIER_1; |                 etat_strategie = CALAGE_PANIER_1; | ||||||
| @ -81,7 +81,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case CALAGE_PANIER_1: |         case CALAGE_PANIER_1: | ||||||
|             if(calage_angle(LONGER_VERS_A, RAYON_ROBOT, 3000 - (RAYON_ROBOT/(RACINE_DE_3/2.)), 120. *DEGREE_EN_RADIAN) == ACTION_TERMINEE){ |             if(calage_angle(LONGER_VERS_A, RAYON_ROBOT, 3000 - (RAYON_ROBOT/(RACINE_DE_3/2.)), 120. *DEGRE_EN_RADIAN) == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = RECULE_PANIER; |                 etat_strategie = RECULE_PANIER; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
| @ -90,7 +90,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|             Trajet_config(250, 500); |             Trajet_config(250, 500); | ||||||
|             Trajectoire_droite(&trajectoire,Localisation_get().x_mm, Localisation_get().y_mm,  |             Trajectoire_droite(&trajectoire,Localisation_get().x_mm, Localisation_get().y_mm,  | ||||||
|                                 180, 3000 - (RAYON_ROBOT/(RACINE_DE_3/2)) - 80, |                                 180, 3000 - (RAYON_ROBOT/(RACINE_DE_3/2)) - 80, | ||||||
|                                 120. * DEGREE_EN_RADIAN, +270. * DEGREE_EN_RADIAN); |                                 120. * DEGRE_EN_RADIAN, +270. * DEGRE_EN_RADIAN); | ||||||
| 
 | 
 | ||||||
|             if(parcourt_trajet_simple_sans_evitement(trajectoire, step_ms) == ACTION_TERMINEE){ |             if(parcourt_trajet_simple_sans_evitement(trajectoire, step_ms) == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = LANCE_DANS_PANIER; |                 etat_strategie = LANCE_DANS_PANIER; | ||||||
| @ -100,7 +100,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|         case LANCE_DANS_PANIER: |         case LANCE_DANS_PANIER: | ||||||
|             Asser_Position_maintien(); |             Asser_Position_maintien(); | ||||||
|             if(lance_balles(step_ms) == ACTION_TERMINEE){ |             if(lance_balles(step_ms) == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = APPROCHE_CERISE_2; |                 etat_strategie = STRATEGIE_FIN; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
| @ -108,7 +108,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|             Trajet_config(250, 500); |             Trajet_config(250, 500); | ||||||
|             Trajectoire_droite(&trajectoire,Localisation_get().x_mm, Localisation_get().y_mm,  |             Trajectoire_droite(&trajectoire,Localisation_get().x_mm, Localisation_get().y_mm,  | ||||||
|                                 830, 3000 - 156, |                                 830, 3000 - 156, | ||||||
|                                 Localisation_get().angle_radian, 30. * DEGREE_EN_RADIAN); |                                 Localisation_get().angle_radian, 30. * DEGRE_EN_RADIAN); | ||||||
| 
 | 
 | ||||||
|             if(parcourt_trajet_simple_sans_evitement(trajectoire, step_ms) == ACTION_TERMINEE){ |             if(parcourt_trajet_simple_sans_evitement(trajectoire, step_ms) == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = STRATEGIE_FIN; |                 etat_strategie = STRATEGIE_FIN; | ||||||
| @ -116,7 +116,7 @@ void Homologation(uint32_t step_ms){ | |||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case ATTRAPPE_CERISE_2: |         case ATTRAPPE_CERISE_2: | ||||||
|             etat_action = cerise_attraper_bordure(LONGER_VERS_A, step_ms); |             etat_action = cerise_attraper_bordure(LONGER_VERS_A, step_ms, 1000-15-PETIT_RAYON_ROBOT_MM); | ||||||
|             if(etat_action == ACTION_TERMINEE){ |             if(etat_action == ACTION_TERMINEE){ | ||||||
|                 etat_strategie = APPROCHE_PANIER_2; |                 etat_strategie = APPROCHE_PANIER_2; | ||||||
|             } |             } | ||||||
| @ -266,3 +266,16 @@ enum couleur_t lire_couleur(void){ | |||||||
|     return COULEUR_BLEU; |     return COULEUR_BLEU; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /// @brief Décremente la temps de step_ms, renvoie 1 si la temporisation est écoulée
 | ||||||
|  | /// @param tempo_ms 
 | ||||||
|  | /// @param step_ms 
 | ||||||
|  | /// @return 1 si la temporisation est écoulée, 0 sinon.
 | ||||||
|  | int temporisation_terminee(uint32_t * tempo_ms, uint32_t step_ms){ | ||||||
|  |     if(*tempo_ms < step_ms){ | ||||||
|  |         return 1; | ||||||
|  |     }else{ | ||||||
|  |         *tempo_ms -= step_ms; | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -6,7 +6,7 @@ | |||||||
| 
 | 
 | ||||||
| #define COULEUR 15 | #define COULEUR 15 | ||||||
| #define TIRETTE 14 | #define TIRETTE 14 | ||||||
| #define DEGREE_EN_RADIAN  (M_PI / 180.) | #define CORR_ANGLE_DEPART_DEGREE  (-1.145) | ||||||
| 
 | 
 | ||||||
| enum etat_action_t{ | enum etat_action_t{ | ||||||
|     ACTION_EN_COURS, |     ACTION_EN_COURS, | ||||||
| @ -50,6 +50,10 @@ enum etat_action_t depose_cerises(uint32_t step_ms); | |||||||
| void Homologation(uint32_t step_ms); | void Homologation(uint32_t step_ms); | ||||||
| enum couleur_t lire_couleur(void); | enum couleur_t lire_couleur(void); | ||||||
| uint attente_tirette(void); | uint attente_tirette(void); | ||||||
|  | enum etat_action_t lance_balles(uint32_t step_ms); | ||||||
|  | int test_panier(void); | ||||||
|  | 
 | ||||||
|  | int temporisation_terminee(uint32_t * tempo_ms, uint32_t step_ms); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,7 +31,7 @@ double vitesse_accostage_mm_s=100; | |||||||
| /// Le robot accoste, longe le support cerise vers la bordure, active la turbine, puis longe le support cerise jusqu'à son bout.
 | /// Le robot accoste, longe le support cerise vers la bordure, active la turbine, puis longe le support cerise jusqu'à son bout.
 | ||||||
| /// @param longer_direction : direction dans laquelle se trouve la bordure
 | /// @param longer_direction : direction dans laquelle se trouve la bordure
 | ||||||
| /// @return ACTION_EN_COURS ou ACTION_TERMINEE
 | /// @return ACTION_EN_COURS ou ACTION_TERMINEE
 | ||||||
| enum etat_action_t cerise_attraper_bordure(enum longer_direction_t longer_direction, uint32_t step_ms){ | enum etat_action_t cerise_attraper_bordure(enum longer_direction_t longer_direction, uint32_t step_ms, double pos_recalage_x_mm){ | ||||||
|     enum etat_action_t etat_action = ACTION_EN_COURS; |     enum etat_action_t etat_action = ACTION_EN_COURS; | ||||||
|     enum longer_direction_t longer_direction_aspire; |     enum longer_direction_t longer_direction_aspire; | ||||||
|     static uint32_t tempo_ms = 0; |     static uint32_t tempo_ms = 0; | ||||||
| @ -54,6 +54,7 @@ enum etat_action_t cerise_attraper_bordure(enum longer_direction_t longer_direct | |||||||
|             avance_puis_longe_bordure(longer_direction); |             avance_puis_longe_bordure(longer_direction); | ||||||
|             if( (longer_direction == LONGER_VERS_A) && (i2c_annexe_get_contacteur_butee_A() == CONTACTEUR_ACTIF) || |             if( (longer_direction == LONGER_VERS_A) && (i2c_annexe_get_contacteur_butee_A() == CONTACTEUR_ACTIF) || | ||||||
|                 (longer_direction == LONGER_VERS_C) && (i2c_annexe_get_contacteur_butee_C() == CONTACTEUR_ACTIF) ){ |                 (longer_direction == LONGER_VERS_C) && (i2c_annexe_get_contacteur_butee_C() == CONTACTEUR_ACTIF) ){ | ||||||
|  |                     Localisation_set_x(pos_recalage_x_mm); | ||||||
|                     etat_attrape = TURBINE_DEMARRAGE; |                     etat_attrape = TURBINE_DEMARRAGE; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|  | |||||||
| @ -1,2 +1,2 @@ | |||||||
| #include "Strategie.h" | #include "Strategie.h" | ||||||
| enum etat_action_t cerise_attraper_bordure(enum longer_direction_t longer_direction, uint32_t step_ms); | enum etat_action_t cerise_attraper_bordure(enum longer_direction_t longer_direction, uint32_t step_ms, double pos_x_mm); | ||||||
|  | |||||||
							
								
								
									
										115
									
								
								Test_strategie.c
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								Test_strategie.c
									
									
									
									
									
								
							| @ -19,6 +19,7 @@ | |||||||
| 
 | 
 | ||||||
| int test_accostage(void); | int test_accostage(void); | ||||||
| int test_longe(void); | int test_longe(void); | ||||||
|  | int test_panier(void); | ||||||
| int test_homologation(void); | int test_homologation(void); | ||||||
| int test_evitement(void); | int test_evitement(void); | ||||||
| int test_tirette_et_couleur(); | int test_tirette_et_couleur(); | ||||||
| @ -64,10 +65,12 @@ void affichage_test_strategie(){ | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| int test_strategie(){ | int test_strategie(){ | ||||||
|     printf("L - longer.\n"); |  | ||||||
|     printf("A - Accoster.\n"); |     printf("A - Accoster.\n"); | ||||||
|     printf("H - Homologation.\n"); |  | ||||||
|     printf("C - Couleur et tirette.\n"); |     printf("C - Couleur et tirette.\n"); | ||||||
|  |     printf("H - Homologation.\n"); | ||||||
|  |     printf("L - Longer.\n"); | ||||||
|  |     printf("P - Panier.\n"); | ||||||
|  |      | ||||||
|     int lettre; |     int lettre; | ||||||
|     do{ |     do{ | ||||||
|         lettre = getchar_timeout_us(0); |         lettre = getchar_timeout_us(0); | ||||||
| @ -98,6 +101,11 @@ int test_strategie(){ | |||||||
|             while(test_longe()); |             while(test_longe()); | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|  |         case 'p': | ||||||
|  |         case 'P': | ||||||
|  |             while(test_panier()); | ||||||
|  |             break; | ||||||
|  | 
 | ||||||
|         case 'q': |         case 'q': | ||||||
|         case 'Q': |         case 'Q': | ||||||
|             return 0; |             return 0; | ||||||
| @ -121,8 +129,6 @@ int test_homologation(){ | |||||||
| 
 | 
 | ||||||
|     stdio_flush(); |     stdio_flush(); | ||||||
| 
 | 
 | ||||||
|      |  | ||||||
| 
 |  | ||||||
|     multicore_launch_core1(affichage_test_strategie); |     multicore_launch_core1(affichage_test_strategie); | ||||||
| 
 | 
 | ||||||
|     temps_ms = Temps_get_temps_ms(); |     temps_ms = Temps_get_temps_ms(); | ||||||
| @ -234,6 +240,107 @@ int test_evitement(){ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | int test_panier(){ | ||||||
|  |     int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init; | ||||||
|  |     printf("Test panier\n"); | ||||||
|  | 
 | ||||||
|  |     static enum{ | ||||||
|  |         TEST_PANIER_INIT, | ||||||
|  |         TEST_PANIER_ASPIRE, | ||||||
|  |         TEST_PANIER_TEMPO, | ||||||
|  |         TEST_PANIER_LANCE_BALLES, | ||||||
|  |         TEST_PANIER_PORTE_OUVERTE, | ||||||
|  |     } etat_test_panier=TEST_PANIER_INIT; | ||||||
|  |     static uint32_t tempo_ms; | ||||||
|  | 
 | ||||||
|  |     i2c_maitre_init(); | ||||||
|  |     Trajet_init(); | ||||||
|  |     //printf("Init gyroscope\n");
 | ||||||
|  |     set_position_avec_gyroscope(0); | ||||||
|  |     if(get_position_avec_gyroscope()){ | ||||||
|  |         Gyro_Init(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     stdio_flush(); | ||||||
|  | 
 | ||||||
|  |     multicore_launch_core1(affichage_test_strategie); | ||||||
|  | 
 | ||||||
|  |     temps_ms = Temps_get_temps_ms(); | ||||||
|  |     temps_ms_init = temps_ms; | ||||||
|  |     do{ | ||||||
|  |         i2c_gestion(i2c0); | ||||||
|  |         i2c_annexe_gestion(); | ||||||
|  |         Balise_VL53L1X_gestion(); | ||||||
|  |         // Routines à 1 ms
 | ||||||
|  |         if(temps_ms != Temps_get_temps_ms()){ | ||||||
|  |             temps_ms = Temps_get_temps_ms(); | ||||||
|  |             QEI_update(); | ||||||
|  |             Localisation_gestion(); | ||||||
|  |             AsserMoteur_Gestion(_step_ms); | ||||||
|  | 
 | ||||||
|  |             // Routine à 2 ms
 | ||||||
|  |             if(temps_ms % _step_ms_gyro == 0){ | ||||||
|  |                 if(get_position_avec_gyroscope()){ | ||||||
|  |                     Gyro_Read(_step_ms_gyro); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             switch(etat_test_panier){ | ||||||
|  |                 case TEST_PANIER_INIT: | ||||||
|  |                     if(lire_couleur()== COULEUR_VERT){ | ||||||
|  |                         i2c_annexe_ferme_porte(); | ||||||
|  |                         i2c_annexe_active_turbine(); | ||||||
|  |                         etat_test_panier=TEST_PANIER_ASPIRE; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  | 
 | ||||||
|  |                 case TEST_PANIER_ASPIRE: | ||||||
|  |                     if(lire_couleur()== COULEUR_BLEU){ | ||||||
|  |                         i2c_annexe_desactive_turbine(); | ||||||
|  |                         tempo_ms = 3000; | ||||||
|  |                         etat_test_panier=TEST_PANIER_TEMPO; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  |                 case TEST_PANIER_TEMPO: | ||||||
|  |                     if(temporisation_terminee(&tempo_ms, _step_ms)){ | ||||||
|  |                         etat_test_panier=TEST_PANIER_LANCE_BALLES; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  | 
 | ||||||
|  |                 case TEST_PANIER_LANCE_BALLES: | ||||||
|  |                     if(lance_balles(_step_ms) == ACTION_TERMINEE){ | ||||||
|  |                         etat_test_panier=TEST_PANIER_PORTE_OUVERTE; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  |                  | ||||||
|  | 
 | ||||||
|  |                 case TEST_PANIER_PORTE_OUVERTE: | ||||||
|  |                     if(temporisation_terminee(&tempo_ms, _step_ms)){ | ||||||
|  |                         i2c_annexe_ouvre_porte(); | ||||||
|  |                     } | ||||||
|  |                     if(lire_couleur()== COULEUR_BLEU){ | ||||||
|  |                         etat_test_panier=TEST_PANIER_INIT; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  | 
 | ||||||
|  |                  | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         lettre = getchar_timeout_us(0); | ||||||
|  |     //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
 | ||||||
|  |     }while(1); | ||||||
|  |     printf("STRATEGIE_LOOP_2\n"); | ||||||
|  |     printf("Lettre : %d; %c\n", lettre, lettre); | ||||||
|  |      | ||||||
|  |     if(lettre == 'q' && lettre == 'Q'){ | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| int test_longe(){ | int test_longe(){ | ||||||
|     int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init; |     int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init; | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								Trajet.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								Trajet.c
									
									
									
									
									
								
							| @ -86,10 +86,10 @@ void Trajet_stop(double pas_de_temps_s){ | |||||||
| /// @param abscisse : abscisse sur la trajectoire
 | /// @param abscisse : abscisse sur la trajectoire
 | ||||||
| /// @return 1 si le trajet est terminé, 0 sinon
 | /// @return 1 si le trajet est terminé, 0 sinon
 | ||||||
| int Trajet_terminee(double abscisse){ | int Trajet_terminee(double abscisse){ | ||||||
|     if(abscisse >= 0.99 ){ |     /*if(abscisse >= 0.99 ){
 | ||||||
|         return 1; |         return 1; | ||||||
|     } |     }*/ | ||||||
|     /*
 |      | ||||||
|     if(trajet_trajectoire.type != TRAJECTOIRE_BEZIER){ |     if(trajet_trajectoire.type != TRAJECTOIRE_BEZIER){ | ||||||
|         if(abscisse >= 1 ){ |         if(abscisse >= 1 ){ | ||||||
|             return 1; |             return 1; | ||||||
| @ -98,7 +98,7 @@ int Trajet_terminee(double abscisse){ | |||||||
|         if(abscisse >= 0.99 ){ |         if(abscisse >= 0.99 ){ | ||||||
|             return 1; |             return 1; | ||||||
|         } |         } | ||||||
|     }*/ |     } | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user