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