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;
|
||||
}
|
||||
|
||||
/// @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
|
||||
/// @param step_ms
|
||||
void AsserMoteur_Gestion(int step_ms){
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "Moteurs.h"
|
||||
|
||||
uint32_t AsserMoteur_RobotImmobile(int step_ms);
|
||||
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, float consigne_mm_s);
|
||||
float AsserMoteur_getConsigne_mm_s(enum t_moteur moteur);
|
||||
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 "Asser_Moteurs.h"
|
||||
#include "Evitement.h"
|
||||
#include "Trajet.h"
|
||||
|
||||
@ -7,25 +8,25 @@
|
||||
|
||||
enum evitement_statu_t evitement_statu=PAS_D_OBSTACLE;
|
||||
|
||||
void Evitement_gestion(){
|
||||
void Evitement_gestion(int step_ms){
|
||||
static uint32_t temps_obstacle;
|
||||
switch(evitement_statu){
|
||||
case PAS_D_OBSTACLE:
|
||||
if(Trajet_get_bloque() == 1){
|
||||
if(Trajet_get_bloque() == 1 && AsserMoteur_RobotImmobile(step_ms)){
|
||||
evitement_statu = OBSTACLE_NON_CONFIRME;
|
||||
temps_obstacle = time_us_32();
|
||||
}
|
||||
break;
|
||||
case OBSTACLE_NON_CONFIRME:
|
||||
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;
|
||||
}
|
||||
break;
|
||||
case ARRET_DEVANT_OBSTACLE:
|
||||
if(Trajet_get_bloque() == 1){
|
||||
case OBSTACLE_CONFIRME:
|
||||
if(!Trajet_get_bloque()){
|
||||
evitement_statu = PAS_D_OBSTACLE;
|
||||
}
|
||||
break;
|
||||
|
@ -1,5 +1,8 @@
|
||||
enum evitement_statu_t{
|
||||
PAS_D_OBSTACLE,
|
||||
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 "Balise_VL53L1X.h"
|
||||
#include "Commande_vitesse.h"
|
||||
#include "Evitement.h"
|
||||
#include "i2c_annexe.h"
|
||||
#include "i2c_maitre.h"
|
||||
#include "Localisation.h"
|
||||
@ -122,6 +123,7 @@ int main() {
|
||||
QEI_update();
|
||||
Localisation_gestion();
|
||||
AsserMoteur_Gestion(_step_ms);
|
||||
Evitement_gestion(_step_ms);
|
||||
|
||||
// Routine à 2 ms
|
||||
if(temps_ms % _step_ms_gyro == 0){
|
||||
|
@ -44,6 +44,14 @@ extern enum etat_homologation_t{
|
||||
|
||||
}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 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);
|
||||
@ -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);
|
||||
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;
|
||||
|
||||
|
@ -4,7 +4,62 @@
|
||||
#include "Geometrie.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 "Balise_VL53L1X.h"
|
||||
#include "Evitement.h"
|
||||
#include "i2c_annexe.h"
|
||||
#include "i2c_maitre.h"
|
||||
#include "gyro.h"
|
||||
@ -297,8 +298,31 @@ void affichage_test_evitement(){
|
||||
int test_evitement(){
|
||||
int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
|
||||
struct trajectoire_t trajectoire;
|
||||
enum evitement_t evitement;
|
||||
enum etat_action_t etat_action;
|
||||
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();
|
||||
Trajet_init();
|
||||
Balise_VL53L1X_init();
|
||||
@ -327,6 +351,7 @@ int test_evitement(){
|
||||
QEI_update();
|
||||
Localisation_gestion();
|
||||
AsserMoteur_Gestion(_step_ms);
|
||||
Evitement_gestion(_step_ms);
|
||||
|
||||
// Routine à 2 ms
|
||||
if(temps_ms % _step_ms_gyro == 0){
|
||||
@ -339,14 +364,12 @@ int test_evitement(){
|
||||
1000,200,
|
||||
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);
|
||||
//}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
|
||||
}while(1);
|
||||
}while(etat_action == ACTION_EN_COURS);
|
||||
printf("STRATEGIE_LOOP_2\n");
|
||||
printf("Lettre : %d; %c\n", lettre, lettre);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user