Cinématique d'une trottinette électrique

Marc BUFFAT département mécanique, université Lyon 1

 "Life is like riding a bicycle. 
  To keep your balance, you must keep moving.”
  (Albert Einstein)

trottinette_elec.jpg

In [1]:
%matplotlib inline
import numpy as np
import sympy as sp
import k3d
import matplotlib.pyplot as plt
from IPython.core.display import HTML
from IPython.display import display,Image
from sympy.physics.vector import init_vprinting
init_vprinting(use_latex='mathjax', pretty_print=False)

Problème

Soit le modèle de trottinette ci-dessous

trottinette.png

La trottinette consiste en un cadre AC horizontale de longueur L, une fourche verticale CB pouvant tourné suivant l'axe CB, une roue arrière d'axe A de rayon R et une roue avant d'axe B de même rayon r. Le conducteur de la trottinette a son centre de gravité en G au milieu de AB et distant de h suivant la verticale.

La cinématique de la trottinette est donnée par la position de A et sa vitesse (fournit par le moteur), ainsi que la position des autres éléments par rapport à A et des conditions cinématiques (contacte sans glissement).

On note O un point d'origine et $R_0$ le repère fixe d'axe vertical $R_0.z$, La trottinette se déplace sur un plan horizontal ($R_0.x$,$R_0.y$) en conservant un cadre dans le plan vertical. Soit $R_1$ le repère lié au cadre en A, de position $x_A,y_A$ et orienté dans le sens de la vitesse en A est en rotation dans le plan horizontal avec un angle $\psi$ autour de la verticale $R_0.z$. On note $L$ la distance entre l'axe des 2 roues $A$ et $B$, et on suppose que $G$ est à égale distance de $A$ et $B$ et distant de $h$ en hauteur. On note $R_2$ le repère lié à la fourche qui est en rotation d'angle $\phi$ autour de $R_1.z$. On note $R_3$ le repère lié à la roue arrière qui est en rotation d'angle $\theta_1$ autour de $R_1.y$, et $R_4$ le repère lié à la roue avant qui est en rotation d'angle $\theta_2$ autour de $R_2.y$.

objectifs

on se propose de déterminer la cinématique de la trottinette dans le cas général, puis dans le cas d'une trajectoire rectiligne (pour vérification) et enfin dans le cas d'une trajectoire circulaire de rayon $R$.

modélisation

5 repères:

  • (O,R0) fixe ,
  • (A,R1) lié au cadre avec l'axe $R1.x$ orienté suivant la direction de la vitesse en A (angle $\psi$).
  • (B,R2) lié à la fourche (rotation $\phi$)
  • (A,R3) lié à la roue arrière (rotation $\theta_1$)
  • (B,R4) lié à la roue avant (rotation $\theta_2$)

La position de la trottinette avec ses roues et son conducteur est donc donnée par:

  • la position $x_a,y_a$ de $A$ par rapport à O,
  • sa vitesse d'amplitude $u_a$ d'angle $\psi$ qui correspond à la rotation du cadre autour de $R_0.z$,
  • la rotation d'angle $\phi$ de la fourche par rapport au cadre autour de $R_1.z$
  • les rotations d'angles $\theta_1$ et $\theta_2$ des roues par rapport à $R_1.y$ et $R_2.y$.

Des paramétres r (rayon roue),h (hauteur de G),L (longueur du cadre),R (rayon de la trajectoire)

Modèle cinématique

définition des paramétres

In [2]:
from sympy.physics.mechanics import dynamicsymbols, Point, ReferenceFrame
In [3]:
# parametres du problème
r, L, h, R, t = sp.symbols('r L h R t')
# degrés de liberté
xa, ya  = dynamicsymbols('x_a y_a')
ua = dynamicsymbols('u_a')
psi, phi, theta1, theta2 = dynamicsymbols('psi phi theta_1 theta_2')
In [4]:
# relation cinématique
display(sp.Eq(xa.diff(t),ua*sp.cos(psi)))
display(sp.Eq(ya.diff(t),ua*sp.sin(psi)))
relU = [(xa.diff(t), ua*sp.cos(psi)),(ya.diff(t), ua*sp.sin(psi))]
display(relU)
$\displaystyle \dot{x}_{a} = u_{a} \operatorname{cos}\left(\psi\right)$
$\displaystyle \dot{y}_{a} = u_{a} \operatorname{sin}\left(\psi\right)$
$\displaystyle \left[ \left( \dot{x}_{a}, \ u_{a} \operatorname{cos}\left(\psi\right)\right), \ \left( \dot{y}_{a}, \ u_{a} \operatorname{sin}\left(\psi\right)\right)\right]$

