Mikrocontroller / CPU für schnelle Trigonometrie im Roboter?

15

Dies betrifft Hardware, die wenig wiegt, da ein Laufroboter (fette Katze, 6 Beine mit 3 Freiheitsgraden) sie herumtragen sollte. Aus diesem Grund muss man viel Trigonometrie machen (mit Matrixmathematik oder nicht, ich bin mir noch nicht sicher), und hier kommt die Frage her.

PIC, Arduino oder billiger AVR sind nicht schnell genug, um alles auf 100 / s zu berechnen und Dinge wie Trägheit und Hindernisvermeidung oder sogar Bruteforce-Pfade / -Gänge im Auge zu behalten.

  • Plan A besteht darin, das Gehirn auf dem Roboter zu tragen. Sei es Mikroprozessor, Micro-ITX, Nettop oder andere; Was ist effiziente Hardware, um Trigonometrie / Matrix-Mathematik schnell zu machen?

    Ich habe online gesucht und erwartet, dass ich etwas über AVR-, x86- oder ARM-Mikrocontroller herausfinde, die darauf spezialisiert sind, aber dort kein Glück.

  • Plan B sieht eine x86-Maschine vor, die über WLAN verbunden ist, um das schwere Heben zu erledigen. Ideal auch für das Prototyping, aber ich möchte, dass dies irgendwann nach Plan A migriert, wenn die Hardware miniaturisiert wird. Aber selbst dann, welche Desktop-CPU kann Trigonometrie am schnellsten?

  • Plan C ist es, die Last zu verteilen und einen stromsparenden Mikrocontroller / Core für jedes Bein zu haben, obwohl dies aus vielen Gründen, die ich an der Erweiterbarkeit mag, nicht die beste Lösung ist.

Ich habe mich noch nicht für die Sprache und / oder Bibliothek entschieden, bevorzuge aber Pascal und C ++.

(Vorschläge für passendere Tags willkommen, ich bin neu hier)

Barry Staes
quelle
11
Gleitkomma-Mathematik ist kein Muss. Sie können jederzeit Sinustabellen (oder Tabellen mit anderen Funktionen) erstellen, diese in den Flash eines AVR einfügen und mit Festpunktberechnungen zwischen den Werten interpolieren. Dies ist möglicherweise schnell genug für Ihre Anforderungen.
Christoph
3
Anstatt sich in Echtzeit von schwerer Mathematik zu trennen, besteht eine übliche Lösung darin, Wertetabellen vorab zu berechnen und dann die Antwort nachzuschlagen. Die Idee, die Arbeit auf mehrere CPUs zu verteilen, ist auch gut, zum Beispiel eine leistungsstarke Master-CPU und dann einen Prozessor pro Zweig.
John U
2
Sie können diese Art von Frage auch auf der Robotics Stackexchange-Website stellen .
Rocketmagnet
1
Plan B wird die Berechnung ziemlich schnell durchführen, aber die Kommunikation über WLAN wird höchstwahrscheinlich den Leistungsgewinn zunichte machen. Haben Sie überlegt, ein Android-Telefon zu verwenden, das über USB verbunden ist? Es ist viel mehr Rechenleistung ohne Verzögerung von WiFi
Stefan
1
Eine STM32F4-Karte mit Gleitkommaeinheit scheint für Ihre Anwendung ausreichend zu sein. Es hat 128k SRAM mit 64k CCM. Es kann mit 168MHz betrieben werden. Ein 32-Bit - Gleitkomma - Multiplikation dauert nur 1 CPU - Zyklus ..
richieqianle

Antworten:

16

Es hört sich nicht so an, als ob Ihre Anwendung wirklich rechenintensiv wäre. Ein dsPIC kann zum Beispiel 400-k-Befehle für jede Ihrer Iterationen ausführen. Das ist eine Menge. Es wird jedoch nützlich sein, eine gute I / O-Fähigkeit auf niedrigem Niveau, PWM-Generatoren, Zeitgeber und dergleichen zu haben.

