Microcontrôleur / CPU pour une trigonométrie rapide en robot?


15

Cela concerne le matériel qui pèse peu, car un robot de marche (gros chat, 6 jambes avec 3 DOF) devrait le transporter. À cause de cette marche, il faudra faire beaucoup de trigonométrie (en utilisant ou non des mathématiques matricielles), et c'est de là que vient cette question.

PIC, Arduino ou AVR bon marché ne sont pas assez rapides pour tout calculer 100 / seconde et garder à l'esprit des choses comme l'inertie et l'évitement d'obstacles, ou même des chemins / allures de force brute.

  • Le plan A consiste à porter le cerveau sur le robot. Que ce soit un microprocesseur, un micro ITX, un nettop ou autre; Qu'est-ce qu'un matériel efficace pour faire de la trigonométrie / des mathématiques matricielles rapidement?

    J'ai cherché en ligne et je m'attendais à découvrir des microcontrôleurs AVR, x86 ou ARM spécialisés dans ce domaine, mais pas de chance là-bas.

  • Le plan B est d'avoir une machine x86 connectée via WiFi pour faire le gros du travail. Idéal pour le prototypage également, mais j'aimerais que cela migre vers le plan A éventuellement lorsque le matériel se miniaturise. Mais même dans ce cas, quel processeur de bureau peut faire la trigonométrie le plus rapidement?

  • Le plan C est de répartir la charge et d'avoir un microcontrôleur / noyau économe en énergie pour chaque jambe, bien que ce ne soit pas la meilleure solution pour de nombreuses raisons j'aime sa capacité d'extension.

Je n'ai pas encore décidé du langage et / ou de la bibliothèque utilisés, mais je préfère Pascal et C ++.

(suggestions de balises plus adaptées bienvenues, je suis nouveau ici)


11
les mathématiques en virgule flottante ne sont pas un must. Vous pouvez toujours créer des tables sinus (ou toute autre fonction), les mettre dans le flash d'un AVR et interpoler entre les valeurs avec des calculs à virgule fixe. Cela pourrait être assez rapide pour vos besoins.
Christoph

3
Plutôt que de perdre des calculs lourds en temps réel, une solution courante consiste à pré-calculer des tableaux de valeurs, puis à rechercher la réponse. L'idée de répartir le travail entre plusieurs processeurs est également bonne, par exemple un puissant processeur maître puis un processeur par jambe.
John U

2
Vous pourriez également envisager de poser ce genre de question sur le site Robotics Stackexchange .
Rocketmagnet

1
Le plan B fera le calcul assez rapidement, mais la communication via WiFi tuera probablement le gain de performances. Avez-vous envisagé d'utiliser un téléphone Android connecté via USB? C'est beaucoup plus de puissance de calcul sans décalage du wifi
Stefan

1
Une carte STM32F4 avec unité à virgule flottante semble être suffisante pour votre application. Il a 128k SRAM avec 64k CCM. Il peut fonctionner à 168 MHz. Une multiplication à virgule flottante 32 bits ne prend qu'un cycle de processeur ..
richieqianle

Réponses:


16

Il ne semble pas que votre application soit vraiment tout ce qui demande beaucoup de calcul. Un dsPIC, par exemple, peut exécuter une instruction de 400 k pour chacune de vos itérations. C'est beaucoup. Il sera cependant utile d'avoir de bonnes capacités d'E / S de bas niveau, des générateurs PWM, des temporisateurs, etc.

Sinus et cosinus n'est vraiment pas si difficile à faire dans une machine entière comme un dsPIC. Je l'ai fait moi-même quelques fois. L'astuce consiste à choisir la bonne représentation des angles. Les radians peuvent être agréables d'un point de vue théorique, mais cela n'est pas pratique sur le plan informatique. La dégressivité est artificielle et tout simplement idiote. Utilisez la plage complète de l'entier de la taille de votre machine pour représenter une rotation complète. Par exemple, sur un dsPIC, qui est un processeur 16 bits, une rotation complète est de 65536 comptes, ce qui est bien plus précis et résolution que nécessaire pour contrôler un robot ou que vous pouvez mesurer de toute façon.