définition des repères

In [5]:
# reperes et points
O = Point('O')
R0 = ReferenceFrame('R_0')
# cadre
R1 = ReferenceFrame('R_1')
R1.orient(R0,'Axis',[psi, R0.z])
A = Point('A')
A.set_pos(O,xa*R0.x + ya*R0.y + r*R0.z )
# roue arriere
R3 = ReferenceFrame('R_3')
R3.orient(R1,'Axis',[theta1, R1.y])
# point P1 de la roue arriere
P1 = Point('P1')
P1.set_pos(A,r*R3.z)
# centre de gravité
G = Point('G')
G.set_pos(A, L/2*R1.x + h*R1.z)
# fourche 
R2 = ReferenceFrame('R_2')
R2.orient(R1,'Axis',[phi, R1.z])
B = Point('B')
B.set_pos(A, L*R1.x)
# roue avant
R4 = ReferenceFrame('R_4')
R4.orient(R2,'Axis',[theta2, R2.y])
# point P2 de la roue avant
P2 = Point('P2')
P2.set_pos(B,r*R4.z)

Calcul de la position des points dans R0

In [6]:
# positions dans R0 du cadre
display('OG=',G.pos_from(O).express(R0).simplify())
display('OA=',A.pos_from(O).express(R0).simplify())
display('OB=',B.pos_from(O).express(R0).simplify())
'OG='
$\displaystyle (\frac{L \operatorname{cos}\left(\psi\right)}{2} + x_{a})\mathbf{\hat{r_0}_x} + (\frac{L \operatorname{sin}\left(\psi\right)}{2} + y_{a})\mathbf{\hat{r_0}_y} + (h + r)\mathbf{\hat{r_0}_z}$
'OA='
$\displaystyle x_{a}\mathbf{\hat{r_0}_x} + y_{a}\mathbf{\hat{r_0}_y} + r\mathbf{\hat{r_0}_z}$
'OB='
$\displaystyle (L \operatorname{cos}\left(\psi\right) + x_{a})\mathbf{\hat{r_0}_x} + (L \operatorname{sin}\left(\psi\right) + y_{a})\mathbf{\hat{r_0}_y} + r\mathbf{\hat{r_0}_z}$
In [7]:
# position des roues
print("Position des roues:")
display('AP1=',P1.pos_from(A).express(R1).simplify())
display('BP2=',P2.pos_from(B).express(R1).simplify())
Position des roues:
'AP1='
$\displaystyle r \operatorname{sin}\left(\theta_{1}\right)\mathbf{\hat{r_1}_x} + r \operatorname{cos}\left(\theta_{1}\right)\mathbf{\hat{r_1}_z}$
'BP2='
$\displaystyle r \operatorname{sin}\left(\theta_{2}\right) \operatorname{cos}\left(\phi\right)\mathbf{\hat{r_1}_x} + r \operatorname{sin}\left(\phi\right) \operatorname{sin}\left(\theta_{2}\right)\mathbf{\hat{r_1}_y} + r \operatorname{cos}\left(\theta_{2}\right)\mathbf{\hat{r_1}_z}$

cinématique

