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)
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.
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.
Ein paar Anmerkungen:
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.
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.
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).
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.
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:
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 logic
Implementierung erfolgen, bei der alles wieder im Tabellenformat vorliegt und Sie lediglich den richtigen Wert daraus auswählen und für den defuzzyfication
Prozess verwenden müssen.
Alles kann in C auf irgendwie schnelleren Prozessoren wie ARM7
. Ich habe es ausprobiert AVR
und bin gescheitert, nachdem ich viel Zeit damit verbracht hatte, alles in fixed point arithmetics
.
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)
Barry Staes
Christoph
John u
Raketenmagnet
Christoph
Stefan
Barry Staes
richieqianle