Sinus und Cosinus sind in einem Integer-Rechner wie einem dsPIC nicht so schwer zu realisieren. Ich habe es selbst ein paar Mal gemacht. Der Trick besteht darin, die richtige Darstellung für die Winkel auszuwählen. Vom theoretischen Standpunkt aus gesehen mögen Radianten nett sein, sind aber rechnerisch unpraktisch. Degress sind künstlich und einfach nur albern. Verwenden Sie den gesamten Bereich Ihrer maschinengroßen Ganzzahl, um eine volle Umdrehung darzustellen. Beispiel: Auf einem dsPIC, bei dem es sich um einen 16-Bit-Prozessor handelt, beträgt eine volle Umdrehung 65536 Counts. Dies ist weitaus mehr Genauigkeit und Auflösung, als Sie zur Steuerung eines Roboters benötigen oder die Sie trotzdem messen können.

Ein Vorteil dieser Darstellung ist, dass der gesamte Zeilenumbruch automatisch erfolgt, nur weil vorzeichenlose Ganzzahlen addiert und subtrahiert werden. Ein weiterer wesentlicher Vorteil ist, dass sich diese Darstellung besonders gut für die Verwendung von Nachschlagetabellen für Sinus und Cosinus eignet. Sie müssen nur 1/4 Zyklus speichern. Die beiden oberen Bits des Winkels geben an, in welchem ​​Quadranten Sie sich befinden, ob Sie vorwärts oder rückwärts in der Tabelle indizieren und ob Sie das Ergebnis negieren möchten oder nicht. Die nächsten N niedrigeren Bits werden zum Indizieren in die Tabelle verwendet, wobei die Tabelle 2 N Segmente (2 N + 1 Punkte) aufweist. Beachten Sie, dass das Rückwärtsindizieren in die Tabelle dann nur die Tabellenindexbits ergänzt.

Sie können der Tabelle genügend Punkte geben, damit die Auswahl der nächsten Antwort gut genug ist. Wenn die Tabelle beispielsweise 1024 Segmente enthält, werden Sinus und Cosinus auf das nächste 1/4096 eines Kreises berechnet. Das wird viel für die Steuerung eines Roboters sein. Wenn Sie mehr Genauigkeit wünschen, können Sie entweder die Tabelle vergrößern oder die verbleibenden unteren Bits des Winkels verwenden, um zwischen benachbarten Tabelleneinträgen linear zu interpolieren.

Der Punkt ist jedenfalls, dass Ihre Anforderungen an diesen Prozessor nicht mit dem angegebenen Problem übereinstimmen. Ich würde wahrscheinlich einen dsPIC33F verwenden. Es ist mit Sicherheit klein, leicht und viel energieeffizienter als ein vollständiger Allzweck-Computerprozess wie ein x86 auf einem Einplatinencomputer.

Olin Lathrop
quelle
Ich hatte immer den Eindruck, dass ein PIC selbst für die inverse Kinematik zu langsam ist, aber ich muss es vielleicht noch einmal überdenken. Ist es möglich, eine inverse Kinematik für 6 3DOF-Beine mit mindestens 100 / Sekunde durchzuführen? Das ist eine inverse Kinematik von 6x3x100, nur um die Bewegungen des lebenden Beins zu erhalten. Auf jeden Fall muss die inverse Kinematik auf derselben Plattform ablaufen, auf der der Algorithmus ausgeführt wird, damit ich diese Teile nicht zweimal neu implementieren muss. Der Algorithmus wäre anspruchsvoller und sicherlich nicht in der Lage, auf einem PIC- oder Arduino-isch-Board ausgeführt zu werden.
Barry Staes
9

Sie werden mit vielen Eingangssignalen umgehen. Sie benötigen nicht unbedingt eine CPU mit hohem Durchsatz. Viele Signale können parallel verarbeitet werden. Dies ist ein typisches DSP-Gebiet. Natürlich möchten Sie auch allgemeine CPU-Funktionen. Dies ist kein Problem. Es gibt viele CPUs mit integrierten DSPs.

