Visualisation des capteurs VL53L1X ignorés + corrections dans la gestion des cônes de détection.
- Cas de test spécifique - La distance des cônes n'est pas encore prise en compte
This commit is contained in:
parent
e1a662d9e7
commit
13ea083670
@ -14,12 +14,12 @@ uint8_t distance_capteur_cm[NB_CAPTEURS];
|
|||||||
|
|
||||||
struct capteur_VL53L1X_t{
|
struct capteur_VL53L1X_t{
|
||||||
uint8_t distance_lue_cm; // Distance entre le capteur et l'obstacle.
|
uint8_t distance_lue_cm; // Distance entre le capteur et l'obstacle.
|
||||||
uint8_t distance_obstacle_robot_mm; // Distance entre l'obstacle et le centre du robot.
|
double distance_obstacle_robot_mm; // Distance entre l'obstacle et le centre du robot.
|
||||||
double angle_ref_robot; // Orientation du capteur dans le référentiel du robot
|
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; // 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_min; // Cone de détection du capteur (min)
|
||||||
double angle_ref_terrain_max; // Cone de détection du capteur (max)
|
double angle_ref_terrain_max; // Cone de détection du capteur (max)
|
||||||
uint donnee_valide;
|
uint donnee_valide; // L'obstacle détecté est dans le terrain et n'est pas dans le robot
|
||||||
uint donnee_ignore; // Le capteur est ignoré car derrière le robot.
|
uint donnee_ignore; // Le capteur est ignoré car derrière le robot.
|
||||||
}capteurs_VL53L1X[NB_CAPTEURS];
|
}capteurs_VL53L1X[NB_CAPTEURS];
|
||||||
|
|
||||||
@ -42,14 +42,14 @@ void actualise_VL53L1X(struct capteur_VL53L1X_t * capteur_VL53L1X, uint8_t dista
|
|||||||
while(capteur_VL53L1X->angle_ref_terrain > 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 < -M_PI){
|
||||||
capteur_VL53L1X->angle_ref_terrain += 2* M_PI;
|
capteur_VL53L1X->angle_ref_terrain += 2* M_PI;
|
||||||
}
|
}
|
||||||
|
|
||||||
capteur_VL53L1X->distance_lue_cm = distance_capteur_cm;
|
capteur_VL53L1X->distance_lue_cm = distance_capteur_cm;
|
||||||
capteur_VL53L1X->distance_obstacle_robot_mm = 10 * (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_min = Geometrie_get_angle_normalisee(capteur_VL53L1X->angle_ref_terrain - DEMI_CONE_CAPTEUR_RADIAN);
|
||||||
capteur_VL53L1X->angle_ref_terrain_max = capteur_VL53L1X->angle_ref_terrain + DEMI_CONE_CAPTEUR_RADIAN;
|
capteur_VL53L1X->angle_ref_terrain_max = Geometrie_get_angle_normalisee(capteur_VL53L1X->angle_ref_terrain + DEMI_CONE_CAPTEUR_RADIAN);
|
||||||
|
|
||||||
invalide_obstacle(capteur_VL53L1X, position_robot);
|
invalide_obstacle(capteur_VL53L1X, position_robot);
|
||||||
|
|
||||||
@ -61,8 +61,8 @@ 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_obstacle_robot_mm);
|
position_obstacle.x_mm = position_robot.x_mm + cos(capteur_VL53L1X->angle_ref_terrain)* capteur_VL53L1X->distance_obstacle_robot_mm;
|
||||||
position_obstacle.y_mm = position_robot.y_mm + sin(capteur_VL53L1X->angle_ref_terrain)* (double)(capteur_VL53L1X->distance_obstacle_robot_mm * 10);
|
position_obstacle.y_mm = position_robot.y_mm + sin(capteur_VL53L1X->angle_ref_terrain)* capteur_VL53L1X->distance_obstacle_robot_mm;
|
||||||
|
|
||||||
capteur_VL53L1X->donnee_valide=1;
|
capteur_VL53L1X->donnee_valide=1;
|
||||||
// Si la distance vaut 0, à invalider
|
// Si la distance vaut 0, à invalider
|
||||||
@ -118,6 +118,7 @@ uint8_t Balise_VL53L1X_get_capteur_cm(uint8_t capteur){
|
|||||||
/// @return
|
/// @return
|
||||||
double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant){
|
double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant){
|
||||||
const uint8_t NB_CONE=3;
|
const uint8_t NB_CONE=3;
|
||||||
|
uint16_t masque_led=0;
|
||||||
struct cone_t{
|
struct cone_t{
|
||||||
double distance_mm;
|
double distance_mm;
|
||||||
double angle;
|
double angle;
|
||||||
@ -137,11 +138,23 @@ double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant){
|
|||||||
for(uint8_t capteur=0; capteur<NB_CAPTEURS; capteur++){
|
for(uint8_t capteur=0; capteur<NB_CAPTEURS; capteur++){
|
||||||
capteurs_VL53L1X[capteur].donnee_ignore = 1;
|
capteurs_VL53L1X[capteur].donnee_ignore = 1;
|
||||||
for(uint8_t cone_index=0; cone_index<NB_CONE; cone_index++){
|
for(uint8_t cone_index=0; cone_index<NB_CONE; cone_index++){
|
||||||
|
/*printf("capteur:%d\n", capteur);
|
||||||
|
printf("capteur_angle_min:%f\n", capteurs_VL53L1X[capteur].angle_ref_terrain_min);
|
||||||
|
printf("capteur_angle_max:%f\n", capteurs_VL53L1X[capteur].angle_ref_terrain_max);
|
||||||
|
printf("cone angel min:%f\n", angle_avancement_radiant - cone[cone_index].angle);
|
||||||
|
printf("cone angel max:%f\n", angle_avancement_radiant + cone[cone_index].angle);*/
|
||||||
|
|
||||||
|
//On test si le capteur détecte dans la plage du cône
|
||||||
if(Geometrie_intersecte_plage_angle(
|
if(Geometrie_intersecte_plage_angle(
|
||||||
angle_avancement_radiant - cone[cone_index].angle, angle_avancement_radiant + cone[cone_index].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)){
|
capteurs_VL53L1X[capteur].angle_ref_terrain_min, capteurs_VL53L1X[capteur].angle_ref_terrain_max)){
|
||||||
|
// Si l'obstacle est sur le terrain
|
||||||
if(capteurs_VL53L1X[capteur].donnee_valide){
|
if(capteurs_VL53L1X[capteur].donnee_valide){
|
||||||
if(capteurs_VL53L1X[capteur].distance_obstacle_robot_mm < distance_minimale){
|
// Si la distance est plus petite que la distance minimale actuelle
|
||||||
|
// Si la distance est plus petite que le cône en question...
|
||||||
|
if(capteurs_VL53L1X[capteur].distance_obstacle_robot_mm < distance_minimale /*&&
|
||||||
|
capteurs_VL53L1X[capteur].distance_obstacle_robot_mm < cone[cone_index].distance_mm*/){
|
||||||
|
// On retient cette distance comme étant notre distance minimale
|
||||||
distance_minimale = capteurs_VL53L1X[capteur].distance_obstacle_robot_mm;
|
distance_minimale = capteurs_VL53L1X[capteur].distance_obstacle_robot_mm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,6 +164,14 @@ double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On éteint les LEDs qui correspondent aux capteurs ignorés
|
||||||
|
for(uint8_t capteur=0; capteur<NB_CAPTEURS; capteur++){
|
||||||
|
if(capteurs_VL53L1X[capteur].donnee_ignore == 1){
|
||||||
|
masque_led |= 1 << capteur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i2c_annexe_couleur_balise(0, masque_led);
|
||||||
|
|
||||||
// On enlève le rayon du robot et la taille du robot adverse
|
// On enlève le rayon du robot et la taille du robot adverse
|
||||||
if(distance_minimale < DISTANCE_OBSTACLE_IGNORE_MM){
|
if(distance_minimale < DISTANCE_OBSTACLE_IGNORE_MM){
|
||||||
distance_minimale -= (RAYON_ROBOT + RAYON_ROBOT_ADVERSE_MM);
|
distance_minimale -= (RAYON_ROBOT + RAYON_ROBOT_ADVERSE_MM);
|
||||||
@ -160,4 +181,4 @@ double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant){
|
|||||||
}
|
}
|
||||||
|
|
||||||
return distance_minimale;
|
return distance_minimale;
|
||||||
}
|
}
|
||||||
|
@ -2,4 +2,5 @@
|
|||||||
void Balise_VL53L1X_init(void);
|
void Balise_VL53L1X_init(void);
|
||||||
void Balise_VL53L1X_gestion(void);
|
void Balise_VL53L1X_gestion(void);
|
||||||
uint8_t Balise_VL53L1X_get_min_distance(void);
|
uint8_t Balise_VL53L1X_get_min_distance(void);
|
||||||
uint8_t Balise_VL53L1X_get_capteur_cm(uint8_t capteur);
|
uint8_t Balise_VL53L1X_get_capteur_cm(uint8_t capteur);
|
||||||
|
double Balise_VL53L1X_get_distance_obstacle_mm(double angle_avancement_radiant);
|
@ -8,7 +8,7 @@ double Geometrie_get_angle_normalisee(double angle){
|
|||||||
while(angle > M_PI){
|
while(angle > M_PI){
|
||||||
angle -= 2* M_PI;
|
angle -= 2* M_PI;
|
||||||
}
|
}
|
||||||
while(angle < 2* -M_PI){
|
while(angle < -M_PI){
|
||||||
angle += 2* M_PI;
|
angle += 2* M_PI;
|
||||||
}
|
}
|
||||||
return angle;
|
return angle;
|
||||||
|
30
Test.c
30
Test.c
@ -60,6 +60,7 @@ int test_aller_retour();
|
|||||||
void test_trajectoire_teleplot();
|
void test_trajectoire_teleplot();
|
||||||
int test_capteurs_balise(void);
|
int test_capteurs_balise(void);
|
||||||
int test_geometrie(void);
|
int test_geometrie(void);
|
||||||
|
int test_angle_balise(void);
|
||||||
|
|
||||||
|
|
||||||
// Mode test : renvoie 0 pour quitter le mode test
|
// Mode test : renvoie 0 pour quitter le mode test
|
||||||
@ -161,6 +162,11 @@ int mode_test(){
|
|||||||
while(test_geometrie());
|
while(test_geometrie());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'O':
|
||||||
|
case 'o':
|
||||||
|
while(test_angle_balise());
|
||||||
|
break;
|
||||||
|
|
||||||
case 'T':
|
case 'T':
|
||||||
case 't':
|
case 't':
|
||||||
while(test_trajectoire());
|
while(test_trajectoire());
|
||||||
@ -1368,4 +1374,28 @@ int test_geometrie(){
|
|||||||
Geometrie_compare_angle(angle*DEGRE_EN_RADIAN, angle_min*DEGRE_EN_RADIAN, angle_max*DEGRE_EN_RADIAN));
|
Geometrie_compare_angle(angle*DEGRE_EN_RADIAN, angle_min*DEGRE_EN_RADIAN, angle_max*DEGRE_EN_RADIAN));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int test_angle_balise(void){
|
||||||
|
|
||||||
|
i2c_maitre_init();
|
||||||
|
Balise_VL53L1X_init();
|
||||||
|
Localisation_set(1000,1500,0);
|
||||||
|
int lettre;
|
||||||
|
double distance, angle=0;
|
||||||
|
do{
|
||||||
|
i2c_gestion(i2c0);
|
||||||
|
i2c_annexe_gestion();
|
||||||
|
Balise_VL53L1X_gestion();
|
||||||
|
|
||||||
|
distance = Balise_VL53L1X_get_distance_obstacle_mm(angle);
|
||||||
|
printf(">distance_obstacle:%3.0f\n", distance);
|
||||||
|
|
||||||
|
lettre = getchar_timeout_us(0);
|
||||||
|
}while(lettre == PICO_ERROR_TIMEOUT || lettre == 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user