Un avantage de cette représentation est que tout l'encapsulage se produit automatiquement simplement en raison de la façon dont les entiers non signés ajoutent et soustraient le travail. Un autre avantage significatif est que cette représentation se prête particulièrement bien à l'utilisation de tables de recherche pour le sinus et le cosinus. Il vous suffit de stocker 1/4 de cycle. Les deux bits supérieurs de l'angle vous indiquent dans quel quadrant vous vous trouvez, ce qui vous indique si vous souhaitez indexer le tableau vers l'avant ou vers l'arrière, et si vous devez annuler le résultat ou non. Les N bits inférieurs suivants sont utilisés pour indexer dans la table, la table ayant 2 N segments (2 N +1 points). Notez que l'indexation dans le tableau vers l'arrière complète alors simplement les bits d'index du tableau.

Vous pouvez donner au tableau suffisamment de points pour que la sélection de la réponse la plus proche soit suffisante. Par exemple, si la table contient 1024 segments, le sinus et le cosinus seront calculés au 1/4096 de cercle le plus proche. Cela va être suffisant pour contrôler un robot. Si vous souhaitez plus de précision, vous pouvez soit agrandir la table, soit utiliser les bits inférieurs restants de l'angle pour interpoler linéairement entre les entrées de table adjacentes.

Quoi qu'il en soit, le fait est qu'il semble que vos exigences pour ce processeur ne correspondent pas au problème indiqué. J'utiliserais probablement un dsPIC33F. Il est certainement petit, léger et beaucoup plus économe en énergie qu'un processus informatique à part entière comme un x86 sur un ordinateur à carte unique.


J'avais toujours l'impression qu'un PIC devait ralentir, ne serait-ce que pour la cinématique inverse, mais je devrais peut-être reconsidérer. Est-il possible de faire une cinématique inverse pour 6legs de 3DOF au moins 100 / seconde? C'est la cinématique inverse 6x3x100 juste pour obtenir les mouvements des jambes en direct. Quoi qu'il en soit, j'ai besoin que la cinématique inverse se produise sur la même plate-forme que l'algorithme s'exécute, de sorte que je n'ai pas à réimplémenter ces parties deux fois. L'algorithme serait plus exigeant et ne pourra certainement pas fonctionner sur une carte PIC ou Arduino-isch.
Barry Staes

9

Vous allez gérer de nombreux signaux d'entrée. Vous n'avez pas nécessairement besoin d'un processeur à haut débit; beaucoup de signaux peuvent être traités en parallèle. Il s'agit d'un territoire DSP typique. Bien sûr, vous voulez également des fonctionnalités générales du processeur. Ce n'est pas un problème. Il existe de nombreux processeurs avec DSP intégrés.

Une conception de puce typique pour de telles applications est un Cortex-M4. Cela vient avec un DSP intégré, et les versions -M4F ont également un FPU. Cela peut ne pas être nécessaire, la trigonométrie peut facilement être effectuée en mathématiques à virgule fixe.


Les mathématiques matricielles auraient-elles un avantage sur le Cortex-M4F? (au cas où je m'y aventurerais, prototypage)
Barry Staes

3
Juste pour être un peu pédant - Le cœur du processeur Cortex-M4 n'a pas de DSP intégré, il a un degré de capacité DSP incorporé dans son cœur de processeur principal. Les extensions DSP sont l'ajout d'instructions de multiplication / accumulation qui facilitent les fonctions DSP typiques telles que le filtrage et les transformations.
uɐɪ

6

Quelques remarques:

  1. Vous n'avez pas besoin de traiter les opérations de trigonométrie sur le même processeur qui exécute l'évitement d'obstacles. Vous pouvez répartir les tâches entre deux microcontrôleurs et utiliser un protocole de communication pour les faire parler.

  2. Pour une expérience, j'ai implémenté un algorithme AHRS avec un filtre de Kalman dans un microcontrôleur ARM Cortex M0 (c'était un STM32, je ne me souviens pas exactement du reste mais je pense que c'était 32 MHz), et en utilisant des mathématiques à virgule fixe, je pouvais exécuter à environ 40 échantillons / seconde. Avec un contrôleur plus rapide, vous devriez pouvoir le transporter facilement, et bien sûr, vous pouvez essayer la méthode FPGA ou DSP.

  3. Je dirais que le contrôle des jambes n'est pas gourmand en CPU et vous pouvez contrôler toutes les jambes ensemble, peut-être séparément des opérations de trigonométrie et d'évitement d'obstacles (voir 1)


Les servos sont contrôlés en série via un contrôleur ou un bus dynamixel, donc c'est déjà pratiquement déchargé. Le problème est que le logiciel doit faire bien plus de calculs cinématiques inverses que ceux requis pour la pose / démarche en direct.
Barry Staes

5

La trigonométrie est délicate, mais il existe des raccourcis. Si vous êtes léger sur la puissance de traitement, considérez l'algorithme CORDIC.

Il s'agit essentiellement d'une table de valeurs pour [par exemple] sinus. Les angles peuvent être en degrés, radians, comme vous voulez. Le fait est que le SINE de ces valeurs est 1/2 (0,5), 1/4 (0,25), 1/8, 1/16 ..... à n'importe quelle fraction de degré que votre robot peut utiliser.

Entrez votre angle, soustrayez la première valeur du tableau, définissez votre résultat sur le premier résultat (0,5). Si, en soustrayant, votre angle devient négatif, alors AJOUTEZ la valeur suivante (et soustrayez 0,25). Sinon, continuez à soustraire les angles et à ajouter des résultats.

Lorsque vous arrivez à la fin du tableau, tout ce que vous avez fait est d'ajouter et de soustraire, mais vous êtes très proche. Il y a un dernier "facteur de violon" à multiplier.

La précision [et la vitesse] du résultat dépendent de la taille [et de la résolution] de la table de recherche.


CORDIC a l'air sympa mais je ne l'utiliserai que s'il accélère le robot (c'est une exigence).
Barry Staes

