Plotter Lego : les maths
Afin de réaliser un traceur ou “plotter” ou table traçante en Lego, je me suis un peu amusé avec les maths. je suis parti du cet excellent site Vertical plotting solutions pour faire les calcul pour différentes géométrie de traceurs.
Le calcul de la position du crayon est une simple affaire de trigonométrie, mais il peut être intéressant de comprendre comment la position varie quand les moteurs bougent un peu, afin de mieux gérer les petits déplacements.
Pour faire les calculs symboliques, j’ai utilisé Python et le package SympPy.
Traceur vertical
Le principe de ce traceur (traceur vertical, ou wall plotter ou polargraph(e)) est de suspendre une nacelle avec le crayon à deux moteurs pas à pas qui enroulent et déroulent leurs câbles.
Wall Plotter est un exemple de ce type de projet.
Schéma de principe :
{width=600}
La position $(x,y)$ est fonction des longueurs de fil $a$ et $b$ et de la distance horizontale $D$ entre les deux moteurs.
$$\left[\begin{matrix}a\\b\end{matrix}\right] = \left[\begin{matrix}\sqrt{x^{2} + y^{2}}\\\sqrt{y^{2} + \left(D - x\right)^{2}}\end{matrix}\right]$$Pour connaitre l’effet des variations de $x$ et $y$ en fonction de $a$ et $b$ on calcule les dérivées partielles de $a$ et $b$ par rapport à $x$ et $y$ et on les écrit dans une matrice, la forme jacobienne $J$ :
$$ J =\left[ \begin{matrix} \frac{\partial a}{\partial x} & \frac{\partial a}{\partial y} \\ \frac{\partial b}{\partial x} & \frac{\partial b}{\partial y} \end{matrix} \right] $$Dans notre cas :
$$ J = \left[\begin{matrix}\frac{x}{\sqrt{x^{2} + y^{2}}} & \frac{y}{\sqrt{x^{2} + y^{2}}}\\\frac{- D + x}{\sqrt{y^{2} + \left(D - x\right)^{2}}} & \frac{y}{\sqrt{y^{2} + \left(D - x\right)^{2}}}\end{matrix}\right] $$On peut réintroduire $a$ et $b$ pour la lisibilité :
$$\left[\begin{matrix}\frac{x}{\sqrt{x^{2} + y^{2}}} & \frac{y}{\sqrt{x^{2} + y^{2}}}\\\frac{- D + x}{\sqrt{y^{2} + \left(D - x\right)^{2}}} & \frac{y}{\sqrt{y^{2} + \left(D - x\right)^{2}}}\end{matrix}\right]$$ou, en remplacant par $a$ et $b$ : :
$$J = \left[\begin{matrix}\frac{x}{a} & \frac{y}{a}\\\frac{- D + x}{b} & \frac{y}{b}\end{matrix}\right]$$Pour calculer les petits déplacements de $a$ et $b$ $(\Delta_a, \Delta_b)$ en fonction de de $x$, $y$ et $(\Delta_x, \Delta_y)$, on multiplie le Jacobien par le vecteur
$$\left[\begin{matrix} \Delta_x \\ \Delta_y \end{matrix} \right]$$.
Ce qui donne :
$$ \left \{ \begin{array}{lll} \Delta_{a} &=&\frac{\Delta_{x} x}{\sqrt{x^{2} + y^{2}}} + \frac{\Delta_{y} y}{\sqrt{x^{2} + y^{2}}} \\ \Delta_{b} &=& \frac{\Delta_{x} \left(- D + x\right)}{\sqrt{y^{2} + \left(D - x\right)^{2}}} + \frac{\Delta_{y} y}{\sqrt{y^{2} + \left(D - x\right)^{2}}} \end{array}\right. $$que l’on peut aussi exprimer par :
$$ \left \{ \begin{array}{lll} \Delta_{a} &=&\frac{\Delta_{x} x}{a} + \frac{\Delta_{y} y}{a} \\ \Delta_{b} &=& \frac{\Delta_{x} \left(- D + x\right)}{b} + \frac{\Delta_{y} y}{b} \end{array}\right. $$Yapuka tester.
Plotter circulaire
Une autre configuration de traceur est le plotter circulaire : le crayon tourne sur un axe ($\Theta$) à une distance $r$ du centre.
En voici un exemple https://roxen.github.io/polar-plotter/
{width=600}
La position du crayon s’écrit ainsi.
$$ \left \{ \begin{array}{lll} x &=&r \cos{\left(\phi \right)} \\ y &=& r \sin{\left(\phi \right)} \end{array}\right. $$De la même façon que précédemment on calcule la forme jacobienne :
$$\left[\begin{matrix}\cos{\left(\phi \right)} & - r \sin{\left(\phi \right)}\\\sin{\left(\phi \right)} & r \cos{\left(\phi \right)}\end{matrix}\right]$$au final :
$$ \left \{ \begin{array}{lll} \Delta_{x} &=&- \Delta_{\phi} r \sin{\left(\phi \right)} + \Delta_{r} \cos{\left(\phi \right)} \\ \Delta_{y} &=& \Delta_{\phi} r \cos{\left(\phi \right)} + \Delta_{r} \sin{\left(\phi \right)} \end{array}\right. $$Traceur avec un bras “robot” (robot arm plotter) (2 degrés de liberté)
C’est une variante du traceur polaire, mais qui dessine sur en gros un quart de la surface du précédent. Le bras s’étend comme un bras du grue portuaire : l’angle avec la verticale du 1er bras est répliqué dans le second bras. Le bras se déplace uniquement dans le plan $XY$.
{width=600}
Jacobien :
$$\left[\begin{matrix}- \left(L_{1} + L_{2}\right) \sin{\left(\phi \right)} \sin{\left(\theta \right)} & \left(L_{1} + L_{2}\right) \cos{\left(\phi \right)} \cos{\left(\theta \right)}\\\left(L_{1} + L_{2}\right) \sin{\left(\phi \right)} \cos{\left(\theta \right)} & \left(L_{1} + L_{2}\right) \sin{\left(\theta \right)} \cos{\left(\phi \right)}\end{matrix}\right]$$$$ \left \{ \begin{array}{lll} \Delta_{\theta} &=&- \Delta_{x} \left(L_{1} + L_{2}\right) \sin{\left(\phi \right)} \sin{\left(\theta \right)} + \Delta_{y} \left(L_{1} + L_{2}\right) \cos{\left(\phi \right)} \cos{\left(\theta \right)} \\ \Delta_{\phi} &=& \Delta_{x} \left(L_{1} + L_{2}\right) \sin{\left(\phi \right)} \cos{\left(\theta \right)} + \Delta_{y} \left(L_{1} + L_{2}\right) \sin{\left(\theta \right)} \cos{\left(\phi \right)} \end{array}\right. $$Bras robot à 3 degrès de liberté (Robot arm plotter)
{width=600}
Equations :
$$\left[\begin{matrix}x\\y\\z\end{matrix}\right] = \left[\begin{matrix}\left(L_{1} \cos{\left(\theta \right)} + L_{2} \cos{\left(\phi \right)}\right) \cos{\left(\theta \right)}\\\left(L_{1} \cos{\left(\theta \right)} + L_{2} \cos{\left(\phi \right)}\right) \sin{\left(\theta \right)}\\L_{1} \sin{\left(\theta \right)} - L_{2} \sin{\left(\phi \right)}\end{matrix}\right]$$$$ J = \left[\begin{matrix}0 & - L_{1} \sin{\left(\theta \right)} \cos{\left(\theta \right)} - \left(L_{1} \cos{\left(\theta \right)} + L_{2} \cos{\left(\phi \right)}\right) \sin{\left(\theta \right)} & - L_{2} \sin{\left(\phi \right)} \cos{\left(\theta \right)}\\0 & - L_{1} \sin^{2}{\left(\theta \right)} + \left(L_{1} \cos{\left(\theta \right)} + L_{2} \cos{\left(\phi \right)}\right) \cos{\left(\theta \right)} & - L_{2} \sin{\left(\phi \right)} \sin{\left(\theta \right)}\\0 & L_{1} \cos{\left(\theta \right)} & - L_{2} \cos{\left(\phi \right)}\end{matrix}\right]$$Au final:
$$\left[\begin{matrix}\Delta_{\omega}\\\Delta_{\theta}\\\Delta_{\phi}\end{matrix}\right] = \left[\begin{matrix}\Delta_{y} \left(- L_{1} \sin{\left(\theta \right)} \cos{\left(\theta \right)} - \left(L_{1} \cos{\left(\theta \right)} + L_{2} \cos{\left(\phi \right)}\right) \sin{\left(\theta \right)}\right) - \Delta_{z} L_{2} \sin{\left(\phi \right)} \cos{\left(\theta \right)}\\\Delta_{y} \left(- L_{1} \sin^{2}{\left(\theta \right)} + \left(L_{1} \cos{\left(\theta \right)} + L_{2} \cos{\left(\phi \right)}\right) \cos{\left(\theta \right)}\right) - \Delta_{z} L_{2} \sin{\left(\phi \right)} \sin{\left(\theta \right)}\\\Delta_{y} L_{1} \cos{\left(\theta \right)} - \Delta_{z} L_{2} \cos{\left(\phi \right)}\end{matrix}\right]$$Conclusion
Sous réserve d’erreurs grossières ou autres !