🤖 Cinématique robotique · sur automate (PLC)

Chapitre 07
Calibration robotique

Objectifs du chapitre

1. Répétabilité n'est pas exactitude

Un robot industriel est nativement très répétable : envoyez-le cent fois à la même consigne articulaire, il revient à la même pose physique à  0,02–0,1 mm près. C'est ce que garantit sa mécanique de qualité et ses codeurs. Mais lui demander d'atteindre une pose cartésienne calculée sur le papier — via la cinématique inverse à partir de la table DH du constructeur — révèle une tout autre réalité : l'exactitude absolue est souvent médiocre, de l'ordre de  0,5–2 mm, parfois pire.

NotionDéfinitionOrdre de grandeur typiqueAméliorée par
Répétabilitédispersion des poses atteintes pour une même consigne, répétée0,02 – 0,1 mmla mécanique (native, rien à faire)
Exactitude absolueécart entre la pose commandée (calculée) et la pose réelle0,5 – 2 mmla calibration

La cause est simple : le modèle géométrique embarqué utilise les paramètres nominaux (les cotes du plan), alors que le robot posé devant vous a des paramètres réels légèrement différents. Les sources d'écart s'accumulent : tolérances de fabrication (un segment long de 400,00 mm au plan mesure 400,12 mm), assemblage (axes pas exactement parallèles ou perpendiculaires), usure, flexion sous la gravité, et dilatation thermique. Chaque écart, propagé le long de la chaîne cinématique, se traduit à l'effecteur par une erreur de pose amplifiée par les bras de levier.

La calibration consiste à identifier les paramètres réels du robot à partir de mesures, puis à corriger le modèle. On rehausse ainsi l'exactitude absolue jusqu'au niveau de la répétabilité (typiquement < 0,2 mm après calibration cinématique). C'est indispensable dès qu'on veut :

Ne confondez jamais les deux. Une fiche technique qui annonce « répétabilité ±0,03 mm » ne dit rien de l'exactitude absolue, qui peut être 30 fois pire. Un robot « précis » au sens répétable peut viser systématiquement 1 mm à côté de la cible calculée. La calibration ne touche pas la répétabilité (déjà excellente) : elle attaque uniquement l'exactitude.

2. Trois niveaux de calibration

La littérature classe la calibration en trois niveaux emboîtés, du plus simple au plus complet. Chaque niveau supérieur englobe et raffine le précédent.

NiveauNomCe qu'on identifieNb. de paramètres (bras 6 axes)Fréquence / effort
1 Calibration articulaire
(« mastering »)
les offsets de zéro des codeurs : un Δθ par axe 6 (un par axe) très fréquent, simple, souvent guidé par le constructeur
2 Calibration cinématique
(géométrique)
tout le modèle géométrique réel : Δa, Δα, Δd, Δθ de chaque liaison ≈ 24–30 (≈ 4 par liaison) occasionnel, cœur de ce chapitre, métrologie requise
3 Calibration non géométrique raideurs articulaires, jeu (backlash) des réducteurs, flexibilité des segments, effets thermiques, effet de la charge variable, modèle enrichi (souvent +10 à +40) rare, haut de gamme, modèle complexe

Le niveau 1 est de loin le plus courant : après un choc, un changement de moteur ou une perte de référence codeur, on « remaître » le robot en amenant chaque axe sur un repère mécanique et en ré-inscrivant l'offset de zéro. C'est indispensable mais insuffisant pour l'exactitude absolue, car il ne corrige pas la géométrie des segments.

Le niveau 2 est le cœur du présent chapitre : il identifie l'ensemble de la table DH réelle (ou MDH / Hayati, cf. chapitre 4). Bien mené, il ramène l'exactitude au niveau de la répétabilité. Le niveau 3 va plus loin en modélisant les déformations dépendant de la charge et de la configuration — utile pour les très hautes exigences (mesure, usinage robotisé), mais avec un modèle nettement plus lourd à identifier et à embarquer.

Un modèle vaut ce que vaut son identification. Ajouter des paramètres au modèle (niveau 3) n'améliore l'exactitude que si ces paramètres sont réellement observables dans vos mesures (section 4). Un modèle plus riche mal identifié est souvent moins bon qu'un modèle simple bien identifié.