In [8]:
# vitesse de A
O.set_vel(R0,0.)
A.set_vel(R0,ua*R1.x)
display("VA=",A.vel(R0))
'VA='
$\displaystyle u_{a}\mathbf{\hat{r_1}_x}$
In [9]:
# vitesse du cadre
A.set_vel(R1,0.)
display("VA=",A.vel(R0))
G.set_vel(R1,0.)
display("VG=",G.v1pt_theory(A,R0,R1))
B.set_vel(R1,0.)
display("VB=",B.v2pt_theory(A,R0,R1))
'VA='
$\displaystyle u_{a}\mathbf{\hat{r_1}_x}$
'VG='
$\displaystyle u_{a}\mathbf{\hat{r_1}_x} + \frac{L \dot{\psi}}{2}\mathbf{\hat{r_1}_y}$
'VB='
$\displaystyle u_{a}\mathbf{\hat{r_1}_x} + L \dot{\psi}\mathbf{\hat{r_1}_y}$
In [10]:
# vitesse des roues
display("VP1=",P1.v2pt_theory(A,R0,R3).express(R1).simplify())
display("VP2=",P2.v2pt_theory(B,R0,R4).express(R2).simplify())
'VP1='
$\displaystyle (r \operatorname{cos}\left(\theta_{1}\right) \dot{\theta}_{1} + u_{a})\mathbf{\hat{r_1}_x} + r \operatorname{sin}\left(\theta_{1}\right) \dot{\psi}\mathbf{\hat{r_1}_y} - r \operatorname{sin}\left(\theta_{1}\right) \dot{\theta}_{1}\mathbf{\hat{r_1}_z}$
'VP2='
$\displaystyle (L \operatorname{sin}\left(\phi\right) \dot{\psi} + r \operatorname{cos}\left(\theta_{2}\right) \dot{\theta}_{2} + u_{a} \operatorname{cos}\left(\phi\right))\mathbf{\hat{r_2}_x} + (L \operatorname{cos}\left(\phi\right) \dot{\psi} + r \left(\dot{\phi} + \dot{\psi}\right) \operatorname{sin}\left(\theta_{2}\right) - u_{a} \operatorname{sin}\left(\phi\right))\mathbf{\hat{r_2}_y} - r \operatorname{sin}\left(\theta_{2}\right) \dot{\theta}_{2}\mathbf{\hat{r_2}_z}$
In [11]:
# projection dans R1
VP1=P1.vel(R0).express(R1).simplify()
display("VP1=",VP1)
VP2=P2.vel(R0).express(R2).simplify()
display("VP2=",VP2)
'VP1='
$\displaystyle (r \operatorname{cos}\left(\theta_{1}\right) \dot{\theta}_{1} + u_{a})\mathbf{\hat{r_1}_x} + r \operatorname{sin}\left(\theta_{1}\right) \dot{\psi}\mathbf{\hat{r_1}_y} - r \operatorname{sin}\left(\theta_{1}\right) \dot{\theta}_{1}\mathbf{\hat{r_1}_z}$
'VP2='
$\displaystyle (L \operatorname{sin}\left(\phi\right) \dot{\psi} + r \operatorname{cos}\left(\theta_{2}\right) \dot{\theta}_{2} + u_{a} \operatorname{cos}\left(\phi\right))\mathbf{\hat{r_2}_x} + (L \operatorname{cos}\left(\phi\right) \dot{\psi} + r \left(\dot{\phi} + \dot{\psi}\right) \operatorname{sin}\left(\theta_{2}\right) - u_{a} \operatorname{sin}\left(\phi\right))\mathbf{\hat{r_2}_y} - r \operatorname{sin}\left(\theta_{2}\right) \dot{\theta}_{2}\mathbf{\hat{r_2}_z}$

analyse des conditions cinématiques de non-glissement

  • 3 conditions
  • permet de calculer la rotation des 2 roues $\omega_1,\omega_2$, et l'angle de rotation $\phi$ de la fourche si on se donne la vitesse $u_a$ et sa direction $\psi$

    #### calcul de la vitesse des roues au point de contacte

    point de contacte $\dot{\theta}=\omega$ et $\theta=\pi$

