Mikrocontroller/CPU für schnelle Trigonometrie im Roboter?

Dies betrifft Hardware, die wenig wiegt, da ein (fetter, katzengroßer, 6 Beine mit 3 Freiheitsgraden) Laufroboter sie herumtragen sollte. Aufgrund dieses Gehens muss viel Trigonometrie durchgeführt werden (mit Matrixmathematik oder nicht, ich bin mir noch nicht sicher), und hier kommt diese Frage.

PIC, Arduino oder billiger AVR sind nicht schnell genug, um alles 100/Sekunde zu berechnen und Dinge wie Trägheit und Hindernisvermeidung oder sogar Brute-Force-Pfade/Gangarten im Auge zu behalten.

  • Plan A ist, das Gehirn auf dem Roboter zu tragen. Ob Mikroprozessor, Micro-ITX, Nettop oder andere; Was ist effiziente Hardware, um Trigonometrie / Matrixmathematik schnell durchzuführen?

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

  • Plan B besteht darin, einen x86-Rechner über WLAN zu verbinden, um die schwere Arbeit zu erledigen. Großartig auch für das Prototyping, aber ich möchte, dass dies irgendwann zu Plan A migriert wird, wenn die Hardware miniaturisiert wird. Aber selbst dann, welche Desktop-CPU kann die Trigonometrie am schnellsten ausführen?

  • Plan C besteht darin, die Last zu verteilen und einen energieeffizienten Mikrocontroller / Kern für jedes Bein zu haben, obwohl dies aus vielen Gründen nicht die beste Lösung ist, ich mag die Erweiterbarkeit.

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

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

Ich bin am meisten daran interessiert, Spaß an der Entwicklung von Software für diesen Roboter / diese Plattform zu haben, aber ich möchte keine Gelegenheit in der Hardwareleistung verpassen. Ich hatte erwartet, spezialisierte Plattformen zu finden.
Fließkomma-Mathematik ist kein Muss. Sie können jederzeit Sinustabellen (oder andere Funktionstabellen) erstellen, sie in den Flash eines AVR stecken und mit Festkommaberechnungen zwischen den Werten interpolieren. Dies könnte für Ihre Anforderungen schnell genug sein.
Anstatt schwere Berechnungen in Echtzeit anzustellen, besteht eine gängige Lösung darin, Wertetabellen vorab zu berechnen und dann die Antwort nachzuschlagen. Gut ist auch die Idee, die Arbeit auf mehrere CPUs zu verteilen, zum Beispiel eine leistungsstarke Master-CPU und dann einen Prozessor pro Bein.
Sie können diese Art von Fragen auch auf der Robotics Stackexchange-Website stellen .
Wie betätigst du die Beine? Wenn Sie Servos verwenden, benötigen diese bei richtiger Ausführung fast keine CPU-Zeit. Wenn Sie erwägen, auch bei robotics.sx zu fragen, teilen Sie bitte einen Link.
Plan B wird die Berechnung ziemlich schnell durchführen, aber die Kommunikation über WiFi wird höchstwahrscheinlich den Leistungsgewinn zunichte machen. Haben Sie darüber nachgedacht, ein über USB verbundenes Android-Telefon zu verwenden? Es ist viel mehr Rechenleistung ohne Verzögerung von WLAN
@stefan Ich habe ein Android-Telefon/Tablet über USB in Betracht gezogen. Wenn es leistungsfähig ist, ist es sicherlich eine Option, aber ich gehe nicht davon aus. Ich möchte auch den OS-Overhead vermeiden.
Ein STM32F4-Board mit Floating Point Unit scheint für Ihre Anwendung ausreichend zu sein. Es hat 128k SRAM mit 64k CCM. Es kann mit 168 MHz betrieben werden. Eine 32-Bit-Gleitkommamultiplikation dauert nur 1 CPU-Zyklus.

Antworten (8)

Es hört sich nicht so an, als ob Ihre Anwendung wirklich so rechenintensiv ist. Ein dsPIC kann beispielsweise 400.000 Anweisungen für jede Ihrer Iterationen ausführen. Das ist eine Menge. Es wird jedoch nützlich sein, gute E/A-Fähigkeiten auf niedrigem Niveau, PWM-Generatoren, Zeitgeber und dergleichen zu haben.

