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

Chapitre 07
Multi-axes & synchronisation

Objectifs du chapitre

1. Le problĂšme multi-axes

Jusqu'ici nous avons rĂ©solu la trajectoire d'un seul axe. Un robot ou une machine en pilote plusieurs — dans ruckig-scl, jusqu'Ă  4 degrĂ©s de libertĂ© (DoF). Chaque axe possĂšde ses propres limites (vₘₐₓ, aₘₐₓ, jₘₐₓ) et son propre dĂ©placement Ă  parcourir. Le Step 1 (chapitre 5) donne pour chaque axe d sa durĂ©e temps-optimale t_min,d.

Or ces durĂ©es n'ont aucune raison d'ĂȘtre Ă©gales : un axe qui parcourt un grand angle mettra plus longtemps qu'un axe qui bouge Ă  peine. Sans coordination, chaque axe atteint sa cible Ă  un instant diffĂ©rent — le mouvement d'ensemble semble dĂ©sordonnĂ©, et le chemin suivi dans l'espace articulaire est imprĂ©visible.

À gauche : deux courbes de position dans le temps, l'axe 1 (bleu) atteint sa cible tĂŽt, l'axe 2 (orange) plus tard ; les deux fins de mouvement ne coĂŻncident pas. À droite : les mĂȘmes deux axes re-cadencĂ©s Ă  une durĂ©e commune t_sync ; l'axe 1 rapide a Ă©tĂ© ralenti pour finir exactement en mĂȘme temps que l'axe 2 lent.
Figure 7.1. À gauche, deux axes indĂ©pendants : l'axe 1 (bleu) atteint sa cible bien avant l'axe 2 (orange). À droite, aprĂšs synchronisation temporelle : l'axe rapide est ralenti pour arriver Ă  la mĂȘme durĂ©e commune t_sync que l'axe limitant.

2. Synchronisation temporelle (Time)

C'est le mode par dĂ©faut. L'idĂ©e : imposer Ă  tous les axes une durĂ©e commune t_sync, puis re-cadencer chaque axe pour qu'il consomme exactement cette durĂ©e. On applique alors Ă  chaque axe le Step 2 (chapitre 6), qui recalcule un profil limitĂ© en jerk s'exĂ©cutant en une durĂ©e imposĂ©e.

La durĂ©e commune ne peut Ă©videmment pas ĂȘtre plus courte que le plus lent des axes : celui-ci est dĂ©jĂ  Ă  son temps-optimal et ne peut pas aller plus vite. On l'appelle l'axe limitant, et c'est lui qui fixe t_sync. Tous les autres, plus rapides, sont ralentis jusqu'Ă  cette durĂ©e — c'est ce que montre le panneau droit de la figure 7.1 : l'axe 1, qui finissait tĂŽt, adopte un profil plus doux et arrive dĂ©sormais en mĂȘme temps que l'axe 2.

Un dĂ©tail crucial vient du Step 2 : rappelons qu'un axe possĂšde des intervalles de durĂ©e bloquĂ©s (chapitre 5) — des durĂ©es irrĂ©alisables pour ses limites de jerk. La durĂ©e commune doit donc ĂȘtre valide pour tous les axes Ă  la fois : on prend le maximum des t_min, mais en Ă©vitant les intervalles bloquĂ©s de chaque axe.

∑ La durĂ©e de synchronisation satisfait :

t_sync ≄ max_d ( t_min,d ) , t_sync ∉ ⋃_d BloquĂ©_d

On part de max_d(t_min,d) ; si cette valeur tombe dans un intervalle bloquĂ© d'un axe, on l'augmente jusqu'Ă  la premiĂšre durĂ©e rĂ©alisable par tous les axes. Chaque axe est ensuite re-cadencĂ© Ă  ce t_sync par le Step 2.

💡 Intuition : synchroniser, c'est ralentir les axes rapides pour attendre le plus lent — jamais accĂ©lĂ©rer le plus lent au-delĂ  de son temps-optimal. L'axe limitant donne le tempo ; les autres s'alignent sur lui.

3. Synchronisation de phase (Phase)