In [12]:
# condition de roulement sans glissement roue arriere: VG1=0
omega1 = sp.symbols("omega_1")
display(VP1)
VG1=VP1.subs([(theta1.diff(t),omega1),(theta1,sp.pi)])
display("cdt de non glissement roue arriere:",VG1)
cdtsGL1=[(omega1,sp.solve(VG1.dot(R1.x),omega1)[0])]
display(cdtsGL1)
$\displaystyle (r \operatorname{cos}\left(\theta_{1}\right) \dot{\theta}_{1} + u_{a})\mathbf{\hat{r_1}_x} + r \operatorname{sin}\left(\theta_{1}\right) \dot{\psi}\mathbf{\hat{r_1}_y} - r \operatorname{sin}\left(\theta_{1}\right) \dot{\theta}_{1}\mathbf{\hat{r_1}_z}$
'cdt de non glissement roue arriere:'
$\displaystyle (- \omega_{1} r + u_{a})\mathbf{\hat{r_1}_x}$
$\displaystyle \left[ \left( \omega_{1}, \ \frac{u_{a}}{r}\right)\right]$
In [13]:
# condition de roulement sans glissement roue avant: VP2=0
omega2 = sp.symbols("omega_2")
display(VP2)
VG2=VP2.subs([(theta2.diff(t),omega2),(theta2,sp.pi)])
display("cdt de non glissement:",VG2)
$\displaystyle (L \operatorname{sin}\left(\phi\right) \dot{\psi} + r \operatorname{cos}\left(\theta_{2}\right) \dot{\theta}_{2} + u_{a} \operatorname{cos}\left(\phi\right))\mathbf{\hat{r_2}_x} + (L \operatorname{cos}\left(\phi\right) \dot{\psi} + r \left(\dot{\phi} + \dot{\psi}\right) \operatorname{sin}\left(\theta_{2}\right) - u_{a} \operatorname{sin}\left(\phi\right))\mathbf{\hat{r_2}_y} - r \operatorname{sin}\left(\theta_{2}\right) \dot{\theta}_{2}\mathbf{\hat{r_2}_z}$
'cdt de non glissement:'
$\displaystyle (L \operatorname{sin}\left(\phi\right) \dot{\psi} - \omega_{2} r + u_{a} \operatorname{cos}\left(\phi\right))\mathbf{\hat{r_2}_x} + (L \operatorname{cos}\left(\phi\right) \dot{\psi} - u_{a} \operatorname{sin}\left(\phi\right))\mathbf{\hat{r_2}_y}$
In [14]:
# cdts de non glissement
phi0=sp.symbols("phi_0")
eq1=VG2.dot(R2.x)
display(eq1)
eq2=VG2.dot(R2.y)
display(eq2)
eq11=(sp.cos(phi)*eq1-sp.sin(phi)*eq2).simplify()
eq22=(sp.sin(phi)*eq1+sp.cos(phi)*eq2).simplify()
cdtsGL2=[(phi0,sp.solve(eq22.subs([(omega2,sp.solve(eq11,omega2)[0])]),phi)[0]),
         (omega2,sp.solve(eq11,omega2)[0].subs(phi,phi0))]
display(cdtsGL2)
$\displaystyle L \operatorname{sin}\left(\phi\right) \dot{\psi} - \omega_{2} r + u_{a} \operatorname{cos}\left(\phi\right)$
$\displaystyle L \operatorname{cos}\left(\phi\right) \dot{\psi} - u_{a} \operatorname{sin}\left(\phi\right)$
$\displaystyle \left[ \left( \phi_{0}, \ 2 \operatorname{atan}\left(\frac{\sqrt{L^{2} \dot{\psi}^{2} + u^{2}_{a}} - u_{a}}{L \dot{\psi}}\right)\right), \ \left( \omega_{2}, \ \frac{u_{a}}{r \operatorname{cos}\left(\phi_{0}\right)}\right)\right]$

Vérification dans le cas d'une trajectoire rectiligne uniforme

la vitesse est constante en module et direction

  • $u_a = cste$ fixé
  • $\dot{\psi} = 0$ donc $\psi=cste$

la position de A est fonction de l'angle initial de la vitesse $\psi(0) = \psi_0$

$$x_a = u_a \cos(\psi_0) t, y_a = u_a \sin(\psi_0) t$$

les conditions de roulement sans glissement impose l'alignement de la fourche et du cadre:

$$\phi = 0$$$$\dot{\theta_1} = \omega_1 = \frac{u_a}{r} = \dot{\theta_2} = \omega_2 $$

conditions de roulement sans glissement

In [15]:
# cdts de roulement sans glissement
cdts = [(psi.diff(t),0),(phi,0)]
display("VG1=",VG1)
display("VG2=",VG2.subs(cdts))
'VG1='
$\displaystyle (- \omega_{1} r + u_{a})\mathbf{\hat{r_1}_x}$
'VG2='
$\displaystyle (- \omega_{2} r + u_{a})\mathbf{\hat{r_2}_x}$

On a donc forcement $$\omega_1 = \omega_2 = \frac{u_A}{r}$$

In [16]:
# conditions cinematiques
cdtsNG=[(theta1,omega1*t),(theta2,omega2*t),
        (omega1,ua/r),(omega2,ua/r),(xa,ua*sp.cos(psi)*t),(ya,ua*sp.sin(psi)*t)]
display(cdtsNG)
$\displaystyle \left[ \left( \theta_{1}, \ \omega_{1} t\right), \ \left( \theta_{2}, \ \omega_{2} t\right), \ \left( \omega_{1}, \ \frac{u_{a}}{r}\right), \ \left( \omega_{2}, \ \frac{u_{a}}{r}\right), \ \left( x_{a}, \ t u_{a} \operatorname{cos}\left(\psi\right)\right), \ \left( y_{a}, \ t u_{a} \operatorname{sin}\left(\psi\right)\right)\right]$