Sinus und Cosinus sind in einer Integer-Maschine wie einem dsPIC wirklich nicht so schwer zu machen. Ich habe es selbst ein paar Mal gemacht. Der Trick besteht darin, die richtige Darstellung für Winkel auszuwählen. Radiant mag aus theoretischer Sicht nett sein, ist aber rechnerisch unpraktisch. Degress sind künstlich und einfach albern. Verwenden Sie den gesamten Bereich Ihrer Ganzzahl in Maschinengröße, um eine vollständige Umdrehung darzustellen. Auf einem dsPIC, einem 16-Bit-Prozessor, entspricht beispielsweise eine volle Umdrehung 65536 Zählwerten, was viel mehr Genauigkeit und Auflösung bedeutet, als Sie zum Steuern eines Roboters benötigen oder die Sie sowieso messen können.

Ein Vorteil dieser Darstellung besteht darin, dass das gesamte Umbrechen automatisch erfolgt, nur weil vorzeichenlose Ganzzahlen addiert und subtrahiert werden. Ein weiterer wesentlicher Vorteil besteht darin, dass sich diese Darstellung besonders gut zur Verwendung von Nachschlagetabellen für Sinus und Cosinus eignet. Sie müssen nur 1/4 Zyklus speichern. Die oberen beiden Bits des Winkels sagen Ihnen, in welchem ​​Quadranten Sie sich befinden, was Ihnen sagt, ob Sie in der Tabelle vorwärts oder rückwärts indexieren und ob Sie das Ergebnis negieren sollen oder nicht. Die nächsten N niedrigeren Bits werden verwendet, um in die Tabelle zu indizieren, wobei die Tabelle 2 N Segmente (2 N + 1 Punkte) hat. Beachten Sie, dass das Rückwärtsindizieren in die Tabelle dann nur das Komplementieren der Tabellenindexbits ist.

Sie können der Tabelle genug Punkte geben, damit die Auswahl der nächsten Antwort gut genug ist. Wenn die Tabelle beispielsweise 1024 Segmente hat, werden Sinus und Cosinus auf das nächste 1/4096 eines Kreises berechnet. Das wird ausreichen, um einen Roboter zu steuern. 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.

Wie auch immer, der Punkt ist, dass Ihre Anforderungen an diesen Prozessor anscheinend nicht mit dem angegebenen Problem übereinstimmen. Ich würde wahrscheinlich einen dsPIC33F verwenden. Es ist sicherlich klein, leicht und viel energieeffizienter als ein vollwertiger Allzweck-Rechenprozess wie ein x86 auf einem Einplatinencomputer.

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 Beine von 3 DOF mit mindestens 100/Sekunde durchzuführen? Das ist 6x3x100 inverse Kinematik, nur um die Live-Beinbewegungen zu erhalten. Jedenfalls muss die inverse Kinematik auf derselben Plattform stattfinden, auf der der Algorithmus ausgeführt wird, damit ich diese Teile nicht zweimal neu implementieren muss. Der Algorithmus wäre anspruchsvoller und würde sicherlich nicht auf einem PIC- oder Arduino-isch-Board laufen können.

Sie werden mit vielen Eingangssignalen zu tun haben. Sie brauchen nicht unbedingt eine CPU mit hohem Durchsatz; viele Signale können parallel verarbeitet werden. Dies ist typisches DSP-Territorium. Natürlich möchten Sie auch die allgemeine CPU-Funktionalität. Dies ist kein Problem. Es gibt viele CPUs mit integrierten DSPs.

Ein typisches Chipdesign für solche Anwendungen ist ein Cortex-M4. Dieser verfügt über einen integrierten DSP, und -M4F-Versionen haben auch eine FPU. Dies ist möglicherweise nicht erforderlich, Trigonometrie kann problemlos in Festkommamathematik durchgeführt werden.

Hätte Matrixmathematik einen Vorteil gegenüber dem Cortex-M4F? (falls ich mich dorthin wage, Prototyping)
Nur um ein wenig pedantisch zu sein - Der Cortex-M4-Prozessorkern hat keinen integrierten DSP, er hat ein gewisses Maß an DSP-Fähigkeit, die in seinen Hauptprozessorkern integriert ist. Die DSP-Erweiterungen sind das Hinzufügen von Multiplizier-/Akkumulierbefehlen, die typische DSP-Funktionen wie Filtern und Transformieren erleichtern.