3. Modèle d'erreur et identification

3.1 Linéarisation : le jacobien d'identification

Notons φ le vecteur de tous les paramètres géométriques (les a, α, d, θ de chaque liaison, empilés). La cinématique directe donne la pose de l'effecteur p = FK(q, φ) pour une configuration articulaire q. Le robot réel a des paramètres φ = φnom + δφ légèrement décalés du nominal. Au premier ordre, l'erreur de pose s'écrit comme une combinaison linéaire des erreurs de paramètres :

δp = FK(q, φ) − FK(q, φnom) ≈ Jid(q) · δφ,    avec  [Jid]·k = ∂ FK(q, φ) / ∂ φk

La matrice Jid est le jacobien d'identification : sa colonne k est la sensibilité de la pose au paramètre φk. À ne pas confondre avec le Jacobien géométrique du chapitre 6 (qui dérive par rapport aux variables articulaires q) : ici on dérive par rapport aux paramètres du modèle φ. En pratique, on obtient chaque colonne très commodément par différences finies sur la FK (exercice 1).

3.2 Empiler les mesures et résoudre au sens des moindres carrés

On place le robot dans N configurations q(1), …, q(N) et on mesure la pose réelle (ou au moins la position) de l'effecteur avec une métrologie externe (section 5). Pour chaque configuration on forme le résidu entre pose mesurée et pose prédite : δp(i) = pmesurée(i) − FK(q(i), φ). En empilant les N équations δp(i) ≈ Jid(q(i)) · δφ, on obtient un grand système linéaire (fortement surdéterminé : bien plus d'équations que de paramètres). On le résout au sens des moindres carrés — les fameuses équations normales :

δφ = ( JidT Jid )⁻¹ JidT δp   ⟺    ( JidT Jid ) δφ = JidT δp

Jid et δp sont empilés sur toutes les mesures. Comme le modèle n'est linéaire qu'au premier ordre, on itère : on met à jour φ ← φ + δφ, on recalcule les résidus et le jacobien, et on recommence jusqu'à ce que ‖δp‖ cesse de décroître (Σ des carrés des résidus stabilisée). En pratique on préfère Levenberg-Marquardt, qui interpole entre la descente de gradient (robuste, loin de la solution) et Gauss-Newton (rapide, près de la solution) via un terme d'amortissement λ :

( JidT Jid + λ·diag(JidT Jid) ) δφ = JidT δp

Levenberg-Marquardt est plus robuste : il converge même quand les équations normales sont mal conditionnées (le terme λ régularise), ce qui arrive fréquemment en calibration à cause des paramètres peu observables (section 4).

C'est un calcul lourd, pas cyclique. Inverser une matrice ≈ 30×30, sur des dizaines à des centaines de poses, en itérant Levenberg-Marquardt : cela prend des millisecondes à des secondes sur un PC. Ce n'est pas destiné à la tâche temps réel 1 kHz de l'automate. On le fait hors ligne (section 7). Ce qui tourne en ligne, c'est seulement la FK avec les paramètres déjà corrigés — quelques microsecondes.

4. Identifiabilité des paramètres

Toute la difficulté théorique de la calibration cinématique tient en un mot : identifiabilité. Certains paramètres sont redondants ou non observables — les mesures ne contiennent tout simplement pas l'information pour les distinguer. Le cas d'école est le couplage d / θ sur axes parallèles : quand deux axes consécutifs sont (presque) parallèles, la convention DH classique devient discontinue — une petite variation réelle produit un saut du paramètre d vers l'infini. C'est précisément pour cela qu'on introduit la convention de Hayati (le paramètre β, cf. chapitre 4) pour ces liaisons : elle rend le modèle continu et identifiable.

Un bon modèle d'identification doit être :

Le conditionnement de la matrice d'identification renseigne sur l'observabilité : un jacobien mal conditionné (grande valeur de cond(Jid), c.-à-d. rapport valeur singulière max / min très élevé) signale des paramètres mal observés — leur estimation sera bruitée ou instable. On choisit alors les configurations de mesure pour améliorer l'observabilité : c'est l'optimisation d'observabilité. On la quantifie par des indices O1–O5 construits sur les valeurs singulières σi de Jid (produit, minimum, minimum/maximum, etc.) et on sélectionne le jeu de poses qui les maximise. Intuitivement : des poses bien réparties dans tout l'espace de travail, sollicitant chaque axe sur une large plage, valent beaucoup mieux qu'une grappe de poses voisines.

