📈 Ruckig · gĂ©nĂ©ration de trajectoire en ligne

Chapitre 04
Les familles de profil

Objectifs du chapitre

1. Quand des phases disparaissent

Au chapitre prĂ©cĂ©dent, nous avons dĂ©composĂ© le profil limitĂ© en jerk en sept segments : trois pour monter en vitesse (jerk positif, accĂ©lĂ©ration constante, jerk nĂ©gatif), une croisiĂšre Ă  vitesse constante, puis trois symĂ©triques pour freiner. C'est le cas le plus riche — mais il n'apparaĂźt que pour de grands dĂ©placements sur des axes bien dĂ©gagĂ©s.

Dans la pratique, selon le dĂ©placement demandĂ© et les limites, certaines de ces sept phases ont une durĂ©e nulle. Un petit dĂ©placement n'a jamais le temps d'atteindre vₘₐₓ : la phase de croisiĂšre s'annule. Un dĂ©placement encore plus court n'atteint mĂȘme pas aₘₐₓ : les plateaux d'accĂ©lĂ©ration constante s'annulent aussi. Chaque combinaison de phases survivantes dĂ©finit une famille de profil.

Quatre mini-panneaux montrant l'allure de l'accélération dans le temps. VEL : deux trapÚzes d'accélération de signes opposés séparés par un long palier à zéro (croisiÚre), vmax atteinte. ACC0_ACC1 : deux trapÚzes qui atteignent amax et -amax mais sans palier de croisiÚre entre eux. NONE : deux triangles d'accélération, aucun plateau, ni amax ni vmax atteints. ACC0 : un trapÚze qui sature amax à l'accélération, puis un triangle à la décélération.
Figure 4.1. Quatre familles vues par l'allure de l'accĂ©lĂ©ration. VEL : la croisiĂšre est prĂ©sente, vₘₐₓ est atteinte. ACC0_ACC1 : les deux plateaux d'accĂ©lĂ©ration saturent aₘₐₓ, mais aucune croisiĂšre. NONE : accĂ©lĂ©ration purement triangulaire, ni aₘₐₓ ni vₘₐₓ. ACC0 : plateau saturĂ© Ă  l'accĂ©lĂ©ration seulement.

💡 Le nom de la famille est une liste de cases cochĂ©es : quelles saturations le profil rĂ©ussit-il Ă  atteindre ? Plus le dĂ©placement est petit, moins on coche de cases — et plus le profil est « maigre Â».

2. Les cinq familles

Regardons chaque famille par la forme de son accĂ©lĂ©ration. Le raisonnement est toujours le mĂȘme : de haut en bas, on retire d'abord la croisiĂšre, puis les plateaux d'accĂ©lĂ©ration.

Les indices 0 et 1 dĂ©signent respectivement le premier bloc (accĂ©lĂ©ration) et le second bloc (dĂ©cĂ©lĂ©ration). Ainsi le nom encode exactement oĂč l'accĂ©lĂ©ration sature : ACC0 = bloc 0 saturĂ©, ACC0_ACC1 = les deux, VEL = en plus, la vitesse sature.

∑ Chaque famille correspond Ă  un systĂšme d'Ă©quations diffĂ©rent : dĂšs qu'une phase disparaĂźt, sa durĂ©e tᔹ = 0 est fixĂ©e, et il reste moins d'inconnues. Le profil complet a sept tᔹ ; NONE n'en a plus que quatre non nuls. Chaque famille se rĂ©sout donc par une formule fermĂ©e qui lui est propre.

3. Deux directions de jerk : UDDU et UDUD

Tant que l'axe part du repos (v₀ = 0, a₀ = 0), l'ordre des signes de jerk est naturel : on accĂ©lĂšre (jerk +), on relĂąche (jerk −), on freine (jerk −), on relĂąche (jerk +). Mais lorsque l'Ă©tat initial n'est pas au repos — v₀ ≠ 0 ou a₀ ≠ 0 — la situation se complique.