Ein paar Anmerkungen:

  1. Sie müssen die Trigonometrieoperationen nicht auf derselben CPU verarbeiten, die die Hindernisvermeidung ausführt. Sie können die Aufgaben zwischen zwei Mikrocontrollern aufteilen und ein Kommunikationsprotokoll verwenden, um sie zum Sprechen zu bringen.

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

Servos werden seriell über Controller oder Dynamixelbus angesteuert, sind also im Grunde schon ausgelastet. Das Problem ist, dass die Software viel mehr Berechnungen der inversen Kinematik durchführen muss, als nur für die Live-Pose/Gangart erforderlich sind.

Trigonometrie ist knifflig, aber es gibt Abkürzungen. Wenn Sie wenig Rechenleistung haben, sollten Sie den CORDIC-Algorithmus in Betracht ziehen.

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

Geben Sie Ihren Winkel ein, subtrahieren Sie den ersten Tabellenwert und setzen Sie Ihr Ergebnis auf das erste Ergebnis (0,5). Wenn Ihr Winkel durch Subtraktion negativ wurde, ADDIEREN Sie den nächsten Wert (und subtrahieren Sie 0,25). Fahren Sie andernfalls damit fort, Winkel zu subtrahieren und Ergebnisse zu addieren.

Wenn Sie am Ende der Tabelle angelangt sind, haben Sie nur noch addiert und subtrahiert, aber Sie sind ganz nah dran. Es gibt einen letzten "Geigenfaktor", mit dem man multiplizieren kann.

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

CORDIC sieht gut aus, aber ich werde es nur verwenden, wenn es den Roboter schneller macht (das ist eine Voraussetzung).

Sie können erwägen, ein Raspberry Pi-Board zu verwenden, auf dem ein Allzweck-GNU/Linux-System ausgeführt wird. Der Raspberry Pi verfügt über mehrere GPIO-Pins, die zum Anschluss von Roboterservos oder Erweiterungskarten verwendet werden können.

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

Das Modell A Raspberry Pi kann mit seiner GPU unter Verwendung von OpenGL ES 2 bis zu 24 GFLOPs allgemeine Gleitkommaberechnungen durchführen und bleibt dabei unter 2,5 W Leistungsbudget.

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

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

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

Das Abspielen von Ganganimationen ist genau das, was ich nicht möchte. Der Algorithmus, den ich implementieren möchte, findet selbst heraus, was mit seinen Beinen zu tun ist, und dieser Algorithmus ist der Grund, warum ich eine schnelle Trigonometrie brauche. Das habe ich in meiner Frage aber nicht deutlich gemacht. Und da sich so viele dazu äußern, wäre es eine Verschwendung, die Frage zu bearbeiten. Ich werde zu gegebener Zeit nachfragen und genauer werden.
In diesem Fall würde ich mich für das Servobeinsystem entscheiden. Jedes Bein hat seinen eigenen Controller. Agentenbasierter Ansatz.

Die Stellaris-Plattform von Texas Instruments hat standardmäßig eine Gleitkommaeinheit an Bord. Ich bin mir nicht sicher, ob der mit 80 MHz getaktete ARM-Controller schnell genug für Ihre Anwendung ist, aber ein LaunchPad-Entwicklungsboard ist ziemlich billig: 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 etwa 4 × 6 cm und hat mehr als 30 GPIO-Pins (wenn ich richtig gezählt habe).

Sie können mit Hilfe von AVR ein x86-Power-PC-CPU-Board in Ihre Roboteranwendung einbetten , um die Antriebe des Roboters als Schnittstellenkarte zu steuern. Die schnellste und günstigste Lösung Ihres Problems. Aber ja, Sie müssen viel Codierung in die x86-Architektur stecken, aber glücklicherweise können Sie viel Codierung von Open-Source-Betriebssystemcodes erfassen. (Wenn Ihre mechanische Konstruktion dieses Gewicht tragen kann)

"x86" und "Power PC" sind zwei völlig unterschiedliche (und zumindest an einigen Stellen in der Geschichte) konkurrierende Architekturen.