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