calcul de la trajectoire numériquement

In [17]:
# valeurs des parametres numériques en USI
valnum=[(L,1.),(r,0.05),(h,1.),(ua,1*0.27778),(psi,np.pi/6),(phi,0)]
display(valnum)
$\displaystyle \left[ \left( L, \ 1.0\right), \ \left( r, \ 0.05\right), \ \left( h, \ 1.0\right), \ \left( u_{a}, \ 0.27778\right), \ \left( \psi, \ 0.5235987755982988\right), \ \left( \phi, \ 0\right)\right]$
In [18]:
# verification
display("OA=",A.pos_from(O).subs(cdtsNG).subs(valnum))
display("OP1",P1.pos_from(O).subs(cdtsNG).subs(valnum))
'OA='
$\displaystyle 0.240564536663241 t\mathbf{\hat{r_0}_x} + 0.13889 t\mathbf{\hat{r_0}_y} + 0.05\mathbf{\hat{r_0}_z}$
'OP1'
$\displaystyle 0.05\mathbf{\hat{r_3}_z} + 0.240564536663241 t\mathbf{\hat{r_0}_x} + 0.13889 t\mathbf{\hat{r_0}_y} + 0.05\mathbf{\hat{r_0}_z}$
In [19]:
# bibliotheque de tracer des trajectoires
from Trottinette import Trottinette
trottinette =  Trottinette([O,A,B,G,P1,P2], [R0,R1], [r,h,L,R], cdts, cdtsNG, valnum)
In [20]:
# calcul sur un temps tmax
tmax = float((2*L/ua).subs(valnum))
print("tmax=",tmax)
trottinette.traj2D([A,G,B],t,tmax)
tmax= 7.199942400460795

vitesse

In [21]:
# verification
display("VA=",A.vel(R0).subs(cdtsNG).subs(valnum))
display("VP1=",P1.vel(R0).subs(cdtsNG).subs(valnum).doit())
'VA='
$\displaystyle 0.27778\mathbf{\hat{r_1}_x}$
'VP1='
$\displaystyle 0.27778\mathbf{\hat{r_1}_x} + 0.27778\mathbf{\hat{r_3}_x}$
In [22]:
trottinette.trajP1P2(t,tmax)

Cas d'une trajectoire circulaire de rayon R

  • vitesse de rotation $\Omega$
  • $x_a = R\cos(\Omega t) , y_a = R\sin(\Omega t)$
  • $\psi = \Omega t + \pi/2$
  • $u_a = \Omega R $

conditions de roulement sans glissement

In [23]:
Omega, R = sp.symbols("Omega R",positive=True)
cdts = [(psi,Omega*t+sp.pi/2),(ua,Omega*R),(xa,R*sp.cos(Omega*t)),(ya,R*sp.sin(Omega*t)),(phi,phi0)]
display(cdts)
$\displaystyle \left[ \left( \psi, \ \Omega t + \frac{\pi}{2}\right), \ \left( u_{a}, \ \Omega R\right), \ \left( x_{a}, \ R \operatorname{cos}\left(\Omega t\right)\right), \ \left( y_{a}, \ R \operatorname{sin}\left(\Omega t\right)\right), \ \left( \phi, \ \phi_{0}\right)\right]$
In [24]:
# conditions cinematiques
cdtsGL=[(theta1,omega1*t),(theta2,omega2*t),
        (omega1,omega1.subs(cdtsGL1).subs(cdts)),(phi0,phi0.subs(cdtsGL2).subs(cdts).simplify()),
        (omega2,omega2.subs(cdtsGL2).subs(cdts).simplify())]
display(cdtsGL)
$\displaystyle \left[ \left( \theta_{1}, \ \omega_{1} t\right), \ \left( \theta_{2}, \ \omega_{2} t\right), \ \left( \omega_{1}, \ \frac{\Omega R}{r}\right), \ \left( \phi_{0}, \ - 2 \operatorname{atan}\left(\frac{R - \sqrt{L^{2} + R^{2}}}{L}\right)\right), \ \left( \omega_{2}, \ \frac{\Omega R}{r \operatorname{cos}\left(\phi_{0}\right)}\right)\right]$

Calcul position des points A et B

