Fonction d'évitement en aller-retour testé
This commit is contained in:
		
							parent
							
								
									374da66a5e
								
							
						
					
					
						commit
						10a0013a77
					
				| @ -60,6 +60,19 @@ float AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms){ | |||||||
|     return distance / temps; |     return distance / temps; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /// @brief Indique si le robot est à l'arrêt
 | ||||||
|  | /// @param step_ms : pas de temps (utilisé pour déterminer les vitesses)
 | ||||||
|  | /// @return 1 si le robot est immobile, 0 s'il est en mouvement.
 | ||||||
|  | uint32_t AsserMoteur_RobotImmobile(int step_ms){ | ||||||
|  |     const float seuil_vitesse_immobile_mm_s = 0.1; | ||||||
|  |     if(AsserMoteur_getVitesse_mm_s(MOTEUR_A, step_ms) < seuil_vitesse_immobile_mm_s && | ||||||
|  |             AsserMoteur_getVitesse_mm_s(MOTEUR_B, step_ms) < seuil_vitesse_immobile_mm_s && | ||||||
|  |             AsserMoteur_getVitesse_mm_s(MOTEUR_C, step_ms) < seuil_vitesse_immobile_mm_s ){ | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /// @brief Fonction d'asservissement des moteurs, à appeler périodiquement
 | /// @brief Fonction d'asservissement des moteurs, à appeler périodiquement
 | ||||||
| /// @param step_ms 
 | /// @param step_ms 
 | ||||||
| void AsserMoteur_Gestion(int step_ms){ | void AsserMoteur_Gestion(int step_ms){ | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #include "Moteurs.h" | #include "Moteurs.h" | ||||||
| 
 | 
 | ||||||
|  | uint32_t AsserMoteur_RobotImmobile(int step_ms); | ||||||
| void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, float consigne_mm_s); | void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, float consigne_mm_s); | ||||||
| float AsserMoteur_getConsigne_mm_s(enum t_moteur moteur); | float AsserMoteur_getConsigne_mm_s(enum t_moteur moteur); | ||||||
| float AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms); | float AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms); | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								Evitement.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								Evitement.c
									
									
									
									
									
								
							| @ -1,4 +1,5 @@ | |||||||
| #include "pico/stdlib.h" | #include "pico/stdlib.h" | ||||||
|  | #include "Asser_Moteurs.h" | ||||||
| #include "Evitement.h" | #include "Evitement.h" | ||||||
| #include "Trajet.h" | #include "Trajet.h" | ||||||
| 
 | 
 | ||||||
| @ -7,25 +8,25 @@ | |||||||
| 
 | 
 | ||||||
| enum evitement_statu_t evitement_statu=PAS_D_OBSTACLE; | enum evitement_statu_t evitement_statu=PAS_D_OBSTACLE; | ||||||
| 
 | 
 | ||||||
| void Evitement_gestion(){ | void Evitement_gestion(int step_ms){ | ||||||
|     static uint32_t temps_obstacle; |     static uint32_t temps_obstacle; | ||||||
|     switch(evitement_statu){ |     switch(evitement_statu){ | ||||||
|         case PAS_D_OBSTACLE: |         case PAS_D_OBSTACLE: | ||||||
|             if(Trajet_get_bloque() == 1){ |             if(Trajet_get_bloque() == 1 && AsserMoteur_RobotImmobile(step_ms)){ | ||||||
|                 evitement_statu = OBSTACLE_NON_CONFIRME; |                 evitement_statu = OBSTACLE_NON_CONFIRME; | ||||||
|                 temps_obstacle = time_us_32(); |                 temps_obstacle = time_us_32(); | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case OBSTACLE_NON_CONFIRME: |         case OBSTACLE_NON_CONFIRME: | ||||||
|             if(time_us_32() - temps_obstacle >  TEMPS_VALIDE_OBSTACLE_US){ |             if(time_us_32() - temps_obstacle >  TEMPS_VALIDE_OBSTACLE_US){ | ||||||
|                 evitement_statu = ARRET_DEVANT_OBSTACLE; |                 evitement_statu = OBSTACLE_CONFIRME; | ||||||
|             } |             } | ||||||
|             if(Trajet_get_bloque() == 1){ |             if(!Trajet_get_bloque()){ | ||||||
|                 evitement_statu = PAS_D_OBSTACLE; |                 evitement_statu = PAS_D_OBSTACLE; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case ARRET_DEVANT_OBSTACLE: |         case OBSTACLE_CONFIRME: | ||||||
|             if(Trajet_get_bloque() == 1){ |             if(!Trajet_get_bloque()){ | ||||||
|                 evitement_statu = PAS_D_OBSTACLE; |                 evitement_statu = PAS_D_OBSTACLE; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|  | |||||||
| @ -1,5 +1,8 @@ | |||||||
| enum evitement_statu_t{ | enum evitement_statu_t{ | ||||||
|     PAS_D_OBSTACLE, |     PAS_D_OBSTACLE, | ||||||
|     OBSTACLE_NON_CONFIRME, |     OBSTACLE_NON_CONFIRME, | ||||||
|     ARRET_DEVANT_OBSTACLE, |     OBSTACLE_CONFIRME, | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | enum evitement_statu_t Evitement_get_statu(); | ||||||
|  | void Evitement_gestion(int step_ms); | ||||||
| @ -13,6 +13,7 @@ | |||||||
| #include "Asser_Position.h" | #include "Asser_Position.h" | ||||||
| #include "Balise_VL53L1X.h" | #include "Balise_VL53L1X.h" | ||||||
| #include "Commande_vitesse.h" | #include "Commande_vitesse.h" | ||||||
|  | #include "Evitement.h" | ||||||
| #include "i2c_annexe.h" | #include "i2c_annexe.h" | ||||||
| #include "i2c_maitre.h" | #include "i2c_maitre.h" | ||||||
| #include "Localisation.h" | #include "Localisation.h" | ||||||
| @ -122,6 +123,7 @@ int main() { | |||||||
|             QEI_update(); |             QEI_update(); | ||||||
|             Localisation_gestion(); |             Localisation_gestion(); | ||||||
|             AsserMoteur_Gestion(_step_ms); |             AsserMoteur_Gestion(_step_ms); | ||||||
|  |             Evitement_gestion(_step_ms); | ||||||
| 
 | 
 | ||||||
|             // Routine à 2 ms
 |             // Routine à 2 ms
 | ||||||
|             if(temps_ms % _step_ms_gyro == 0){ |             if(temps_ms % _step_ms_gyro == 0){ | ||||||
|  | |||||||
| @ -44,6 +44,14 @@ extern enum etat_homologation_t{ | |||||||
|      |      | ||||||
| }etat_homologation; | }etat_homologation; | ||||||
| 
 | 
 | ||||||
|  | enum evitement_t{ | ||||||
|  |     SANS_EVITEMENT, | ||||||
|  |     PAUSE_DEVANT_OBSTACLE, | ||||||
|  |     ARRET_DEVANT_OBSTACLE, | ||||||
|  |     RETOUR_SI_OBSTABLE, | ||||||
|  |     CONTOURNEMENT | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| enum etat_action_t cerise_accostage(void); | enum etat_action_t cerise_accostage(void); | ||||||
| enum etat_action_t avance_puis_longe_bordure(enum longer_direction_t longer_direction); | enum etat_action_t avance_puis_longe_bordure(enum longer_direction_t longer_direction); | ||||||
| enum etat_action_t parcourt_trajet_simple(struct trajectoire_t trajectoire, uint32_t step_ms); | enum etat_action_t parcourt_trajet_simple(struct trajectoire_t trajectoire, uint32_t step_ms); | ||||||
| @ -58,6 +66,7 @@ void Strategie(enum couleur_t couleur, uint32_t step_ms, uint32_t temps_ms); | |||||||
| 
 | 
 | ||||||
| int temporisation_terminee(uint32_t * tempo_ms, uint32_t step_ms); | int temporisation_terminee(uint32_t * tempo_ms, uint32_t step_ms); | ||||||
| enum etat_action_t  Strategie_aller_panier(enum couleur_t couleur, uint32_t step_ms); | enum etat_action_t  Strategie_aller_panier(enum couleur_t couleur, uint32_t step_ms); | ||||||
|  | enum etat_action_t Strategie_parcourir_trajet(struct trajectoire_t trajectoire, uint32_t step_ms, enum evitement_t evitement); | ||||||
| 
 | 
 | ||||||
| extern float distance_obstacle; | extern float distance_obstacle; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,7 +4,62 @@ | |||||||
| #include "Geometrie.h" | #include "Geometrie.h" | ||||||
| #include "Balise_VL53L1X.h" | #include "Balise_VL53L1X.h" | ||||||
| 
 | 
 | ||||||
| enum etat_action_t Strategie_parcourir_trajet(){ | enum etat_action_t Strategie_parcourir_trajet(struct trajectoire_t trajectoire, uint32_t step_ms, enum evitement_t evitement){ | ||||||
|  |     enum etat_action_t etat_action = ACTION_EN_COURS; | ||||||
|  |     enum etat_trajet_t etat_trajet; | ||||||
|  |     float angle_avancement; | ||||||
|  |      | ||||||
|  |     static enum { | ||||||
|  |         PARCOURS_INIT, | ||||||
|  |         PARCOURS_AVANCE, | ||||||
|  |     } etat_parcourt=PARCOURS_INIT; | ||||||
|  | 
 | ||||||
|  |     switch (etat_parcourt){ | ||||||
|  |         case PARCOURS_INIT: | ||||||
|  |             Trajet_debut_trajectoire(trajectoire); | ||||||
|  |             etat_parcourt = PARCOURS_AVANCE; | ||||||
|  |             break; | ||||||
|  |          | ||||||
|  |         case PARCOURS_AVANCE: | ||||||
|  |             if(evitement != SANS_EVITEMENT){ | ||||||
|  |                 angle_avancement = Trajet_get_orientation_avance(); | ||||||
|  |                 distance_obstacle = Balise_VL53L1X_get_distance_obstacle_mm(angle_avancement); | ||||||
|  |                 Trajet_set_obstacle_mm(distance_obstacle); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if(Evitement_get_statu() == ARRET_DEVANT_OBSTACLE){ | ||||||
|  |                 switch(evitement){ | ||||||
|  |                     case SANS_EVITEMENT: | ||||||
|  |                         //printf("Evitement lors trajet SANS_EVITEMENT: ERREUR\n");
 | ||||||
|  |                         break; | ||||||
|  |                     case PAUSE_DEVANT_OBSTACLE: | ||||||
|  |                         // Rien à faire ici
 | ||||||
|  |                         break; | ||||||
|  |                      | ||||||
|  |                     case ARRET_DEVANT_OBSTACLE: | ||||||
|  |                         etat_parcourt = PARCOURS_INIT; | ||||||
|  |                         return ACTION_TERMINEE; | ||||||
|  | 
 | ||||||
|  |                     case RETOUR_SI_OBSTABLE: | ||||||
|  |                         Trajet_inverse(); | ||||||
|  |                         break; | ||||||
|  | 
 | ||||||
|  |                     case CONTOURNEMENT: // TODO
 | ||||||
|  |                         break; | ||||||
|  |                          | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             etat_trajet = Trajet_avance(step_ms/1000.); | ||||||
|  |             if(etat_trajet == TRAJET_TERMINE){ | ||||||
|  |                 etat_action = ACTION_TERMINEE; | ||||||
|  |                 etat_parcourt = PARCOURS_INIT; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return etat_action; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ | |||||||
| 
 | 
 | ||||||
| #include "Asser_Moteurs.h" | #include "Asser_Moteurs.h" | ||||||
| #include "Balise_VL53L1X.h" | #include "Balise_VL53L1X.h" | ||||||
|  | #include "Evitement.h" | ||||||
| #include "i2c_annexe.h" | #include "i2c_annexe.h" | ||||||
| #include "i2c_maitre.h" | #include "i2c_maitre.h" | ||||||
| #include "gyro.h" | #include "gyro.h" | ||||||
| @ -297,8 +298,31 @@ void affichage_test_evitement(){ | |||||||
| int test_evitement(){ | int test_evitement(){ | ||||||
|     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; | ||||||
|     struct trajectoire_t trajectoire; |     struct trajectoire_t trajectoire; | ||||||
|  |     enum evitement_t evitement; | ||||||
|  |     enum etat_action_t etat_action; | ||||||
|     printf("Evitement\n"); |     printf("Evitement\n"); | ||||||
| 
 | 
 | ||||||
|  |     printf("A - Sans evitement.\n"); | ||||||
|  |     printf("B - Pause devant obstacle.\n"); | ||||||
|  |     printf("C - Arrêt devant obstacle.\n"); | ||||||
|  |     printf("D - Retour si obstacle.\n"); | ||||||
|  |     printf("E - Contournement.\n"); | ||||||
|  |     do{ | ||||||
|  |         lettre = getchar_timeout_us(0); | ||||||
|  |     }while(lettre == PICO_ERROR_TIMEOUT || lettre == 0); | ||||||
|  |     switch(lettre){ | ||||||
|  |         case 'a': | ||||||
|  |         case 'A':evitement=SANS_EVITEMENT;break; | ||||||
|  |         case 'b': | ||||||
|  |         case 'B':evitement=PAUSE_DEVANT_OBSTACLE;break; | ||||||
|  |         case 'c': | ||||||
|  |         case 'C':evitement=ARRET_DEVANT_OBSTACLE;break; | ||||||
|  |         case 'd': | ||||||
|  |         case 'D':evitement=RETOUR_SI_OBSTABLE;break; | ||||||
|  |         case 'e': | ||||||
|  |         case 'E':evitement=CONTOURNEMENT;break; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     i2c_maitre_init(); |     i2c_maitre_init(); | ||||||
|     Trajet_init(); |     Trajet_init(); | ||||||
|     Balise_VL53L1X_init(); |     Balise_VL53L1X_init(); | ||||||
| @ -327,6 +351,7 @@ int test_evitement(){ | |||||||
|             QEI_update(); |             QEI_update(); | ||||||
|             Localisation_gestion(); |             Localisation_gestion(); | ||||||
|             AsserMoteur_Gestion(_step_ms); |             AsserMoteur_Gestion(_step_ms); | ||||||
|  |             Evitement_gestion(_step_ms); | ||||||
| 
 | 
 | ||||||
|             // Routine à 2 ms
 |             // Routine à 2 ms
 | ||||||
|             if(temps_ms % _step_ms_gyro == 0){ |             if(temps_ms % _step_ms_gyro == 0){ | ||||||
| @ -339,14 +364,12 @@ int test_evitement(){ | |||||||
|                                 1000,200, |                                 1000,200, | ||||||
|                                 0, 0); // Angles
 |                                 0, 0); // Angles
 | ||||||
| 
 | 
 | ||||||
|             if(parcourt_trajet_simple(trajectoire, _step_ms) == ACTION_TERMINEE){ |             etat_action = Strategie_parcourir_trajet(trajectoire, _step_ms, evitement); | ||||||
| 
 |  | ||||||
|             } |  | ||||||
| 
 | 
 | ||||||
|         } |         } | ||||||
|         lettre = getchar_timeout_us(0); |         lettre = getchar_timeout_us(0); | ||||||
|     //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
 |     //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
 | ||||||
|     }while(1); |     }while(etat_action == ACTION_EN_COURS); | ||||||
|     printf("STRATEGIE_LOOP_2\n"); |     printf("STRATEGIE_LOOP_2\n"); | ||||||
|     printf("Lettre : %d; %c\n", lettre, lettre); |     printf("Lettre : %d; %c\n", lettre, lettre); | ||||||
|      |      | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user