La synchro temporelle garantit que tous les axes arrivent ensemble, mais pas qu'ils suivent la mĂȘme forme de mouvement : entre le dĂ©part et l'arrivĂ©e, le chemin dans l'espace articulaire peut se courber. Pour certaines applications — chemins prĂ©visibles, absence de dĂ©passement de trajectoire — on prĂ©fĂšre un mouvement en ligne droite dans l'espace articulaire.

C'est possible lorsque les dĂ©placements de tous les axes sont colinĂ©aires : leurs vecteurs d'Ă©cart d'Ă©tat pointent dans la mĂȘme direction (Ă  un facteur d'Ă©chelle prĂšs). Dans ce cas, tous les axes suivent le mĂȘme profil temporel — celui de l'axe limitant — simplement mis Ă  l'Ă©chelle par le ratio de dĂ©placement de chaque axe. Comme leurs positions restent proportionnelles Ă  chaque instant, la trajectoire rĂ©sultante est une droite.

Plan des deux axes : position de l'axe 1 en abscisse, position de l'axe 2 en ordonnĂ©e. Une trajectoire Phase relie le point de dĂ©part au point d'arrivĂ©e par une ligne droite. Une trajectoire Time relie les mĂȘmes points par une courbe qui s'Ă©carte de la droite.
Figure 7.2. Dans le plan des deux axes, la synchro Phase trace une ligne droite du dĂ©part Ă  la cible, alors que la synchro Time — qui garantit seulement l'arrivĂ©e simultanĂ©e — suit un chemin courbe. MĂȘme point de dĂ©part, mĂȘme point d'arrivĂ©e, mĂȘme durĂ©e : seul le chemin diffĂšre.

ConcrĂštement, chaque axe reçoit le timing de l'axe limitant, et son jerk est mis Ă  l'Ă©chelle par le ratio de son dĂ©placement Ă  celui de l'axe limitant. Les profils sont ainsi des copies homothĂ©tiques : mĂȘmes instants de commutation, amplitudes proportionnelles.

Si la condition de colinĂ©aritĂ© n'est pas remplie — les axes doivent partir dans des directions incompatibles — la phase est impossible et Ruckig se replie automatiquement sur la synchro Time. On ne perd donc jamais l'arrivĂ©e simultanĂ©e ; on renonce seulement Ă  la ligne droite.

4. Pas de synchronisation, et les autres modes

Le mode No renonce à toute coordination : chaque axe court à son propre t_min, indépendamment des autres. La durée de la trajectoire globale vaut alors simplement le max des durées d'axe, mais les axes rapides atteignent leur cible en avance et y restent immobiles en attendant les autres.

Ruckig propose encore quelques variantes :

⏱ La synchronisation ne coĂ»te pas d'itĂ©ration : une fois t_sync dĂ©terminĂ©, chaque axe est traitĂ© par le Step 2 en forme fermĂ©e. Le surcoĂ»t par cycle reste bornĂ© et proportionnel au nombre de DoF (≀ 4) — parfaitement compatible avec un cycle temps rĂ©el.

🔧 Dans ruckig-scl, la FC Synchronize calcule la durĂ©e commune t_sync ≄ max(t_min) en Ă©vitant les intervalles bloquĂ©s de chaque axe (d'oĂč le Block introduit au chapitre 5), puis re-cadence chaque axe par le Step 2. La FC PhaseSynchronize gĂšre la synchro « Phase Â» : elle teste la colinĂ©aritĂ© des Ă©carts d'Ă©tat par axe ; si colinĂ©aires, chaque axe suit le timing de l'axe limitant avec le jerk mis Ă  l'Ă©chelle par le ratio de dĂ©placement (mouvement en ligne droite dans l'espace articulaire) ; sinon elle se replie sur Time.

Les modes sont des constantes INT dans le DB dbRuckigConst : SYNC_TIME (défaut, tous arrivent ensemble), Phase, No (chaque axe indépendant à son t_min), plus per-DoF (chaque axe son propre mode), TimeIfNecessary (synchronisé seulement si la cible bouge) et Discrete (t_sync arrondi au multiple supérieur de cycleTime). Le tout est limité à 4 DoF.

Récapitulatif