In [25]:
# position de A et B 
display(A.pos_from(O).express(R1).subs(cdts).simplify())
display(B.pos_from(O).express(R1).subs(cdts).simplify())
$\displaystyle - R\mathbf{\hat{r_1}_y} + r\mathbf{\hat{r_1}_z}$
$\displaystyle L\mathbf{\hat{r_1}_x} - R\mathbf{\hat{r_1}_y} + r\mathbf{\hat{r_1}_z}$
In [26]:
# et vitesse de A et B 
display(A.vel(R0).subs(cdts))
display(B.vel(R0).subs(cdts).simplify())
$\displaystyle \Omega R\mathbf{\hat{r_1}_x}$
$\displaystyle \Omega R\mathbf{\hat{r_1}_x} + L \Omega\mathbf{\hat{r_1}_y}$

valeurs numériques des parametres

  • définitions des valeurs numériques des paramètres dans valnum
  • vérification en calculant la valeur numérique de la vitesse de la roue avant au point de contact

on prend pour $\omega$ une valeur donnant une vitesse $u_a$ de $\approx 10 km/h$

In [44]:
# parametres numériques en USI
valnum=[(L,1.),(r,0.05),(h,1.),(ua,Omega*R),(R,2),(Omega,10.*0.27/2)]
valnum.append((phi0,phi0.subs(cdtsGL).subs(valnum)))
valnum.append((omega2,omega2.subs(cdtsGL).subs(valnum)))
valnum.append((omega1,omega1.subs(cdtsGL).subs(valnum)))
display(cdts,valnum)
$\displaystyle \left[ \left( \psi, \ \Omega t + \frac{\pi}{2}\right), \ \left( u_{a}, \ \Omega R\right), \ \left( x_{a}, \ R \operatorname{cos}\left(\Omega t\right)\right), \ \left( y_{a}, \ R \operatorname{sin}\left(\Omega t\right)\right), \ \left( \phi, \ \phi_{0}\right)\right]$
$\displaystyle \left[ \left( L, \ 1.0\right), \ \left( r, \ 0.05\right), \ \left( h, \ 1.0\right), \ \left( u_{a}, \ \Omega R\right), \ \left( R, \ 2\right), \ \left( \Omega, \ 1.35\right), \ \left( \phi_{0}, \ 0.463647609000806\right), \ \left( \omega_{2}, \ 60.3738353924943\right), \ \left( \omega_{1}, \ 54.0\right)\right]$
In [45]:
# verification sur la vitesse de contacte de la roue avant
VG2.subs(cdts).subs(cdtsGL).subs(valnum).simplify()
Out[45]:
$\displaystyle - 8.88178419700125 \cdot 10^{-16}\mathbf{\hat{r_2}_x} - 6.66133814775094 \cdot 10^{-16}\mathbf{\hat{r_2}_y}$

calcul numérique de la trajectoire de A et B

In [46]:
display("OA=",A.pos_from(O).express(R0).subs(cdts).subs(cdtsGL).subs(valnum))
display("OB=",B.pos_from(O).express(R0).subs(cdts).subs(cdtsGL).subs(valnum))
'OA='
$\displaystyle 2 \operatorname{cos}\left(1.35 t\right)\mathbf{\hat{r_0}_x} + 2 \operatorname{sin}\left(1.35 t\right)\mathbf{\hat{r_0}_y} + 0.05\mathbf{\hat{r_0}_z}$
'OB='
$\displaystyle (- 1.0 \operatorname{sin}\left(1.35 t\right) + 2 \operatorname{cos}\left(1.35 t\right))\mathbf{\hat{r_0}_x} + (2 \operatorname{sin}\left(1.35 t\right) + 1.0 \operatorname{cos}\left(1.35 t\right))\mathbf{\hat{r_0}_y} + 0.05\mathbf{\hat{r_0}_z}$
In [47]:
from Trottinette import Trottinette
trottinette =  Trottinette([O,A,B,G,P1,P2], [R0,R1], [r,h,L,R], cdts, cdtsGL, valnum)
# tmax 60. pour 1 tour
tmax = float(60./(Omega*30/np.pi).subs(valnum))
print("tmax=",tmax)
trottinette.traj2D([A,G,B],t,tmax)
tmax= 4.654211338651544

calcul numérique de la vitesse