3

Vous pouvez envisager d'utiliser une carte Raspberry Pi qui exécute un système GNU / Linux à usage général. Le Raspberry Pi possède plusieurs broches GPIO qui peuvent être utilisées pour connecter des servos de robot ou des cartes d'extension.

http://www.youtube.com/watch?v=RuYLTudcOaM

Le modèle A Raspberry Pi peut effectuer jusqu'à 24 GFLOP de calcul à virgule flottante à usage général en utilisant son GPU utilisant OpenGL ES 2 tout en restant sous un budget de puissance de 2,5 W.

http://elinux.org/RPi_Hardware

Exemple: une configuration de robot alimentée par batterie implémentée à l'aide du Raspberry Pi.

http://www.homofaciens.de/technics-robots-R3-construction_en_navion.htm

Exemple 2: un robot à 6 pattes contrôlé par un Raspberry Pi:

http://www.youtube.com/watch?v=Yhv43H5Omfc

Exemple 3: un robot à pendule inversé à 2 roues auto-équilibré contrôlé par un Raspberry Pi:

http://www.youtube.com/watch?v=n-noFwc23y0


2

Pour le robot à pattes, vous pouvez créer des séquences de mouvements de jambes prédéfinies et les "jouer". L'évitement d'obstacles en temps réel peut être fait avec une fuzzy logicimplémentation légère où tout est à nouveau sous forme de tableau et tout ce que vous devez faire est de choisir la bonne valeur et de l'utiliser pour le defuzzyficationprocessus.

Tout peut être fait en C sur un processeur plus rapide comme ARM7. Je l'ai essayé AVRet j'ai échoué, après avoir passé beaucoup de temps à tout transformer en fixed point arithmetics.


Jouer des animations de démarche est exactement ce que je ne veux pas. L'algorithme que je veux implémenter détermine ce qu'il faut faire de ses jambes, et cet algorithme est la raison pour laquelle j'ai besoin d'une trigonométrie rapide. Cependant, je n'ai pas précisé cela dans ma question. Et vu que tant de carillons à ce sujet, je serais inutile de modifier la question. Je vais demander et être plus précis, en temps voulu.
Barry Staes

Dans ce cas, j'opterais pour le système de jambes servo. Chaque jambe a son propre contrôleur. Approche basée sur l'agent.
Gossamer

1

La plate-forme Texas Instruments Stellaris a une unité à virgule flottante intégrée par défaut. Je ne sais pas si le contrôleur ARM cadencé à 80 MHz est assez rapide pour votre application, mais une carte de développement LaunchPad est assez bon marché: http://www.ti.com/ww/en/launchpad/stellaris_head.html

Il est programmable via USB, des chaînes d'outils gratuites sont disponibles pour au moins Windows et Linux, mesurent environ 4 × 6 cm et ont plus de 30 broches GPIO (si je compte correctement).


0

Vous pouvez intégrer la carte CPU x86 power pc dans votre application robotique à l'aide de l'AVR pour contrôler les lecteurs du robot en tant que carte d'interface. La solution la plus rapide et la moins chère de votre problème. Mais oui, vous devez gâcher beaucoup de codage dans l'architecture x86, mais heureusement, vous pouvez saisir beaucoup de codage à partir de codes de système d'exploitation open source. (Si votre construction mécanique peut supporter ce poids)


4
"x86" et "power pc" sont deux architectures concurrentes entièrement différentes (et au moins à certains moments de l'histoire).
Chris Stratton
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.