Ein typisches Chipdesign für solche Anwendungen ist ein Cortex-M4. Dies kommt mit einem integrierten DSP und -M4F-Versionen haben auch eine FPU. Dies ist möglicherweise nicht erforderlich. Die Trigonometrie kann problemlos in Festkomma-Mathematik durchgeführt werden.

MSalters
quelle
Hätte Matrixmathematik einen Vorteil gegenüber dem Cortex-M4F? (falls ich es wage, Prototyping)
Barry Staes
3
Nur um ein bisschen pedantisch zu sein: Der Cortex-M4-Prozessorkern verfügt nicht über einen integrierten DSP, sondern über eine gewisse DSP-Fähigkeit, die in den Hauptprozessorkern integriert ist. Die DSP-Erweiterungen sind das Hinzufügen von Multiplikations- / Akkumulationsbefehlen, die typische DSP-Funktionen wie Filtern und Transformieren ermöglichen.
uɐɪ
6

Ein paar Bemerkungen:

  1. Sie müssen die Trigonometrieoperationen nicht auf derselben CPU ausführen, die die Hindernisvermeidung ausführt. Sie können die Aufgaben zwischen zwei Mikrocontrollern aufteilen und sie mithilfe eines Kommunikationsprotokolls zum Sprechen bringen.

  2. Für ein Experiment habe ich einen AHRS- Algorithmus mit einem Kalman-Filter in einen ARM Cortex M0-Mikrocontroller implementiert (es war ein STM32, erinnere mich nicht genau an den Rest, aber ich glaube, es war 32 MHz) und mit Festkomma-Mathematik konnte ich laufen es bei etwa 40 Proben / Sekunde. Mit einem schnelleren Controller sollten Sie es problemlos tragen können, und natürlich können Sie auch die FPGA- oder DSP-Methode ausprobieren.

  3. Ich würde sagen, dass die Steuerung der Beine nicht CPU-intensiv ist und Sie alle Beine zusammen steuern können, möglicherweise getrennt von den Trigonometrie- und Hindernisvermeidungsoperationen (siehe 1).

Clabacchio
quelle
Servos werden seriell über Controller oder Dynamixel-Bus angesteuert, das ist also grundsätzlich schon abgeladen. Das Problem ist, dass die Software weitaus mehr inverse Kinematik-Berechnungen durchführen muss, als nur für die Live-Pose / den Live-Gang erforderlich sind.
Barry Staes
5

Trigonometrie ist schwierig, aber es gibt Abkürzungen. Wenn Sie wenig Rechenleistung benötigen, sollten Sie den CORDIC-Algorithmus berücksichtigen.

Es ist im Grunde eine Wertetabelle für [zum Beispiel] Sinus. Die Winkel können in Grad und Bogenmaß angegeben werden. Der Punkt ist, der Sinus dieser Werte ist 1/2 (0,5), 1/4 (0,25), 1/8, 1/16 ... bis zu einem Bruchteil eines Grades, den Ihr Roboter verwenden kann.

Geben Sie Ihren Winkel ein, subtrahieren Sie den ersten Tabellenwert und setzen Sie Ihr Ergebnis auf erstes Ergebnis (0,5). Wenn Ihr Winkel durch Subtrahieren negativ wurde, ADDIEREN Sie den nächsten Wert (und subtrahieren Sie 0,25). Andernfalls ziehen Sie die Winkel weiter ab und addieren die Ergebnisse.

Wenn Sie am Ende der Tabelle angelangt sind, müssen Sie nur noch addieren und subtrahieren, aber Sie sind mächtig nah dran. Es gibt einen letzten "Geigenfaktor", mit dem multipliziert werden kann.

Die Genauigkeit [und Geschwindigkeit] des Ergebnisses hängt von der Größe [und Auflösung] der Nachschlagetabelle ab.

