Localisation fonctionnelle
This commit is contained in:
		
							parent
							
								
									bde7f64555
								
							
						
					
					
						commit
						9ffa087e2d
					
				
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -1,5 +1,6 @@ | |||||||
| { | { | ||||||
|     "files.associations": { |     "files.associations": { | ||||||
| 
 |         "geometrie.h": "c", | ||||||
|  |         "geometrie_robot.h": "c" | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -12,7 +12,9 @@ pico_sdk_init() | |||||||
| 
 | 
 | ||||||
| add_executable(Mon_Projet | add_executable(Mon_Projet | ||||||
|   Asser_Moteurs.c |   Asser_Moteurs.c | ||||||
|  |   Geometrie.c | ||||||
|   Moteurs.c |   Moteurs.c | ||||||
|  |   Localisation.c | ||||||
|   main.c |   main.c | ||||||
|   Temps.c |   Temps.c | ||||||
|   QEI.c |   QEI.c | ||||||
|  | |||||||
							
								
								
									
										82
									
								
								Geometrie.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								Geometrie.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | |||||||
|  | #include "Geometrie.h" | ||||||
|  | #include "math.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /// @brief Retourne l'angle entre -PI et +PI
 | ||||||
|  | /// @param angle 
 | ||||||
|  | /// @return 
 | ||||||
|  | float Geometrie_get_angle_normalisee(float angle){ | ||||||
|  |     while(angle > M_PI){ | ||||||
|  |         angle -= 2* M_PI; | ||||||
|  |     } | ||||||
|  |     while(angle < -M_PI){ | ||||||
|  |         angle += 2* M_PI; | ||||||
|  |     } | ||||||
|  |     return angle; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Indique si un angle est compris entre deux angles. Les angles doivent être entre -PI et PI.
 | ||||||
|  | /// @param angle : angle à comparer
 | ||||||
|  | /// @param angle_min : début de la fourchette
 | ||||||
|  | /// @param angle_max : fin de la fourchette
 | ||||||
|  | /// @return 1 si l'angle est compris entre min et max, 0 sinon
 | ||||||
|  | unsigned int Geometrie_compare_angle(float angle, float angle_min, float angle_max){ | ||||||
|  |     if(angle_min > angle_max){ | ||||||
|  |         // cas où la fourchette comprend -PI.
 | ||||||
|  |         if( (angle > angle_min) || (angle < angle_max)){ | ||||||
|  |             return 1; | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  |     }else{ | ||||||
|  |         // Cas normal
 | ||||||
|  |         if( (angle > angle_min) && (angle < angle_max)){ | ||||||
|  |             return 1; | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief A partir de l'orientation actuelle du robot et de l'orientation souhaitée, 
 | ||||||
|  | /// donne l'angle consigne pour limiter les rotations inutiles.
 | ||||||
|  | /// Tous les angles sont en radian
 | ||||||
|  | /// @param angle_depart 
 | ||||||
|  | /// @param angle_souhaite 
 | ||||||
|  | /// @return angle_optimal en radian
 | ||||||
|  | float Geometrie_get_angle_optimal(float angle_depart, float angle_souhaite){ | ||||||
|  |     while((angle_depart - angle_souhaite) > M_PI){ | ||||||
|  |         angle_souhaite += 2* M_PI; | ||||||
|  |     } | ||||||
|  |     while((angle_depart - angle_souhaite) < -M_PI){ | ||||||
|  |         angle_souhaite -= 2* M_PI; | ||||||
|  |     } | ||||||
|  |     return angle_souhaite; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @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(float angle1_min, float angle1_max, float angle2_min, float 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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// @brief Déplace un point de la distance indiquée en se servant de l'angle de la position donnée.
 | ||||||
|  | struct position_t Geometrie_deplace(struct position_t position_depart, float distance_mm){ | ||||||
|  |     struct position_t position_arrivée; | ||||||
|  |     position_arrivée.angle_radian = position_depart.angle_radian; | ||||||
|  |     position_arrivée.x_mm = position_depart.x_mm + cosf(position_depart.angle_radian) * distance_mm; | ||||||
|  |     position_arrivée.y_mm = position_depart.y_mm + sinf(position_depart.angle_radian) * distance_mm; | ||||||
|  |      | ||||||
|  |     return position_arrivée; | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								Geometrie.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Geometrie.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | #ifndef GEOMETRIE_H | ||||||
|  | #define GEOMETRIE_H | ||||||
|  | 
 | ||||||
|  | #ifndef M_PI | ||||||
|  | #define M_PI (3.14159265358979323846) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define DEGRE_EN_RADIAN  (M_PI / 180.) | ||||||
|  | #define DISTANCE_INVALIDE (-1.) | ||||||
|  | 
 | ||||||
|  | struct position_t{ | ||||||
|  |     float x_mm, y_mm; | ||||||
|  |     float angle_radian; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | float Geometrie_get_angle_normalisee(float angle); | ||||||
|  | unsigned int Geometrie_compare_angle(float angle, float angle_min, float angle_max); | ||||||
|  | unsigned int Geometrie_intersecte_plage_angle(float angle1_min, float angle1_max, float angle2_min, float angle2_max); | ||||||
|  | float Geometrie_get_angle_optimal(float angle_depart, float angle_souhaite); | ||||||
|  | struct position_t Geometrie_deplace(struct position_t position_depart, float distance_mm); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										4
									
								
								Geometrie_robot.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Geometrie_robot.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | #include "Geometrie.h" | ||||||
|  | 
 | ||||||
|  | #define DISTANCE_ROUES_CENTRE_MM 52. | ||||||
|  | 
 | ||||||
							
								
								
									
										54
									
								
								Localisation.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								Localisation.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | #include "Localisation.h" | ||||||
|  | #include "Temps.h" | ||||||
|  | #include "QEI.h" | ||||||
|  | #include "math.h" | ||||||
|  | #include "Geometrie_robot.h" | ||||||
|  | 
 | ||||||
|  | struct position_t position; | ||||||
|  | 
 | ||||||
|  | void Localisation_init(){ | ||||||
|  |     Temps_init(); | ||||||
|  |     QEI_init(); | ||||||
|  |     position.x_mm = 0; | ||||||
|  |     position.y_mm = 0; | ||||||
|  |     position.angle_radian = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Localisation_set(float x_mm, float y_mm, float angle_radian){ | ||||||
|  |     position.x_mm = x_mm; | ||||||
|  |     position.y_mm = y_mm; | ||||||
|  |     position.angle_radian = angle_radian; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Localisation_set_x(float x_mm){ | ||||||
|  |     position.x_mm = x_mm; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Localisation_set_y(float y_mm){ | ||||||
|  |     position.y_mm = y_mm; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Localisation_set_angle(float angle_radian){ | ||||||
|  |     position.angle_radian = angle_radian; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Localisation_gestion(){ | ||||||
|  |     float distance_roue_gauche_mm = QEI_get_mm(QEI_B_NAME); | ||||||
|  |     float distance_roue_droite_mm = QEI_get_mm(QEI_A_NAME); | ||||||
|  |      | ||||||
|  |     float delta_avance_mm, delta_orientation_rad; | ||||||
|  | 
 | ||||||
|  |     delta_avance_mm = (distance_roue_droite_mm + distance_roue_gauche_mm)/2; | ||||||
|  |     delta_orientation_rad = (distance_roue_droite_mm - distance_roue_gauche_mm) / (DISTANCE_ROUES_CENTRE_MM*2); | ||||||
|  | 
 | ||||||
|  |     position.angle_radian += delta_orientation_rad; | ||||||
|  | 
 | ||||||
|  |     // Projection dans le référentiel de la table
 | ||||||
|  |     position.x_mm += delta_avance_mm * cosf(position.angle_radian); | ||||||
|  |     position.y_mm += delta_avance_mm * sinf(position.angle_radian); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct position_t Localisation_get(void){ | ||||||
|  |     return position; | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								Localisation.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								Localisation.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | #include "Geometrie.h" | ||||||
|  | 
 | ||||||
|  | struct position_t Localisation_get(void); | ||||||
|  | void Localisation_gestion(); | ||||||
|  | void Localisation_init(); | ||||||
|  | 
 | ||||||
|  | void Localisation_set(float x_mm, float y_mm, float angle_radian); | ||||||
|  | void Localisation_set_x(float x_mm); | ||||||
|  | void Localisation_set_y(float y_mm); | ||||||
|  | void Localisation_set_angle(float angle_radian); | ||||||
							
								
								
									
										8
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								main.c
									
									
									
									
									
								
							| @ -8,6 +8,7 @@ | |||||||
| #include "hardware/adc.h" | #include "hardware/adc.h" | ||||||
| #include "hardware/pwm.h" | #include "hardware/pwm.h" | ||||||
| #include "Asser_Moteurs.h" | #include "Asser_Moteurs.h" | ||||||
|  | #include "Localisation.h" | ||||||
| #include "Moteurs.h" | #include "Moteurs.h" | ||||||
| #include "Temps.h" | #include "Temps.h" | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @ -36,19 +37,16 @@ void main(void) | |||||||
| 	Temps_init(); | 	Temps_init(); | ||||||
| 	tension_batterie_init(); | 	tension_batterie_init(); | ||||||
| 	identifiant_init(); | 	identifiant_init(); | ||||||
|  | 	Localisation_init(); | ||||||
| 	uint32_t temps_ms = Temps_get_temps_ms(); | 	uint32_t temps_ms = Temps_get_temps_ms(); | ||||||
| 	 | 	 | ||||||
| 
 | 
 | ||||||
| 	gpio_init(LED1PIN); | 	gpio_init(LED1PIN); | ||||||
| 	gpio_set_dir(LED1PIN, GPIO_OUT ); | 	gpio_set_dir(LED1PIN, GPIO_OUT ); | ||||||
| 	gpio_put(LED1PIN, 1); | 	gpio_put(LED1PIN, 1); | ||||||
| 	AsserMoteur_setConsigne_mm_s(MOTEUR_A, 100.); |  | ||||||
| 	AsserMoteur_setConsigne_mm_s(MOTEUR_B, 100.); |  | ||||||
| 
 | 
 | ||||||
| 	 | 	 | ||||||
| 	multicore_launch_core1(affichage); | 	multicore_launch_core1(affichage); | ||||||
| 	Moteur_SetVitesse(MOTEUR_A, 000); |  | ||||||
| 	Moteur_SetVitesse(MOTEUR_B, 000); |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	while(1){ | 	while(1){ | ||||||
| @ -58,6 +56,7 @@ void main(void) | |||||||
| 			if(temps_ms % step_ms == 0){ | 			if(temps_ms % step_ms == 0){ | ||||||
| 				QEI_update(); | 				QEI_update(); | ||||||
| 				AsserMoteur_Gestion(step_ms); | 				AsserMoteur_Gestion(step_ms); | ||||||
|  | 				Localisation_gestion(); | ||||||
| 			} | 			} | ||||||
| 			if(temps_ms % 100 == 0){ | 			if(temps_ms % 100 == 0){ | ||||||
| 				identifiant_lire(); | 				identifiant_lire(); | ||||||
| @ -76,6 +75,7 @@ void affichage(void){ | |||||||
| 		 | 		 | ||||||
| 		/*printf(">m1:%f\n>m2:%f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_B, step_ms) );
 | 		/*printf(">m1:%f\n>m2:%f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_B, step_ms) );
 | ||||||
| 		printf(">m1_c:%f\n>m2_c:%f\n", AsserMoteur_getConsigne_mm_s(MOTEUR_A), AsserMoteur_getConsigne_mm_s(MOTEUR_B) );*/ | 		printf(">m1_c:%f\n>m2_c:%f\n", AsserMoteur_getConsigne_mm_s(MOTEUR_A), AsserMoteur_getConsigne_mm_s(MOTEUR_B) );*/ | ||||||
|  | 		printf(">pos_x:%.1f\n>pos_y:%.1f\n>pos_angle:%.1f\n", Localisation_get().x_mm, Localisation_get().y_mm, Localisation_get().angle_radian); | ||||||
| 		sleep_ms(100); | 		sleep_ms(100); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user