Le sur-paramétrage fait « exploser » les paramètres. Si vous mettez dans le modèle un paramètre non identifiable (redondant, ou non observable dans vos poses), les moindres carrés vont lui affecter une valeur énorme et absurde pour absorber le bruit — souvent compensée par une valeur énorme et opposée sur un autre paramètre. Le modèle « colle » alors aux mesures d'apprentissage mais généralise mal. Symptômes : un δφ gigantesque, un conditionnement catastrophique. Remèdes : modèle minimal (Hayati sur axes parallèles), régularisation (Levenberg-Marquardt), et validation indépendante (section 6).

5. Les méthodes de mesure

Identifier δφ suppose de comparer la pose prédite à une pose réelle — donc de mesurer quelque chose sur le robot physique. Les méthodes se classent selon ce qu'elles mesurent et avec quel équipement. C'est le choix le plus structurant d'un projet de calibration : il conditionne le coût, la précision et la faisabilité sur site.

5.1 Open-loop — métrologie externe de la pose

On mesure directement la pose (ou au moins la position) de l'effecteur dans un repère externe, avec un instrument de métrologie : laser tracker (le plus répandu, très précis), bras de mesure / CMM, photogrammétrie / vision stéréo, théodolites, capteurs laser. On dispose alors de la mesure complète et on identifie tout le modèle.

5.2 Closed-loop — auto-calibration basée contraintes

Plutôt que de mesurer une pose absolue, on impose au robot des contraintes physiques connues et on exploite le fait qu'elles doivent être satisfaites : pointer la TCP sur un point fixe depuis plusieurs orientations, la contraindre sur un plan, maintenir une distance fixe (barre étalon ball-bar ou double-ball-bar télescopique), ou utiliser des capteurs redondants embarqués. Les résidus sur la contrainte (le point n'est pas exactement fixe selon le modèle) nourrissent l'identification.

5.3 Screw axis measurement — analyse cercle-point

On bouge un seul axe à la fois. Un point de l'effecteur décrit alors un cercle dans l'espace. En ajustant (fit) ce cercle (et son plan), on identifie directement la position et la direction de l'axe articulaire correspondant — c'est-à-dire sa vis (screw axis). En répétant pour chaque axe, on reconstruit géométriquement toute la chaîne.

5.4 Vision / méthodes autonomes et bas coût