Alan Campbell
quelle
CORDIC sieht gut aus, aber ich benutze es nur, wenn es den Roboter schneller macht (das ist eine Voraussetzung).
Barry Staes
3

Sie können ein Raspberry Pi-Board verwenden, auf dem ein GNU / Linux-System für allgemeine Zwecke ausgeführt wird. Der Raspberry Pi verfügt über mehrere GPIO-Pins, über die Roboterservos oder Erweiterungskarten angeschlossen werden können.

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

Das Modell A Raspberry Pi kann mit seiner GPU bis zu 24 GFLOPs für allgemeine Gleitkomma-Berechnungen mit OpenGL ES 2 ausführen, wobei das Leistungsbudget unter 2,5 W bleibt.

http://elinux.org/RPi_Hardware

Beispiel: Ein batteriebetriebenes Roboter-Setup, das mit dem Raspberry Pi implementiert wurde.

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

Beispiel 2: Ein 6-beiniger Roboter, der von einem Himbeer-Pi gesteuert wird:

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

Beispiel 3: Ein selbstausgleichender 2-Rad-Umkehrpendelroboter, der von einem Himbeer-Pi gesteuert wird:

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

xranby
quelle
2

Für Roboter mit Beinen können Sie einige vordefinierte Beinbewegungssequenzen erstellen und "spielen". Die Umgehung von Hindernissen in Echtzeit kann mit einer einfachen fuzzy logicImplementierung erfolgen, bei der alles wieder im Tabellenformat vorliegt. Sie müssen lediglich den richtigen Wert daraus auswählen und für die defuzzyficationVerarbeitung verwenden.

Alles kann in C auf irgendwie schnelleren Prozessoren erledigt werden ARM7. Ich habe es anprobiert AVRund bin gescheitert, nachdem ich viel Zeit damit verbracht hatte, alles zu verwandeln fixed point arithmetics.

Gossamer
quelle
Ganganimationen zu spielen ist genau das, was ich nicht will. Der Algorithmus, den ich implementieren möchte, berechnet, was mit seinen Beinen zu tun ist, und dieser Algorithmus ist der Grund, warum ich eine schnelle Trigonometrie benötige. Das habe ich jedoch in meiner Frage nicht klargestellt. Und wenn ich sehe, dass sich so viele dazu gesellen, wäre es eine Verschwendung, die Frage zu bearbeiten. Ich werde zu gegebener Zeit genauer nachfragen.
Barry Staes
In diesem Fall würde ich mich für das Servo-Bein-System entscheiden. Jedes Bein hat einen eigenen Controller. Agentenbasierter Ansatz.
Gossamer
1

Die Stellaris-Plattform von Texas Instruments verfügt standardmäßig über eine Gleitkommaeinheit an Bord. Nicht sicher, ob der mit 80 MHz getaktete ARM-Controller für Ihre Anwendung schnell genug ist, aber ein LaunchPad-Entwicklungsboard ist ziemlich günstig: http://www.ti.com/ww/en/launchpad/stellaris_head.html

Es ist über USB programmierbar, kostenlose Toolchains sind für mindestens Windows und Linux verfügbar, misst ca. 4 × 6 cm und hat 30+ GPIO-Pins (wenn ich richtig gezählt habe).

jippie
quelle
0

Mithilfe von AVR können Sie eine x86-PowerPC-CPU- Karte in Ihre Roboteranwendung einbetten , um die Laufwerke des Roboters als Schnittstellenkarte zu steuern. Die schnellste und günstigste Lösung für Ihr Problem. Aber ja, Sie müssen viel Code in die x86-Architektur stecken, aber glücklicherweise können Sie viel Code aus Open-Source-Betriebssystemcodes heraus erfassen. (Wenn Ihre mechanische Konstruktion dieses Gewicht tragen kann)

Abdul Rehman
quelle
4
"x86" und "power pc" sind zwei völlig unterschiedliche (und zumindest an einigen Stellen in der Geschichte) konkurrierende Architekturen.
Chris Stratton