Tutoriel · Intermédiaire · 35 min de lecture
Une machine à états de prise-dépose qui survit à la panne
Approche, saisie, vérification, levage, dépose — une machine à états dont la vérification transforme une démo en machine qu'on laisse tourner sans surveillance.
Pourquoi la démo marche et le système non
Chaque première prise-dépose est une liste d’appels delay(). Allez ici, fermez la pince, allez là, ouvrez. Cela marche en vidéo et cela marche environ quatre-vingts fois sur cent sur l’établi, ce qui semble assez près du but.
Ce n’est pas près du but, parce que les vingt échecs sont tous silencieux. La pince s’est fermée sur rien et le bras a porté de l’air à travers la table et ouvert au-dessus du bac. La pièce était légèrement de travers et s’est fait renverser au lieu d’être saisie. Le servo a microcoupé en plein levage et le contrôleur a redémarré en pose inconnue mâchoires fermées.
Ce qui transforme cela de catastrophes en récupérations est une chose : une étape de vérification entre la saisie et le levage, et une machine à états qui a où aller quand elle échoue. C’est tout l’objet de cette page.
Les états
Un cycle de prise-dépose fait neuf états, et il vaut de nommer les neuf plutôt que de les fusionner.
| État | Ce qui se passe | Condition de sortie |
|---|---|---|
IDLE |
En attente d’une tâche | Une demande de prise arrive |
APPROACH |
Aller à une pose au-dessus de l’objet, pince ouverte | Bras stabilisé |
DESCEND |
Déplacement rectiligne vers le bas jusqu’à la pose de saisie | À profondeur, ou un capteur de contact part |
GRASP |
Fermer les mâchoires, puis temporiser | Temporisation écoulée |
VERIFY |
Vérifier que quelque chose est vraiment tenu | Tenu → LIFT. Vide → RECOVER |
LIFT |
Déplacement rectiligne de retour jusqu’à la pose d’approche | Bras stabilisé |
TRANSFER |
Aller au-dessus de la cible de dépose | Bras stabilisé |
PLACE |
Descendre, ouvrir, temporiser, dégager | Dégagement terminé |
RECOVER |
Rouvrir, dégager, compter la tentative, réessayer ou abandonner | Réessai → APPROACH. Abandon → IDLE avec défaut |
Deux points de conception font l’essentiel du travail ici.
Les poses d’approche et de retrait sont des états séparés, au-dessus de l’objet. Une pince qui plonge droit sur une pièce depuis une direction arbitraire la renverse, et une pince qui lève le long d’une courbe traîne la pièce latéralement avant de dégager. Venez toujours directement d’au-dessus (ou directement le long de l’axe d’insertion) avec un court segment droit, et repartez pareil.
VERIFY est un état, pas une ligne de code. C’est le seul endroit du cycle où la machine apprend si la réalité a suivi le plan, et il lui faut un endroit où échouer.
Vérifier la saisie
Quatre façons, la moins chère d’abord. Il en faut au moins une.
Le contrôle de position des mâchoires (gratuit)
Si votre pince a une souplesse en série, une saisie sur un objet arrête les mâchoires avant l’endroit où elles vont en fermant sur du vide. Si vous pouvez lire la position des mâchoires, la comparer à la position de fermeture à vide dit que quelque chose est entre les doigts.
Sur un servo amateur simple, vous ne pouvez pas lire la position — c’est de la boucle ouverte. Mais un servo dont le curseur du potentiomètre sort vers une broche ADC vous donne cela pour le prix d’un fil, et cette modification prend dix minutes.
Limites : cela dit que quelque chose est là, pas que c’est la bonne chose ni bien tenue.
Un microrupteur sur le doigt (environ 50 centimes)
Un microrupteur à levier sur la face intérieure d’un doigt, câblé à une broche d’entrée avec rappel. Se ferme quand le patin touche quelque chose.
C’est de loin l’option au meilleur rapport. C’est une réponse numérique directe à « y a-t-il quelque chose entre les mâchoires », cela survit à tout, et cela s’anti-rebondit en logiciel en trois lignes. Mettez-le sur la partie souple du doigt pour qu’il parte fiablement à un effort répétable.
La mesure de courant (environ 2 €)
Un shunt ou un capteur à effet Hall dans l’alimentation du servo. Un servo qui se ferme sur du vide redescend au repos ; un servo qui se ferme sur un objet reste à courant élevé.
Limites : bruyant, exige un seuil à étalonner, et se trompe quand la batterie s’affaisse. Vaut le coup quand vous voulez aussi détecter un écrasement plutôt qu’une simple tenue — un courant très au-dessus de la valeur attendue signifie que la pièce est plus dure que prévu ou que vous avez raté et attrapé le montage.
Barrière optique entre les mâchoires (environ 1 €)
Un émetteur IR et un phototransistor à travers l’ouverture des mâchoires. Faisceau coupé signifie quelque chose dans l’intervalle.
Limites : elle voit l’objet avant que vous l’ayez saisi, donc elle vérifie la présence plutôt que la prise. À associer avec autre chose. Vraiment bonne sur les machines qui prennent des objets transparents ou sombres où la vision peine.
L’écrire
Le motif est une simple machine à états finis avec un timer non bloquant, donc rien dans la boucle ne cale et l’arrêt d’urgence reste réactif :
enum State { IDLE, APPROACH, DESCEND, GRASP, VERIFY, LIFT, TRANSFER, PLACE, RECOVER };
State state = IDLE;
uint32_t stateEnteredAt = 0;
uint8_t attempts = 0;
const uint8_t MAX_ATTEMPTS = 3;
const uint16_t GRASP_DWELL_MS = 350; // let the compliance settle before you trust it
const uint16_t SETTLE_MS = 250;
void enter(State next) { state = next; stateEnteredAt = millis(); }
bool elapsed(uint16_t ms) { return millis() - stateEnteredAt >= ms; }
// Debounced: one reading is a glitch, three in a row is a fact.
bool objectHeld() {
static uint8_t streak = 0;
streak = digitalRead(GRIP_SWITCH) == LOW ? min(streak + 1, 3) : 0;
return streak >= 3;
}
void loop() {
arm.update(); // non-blocking motion, every pass
gripper.update();
switch (state) {
case IDLE:
if (jobPending()) { attempts = 0; arm.moveTo(approachPose); enter(APPROACH); }
break;
case APPROACH:
gripper.open();
if (arm.arrived() && elapsed(SETTLE_MS)) { arm.moveTo(graspPose); enter(DESCEND); }
break;
case DESCEND:
if (arm.arrived()) { gripper.close(); enter(GRASP); }
break;
case GRASP:
// The dwell is not politeness. A compliant finger rings after closing,
// and reading the switch during the ring gives you a coin flip.
if (elapsed(GRASP_DWELL_MS)) enter(VERIFY);
break;
case VERIFY:
if (objectHeld()) { arm.moveTo(approachPose); enter(LIFT); }
else { enter(RECOVER); }
break;
case LIFT:
if (arm.arrived()) { arm.moveTo(placeApproach); enter(TRANSFER); }
break;
case TRANSFER:
if (arm.arrived()) { arm.moveTo(placePose); enter(PLACE); }
break;
case PLACE:
if (arm.arrived() && elapsed(SETTLE_MS)) {
gripper.open();
// Open BEFORE retreating, and retreat straight up, or you drag the part.
if (elapsed(SETTLE_MS + 200)) { arm.moveTo(placeApproach); enter(IDLE); }
}
break;
case RECOVER:
gripper.open();
if (elapsed(SETTLE_MS)) {
if (++attempts < MAX_ATTEMPTS) { arm.moveTo(approachPose); enter(APPROACH); }
else { raiseFault("grasp failed after 3 attempts"); enter(IDLE); }
}
break;
}
}
Trois détails là-dedans gagnent leur place :
La temporisation de saisie. Un doigt souple sonne quelques centaines de millisecondes après fermeture. Vérifiez pendant la sonnerie et vous obtenez un pile ou face. 300–400 ms suffisent d’ordinaire ; mesurez les vôtres en enregistrant l’interrupteur une seconde après une fermeture.
La vérification anti-rebondie. Une lecture d’interrupteur est un glitch. Trois lectures consécutives sont un fait, et cela coûte trois passages d’une boucle qui tourne à des centaines de hertz.
Un réessai borné. Réessayer indéfiniment est comment un robot passe la nuit à gratter une pièce tombée au sol il y a une heure. Trois tentatives puis un défaut qu’un humain doit lever.
Quoi faire quand le réessai n’aide pas
RECOVER tel qu’écrit réessaie juste depuis la même pose, ce qui corrige le cas courant — la pièce était légèrement décalée, les mâchoires l’ont poussée, et la seconde tentative atterrit. Cela ne corrige pas une pièce qui est ailleurs entièrement. Escalades utiles, dans l’ordre :
- Bougez l’approche. Décalez la pose de saisie de quelques millimètres en petite spirale à chaque réessai. Coûte trois lignes et récupère une fraction surprenante.
- Redétectez. Si vous avez une caméra ou un capteur de distance, prenez une mesure fraîche plutôt que de croire la pose reçue.
- Élargissez l’ouverture. Une ouverture de mâchoires ajustée serrée à la pièce nominale échoue sur une pièce pivotée. Ouvrez plus large au réessai.
- Abandonnez bruyamment. Un défaut qui arrête la machine et dit dans quel état elle était bat une machine qui continue et remplit discrètement le bac de rebuts.
Les pannes qui ne sont pas la faute de la pince
Quand une prise-dépose est peu fiable, ce n’est souvent pas la saisie :
| Symptôme | Cause usuelle |
|---|---|
| Échoue seulement sur cycles rapides | Pas assez de temps de stabilisation. Le bras est arrivé de son propre avis et sonne encore |
| Échoue après vingt minutes | Échauffement du servo. Voir le courant de blocage — les mâchoires sont probablement tenues fermées tout le retour |
| Renverse la pièce à l’approche | Descente en biais plutôt que droit le long de l’axe d’insertion |
| La lâche au transfert, pas à la prise | L’accélération. La saisie était dimensionnée pour une tenue statique et le déplacement exige plus |
| Traîne la pièce au relâchement | Retrait avant que les mâchoires soient pleinement ouvertes, ou retrait le long d’une courbe |
| Le contrôleur redémarre en plein cycle | L’alimentation des servos qui microcoupe. Séparez le rail d’alimentation des servos |
| Marche, puis cesse progressivement de marcher | Patins sales. μ chute à mesure que la poussière s’accumule, et il n’y a pas d’alarme pour cela |
La quatrième ligne vaut qu’on s’y attarde, parce que c’est celle qui ressemble le plus à un mystère. Une saisie qui tient parfaitement sur l’établi peut lâcher 40 ms après le début d’un levage — avant que le bras ait visiblement bougé — parce que le terme d’accélération domine. Le simulateur de pince montrera l’instant exact pour vos nombres, et le correctif est d’ordinaire de ralentir le profil plutôt que de serrer plus fort.
Où aller ensuite
Une fois le cycle fiable, les ajouts suivants valent le coup, par ordre de valeur :
- Comptage de cycles et journal de défauts. On ne peut améliorer un nombre de fiabilité qu’on ne mesure pas.
- Un vrai profil de mouvement sur le transfert, pour borner l’accélération et cesser de surdimensionner la prise pour survivre à des mouvements saccadés.
- La pose depuis la détection, pas depuis des constantes, ce qui est le pas de la démo à la machine.
Suite
- Machines à états finis pour le comportement des robots — le motif général dont ceci est une instance
- Effort, blocage et souplesse des pinces à servos — pourquoi la temporisation existe et pourquoi les mâchoires ne doivent pas rester fermées
- Types de pinces et effort de serrage — dimensionner la saisie dont la séquence dépend
- Le simulateur de pince — trouvez l’instant où une saisie lâche sur vos propres nombres
Explorer le graphe
Fait partie de ces réalisations
Les projets et parcours d'apprentissage qui incluent ce tutoriel.
Pour aller plus loin