Enfin, des méthodes vision (caméra embarquée observant une mire fixe, ou fixe observant une mire sur l'effecteur), la contrainte planaire, ou la self-calibration par caméra embarquée offrent un compromis bas coût et automatisable : pas d'instrument dédié coûteux, procédure programmable. La contrepartie est une précision variable, dépendante de la résolution caméra, de la calibration de la caméra elle-même et des conditions d'éclairage.

5.5 Tableau comparatif

MéthodeCoûtPrécisionParamètres identifiablesSur site / en production
Open-loop (laser tracker, CMM, photogrammétrie) Élevé à très élevé Excellente (µm – dizaines de µm) Tout le modèle (pose complète) Difficile (métrologie lourde, hors prod.)
Closed-loop (point fixe, plan, ball-bar) Faible Moyenne Sous-ensemble (contraintes partielles) Oui (peu de métrologie externe)
Screw axis / circle point Faible à modéré Bonne (sensible au bruit sur petits arcs) Géométrie des axes (position + direction) Oui, mais axe par axe
Vision / autonome / planaire Faible Variable (dépend de la caméra) Variable selon le montage Oui, automatisable

6. Procédure type de bout en bout

Une campagne de calibration cinématique suit toujours la même trame ordonnée :

  1. Choisir le modèle. Sélectionner la paramétrisation : MDH, Hayati pour les axes parallèles, ou POE (produit d'exponentielles). Objectif : complet, minimal, continu (section 4).
  2. Choisir la métrologie. Selon budget et exigence : open-loop (laser tracker) pour la précision maximale, closed-loop pour un coût minimal sur site (section 5).
  3. Collecter N poses bien distribuées. Générer des configurations qui maximisent l'observabilité (indices O1–O5), réparties dans tout l'espace de travail. Positionner le robot, laisser stabiliser, mesurer, horodater.
  4. Identifier par LS / Levenberg-Marquardt. Empiler résidus et jacobien d'identification, résoudre, itérer jusqu'à convergence (section 3).
  5. Valider sur un jeu indépendant. Réserver un ensemble de poses non utilisées pour l'identification et y mesurer l'erreur résiduelle. C'est le seul juge honnête de la qualité : cela détecte le sur-apprentissage (exercice 3).
  6. Mettre à jour le modèle du contrôleur. Inscrire les paramètres corrigés dans le robot / l'automate, en mémoire persistante, pour que la FK (et l'IK) les utilisent (section 7).

Séparez toujours apprentissage et validation. Réservez p. ex. 70 % des poses à l'identification et 30 % à la validation. Une erreur résiduelle faible en apprentissage mais élevée en validation = sur-apprentissage : votre modèle a « appris le bruit ». Réduisez alors le nombre de paramètres ou améliorez la distribution des poses.

7. Mise en œuvre sur automate

Le partage des rôles entre le PC/outil d'identification et l'automate est le point de conception clé de ce chapitre.

L'identification ne va PAS dans la boucle temps réel. Levenberg-Marquardt, l'inversion de grands systèmes, l'itération sur des dizaines de poses : c'est un calcul hors ligne, sur PC ou dans un outil dédié — ou, à la rigueur, dans une tâche de fond basse priorité de l'automate. Jamais dans la tâche cyclique 1 kHz. L'automate, lui, (a) pilote la collecte (positionnement aux poses de mesure, horodatage, acquisition des mesures) ; (b) stocke les paramètres calibrés en mémoire rémanente / persistante (VAR RETAIN ou recette) ; (c) exécute la FK (chapitre 5) avec ces paramètres corrigés à chaque cycle ; (d) peut appliquer en ligne une simple correction d'offset articulaire (niveau 1).

Concrètement, on stocke les corrections dans une structure persistante, une par liaison, puis on les ajoute à la table DH nominale juste avant d'appeler la FK. La géométrie nominale reste intacte (traçabilité), la correction est isolée et rechargeable comme une recette.

// ---- Correction géométrique calibrée, par liaison ----
// Δa, Δα, Δd, Δθ sont les écarts identifiés hors ligne
// (paramètres RÉELS − paramètres NOMINAUX). Voir chapitre 4 (MDH/Hayati).
TYPE T_CALIB_LINK :
STRUCT
    d_theta : LREAL;   // rad — offset de zéro (niveau 1) + correction géométrique
    d_d     : LREAL;   // m
    d_a     : LREAL;   // m
    d_alpha : LREAL;   // rad
END_STRUCT
END_TYPE

// Table de correction complète d'un bras 6 axes, en mémoire persistante.
TYPE T_CALIB : ARRAY[0..5] OF T_CALIB_LINK; END_TYPE

// Déclaration côté programme : RETAIN => survit à l'arrêt/redémarrage.
// On la charge une fois (recette) après identification hors ligne.
VAR RETAIN
    gCalib : T_CALIB;    // corrections calibrées, chargées après identification
END_VAR

La fonction ci-dessous fabrique la table DH corrigée à partir de la table nominale et des corrections calibrées. On l'appelle une fois (les corrections sont constantes), et le résultat alimente FB_ForwardKinematics (chapitre 5) à chaque cycle.

// Applique la correction calibrée à la table DH nominale.
// dhNom  : table du constructeur (nominale, inchangée).
// calib  : corrections identifiées hors ligne (gCalib).
// dhCal  : table corrigée, à passer ensuite à la FK.
FUNCTION ApplyCalibration : BOOL
VAR_IN_OUT
    dhNom : ARRAY[0..5] OF T_DH;    // nominale (lecture)
    calib : T_CALIB;               // corrections (lecture)
    dhCal : ARRAY[0..5] OF T_DH;   // corrigée (écriture)
END_VAR
VAR
    i : INT;
END_VAR
    FOR i := 0 TO 5 DO
        // On recopie la liaison nominale puis on ajoute la correction.
        dhCal[i].isPrismatic := dhNom[i].isPrismatic;
        dhCal[i].theta := dhNom[i].theta + calib[i].d_theta;   // rad
        dhCal[i].d     := dhNom[i].d     + calib[i].d_d;        // m
        dhCal[i].a     := dhNom[i].a     + calib[i].d_a;        // m
        dhCal[i].alpha := dhNom[i].alpha + calib[i].d_alpha;    // rad
    END_FOR
    ApplyCalibration := TRUE;
END_FUNCTION

Le flux global tient en une phrase : hors ligne on identifie δφ et on l'inscrit dans gCalib ; en ligne, ApplyCalibration produit dhCal, et la FK tourne sur dhCal — exacte, en quelques microsecondes, dans le cycle.

Persistance et unités. Oublier le RETAIN (ou son équivalent recette) et vos corrections s'évaporent au prochain redémarrage : le robot repart en nominal, exactitude dégradée, sans alarme. Autre piège classique : mélanger degrés et radians dans d_theta/d_alpha — comme partout dans le cours, ces corrections angulaires sont en radians, les corrections de longueur en mètres.

8. Les pièges de la calibration

Les cinq pièges à connaître. (1) Sur-apprentissage — trop de paramètres : le modèle colle au bruit, excellent en apprentissage, médiocre en validation. (2) Paramètres non identifiables — redondants ou non observables : leur estimation « explose » (valeurs absurdes, souvent compensées entre elles), conditionnement catastrophique. (3) Température — le robot se dilate pendant la campagne ; mesurer sur plusieurs heures avec un robot qui chauffe pollue l'identification. Laisser stabiliser thermiquement, mesurer dans des conditions constantes. (4) Diversité insuffisante des poses — une grappe de poses voisines n'excite pas tous les paramètres : mauvaise observabilité, identification bruitée. (5) Confondre répétabilité et exactitude — croire qu'un robot répétable est exact, ou valider la calibration sur la répétabilité au lieu de l'exactitude absolue.

Exercices

Exercice 1 — Une colonne du jacobien d'identification par différences finies

On veut la colonne de Jid correspondant au paramètre a de la liaison k. Écrivez une fonction qui, pour une configuration q donnée, calcule la sensibilité de la position de l'effecteur à ce paramètre par ( FK(ak + δ) − FK(ak) ) / δ. On suppose disponibles FB_ForwardKinematics (chapitre 5), qui remplit une pose T_POSE à partir d'un T_ROBOT6.

Voir la solution
// Colonne de J_id pour le paramètre a de la liaison k : sensibilité de
// la position (x,y,z) de l'effecteur, par différence finie avant.
FUNCTION IdColumn_a : BOOL
VAR_IN_OUT
    robot : T_ROBOT6;    // table DH + q (lecture)
    k     : INT;         // indice de liaison
    col   : T_VEC3;      // résultat : d(pos)/d(a_k)  (écriture)
END_VAR
VAR
    fk        : FB_ForwardKinematics;
    p0, p1    : T_POSE;
    aSave     : LREAL;
    delta     : LREAL := 1.0E-6;   // m — petit pas
    robotPert : T_ROBOT6;          // copie perturbée
    i         : INT;
END_VAR
    // 1) Pose nominale.
    fk(robot := robot, pose => p0);

    // 2) Copie du robot, puis perturbation du seul paramètre a_k.
    robotPert := robot;                 // copie de la structure entière
    aSave := robotPert.dh[k].a;
    robotPert.dh[k].a := aSave + delta;

    // 3) Pose perturbée.
    fk(robot := robotPert, pose => p1);

    // 4) Différence finie composante par composante.
    col[0] := (p1.x - p0.x) / delta;
    col[1] := (p1.y - p0.y) / delta;
    col[2] := (p1.z - p0.z) / delta;

    IdColumn_a := TRUE;
END_FUNCTION

On répète pour Δα, Δd, Δθ de chaque liaison pour obtenir toutes les colonnes ; la partie orientation de Jid se traite de même sur la matrice de rotation. Le pas δ doit être petit (linéarisation) mais pas au point de noyer la différence dans les erreurs d'arrondi LREAL : 10−6 est un bon compromis. La différence centrée ( FK(a+δ) − FK(a−δ) ) / (2δ) est plus précise si le budget de calcul le permet.

Exercice 2 — Appliquer un offset calibré avant la FK

On a identifié pour la liaison 2 un écart de longueur Δa2 = +0,15 mm et un offset de zéro Δθ2 = −0,002 rad. Montrez comment charger ces valeurs dans gCalib puis obtenir la table DH corrigée à passer à la FK.

Voir la solution
PROGRAM P_ChargeCalib
VAR
    robot  : T_ROBOT6;                 // contient dh nominale + q
    dhCal  : ARRAY[0..5] OF T_DH;      // table corrigée pour la FK
    fk     : FB_ForwardKinematics;
    pose   : T_POSE;
END_VAR

// --- 1) Charger les corrections identifiées (une seule fois, ex. recette) ---
// ATTENTION unités : mètres et radians, pas de mm ni de degrés.
gCalib[2].d_a     := 0.15 / 1000.0;    // 0,15 mm -> 0,00015 m
gCalib[2].d_theta := -0.002;           // rad
// (les autres liaisons restent à 0 si non calibrées)

// --- 2) Fabriquer la table corrigée à partir de la nominale ---
ApplyCalibration(dhNom := robot.dh, calib := gCalib, dhCal := dhCal);

// --- 3) FK sur la table CORRIGEE ---
// On substitue dhCal à la table nominale du robot avant l'appel.
robot.dh := dhCal;
fk(robot := robot, pose => pose);
// 'pose' est maintenant l'estimation EXACTE (modèle calibré).

Point clé : la conversion aux frontières (0,15 mm → 0,00015 m). La table nominale reste stockée telle quelle ; seule la copie dhCal porte la correction, ce qui garde la traçabilité et permet de revenir au nominal à tout moment.

Exercice 3 — Pourquoi valider sur un jeu indépendant ?

Après identification, l'erreur moyenne résiduelle sur les 50 poses d'apprentissage vaut 0,05 mm. Sur 20 poses de validation non utilisées, elle vaut 0,9 mm. Qu'en concluez-vous ? Qu'auriez-vous mesuré si vous n'aviez validé que sur l'apprentissage ?

Voir la solution

L'écart énorme entre apprentissage (0,05 mm) et validation (0,9 mm) est la signature d'un sur-apprentissage : le modèle a « appris le bruit » des 50 poses au lieu de la vraie géométrie. Typiquement, trop de paramètres (dont des non identifiables) ont pris des valeurs absurdes qui minimisent le résidu d'apprentissage sans améliorer la physique.

Si l'on n'avait regardé que l'apprentissage, on aurait cru la calibration excellente (0,05 mm) et déployé un robot en réalité exact à seulement 0,9 mm — pire, peut-être, que certaines zones non couvertes. Seule la validation indépendante mesure la capacité de généralisation, c'est-à-dire l'exactitude réelle sur des poses nouvelles. Remèdes : réduire le nombre de paramètres (modèle minimal, Hayati sur axes parallèles), régulariser (Levenberg-Marquardt), et améliorer la distribution des poses d'apprentissage (observabilité).

Exercice 4 — Répétabilité vs exactitude, chiffré

On envoie dix fois le robot à la même consigne et on mesure les positions atteintes ; elles sont toutes dans une sphère de rayon 0,03 mm, centrée en un point P situé à 1,2 mm de la cible théorique. Donnez la répétabilité et l'exactitude absolue. Laquelle la calibration améliore-t-elle ?

Voir la solution

Répétabilité ≈ 0,03 mm : c'est la dispersion des poses atteintes pour une même consigne (le rayon de la sphère). Elle est excellente et native — la mécanique.

Exactitude absolue ≈ 1,2 mm : c'est l'écart entre la position réellement atteinte (le centre P du nuage) et la cible commandée. C'est un biais systématique dû à l'écart entre paramètres nominaux et réels.

La calibration améliore l'exactitude (elle corrige le biais de 1,2 mm en ramenant P vers la cible), pas la répétabilité (les 0,03 mm de dispersion restent : ils viennent de la mécanique, pas du modèle). Après une bonne calibration cinématique, on peut espérer une exactitude du même ordre que la répétabilité, soit < 0,2 mm ici.

Récapitulatif