Mouvement asservi en douceur pour un robot rampant


11

J'ai fait un petit robot sur chenilles il y a peu de temps qui avait deux jambes avec deux degrés de liberté chacune, donc 4 servos RC au total. Pendant que je programmais le mouvement des jambes, j'ai remarqué qu'elles bougeaient plutôt raidement. Il est logique que le contrôleur interne du servo RC ait une réponse très rapide aux commandes de position, mais je voulais que mon robot se déplace d'une manière qui semble un peu plus fluide et réaliste.

Ma solution a été de créer une fonction cubique du temps qui décrit le chemin des servos, puis de définir leur position par petits incréments de temps, ce qui entraîne un mouvement plus fluide. Essentiellement ce que je faisais était pour résoudre les coefficients dans une équation cubique en utilisant l'intervalle de temps, début et de fin position du servo, et le démarrage et le servo taux de fin devrait se déplacer (qui est juste la dérivée de la position):ai

Résolvez pour , un 1 , un 2 et un 3 :a0a1a2a3

r a t e ( t ) = p o s i t i o n ( t ) = a 1 + 2 a 2 t + 3 a 3 t

position(t)=a0+a1t+a2t2+a3t3
rate(t)=position(t)=a1+2a2t+3a3t2

Éléments fournis: , p o s i t i o n ( t f ) , r a t e ( 0 ) , r a t e ( t f )position(0)position(tf)rate(0)rate(tf)

J'ai réglé le taux du servo entre une paire de mouvements à zéro si les mouvements étaient dans des directions opposées, et positif ou négatif si les mouvements étaient tous les deux dans la direction positive ou négative, respectivement.

Cela a plutôt bien fonctionné, mais cette solution est limitée de plusieurs façons. D'une part, il est difficile de décider quels devraient être exactement les taux entre les mouvements qui vont dans la même direction. J'ai utilisé la moyenne des pentes en avant et en arrière d'une position particulière entre les mouvements, mais il n'est pas clair pour moi que ce soit optimal. Deuxièmement, des courbes cubiques pourraient amener le servo à une position en dehors de la plage des positions au début et à la fin d'un mouvement, ce qui peut être indésirable. Par exemple, à un moment donné de l'intervalle de temps, la courbe pourrait faire en sorte que le servo dépasse la deuxième position, ou en dessous de la première position. Troisièmement, la génération de courbe ici ne prend pas en compte la vitesse maximale à laquelle le servo peut tourner, donc une courbe peut faire bouger le servo à une vitesse irréaliste. Avec ça,

En négligeant cette dernière préoccupation, ces problèmes peuvent être résolus en augmentant le degré du polynôme et en ajoutant des contraintes à résoudre pour les coefficients, mais je commence maintenant à me demander ...

Existe-t-il un meilleur moyen que celui-ci pour rendre le mouvement du servo fluide et plus réaliste?


Le code aurait dû être relativement simple. Pouvez-vous nous expliquer plus en détail pourquoi cela a été impliqué?
DaemonMaker

1
Vous avez raison, le code était assez simple, bien que la méthode résultante pour contrôler les servos était plus complexe qu'auparavant. J'ai modifié ma question pour inclure une description des limites de cette méthode à la place.
Robz

NURBS , des splines B rationnelles non uniformes, pourrait faire le travail
James Waldby - jwpat7

@ jwpat7 merci pour votre contribution, mais je ne pense pas que NURBS fonctionnerait parce que ces courbes ne sont pas garanties d'atteindre les points fournis
Robz

Kp

Réponses:


6

Génération de profils de mouvement

Dans le passé, j'ai utilisé un générateur de profil de mouvement pour résoudre ce problème. Pour l'utiliser, vous aurez besoin de la position cible souhaitée (point de consigne), de la vitesse maximale et des valeurs d'accélération associées à vos moteurs. Il fonctionne en intégrant une courbe de vitesse trapézoïdale afin d'obtenir un profil de position lisse. Une courbe en S peut être utilisée si le mouvement doit être encore plus fluide. Référence à un article expliquant le profilage de Motion .

Pré-filtrage des points de consigne

Mis à part la route de profilage de mouvement, vous pouvez simplement filtrer les commandes passe-bas sur les servos. Ce type de filtrage des points de consigne ralentira votre réponse, mais il l'aplanira également et il est facile à mettre en œuvre. La fréquence de coupure devra être choisie pour qu'elle prenne en charge la bande passante de votre système (afin qu'elle ne filtre pas le mouvement souhaité). Implémentation simple du filtre passe-bas en C


+1: certainement la génération de profils de mouvement.
Guy Sirton

2

Je pense que la question se réfère à ce type d'appareil: servo RC

Ceux-ci ne sont généralement pas très performants, ils ne pourront donc pas très bien suivre un profil de mouvement généré. La plupart des systèmes de commande de moteur commerciaux utilisent une courbe en S pour un déplacement point à point (voir la réponse de @ ddevaz) qui font un profil par morceaux où chaque segment utilise une équation différente. Votre problème va être que pour que votre moteur puisse suivre le profil généré, vous allez probablement avoir un profil très "lent". Sinon, le profil que vous essayez de commander à l'appareil de suivre va avoir une grande erreur de position par rapport à la position réelle de l'appareil.

Idéalement, vous aurez besoin d'une sorte de rétroaction que vous pouvez regarder pendant que vous exécutez le mouvement afin que vous puissiez voir dans quelle mesure l'appareil suit la commande. D'un point de vue plus pratique, si vous voulez un mouvement nettement meilleur, vous devrez peut-être différents moteurs et différentes commandes de moteur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.