Doppelte Pendelbewegungsgleichung in Python

Was ist ein Doppelpendel?

Zuvor habe ich in dem Artikel Motorgleichung mit Sympy Sympy verwendet, um die kinematische Gleichung des Feder-Dämpfer-Systems abzuleiten. Dieses Mal möchte ich die Bewegungsgleichung des Doppelpendels ableiten. Doppelpendel sind in der physikalischen Mechanik üblich, und wie in der folgenden Abbildung gezeigt, befindet sich am Ende des Pendels ein zusätzliches Pendel. Es ist nur ein Doppelpendel, aber es ist eine komplexe Bewegung, die mit einem einzelnen Pendel nicht zu vergleichen ist. Daher wird sie häufig in Chaos und komplexen Systemen erwähnt.

二重振り子.png

Formel

Betrachten wir zunächst die Bewegungsgleichung eines einfachen Pendels. (Stellen Sie sich in der obigen Abbildung ein einzelnes Pendel vor.)

ml\ddot{\theta} + mg \sin\theta = 0

Es ist ersichtlich, dass ein Element den Trägheitsterm darstellt und zwei Elemente den Schwerkraftterm darstellen und die Winkelbeschleunigung des Pendels proportional zu dem $ \ sin $ des Pendelwinkels zu diesem Zeitpunkt ist. Als nächstes kommt das Doppelpendel. Wenn es darum geht, ernsthaft abzuleiten, wird es eine lange Geschichte mit der Lagrange-Funktion sein, also werde ich dieses Mal die Formel Wikipedia überprüfen. 8C% E9% 87% 8D% E6% 8C% AF% E3% 82% 8A% E5% AD% 90) wird schnell eingenommen.

(m_1+m_2)l_1\ddot{\theta}_1 + m_2l_2\ddot{\theta}_2\cos(\theta_1 - \theta_2) + m_2l_2\dot{\theta}_2^2\sin(\theta_1 - \theta_2) + (m_1 + m_2)g\sin\theta_1 = 0
\\\
l_1l_2\ddot{\theta}_1\cos(\theta_1- \theta_2) + l_2^2\ddot{\theta}_2 - l_1l_2\dot{\theta}_1^2\sin(\theta_1 - \theta_2) + gl_2\sin\theta_2 = 0

Wenn Sie sich die Gleichung ansehen, sehen Sie, dass sie erheblich komplizierter ist als die kinematische Gleichung eines einfachen Pendels.

SymPyBotics Das letzte Mal habe ich das Modul physics.mechanics von SymPy direkt verwendet, um die Formel abzuleiten, aber der starre Körper wie diesmal ist eine Klausel. Ich möchte SymPyBotics verwenden, um das Ableiten von Formeln für durch (Link) verbundene Objekte zu vereinfachen. Holen Sie es sich von Github und installieren Sie es.

git clone https://github.com/cdsousa/SymPyBotics.git
cd SymPyBotics
sudo python setup.py install

Erstellen Sie mit SymPyBotics ein Doppelpendel. Unten ist der Code.

import sympybotics
rbtdef = sympybotics.RobotDef('Double Pendulum',
                              [(0, 'l_1', 0, 'q-pi/2'),
                               (0, 'l_2', 0, 'q')],
                              dh_convention='standard')
from sympy import symbols, Matrix, simplify, pprint
g = symbols('g')
rbtdef.gravityacc = Matrix([[0.0],[-g],[0.0]])
rbt = sympybotics.RobotDynCode(rbtdef)
for p in rbt.geo.p:
    pprint(simplify(p), use_unicode=False)

Der Ort, an dem Sie "sympybotics.RobotDef" aufrufen, ist der Ort, an dem Sie das Doppelpendel erstellen. [(0, 'l_1', 0, 'q'), (0, 'l_2', 0, 'q')] ist der eigentliche Doppelpendelparameter, aber Denavit-Hartenberg-Parameter ist eine Methode zur Angabe von Parametern, die von Robotern verwendet werden. Kurz gesagt geben "l_1" und "l_2" die Länge von Pendel 1 und Pendel 2 an, und "q" gibt den Winkel des Pendels an, die den Variablen "q1" und "q2" zugewiesen werden, nachdem das Pendel erstellt wurde. Der erste Winkel ist "q1-pi / 2", der hinzugefügt wird, um anzupassen, wo der Winkel gemessen wird. Dies liegt daran, dass SymPyBotics den Winkel von der positiven x-Achse misst, während die Abbildung den Winkel von der negativen y-Achse misst. Wenn Sie ein dreifaches Pendel wollen, "[(0," l_1 ", 0," q-pi / 2 "), (0," l_2 ", 0," q "), (0," l_3 ", 0," q ')] `. Der letzte Druck, den ich geschrieben habe, gibt die Formel aus, die die Position des Pendels ausdrückt, und lautet wie folgt.

[l_1*sin(q1) ]
[            ]
[-l_1*cos(q1)]
[            ]
[     0      ]
[l_1*sin(q1) + l_2*sin(q1 + q2) ]
[                               ]
[-l_1*cos(q1) - l_2*cos(q1 + q2)]
[                               ]
[               0               ]
rbt.dyn.gen_all()
params = {'l_1x': 0.0, 'l_1y': 0.0,
          'l_2x': 0.0, 'l_2y': 0.0,
          'L_1zz': 0.0, 'L_2zz': 0.0}
