Equation de mouvement à double pendule en python

Qu'est-ce qu'un double pendule?

Auparavant, dans l'article Equation moteur avec sympy, j'ai utilisé sympy pour dériver l'équation cinématique du système ressort-amortisseur. Cette fois, je voudrais dériver l'équation de mouvement du double pendule. Les doubles pendules sont courants en mécanique physique, et comme le montre la figure ci-dessous, il y a un pendule supplémentaire à l'extrémité du pendule. C'est juste un double pendule, mais c'est un mouvement complexe qui est incomparable à un seul pendule, donc il est souvent mentionné dans le chaos et les systèmes complexes.

二重振り子.png

Formule

Examinons d'abord l'équation de mouvement d'un simple pendule. (Imaginez un seul pendule dans la figure ci-dessus.)

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

On peut voir qu'un élément représente le terme inertiel et deux éléments représentent le terme de gravité, et l'accélération angulaire du pendule est proportionnelle au $ \ sin $ de l'angle du pendule à ce moment. Vient ensuite le double pendule. Quand il s'agira de le dériver sérieusement, ce sera une longue histoire en utilisant la fonction Lagrange, donc cette fois je vais vérifier la formule Wikipedia 8C% E9% 87% 8D% E6% 8C% AF% E3% 82% 8A% E5% AD% 90) est pris rapidement.

(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

En regardant simplement l'équation, vous pouvez voir qu'elle est considérablement plus compliquée que l'équation cinématique d'un simple pendule.

SymPyBotics La dernière fois, j'ai utilisé le module physics.mechanics de SymPy directement pour dériver la formule, mais le corps rigide comme cette fois est une clause. Je voudrais utiliser SymPyBotics, ce qui facilite la dérivation de formules pour les objets connectés par (lien). Obtenez-le depuis github et installez-le.

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

Créez un double pendule à l'aide de SymPyBotics. Ci-dessous le 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)

L'endroit où vous appelez sympybotics.RobotDef est l'endroit où vous créez le double pendule. [(0, 'l_1', 0, 'q'), (0, 'l_2', 0, 'q')] est le paramètre de double pendule réel, mais paramètre Denavit – Hartenberg est une méthode pour donner des paramètres utilisés par les robots. Brièvement, "l_1" et "l_2" indiquent la longueur du pendule 1 et du pendule 2, et "q" indique l'angle du pendule, qui sont affectés aux variables "q1" et "q2" après la création du pendule. Le premier angle est «q1-pi / 2», qui est ajouté pour ajuster l'endroit où l'angle est mesuré. En effet, SymPyBotics mesure l'angle à partir de l'axe x positif, tandis que la figure mesure l'angle à partir de l'axe y négatif. Si vous voulez faire un triple pendule, [(0, 'l_1', 0, 'q-pi / 2'), (0, 'l_2', 0, 'q'), (0, 'l_3', 0, ' q ')] . Le dernier tirage que j'ai écrit produit la formule qui exprime la position du pendule, et c'est comme suit.

[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))

Ensuite, chaque terme (terme d'inertie, terme de force centrifuge / collioli, terme de gravité) qui est un élément de l'équation de mouvement est dérivé. Généré avec rbt.dyn.gen_all (), et supprimez les paramètres inutiles (paramètres liés au moment d'inertie) cette fois.

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))

Enfin, nous calculons en fait l'équation cinétique. Au moment de la première ligne, l'équation cinétique a été dérivée, mais [Wikipedia](http://ja.wikipedia.org/wiki/%E4%BA%8C%E9%87%8D%E6%8C% AF% E3% 82% 8A% E5% AD% 90) a été simplifiée et les variables ont été modifiées pour comparer les résultats.

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))]])

C'est un peu difficile à voir, mais si vous pensez que la formule est égale à 0 et supprimez les variables inutiles, [l'équation de mouvement à double pendule de Wikipedia](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. Vous pouvez voir qu'il correspond à BC.8F). Cette fois, il s'agissait d'un double pendule, mais il semble qu'il puisse également être appliqué à la dérivation d'équations de mouvement pour plusieurs balanciers et robots.

Recommended Posts

Equation de mouvement à double pendule en python
Résolution d'équations de mouvement en Python (odeint)
Laissez Python calculer l'équation de mouvement d'Euler Lagrange
Trouvez la solution de l'équation d'ordre n avec python
Equation de mouvement avec sympy
Jugement d'équivalence d'objet en Python
Implémentation du tri rapide en Python
Avoir le graphique d'équation de la fonction linéaire dessiné en Python
Obtenez des données LeapMotion en Python.
Manipulation des pixels d'image en Python
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Gestion des fichiers JSON en Python
Implémentation du jeu de vie en Python
Affichage de la forme d'onde audio en Python
La loi des nombres en python
Implémentation du tri original en Python
Essayez d'utiliser LeapMotion avec Python
Conversion de la chaîne <-> date (date, datetime) en Python
Vérifiez le comportement du destroyer en Python
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
Résumé de diverses instructions for en Python
Empêcher le double lancement en Python (version améliorée)
Modèles Gang of Four (GoF) en Python
Principes de base pour exécuter NoxPlayer en Python
Remplacement en bloc des chaînes dans les tableaux Python
Projet Euler # 16 "Somme des pouvoirs" en Python
Traffic Safety-kun: Reconnaissance des panneaux de signalisation en Python
Résumé des méthodes intégrées, etc. de la liste Python
Utilisation d'opérateurs non logiques de ou en python
À la recherche du FizzBuzz le plus rapide en Python
Exemple pratique d'architecture hexagonale en Python
Projet Euler # 17 "Nombre de caractères" en Python
Débarrassez-vous des images DICOM en Python
Statut de chaque système de traitement Python en 2020
Projet Euler # 1 "Multiple de 3 et 5" en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Sortie du nombre de cœurs de processeur en Python
Métaprogrammation avec Python
Dessiner un graphique d'une fonction quadratique en Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Recevoir le websocket de l'API kabu station ® en Python
Méta-analyse en Python
Unittest en Python
Résumé de la façon d'importer des fichiers dans Python 3
Projet Euler # 10 "somme des nombres premiers" en Python
Fonctionnement sans assistance des feuilles de calcul Google (etc.) en Python
Simulation de double pendule
Récupérer l'appelant d'une fonction en Python
Afficher le résultat du traitement de la géométrie en Python
Époque en Python