In [48]:
display("VA=",A.vel(R0).magnitude().subs(cdts).subs(cdtsGL).subs(valnum).doit())
display("VB=",B.vel(R0).magnitude().subs(cdts).subs(cdtsGL).subs(valnum).doit())
display("VP1=",P1.vel(R0).magnitude().subs(cdts).subs(cdtsGL).subs(valnum).doit())
display("VP2=",P2.vel(R0).magnitude().subs(cdts).subs(cdtsGL).subs(valnum).doit())
'VA='
$\displaystyle 2.7$
'VB='
$\displaystyle 3.01869176962472$
'VP1='
$\displaystyle 3.81837661840736 \sqrt{0.0003125 \operatorname{sin}^{2}\left(54.0 t\right) + \operatorname{cos}\left(54.0 t\right) + 1}$
'VP2='
$\displaystyle 4.26907484122731 \sqrt{0.00025 \operatorname{sin}^{2}\left(60.3738353924943 t\right) - 6.2450045135165 \cdot 10^{-18} \operatorname{sin}\left(60.3738353924943 t\right) + 1.0 \operatorname{cos}\left(60.3738353924943 t\right) + 1}$
In [49]:
trottinette.vitesse([A,B,P1,P2],t,tmax/5)

Calcul numérique de la trajectoire des roues, visualisation 3D

In [51]:
trottinette.traj3D(t,tmax)

analyse cinématique

calcul de la norme des vitesses

In [53]:
display("VA=",A.vel(R0).subs(cdts).magnitude())
display("VB=",B.vel(R0).subs(cdts).magnitude().simplify())
display("VG=",G.vel(R0).subs(cdts).magnitude().simplify())
'VA='
$\displaystyle \Omega R$
'VB='
$\displaystyle \sqrt{L^{2} \Omega^{2} + \Omega^{2} R^{2}}$
'VG='
$\displaystyle \frac{\sqrt{L^{2} \Omega^{2} + 4 \Omega^{2} R^{2}}}{2}$

calcul des accelérations A

la trottinette est soumise à une accélération centripède, et donc le conducteur en G ressent une force centrifuge de direction opposée $M\vec{\gamma}(G)$ dans le référentiel $R_1$ lié à la trottinette.

In [54]:
display("A(A)=",A.acc(R0).subs(cdts).simplify())
display("A(G)=",G.acc(R0).subs(cdts).simplify())
display("A(B)=",B.acc(R0).subs(cdts).simplify())
'A(A)='
$\displaystyle \Omega^{2} R\mathbf{\hat{r_1}_y}$
'A(G)='
$\displaystyle - \frac{L \Omega^{2}}{2}\mathbf{\hat{r_1}_x} + \Omega^{2} R\mathbf{\hat{r_1}_y}$
'A(B)='
$\displaystyle - L \Omega^{2}\mathbf{\hat{r_1}_x} + \Omega^{2} R\mathbf{\hat{r_1}_y}$

Etude simplifié de la dynamique de la trottinette en virage

On applique les principes fondamentaux de la mécanique:

  • variation qte de mouvement = somme des forces
  • variation mt cinétique en G = somme des moments en G
  • moment en A d'une force $\vec{F}$ appliquée en B $$ \vec{M_A} = \vec{AB}\wedge \vec{F}$$

En négligeant les forces de frottement, les forces s'appliquant sur la trottinette et son conducteur sont:

  • le poids appliqué au centre de gravité G (du conducteur), dirigé suivant la verticale $\vec{z}$
  • la réaction du sol au point de contacte des roues dans le plan de chaque roue
  • la force motrice du moteur dans la direction du mouvement $\vec{x}$

En virage, on doit modifier l'orientation de la quantité de mouvement pour créer une accélération centripéde, mais aussi l'orientation du moment cinétique des roues.

Pour cela le conducteur va pencher la trottinette vers l'intérieur du virage en utilisant le guidon pour imprimer une rotation suivant $\vec{R_2.x}$ et pas uniquement tourner le guidon autour de $\vec{R_2.z}$. D'autre part, les roues ont un moment cinétique principalement suivant $\vec{R_2.y}$ dont il faut changer la direction, i.e. le faire tourner autour de $\vec{R_2.z}$. Pour cela il faut appliquer un couple gyroscopique suivant $\vec{R_2.x}$ dans le sens opposé au mouvement de rotation précédent, ce qui limite (mais dans une faible mesure) l'angle de rotation autour de $\vec{R_2.x}$. On constate donc que ce couple gyroscopique a un effet stabilisant, mais qui reste faible dans la pratique.

