Le positionnement du robot est obtenu par odométrie, c'est à dire
que la position est obtenue par intégration de petits
déplacements. L'intérêt de l'odométrie est qu'elle est assez
simple à mettre en oeuvre et qu'elle est fiable. Par contre, quand
on intègre les déplacements, on intègre aussi l'erreur ce qui fait
que l'erreur
de position croît avec le temps.
Voyons maintenant comment on réalise concrètement ce
positionnement. Comme je l'ai dit, le DSP vient lire régulièrement
(toutes les 1 ou 10 ms) la position de chaque roue codeuse. Entre
deux lectures, on peut savoir de combien s'est déplacée chaque
roue codeuse et il faut à partir de cela en déduire la position du
robot.
Il y a en fait deux manières d'approximer la trajectoire
élémentaire parcourue par le robot pendant ce temps :
Sur le robot, il n'y a que l'approximation par des segments qui a
été implémentée et elle donnait de bons résultats. Par contre,
l'approximation par des arcs de cercle a été réalisée en
simulations sous MATLAB et elle n'a pas fait apparaître
de différences notoires lorsque la fréquence d'échantillonnage
reste suffisamment élevée. Avec les valeurs utilisées sur
le robot, on ne voit absolument aucune différence.
On présentera quand même ici les deux méthodes pour voir en quoi
elles différent et pourquoi elles convergent lorsque devient
suffisamment petit. Par contre, il faut garder à l'esprit
qu'aucune de ces méthodes n'est absolument exacte.
Appelons et
les distances (en mm) parcourues
respectivement par les roues droites et gauches entre deux
lectures des LM soit un intervalle de temps
. Connaissant la
pose du robot à l'instant
, on cherche la pose à l'instant
. On emploie volontairement ici le terme "pose" en accord avec
de nombreuses publications. En effet, la pose représente à la fois
la position du robot
et son orientation
. En
général, on utilise dans la littérature le terme "position" pour
le doublet
, le terme "pose" pour la triplet
et le terme "posture"
où
représente
le courbure. Il faut remarquer que le terme position est souvent
utilisé abusivement 1.7 pour désigner un état du robot qui peut intégrer bien
d'autres paramètres que sa position (x,y).
On a donc :
En effet, lorsque le robot fait un tour sur lui-même (
radians), la différence de parcours entre les deux roues est de
. Ce qui donne une différence de
pour une rotation de 1
radian. Il s'agit là d'ailleurs de la définition du radian. Cette
constante
a été appelée
MM_PER_RADIAN
dans le code
DSP.
Ainsi,
Or, l'orientation du robot doit toujours rester dans l'intervalle
. Ce choix est totalement arbitraire mais il nous est
apparu comme étant le plus pertinent et le plus facile à utiliser;
on aurait pu choisir
. On a donc du écrire une fonction
réalisant un modulo dont le résultat est toujours dans
, cette fonction nommée
fmod_pmpi
peut être
trouvée dans math.c
. C'est
pourquoi on trouvera dans le code :
pos.angle = fmod_pmpi(pos.angle + (diff_d - diff_g)/MM_PER_RADIAN);
Le calcul et le stockage de la position sont désormais effectués sur des float. En effet, lors des premiers tests réalisés sur le portable, nous utilisions des float pour le calcul et des nombres entiers pour le stockage de la position en dixièmes de millimètres. Ce type de stockage engendrait une perte de précision non négligeable. C'est pourquoi nous réalisons maintenant tous les calculs en float ce qui apporte une souplesse d'utilisation importante et surtout ne prend pas plus de temps de calcul sur le DSP.
En reprenant les mêmes notations que précédemment, on obtient la figure suivante :
On a toujours :
Si on tourne vers la droite (
) :
par contre, si on tourne vers la gauche (
) :
On en tire :
ou encore,
Il faut bien voir qu'il est nécessaire de prévoir un cas spécial
lorsque les deux roues parcourent exactement la même distance.
Dans ce cas, l'arc de cercle se transforme en segment ce qui
correspond à un cercle de rayon infini. Bien sûr, on ne peut pas
faire de calcul avec une valeur infinie, c'est pourquoi, il faut
prévoir un cas spécial.
Ce calcul doit absolument être effectué en virgule flottante (float) car il nécessite une dynamique très importante : rayon très grand et déplacements des roues très petits.
Or,
Ce qui donne après développement :
On retombe alors sur l'approximation par des segments de droites
si on suppose que
est très petit. En effet,
dans ce cas :
ce qui donne :
ou encore :
Or,
petit implique
, d'où :
Mais,
et
donc
.
Ainsi,
L'approximation
petit est d'autant plus
justifiée que la fréquence d'échantillonnage
est très
grande et que l'angle varie très peu entre deux estimations de la
position 1.8. Ceci explique
donc que les deux méthodes d'approximation convergent lorsque l'on
diminue la période d'échantillonnage.