-
Notifications
You must be signed in to change notification settings - Fork 0
/
Trajet.c
100 lines (81 loc) · 2.84 KB
/
Trajet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <math.h>
#include "Geometrie.h"
#include "Trajectoire.h"
#include "Trajet.h"
#include "Asser_Position.h"
#define VITESSE_MAX_MM_S 1000
double Trajet_calcul_vitesse(double temps_s);
double abscisse;
double position_mm; // Position en mm sur la trajectoire
double vitesse_mm_s;
double acceleration_mm_ss;
struct trajectoire_t trajet_trajectoire;
struct position_t position_consigne;
void Trajet_init(){
abscisse = 0;
vitesse_mm_s = 0;
acceleration_mm_ss = 300;
position_mm = 0;
}
void Trajet_debut_trajectoire(struct trajectoire_t trajectoire){
abscisse = 0;
vitesse_mm_s = 0;
acceleration_mm_ss = 1500;
position_mm = 0;
trajet_trajectoire = trajectoire;
}
int Trajet_avance(double pas_de_temps_s){
double distance_mm, orientation_radian;
struct point_xy_t point;
struct position_t position;
// Calcul de la vitesse
vitesse_mm_s = Trajet_calcul_vitesse(pas_de_temps_s);
// Calcul de l'avancement en mm
distance_mm = vitesse_mm_s * pas_de_temps_s;
position_mm += distance_mm;
// Calcul de l'abscisse sur la trajectoire
abscisse = Trajectoire_avance(&trajet_trajectoire, abscisse, distance_mm);
// Obtention du point consigne
point = Trajectoire_get_point(&trajet_trajectoire, abscisse);
// Obtention de l'orientation consigne
orientation_radian = 0; // TODO
position.x_mm = point.x;
position.y_mm = point.y;
position.angle_radian = orientation_radian;
position_consigne=position;
Asser_Position(position);
if(abscisse >= 1 ){
return TRAJET_TERMINE;
}
return TRAJET_EN_COURS;
}
struct position_t Trajet_get_consigne(){
return position_consigne;
}
/// @brief Calcule la vitesse à partir de l’accélération du robot, de la vitesse maximale et de la contrainte en fin de trajectoire
/// @param pas_de_temps_s : temps écoulé en ms
/// @return vitesse déterminée en m/s
double Trajet_calcul_vitesse(double pas_de_temps_s){
double vitesse_max_contrainte;
double distance_contrainte;
double vitesse;
// Calcul de la vitesse avec acceleration
vitesse = vitesse_mm_s + acceleration_mm_ss * pas_de_temps_s;
// Calcul de la vitesse maximale due à la contrainte en fin de trajectoire (0 mm/s)
// https://poivron-robotique.fr/Consigne-de-vitesse.html
distance_contrainte = Trajectoire_get_longueur_mm(&trajet_trajectoire) - position_mm;
// En cas de dépassement, on veut garder la contrainte, pour l'instant
if(distance_contrainte > 0){
vitesse_max_contrainte = sqrt(2 * acceleration_mm_ss * distance_contrainte);
}else{
vitesse_max_contrainte = 0;
}
// Selection de la vitesse la plus faible
if(vitesse > vitesse_max_contrainte){
vitesse = vitesse_max_contrainte;
}
if(vitesse > VITESSE_MAX_MM_S){
vitesse = VITESSE_MAX_MM_S;
}
return vitesse;
}