calcul de l'angle d'inclinaison de la trottinette

Pour calculer l'angle $\beta$ d'inclinaison de la trottinette,on suppose que le centre de gravité G (du conducteur) subit une rotation $\beta$ autour de la direction $R_1.x$ (direction de la vitesse), c.a.d le conducteur de masse M se penche à droite ou à gauche.

On se place dans le référentiel lié au conducteur $R_1$, dans lequel le conducteur est immobile. $R_1.x$ est dans la direction de la vitesse, $R_1.y$ est dirigée vers le centre du virage, et $R_1.z$ est vertical.

Les forces qui s'exercent sont:

  • le poids $\vec{P}$ en G suivant la verticale $R_1.z$ : $$\vec{P}= -M g \vec{R_1.z}$$
  • la réaction du sol $\vec{Fr}$ sur les roues qui est inclinée de $\beta$ par rapport à la verticale: $$\vec{Fr}= F \left(\sin{\beta} \vec{R_1.x} + \cos{\beta} \vec{R_1.z}\right)$$
  • la force centrifuge $\vec{Fc}$ suivant l'horizontale avec une composante principale suivant $R_1.y$ $$\vec{Fc}= - M \vec{\gamma}(G)_{|R_0} $$
  • la force motrice suivant $R_1.x$ (direction de la vitesse) qui permet de vaincre les frottements.

    L'équilibre dans $R_1$ impose donc : $$ \vec{P} + \vec{Fr} + \vec{Fc} = \vec{0}$$

In [55]:
beta, M, g, F = sp.symbols('beta M g F')
# force centrifuge
Fc = -M*G.acc(R0).subs(cdts).simplify()
display('force centrifuge=',Fc)
Fc = Fc.dot(R1.y)*R1.y
display('force centrifuge=',Fc)
# force de gravité
P = - M*g*R1.z
# reaction
Fr = F*(sp.cos(beta)*R1.z + sp.sin(beta)*R1.y)
display('réaction du sol=',Fr)
# bilan: somme des forces
S = P + Fr + Fc
display("bilan=",S)
eq1 = sp.Eq(sp.tan(beta),Omega**2*R/g)
eq2 = sp.Eq(F,M*g/sp.cos(beta))
display("solution",eq1,eq2)
'force centrifuge='
$\displaystyle \frac{L M \Omega^{2}}{2}\mathbf{\hat{r_1}_x} - M \Omega^{2} R\mathbf{\hat{r_1}_y}$
'force centrifuge='
$\displaystyle - M \Omega^{2} R\mathbf{\hat{r_1}_y}$
'réaction du sol='
$\displaystyle F \operatorname{sin}\left(\beta\right)\mathbf{\hat{r_1}_y} + F \operatorname{cos}\left(\beta\right)\mathbf{\hat{r_1}_z}$
'bilan='
$\displaystyle (F \operatorname{sin}\left(\beta\right) - M \Omega^{2} R)\mathbf{\hat{r_1}_y} + (F \operatorname{cos}\left(\beta\right) - M g)\mathbf{\hat{r_1}_z}$
'solution'
$\displaystyle \operatorname{tan}\left(\beta\right) = \frac{\Omega^{2} R}{g}$
$\displaystyle F = \frac{M g}{\operatorname{cos}\left(\beta\right)}$

Analyse

Donc le conducteur doit se pencher vers l'intérieur du cercle, i.e. $\beta >0 $, pour contrer la force centrifuge.

L'inclinaison optimale a été obtenue ci-dessus. En supposant que $R\gg L,h$, on peut calculer l'expression de $\beta$ en fonction des paramètres du problème, en particulier $u_a$ et $R$. Mettre le résultat dans la variable bopt, puis calculer sa valeur numérique en degré dans bval en substituant les valeurs numériques des paramètres avec $ g = 9.81$. On calculera la valeur numérique en degré avec 2 chiffres significatifs en utilisant la méthode .evalf(2)

In [56]:
bopt =  sp.atan(ua**2/g/R)
bval = (bopt.subs(cdts).subs(valnum).subs(g,9.81)*180/np.pi).evalf(2)
display("Beta opt=",bopt)
print("valeur en degré=",bval)
'Beta opt='
$\displaystyle \operatorname{atan}\left(\frac{u^{2}_{a}}{R g}\right)$
valeur en degré= 20.

Conclusion

conclusion de l'étude (à remplir par l'étudiant):

Références

FIN