Imaginez un axe qui file dĂ©jĂ  trop vite vers sa cible : il faut d'abord ralentir, quitte Ă  inverser l'accĂ©lĂ©ration, avant de pouvoir se recaler. Ou une accĂ©lĂ©ration initiale du « mauvais Â» signe qu'il faut d'abord rĂ©sorber. Selon les cas, l'ordonnancement des signes de jerk Ă  appliquer n'est pas le mĂȘme — d'oĂč deux candidats Ă  essayer, notĂ©s par la sĂ©quence des signes :

UDDU : Up — Down — Down — Up UDUD : Up — Down — Up — Down

ConcrÚtement, ce sont deux ordres de signes possibles pour les phases de jerk. Pour un déplacement donné, l'un des deux mÚne à une solution valide et l'autre non (ou à une solution plus lente). Le solveur ne le sait pas d'avance : il essaie les deux.

💡 Intuition : la famille rĂ©pond Ă  « combien de phases survivent ? Â», la direction rĂ©pond Ă  « dans quel ordre attaquer les signes de jerk pour partir de cet Ă©tat initial biscornu ? Â». Deux questions indĂ©pendantes.

4. La stratégie du solveur

Comment trouver, parmi toutes ces possibilitĂ©s, la trajectoire temps-optimale d'un seul axe ? Ruckig ne cherche pas « intelligemment Â» : il Ă©numĂšre. Pour un axe :

  1. parcourir toutes les combinaisons familles × 2 directions de jerk ;
  2. calculer chaque candidat en forme fermée (pas d'itération) grùce aux équations propres à sa famille ;
  3. Ă©carter les candidats infaisables : ceux qui violeraient une limite (vₘₐₓ, aₘₐₓ) ou qui donnent des durĂ©es de phase nĂ©gatives (physiquement impossibles) ;
  4. parmi les survivants, garder le profil de durée minimale.

C'est exactement ce que fait le Step 1 dĂ©taillĂ© au chapitre suivant : la solution temps-optimale d'un axe isolĂ©. Comme chaque candidat se calcule directement, l'Ă©numĂ©ration complĂšte reste trĂšs rapide — parfaitement compatible avec un cycle temps rĂ©el.

⚠ Ne confondez pas la famille (quelles phases existent : NONE, ACC0, ACC1, ACC0_ACC1, VEL) et la direction (l'ordre des signes de jerk : UDDU ou UDUD). Ce sont deux axes de recherche indĂ©pendants : le solveur explore leur produit, pas l'un ou l'autre. Un mĂȘme profil est identifiĂ© par le couple (famille, direction).

5. Dans ruckig-scl

🔧 La FC ComputeProfile1Axis est le solveur temps-optimal 1-DoF : elle Ă©numĂšre les familles × 2 directions de jerk, calcule chacune en forme fermĂ©e, rejette les candidats infaisables, et conserve celui de durĂ©e minimale. La FC SolveDirection traite, elle, toutes les familles pour une seule direction de jerk.

Les familles portent des noms explicites : NONE, ACC0, ACC1, ACC0_ACC1, VEL ; les deux directions sont UDDU et UDUD. Pour les Ă©tats initiaux pathologiques, il existe des familles de repli « two-step Â» — TwoStepNone, TwoStepAcc0, TwoStepVel, TwoStepAcc1Vel — qui rattrapent les cas oĂč l'Ă©numĂ©ration standard Ă©choue.

// SCL — schĂ©ma du solveur 1-DoF (pseudo-structure)
FOR dir := UDDU TO UDUD DO           // 2 directions de jerk
    #ok := "SolveDirection"(dir, ...); // essaie toutes les familles
    IF #ok AND (#cand.duration < #best.duration) THEN
        #best := #cand;              // garde le plus court FAISABLE
    END_IF;
END_FOR;

Récapitulatif