Correction de bug : dans certains cas, le calcul de déplacement sur une courbe de bézier restait bloqué dans une boucle.
This commit is contained in:
parent
a506ece7ce
commit
366329ccdf
@ -7,6 +7,7 @@
|
|||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
#define PRECISION_ABSCISSE 0.001f
|
#define PRECISION_ABSCISSE 0.001f
|
||||||
|
#define NB_MAX_ITERATIONS 3
|
||||||
|
|
||||||
|
|
||||||
void Trajectoire_circulaire(struct trajectoire_t * trajectoire, float centre_x, float centre_y, float angle_debut_rad,
|
void Trajectoire_circulaire(struct trajectoire_t * trajectoire, float centre_x, float centre_y, float angle_debut_rad,
|
||||||
@ -172,16 +173,18 @@ float Trajectoire_avance(struct trajectoire_t * trajectoire, double abscisse, do
|
|||||||
if(trajectoire->type == TRAJECTOIRE_CIRCULAIRE || trajectoire->type == TRAJECTOIRE_DROITE){
|
if(trajectoire->type == TRAJECTOIRE_CIRCULAIRE || trajectoire->type == TRAJECTOIRE_DROITE){
|
||||||
return abscisse + delta_abscisse;
|
return abscisse + delta_abscisse;
|
||||||
}
|
}
|
||||||
|
|
||||||
delta_mm = distance_points(Trajectoire_get_point(trajectoire, abscisse).point_xy, Trajectoire_get_point(trajectoire, abscisse + delta_abscisse).point_xy );
|
delta_mm = distance_points(Trajectoire_get_point(trajectoire, abscisse).point_xy, Trajectoire_get_point(trajectoire, abscisse + delta_abscisse).point_xy );
|
||||||
|
|
||||||
// Sur les trajectoires de bézier, il peut être nécessaire d'affiner
|
// 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.
|
// Les cas où l'algorythme diverge ne devraient pas se produire car distance_cm << longeur_trajectoire.
|
||||||
erreur_relative = 1 - delta_mm / distance_mm;
|
erreur_relative = 1 - delta_mm / distance_mm;
|
||||||
while(fabs(erreur_relative) > PRECISION_ABSCISSE){
|
int nb_iteration=0;
|
||||||
|
while(fabs(erreur_relative) > PRECISION_ABSCISSE && nb_iteration < NB_MAX_ITERATIONS){
|
||||||
delta_abscisse = delta_abscisse * distance_mm / delta_mm;
|
delta_abscisse = delta_abscisse * distance_mm / delta_mm;
|
||||||
delta_mm = distance_points(Trajectoire_get_point(trajectoire, abscisse).point_xy, Trajectoire_get_point(trajectoire, abscisse + delta_abscisse).point_xy );
|
delta_mm = distance_points(Trajectoire_get_point(trajectoire, abscisse).point_xy, Trajectoire_get_point(trajectoire, abscisse + delta_abscisse).point_xy );
|
||||||
erreur_relative = 1 - delta_mm / distance_mm;
|
erreur_relative = 1 - delta_mm / distance_mm;
|
||||||
|
nb_iteration++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return abscisse + delta_abscisse;
|
return abscisse + delta_abscisse;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// Changer le define en fonction qu'on soit sur les PAMIs ou sur le robot principal
|
// Changer le define en fonction qu'on soit sur les PAMIs ou sur le robot principal
|
||||||
|
|
||||||
#define ROBOT_PROPULSION_2026
|
//#define ROBOT_PROPULSION_2026
|
||||||
//#define ROBOT_TYPE_PAMI
|
#define ROBOT_TYPE_PAMI
|
||||||
|
|
||||||
#ifndef ROBOT_PROPULSION_2026
|
#ifndef ROBOT_PROPULSION_2026
|
||||||
#ifndef ROBOT_TYPE_PAMI
|
#ifndef ROBOT_TYPE_PAMI
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user