Gestion des déplacements suivants des trajectoires avec un contrôle en vitesse.
This commit is contained in:
parent
2d93697571
commit
e1d3568f53
@ -1 +1,2 @@
|
||||
#include "Geometrie.h"
|
||||
void Asser_Position(struct position_t position_consigne);
|
@ -20,6 +20,11 @@ gyro_ADXRS453.c
|
||||
Localisation.c
|
||||
Moteurs.c
|
||||
Temps.c
|
||||
Trajet.c
|
||||
Trajectoire.c
|
||||
Trajectoire_bezier.c
|
||||
Trajectoire_circulaire.c
|
||||
Trajectoire_droite.c
|
||||
Servomoteur.c
|
||||
spi_nb.c)
|
||||
|
||||
|
9
Geometrie.h
Normal file
9
Geometrie.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef GEOMETRIE_H
|
||||
#define GEOMETRIE_H
|
||||
|
||||
struct position_t{
|
||||
double x_mm, y_mm;
|
||||
double angle_radian;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,7 +1,4 @@
|
||||
struct position_t{
|
||||
double x_mm, y_mm;
|
||||
double angle_radian;
|
||||
};
|
||||
#include "Geometrie.h"
|
||||
|
||||
struct position_t Localisation_get(void);
|
||||
void Localisation_gestion();
|
||||
|
117
Trajectoire.c
Normal file
117
Trajectoire.c
Normal file
@ -0,0 +1,117 @@
|
||||
#include "Trajectoire.h"
|
||||
#include "Trajectoire_bezier.h"
|
||||
#include "Trajectoire_circulaire.h"
|
||||
#include "Trajectoire_droite.h"
|
||||
|
||||
#include "math.h"
|
||||
|
||||
#define NB_MAX_TRAJECTOIRES 5
|
||||
#define PRECISION_ABSCISSE 0.001
|
||||
|
||||
|
||||
void Trajectoire_circulaire(struct trajectoire_t * trajectoire, double centre_x, double centre_y, double angle_debut_degre, double angle_fin_degre, double rayon){
|
||||
trajectoire->type = TRAJECTOIRE_CIRCULAIRE;
|
||||
trajectoire->p1.x = centre_x;
|
||||
trajectoire->p1.y = centre_y;
|
||||
trajectoire->angle_debut_degre = angle_debut_degre;
|
||||
trajectoire->angle_fin_degre = angle_fin_degre;
|
||||
trajectoire->rayon = rayon;
|
||||
trajectoire->longueur = -1;
|
||||
}
|
||||
|
||||
void Trajectoire_droite(struct trajectoire_t * trajectoire, double p1_x, double p1_y, double p2_x, double p2_y){
|
||||
trajectoire->type = TRAJECTOIRE_DROITE;
|
||||
trajectoire->p1.x = p1_x;
|
||||
trajectoire->p1.y = p1_y;
|
||||
trajectoire->p2.x = p2_x;
|
||||
trajectoire->p2.y = p2_y;
|
||||
trajectoire->longueur = -1;
|
||||
}
|
||||
|
||||
void Trajectoire_bezier(struct trajectoire_t * trajectoire, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y, double p4_x, double p4_y){
|
||||
trajectoire->type = TRAJECTOIRE_BEZIER;
|
||||
trajectoire->p1.x = p1_x;
|
||||
trajectoire->p1.y = p1_y;
|
||||
trajectoire->p2.x = p2_x;
|
||||
trajectoire->p2.y = p2_y;
|
||||
trajectoire->p3.x = p3_x;
|
||||
trajectoire->p3.y = p3_y;
|
||||
trajectoire->p4.x = p4_x;
|
||||
trajectoire->p4.y = p4_y;
|
||||
trajectoire->longueur = -1;
|
||||
}
|
||||
|
||||
/// @brief Renvoie la longueur de la trajectoire en mm, la calcule si besoin
|
||||
/// @param trajectoire
|
||||
/// @return Longueur de la trajectoire
|
||||
double Trajectoire_get_longueur_mm(struct trajectoire_t * trajectoire){
|
||||
if(trajectoire->longueur > 0){
|
||||
// La longueur est déjà calculée
|
||||
}else{
|
||||
// Calculons la longueur de la trajectoire
|
||||
switch(trajectoire->type){
|
||||
case TRAJECTOIRE_DROITE:
|
||||
Trajectoire_droite_get_longueur(trajectoire);
|
||||
break;
|
||||
case TRAJECTOIRE_CIRCULAIRE:
|
||||
Trajectoire_circulaire_get_longueur(trajectoire);
|
||||
break;
|
||||
|
||||
case TRAJECTOIRE_BEZIER:
|
||||
Trajectoire_bezier_get_longueur(trajectoire);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return trajectoire->longueur;
|
||||
}
|
||||
|
||||
/// @brief Renvoie le point d'une trajectoire à partir de son abscisse
|
||||
/// @param abscisse : abscisse sur la trajectoire
|
||||
/// @return point en coordonnées X/Y
|
||||
struct point_xy_t Trajectoire_get_point(struct trajectoire_t * trajectoire, double abscisse){
|
||||
switch(trajectoire->type){
|
||||
case TRAJECTOIRE_DROITE:
|
||||
return Trajectoire_droite_get_point(trajectoire, abscisse);
|
||||
break;
|
||||
|
||||
case TRAJECTOIRE_CIRCULAIRE:
|
||||
return Trajectoire_circulaire_get_point(trajectoire, abscisse);
|
||||
break;
|
||||
|
||||
case TRAJECTOIRE_BEZIER:
|
||||
return Trajectoire_bezier_get_point(trajectoire, abscisse);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// @brief Calcul la nouvelle abscisse une fois avancé de la distance indiquée
|
||||
/// @param abscisse : Valeur entre 0 et 1, position actuelle du robot sur sa trajectoire
|
||||
/// @param distance_mm : Distance en mm de laquelle le robot doit avancer sur la trajectoire
|
||||
/// @return nouvelle abscisse
|
||||
double Trajectoire_avance(struct trajectoire_t * trajectoire, double abscisse, double distance_mm){
|
||||
double delta_abscisse, delta_mm, erreur_relative;
|
||||
|
||||
if(distance_mm == 0){
|
||||
return abscisse;
|
||||
}
|
||||
// Ceci permet d'avoir une abscisse exact sur les trajectoires droites et les trajectoires circulaires
|
||||
delta_abscisse = distance_mm / Trajectoire_get_longueur_mm(trajectoire);
|
||||
delta_mm = distance_points(Trajectoire_get_point(trajectoire, abscisse), Trajectoire_get_point(trajectoire, abscisse + delta_abscisse) );
|
||||
|
||||
// Sur les trajectoires de bézier, il peut être nécessaire d'affiner
|
||||
// Les cas où l'algorythme diverge ne devraient pas se produire car distance_cm << longeur_trajectoire.
|
||||
erreur_relative = 1 - delta_mm / distance_mm;
|
||||
while(fabs(erreur_relative) > PRECISION_ABSCISSE){
|
||||
delta_abscisse = delta_abscisse * distance_mm / delta_mm;
|
||||
delta_mm = distance_points(Trajectoire_get_point(trajectoire, abscisse), Trajectoire_get_point(trajectoire, abscisse + delta_abscisse) );
|
||||
erreur_relative = 1 - delta_mm / distance_mm;
|
||||
}
|
||||
|
||||
return abscisse + delta_abscisse;
|
||||
}
|
||||
|
||||
double distance_points(struct point_xy_t point, struct point_xy_t point_old){
|
||||
return sqrt( pow(point.x - point_old.x, 2) + pow(point.y - point_old.y , 2));
|
||||
|
||||
}
|
30
Trajectoire.h
Normal file
30
Trajectoire.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef TRAJECTOIRE_H
|
||||
#define TRAJECTOIRE_H
|
||||
|
||||
enum trajectoire_type_t{
|
||||
TRAJECTOIRE_DROITE,
|
||||
TRAJECTOIRE_CIRCULAIRE,
|
||||
TRAJECTOIRE_BEZIER
|
||||
};
|
||||
|
||||
struct point_xy_t{
|
||||
double x, y;
|
||||
};
|
||||
|
||||
struct trajectoire_t {
|
||||
enum trajectoire_type_t type;
|
||||
struct point_xy_t p1, p2, p3, p4;
|
||||
double orientation_debut, orientation_fin;
|
||||
double rayon, angle_debut_degre, angle_fin_degre;
|
||||
double longueur;
|
||||
};
|
||||
|
||||
double Trajectoire_get_longueur_mm(struct trajectoire_t * trajectoire);
|
||||
struct point_xy_t Trajectoire_get_point(struct trajectoire_t * trajectoire, double abscisse);
|
||||
double Trajectoire_avance(struct trajectoire_t * trajectoire, double abscisse, double distance_mm);
|
||||
double distance_points(struct point_xy_t point, struct point_xy_t point_old);
|
||||
void Trajectoire_circulaire(struct trajectoire_t * trajectoire, double centre_x, double centre_y, double angle_debut_degre, double angle_fin_degre, double rayon);
|
||||
void Trajectoire_droite(struct trajectoire_t * trajectoire, double p1_x, double p1_y, double p2_x, double p2_y);
|
||||
void Trajectoire_bezier(struct trajectoire_t * trajectoire, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y, double p4_x, double p4_y);
|
||||
|
||||
#endif
|
35
Trajectoire_bezier.c
Normal file
35
Trajectoire_bezier.c
Normal file
@ -0,0 +1,35 @@
|
||||
#include "Trajectoire.h"
|
||||
#include "Trajectoire_bezier.h"
|
||||
|
||||
|
||||
void Trajectoire_bezier_get_longueur(struct trajectoire_t * trajectoire){
|
||||
struct point_xy_t point, point_old;
|
||||
double nb_pas=500;
|
||||
|
||||
trajectoire->longueur=0;
|
||||
point_old = trajectoire->p1;
|
||||
|
||||
for(double abscisse=0; abscisse<=1; abscisse += 1./nb_pas){
|
||||
point = Trajectoire_bezier_get_point(trajectoire, abscisse);
|
||||
trajectoire->longueur += distance_points(point, point_old);
|
||||
point_old = point;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// @brief Retourne le point sur la trajectoire en fonction de l'abscisse
|
||||
/// @param abscisse : compris entre 0 et 1
|
||||
struct point_xy_t Trajectoire_bezier_get_point(struct trajectoire_t * trajectoire, double abscisse){
|
||||
struct point_xy_t point;
|
||||
point.x = (double) trajectoire->p1.x * (1-abscisse) * (1-abscisse) * (1-abscisse) +
|
||||
3 * (double) trajectoire->p2.x * abscisse * (1-abscisse) * (1-abscisse) +
|
||||
3 * (double) trajectoire->p3.x * abscisse * abscisse * (1-abscisse) +
|
||||
(double) trajectoire->p4.x * abscisse * abscisse * abscisse;
|
||||
|
||||
point.y = (double) trajectoire->p1.y * (1-abscisse) * (1-abscisse) * (1-abscisse) +
|
||||
3 * (double) trajectoire->p2.y * abscisse * (1-abscisse) * (1-abscisse) +
|
||||
3 * (double) trajectoire->p3.y * abscisse * abscisse * (1-abscisse) +
|
||||
(double) trajectoire->p4.y * abscisse * abscisse * abscisse;
|
||||
|
||||
return point;
|
||||
}
|
5
Trajectoire_bezier.h
Normal file
5
Trajectoire_bezier.h
Normal file
@ -0,0 +1,5 @@
|
||||
#include "Trajectoire.h"
|
||||
|
||||
|
||||
void Trajectoire_bezier_get_longueur(struct trajectoire_t * trajectoire);
|
||||
struct point_xy_t Trajectoire_bezier_get_point(struct trajectoire_t * trajectoire, double abscisse);
|
26
Trajectoire_circulaire.c
Normal file
26
Trajectoire_circulaire.c
Normal file
@ -0,0 +1,26 @@
|
||||
#include "math.h"
|
||||
#include "Trajectoire.h"
|
||||
|
||||
|
||||
void Trajectoire_circulaire_get_longueur(struct trajectoire_t * trajectoire){
|
||||
double distance_angulaire;
|
||||
if(trajectoire->angle_debut_degre > trajectoire->angle_fin_degre){
|
||||
distance_angulaire = trajectoire->angle_debut_degre - trajectoire->angle_fin_degre;
|
||||
}else{
|
||||
distance_angulaire = trajectoire->angle_fin_degre - trajectoire->angle_debut_degre;
|
||||
}
|
||||
trajectoire->longueur = 2. * M_PI * trajectoire->rayon * distance_angulaire / 360.;
|
||||
}
|
||||
|
||||
/// @brief Retourne le point sur la trajectoire en fonction de l'abscisse
|
||||
/// @param abscisse : compris entre 0 et 1
|
||||
struct point_xy_t Trajectoire_circulaire_get_point(struct trajectoire_t * trajectoire, double abscisse){
|
||||
struct point_xy_t point;
|
||||
double angle_degre;
|
||||
|
||||
angle_degre = (double) trajectoire->angle_debut_degre * (1-abscisse) + (double) trajectoire->angle_fin_degre * abscisse;
|
||||
point.x = trajectoire->p1.x + cos(angle_degre/180. * M_PI) * trajectoire->rayon;
|
||||
point.y = trajectoire->p1.y + sin(angle_degre/180. * M_PI) * trajectoire->rayon;
|
||||
|
||||
return point;
|
||||
}
|
4
Trajectoire_circulaire.h
Normal file
4
Trajectoire_circulaire.h
Normal file
@ -0,0 +1,4 @@
|
||||
#include "math.h"
|
||||
|
||||
void Trajectoire_circulaire_get_longueur(struct trajectoire_t * trajectoire);
|
||||
struct point_xy_t Trajectoire_circulaire_get_point(struct trajectoire_t * trajectoire, double avancement);
|
17
Trajectoire_droite.c
Normal file
17
Trajectoire_droite.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include "Trajectoire.h"
|
||||
|
||||
|
||||
void Trajectoire_droite_get_longueur(struct trajectoire_t * trajectoire){
|
||||
trajectoire->longueur = distance_points(trajectoire->p1, trajectoire->p2);
|
||||
}
|
||||
|
||||
/// @brief Retourne le point sur la trajectoire en fonction de l'abscisse
|
||||
/// @param abscisse : compris entre 0 et 1
|
||||
struct point_xy_t Trajectoire_droite_get_point(struct trajectoire_t * trajectoire, double abscisse){
|
||||
struct point_xy_t point;
|
||||
|
||||
point.x = (double) trajectoire->p1.x * (1. - abscisse) + (double) trajectoire->p2.x * abscisse;
|
||||
point.y = (double) trajectoire->p1.y * (1. - abscisse) + (double) trajectoire->p2.y * abscisse;
|
||||
|
||||
return point;
|
||||
}
|
4
Trajectoire_droite.h
Normal file
4
Trajectoire_droite.h
Normal file
@ -0,0 +1,4 @@
|
||||
#include "Trajectoire.h"
|
||||
|
||||
void Trajectoire_droite_get_longueur(struct trajectoire_t * trajectoire);
|
||||
struct point_xy_t Trajectoire_droite_get_point(struct trajectoire_t * trajectoire, double abscisse);
|
94
Trajet.c
Normal file
94
Trajet.c
Normal file
@ -0,0 +1,94 @@
|
||||
#include <math.h>
|
||||
#include "Geometrie.h"
|
||||
#include "Trajectoire.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;
|
||||
}
|
||||
|
||||
void 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);
|
||||
|
||||
}
|
||||
|
||||
struct position_t Trajet_get_consigne(){
|
||||
return position_consigne;
|
||||
}
|
||||
|
||||
/// @brief Calcule la vitesse à partir de l'accelé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;
|
||||
}
|
5
Trajet.h
Normal file
5
Trajet.h
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
void Trajet_init();
|
||||
void Trajet_debut_trajectoire(struct trajectoire_t trajectoire);
|
||||
void Trajet_avance(double temps_s);
|
||||
struct position_t Trajet_get_consigne(void);
|
84
test.c
84
test.c
@ -6,16 +6,17 @@
|
||||
#include "math.h"
|
||||
|
||||
#include "gyro.h"
|
||||
#include "Temps.h"
|
||||
#include "spi_nb.h"
|
||||
#include "Servomoteur.h"
|
||||
#include "Asser_Moteurs.h"
|
||||
#include "Asser_Position.h"
|
||||
#include "Commande_vitesse.h"
|
||||
#include "Localisation.h"
|
||||
#include "Moteurs.h"
|
||||
#include "QEI.h"
|
||||
#include "Asser_Moteurs.h"
|
||||
#include "Localisation.h"
|
||||
#include "Commande_vitesse.h"
|
||||
#include "Asser_Position.h"
|
||||
|
||||
#include "Servomoteur.h"
|
||||
#include "spi_nb.h"
|
||||
#include "Temps.h"
|
||||
#include "Trajectoire.h"
|
||||
#include "Trajet.h"
|
||||
|
||||
const uint LED_PIN = 25;
|
||||
const uint LED_PIN_ROUGE = 28;
|
||||
@ -38,6 +39,7 @@ int test_cde_vitesse_rectangle();
|
||||
int test_cde_vitesse_cercle();
|
||||
int test_asser_position_avance();
|
||||
int test_asser_position_avance_et_tourne();
|
||||
int test_trajectoire();
|
||||
void affiche_localisation();
|
||||
|
||||
int main() {
|
||||
@ -148,6 +150,7 @@ int mode_test(){
|
||||
printf("I - Asser Position - avance et tourne\n");
|
||||
printf("M - pour les moteurs\n");
|
||||
printf("L - pour la localisation\n");
|
||||
printf("T - Trajectoire\n");
|
||||
stdio_flush();
|
||||
int rep = getchar_timeout_us(TEST_TIMEOUT_US);
|
||||
stdio_flush();
|
||||
@ -204,9 +207,14 @@ int mode_test(){
|
||||
break;
|
||||
case 'L':
|
||||
case 'l':
|
||||
/* code */
|
||||
while(test_localisation());
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
case 't':
|
||||
while(test_trajectoire());
|
||||
break;
|
||||
|
||||
case PICO_ERROR_TIMEOUT:
|
||||
iteration--;
|
||||
if(iteration == 0){
|
||||
@ -222,6 +230,64 @@ int mode_test(){
|
||||
|
||||
}
|
||||
|
||||
void test_trajectoire_printf(){
|
||||
struct position_t _position;
|
||||
while(1){
|
||||
_position = Trajet_get_consigne();
|
||||
printf("T: %ld, X: %f, Y: %f, orientation: %2.1f\n", time_us_32()/1000, _position.x_mm, _position.y_mm, _position.angle_radian/M_PI*180);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int test_trajectoire(){
|
||||
int lettre, _step_ms = 1, temps_ms=0;
|
||||
Trajet_init();
|
||||
struct trajectoire_t trajectoire;
|
||||
printf("Choix trajectoire :\n");
|
||||
printf("B - Bezier\n");
|
||||
printf("C - Circulaire\n");
|
||||
printf("D - Droite\n");
|
||||
do{
|
||||
lettre = getchar_timeout_us(TEST_TIMEOUT_US);
|
||||
stdio_flush();
|
||||
}while(lettre == PICO_ERROR_TIMEOUT);
|
||||
switch(lettre){
|
||||
case 'b':
|
||||
case 'B':
|
||||
Trajectoire_bezier(&trajectoire, 0, 0, -200., 450, 250, 450, 0, 0);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case 'C':
|
||||
Trajectoire_circulaire(&trajectoire, 0, 250, -90, 90, 250);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
case 'D':
|
||||
Trajectoire_droite(&trajectoire, 0, 0, 0, 500);
|
||||
break;
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
|
||||
Trajet_debut_trajectoire(trajectoire);
|
||||
multicore_launch_core1(test_trajectoire_printf);
|
||||
do{
|
||||
// Routines à 1 ms
|
||||
QEI_update();
|
||||
Localisation_gestion();
|
||||
AsserMoteur_Gestion(_step_ms);
|
||||
|
||||
Trajet_avance(_step_ms/1000.);
|
||||
sleep_ms(_step_ms);
|
||||
temps_ms += _step_ms;
|
||||
lettre = getchar_timeout_us(0);
|
||||
}while(lettre == PICO_ERROR_TIMEOUT);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int test_asser_position_avance_et_tourne(){
|
||||
int lettre, _step_ms = 1, temps_ms=0;
|
||||
struct position_t position_consigne;
|
||||
|
Loading…
Reference in New Issue
Block a user