mass = simplify(rbt.dyn.M.subs(params))
corioli = simplify(rbt.dyn.c.subs(params))
gravity = simplify(rbt.dyn.g.subs(params))

Als nächstes wird jeder Term (Trägheitsterm, Zentrifugal- / Kolliolenkraftterm, Schwerkraftterm) abgeleitet, der ein Element der Bewegungsgleichung ist. Wird mit rbt.dyn.gen_all () generiert und löscht diesmal unnötige Parameter (Parameter, die sich auf das Trägheitsmoment beziehen).

eq = (mass * rbtdef.ddq + corioli + gravity).as_mutable()
eq[0, 0] -= eq[1, 0]
params = {rbtdef.ddq[1, 0]: rbtdef.ddq[1, 0] - rbtdef.ddq[0, 0],
          rbtdef.dq[1, 0]: rbtdef.dq[1, 0] - rbtdef.dq[0, 0],
          rbtdef.q[1, 0]: rbtdef.q[1, 0] - rbtdef.q[0, 0]}
print simplify(eq.subs(params))

Schließlich berechnen wir tatsächlich die kinetische Gleichung. Zum Zeitpunkt der ersten Zeile wurde die kinetische Gleichung abgeleitet, aber [Wikipedia](http://ja.wikipedia.org/wiki/%E4%BA%8C%E9%87%8D%E6%8C% AF% E3% 82% 8A% E5% AD% 90) wurde vereinfacht und die Variablen wurden geändert, um die Ergebnisse zu vergleichen.

Matrix([
[l_1*(\ddot{q}_1*l_1*m_1 + \ddot{q}_1*l_1*m_2 + \ddot{q}_2*l_2*m_2*cos(q1 - q2) + \dot{q}_2**2*l_2*m_2*sin(q1 - q2) + g*m_1*sin(q1) + g*m_2*sin(q1))],
[                                                 l_2*m_2*(\ddot{q}_1*l_1*cos(q1 - q2) + \ddot{q}_2*l_2 - \dot{q}_1**2*l_1*sin(q1 - q2) + g*sin(q2))]])

Es ist etwas schwer zu erkennen, aber wenn Sie der Meinung sind, dass die Formel gleich 0 ist und unnötige Variablen entfernen, [Wikipedia's Doppelpendel-Bewegungsgleichung](http://ja.wikipedia.org/wiki/%E4%BA%8C%] E9% 87% 8D% E6% 8C% AF% E3% 82% 8A% E5% AD% 90 # .E9.81.8B.E5.8B.95.E6.96.B9.E7.A8.8B.E5. Sie können sehen, dass es mit BC.8F übereinstimmt. Diesmal war es ein Doppelpendel, aber es scheint, dass es auch zur Ableitung von Bewegungsgleichungen für mehrere Pendel und Roboter angewendet werden kann.

Recommended Posts

Doppelte Pendelbewegungsgleichung in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Lassen Sie Python die Bewegungsgleichung von Euler Lagrange berechnen
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Bewegungsgleichung mit Sympy
Objektäquivalenzbeurteilung in Python
Implementierung der schnellen Sortierung in Python
Lassen Sie das Gleichungsdiagramm der linearen Funktion in Python zeichnen
Holen Sie sich LeapMotion-Daten in Python.
Bildpixel-Manipulation in Python
Zeitdelta in Python 2.7-Serie teilen
MySQL-automatische Escape-Funktion von Parametern in Python
Umgang mit JSON-Dateien in Python
Implementierung eines Lebensspiels in Python
Audio-Wellenform-Anzeige in Python
Das Gesetz der Zahlen in Python
Implementierung der ursprünglichen Sortierung in Python
Versuchen Sie es mit LeapMotion mit Python
Konvertierung der Zeichenfolge <-> Datum (Datum, Datum / Uhrzeit) in Python
Überprüfen Sie das Verhalten des Zerstörers in Python
Übung, dies in Python zu verwenden (schlecht)
Allgemeine Relativitätstheorie in Python: Einführung
Ausgabebaumstruktur von Dateien in Python
Zeigen Sie eine Liste der Alphabete in Python 3 an
Zusammenfassung verschiedener for-Anweisungen in Python
Doppelstart in Python verhindern (verbesserte Version)
Gang of Four (GoF) -Muster in Python
Grundlagen zum Ausführen von NoxPlayer in Python
Massenersatz von Zeichenfolgen in Python-Arrays
Projekt Euler # 16 "Summe der Kräfte" in Python
Traffic Safety-Kun: Erkennung von Verkehrszeichen in Python
Zusammenfassung der integrierten Methoden usw. der Python-Liste
Nicht logische Operatorverwendung von oder in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Praktisches Beispiel für hexagonale Architektur in Python
Projekt Euler # 17 "Anzahl der Zeichen" in Python
Entfernen Sie DICOM-Bilder in Python
Status jedes Python-Verarbeitungssystems im Jahr 2020
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Geben Sie die Anzahl der CPU-Kerne in Python aus
Metaprogrammierung mit Python
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Erhalten Sie einen Websocket der kabu station ® API in Python
Metaanalyse in Python
Unittest in Python
Zusammenfassung zum Importieren von Dateien in Python 3
Projekt Euler # 10 "Summe der Primzahlen" in Python
Unbeaufsichtigter Betrieb von Google Spreadsheets (usw.) in Python
Doppelpendelsimulation
Holen Sie sich den Aufrufer einer Funktion in Python
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Epoche in Python