La dernière étape : Contrôle
Cet article fait suite aux articles :
- l’IA…Et le véhicule fut autonome
- La fusion de capteurs
- Les voitures autonomes et la localisation
- Les voitures autonomes peuvent-elles penser ?
Il s’agit désormais de la dernière étape. Une voiture autonome utilise le module Perception pour connaître son environnement, le module Localisation pour connaître sa position dans cet environnement au centimètre et le module Planning pour prendre des décisions et générer des trajectoires.
Le module Control est désormais en charge de déplacer le véhicule en générant un angle pour le volant et une accélération.
Points de chemin
L’étape Control consiste à suivre la trajectoire générée le plus fidèlement possible. Chaque trajectoire est une suite de points de chemin contenant chacun une position (x;y) un angle (yaw) et une vitesse (v).
Un algorithme de Control est appelé régulateur. Le but d’un régulateur est de générer des instructions pour le véhicule telles que l’angle du volant ou le niveau d’accélération en prenant en compte les contraintes réelles (route, vent, glissement des roues…) et la trajectoire générée.
Quels régulateurs ?
Un grand nombre de régulateurs existent pour déplacer un robot/véhicule. Ils sont plus ou moins complexes suivant le problème que l’on souhaite résoudre.
PID — Proportional Integral Derivative
Le plus simple de tous s’appelle le Proportional Integral Derivative ou PID.
Le régulateur PID est un algorithme qui calcule une valeur (par exemple un angle du volant) à partir de calcul d’une erreur. L’erreur est la différence entre la trajectoire que l’on doit adopter et celle que l’on adopte réellement.
Nous avons trois élements dans un régulateur PID :
- P : Proportional — Ce terme applique une correction au volant proportionnelle à l’erreur. Si nous sommes trop loin de l’objectif, nous tournons le volant dans l’autre sens.
L’inconvénient d’un régulateur P est qu’il cause une oscillation constante. Suivant la fréquence à laquelle l’algorithme calcule l’erreur, l’oscillation est plus ou moins importante. Le coefficient Kp indique le degré d’oscillation que l’on souhaite.
- D : Derivative — Le terme D a pour objectif de supprimer cet effet d’oscillation en ajoutant un terme à la formule. Ce terme est le changement d’erreur. Le régulateur PD comprend que l’erreur diminue et réduit légèrement l’angle qu’il adopte pour se rapprocher d’une trajectoire lisse.
- I : Integral — Le dernier terme sert à corriger une erreur mécanique qui nous cause de tourner le volant plus ou moins fort selon les véhicules pour rester droit. Nous ajoutons donc un dernier terme pour pénaliser la somme des erreurs cumulées. La courbe Twiddle PID correspond à l’utilisation d’un algorithme pour trouver plus rapidement les coefficients et donc converger plus rapidement vers la trajectoire de référence.
Nous avons donc une somme de trois composants permettant au véhicule de suivre une trajectoire efficacement en temps réel. Les différents Kp, Ki, Kd sont des coefficients que nous devons trouver afin d’optimiser la conduite.
Le régulateur PID est le plus simple et le plus commun au monde. Il a pour avantage de s’implémenter rapidement et de fonctionner dans les situations simples. Dans le cas d’une voiture autonome, un régulateur PID peut être utilisé pour calculer l’angle et un autre pour calculer l’accélération. Les contrôles latéraux et longitudinaux sont difficiles à combiner. De plus, il est impossible de modeler la physique du véhicule. Lorsque nous conduisons, nous ajustons naturellement nos manoeuvres suivant la taille, masse et dynamique du véhicule. Un régulateur PID ne peut le faire.
MPC — Model Predictive Control
D’autres régulateurs sont également connus pour intégrer la physique du véhicule (masse, taille, …). Ils sont plus difficiles à implémenter mais plus efficaces. Ces régulateurs peuvent prendre en compte les forces qui s’appliquent au véhicule, les caractéristiques du véhicule, …
Actuateurs
Nous commençons par définir des actuateurs. Il s’agit des éléments permettant de déplacer le véhicule. Une voiture a trois actuateurs : un volant, une pédale d’accélération et une pédale de frein. L’objectif d’un régulateur MPC est de jouer sur ces actuateurs en faisant varier l’angle du volant, la pression sur la pédale d’accélération ou celle sur la pédae de frein.
Contraintes et forces
Nous évoluons dans un environnement appelé non holonome. Cela signifie que par exemple, les roues ne peuvent physiquement pas être à 90°; elles sont plutôt entre -30° et 30°. Prendre cela en compte permet d’avoir des trajectoires plus réalistes et plus fidèles à la trajectoire de référence. Nous pouvons aussi définir l’accélération comme étant une valeur entre -1 (freinage) et 1 (accélération maximale).
Nous avons également deux types de modèles implémentables : kinématiques et dynamiques.
Un modèle cinématique signifie que notre véhicule réalise l’implémentation des formules mathématiques pour définir le mouvement et la trajectoire du véhicule.
Un modèle dynamique prend en compte le principe fondamental de la dynamique et donc les forces appliquées au véhicule. Ces forces peuvent être la résistance de l’air, le poids du véhicule, la gravité, le contact des roues sur le sol, … La force centrifuge peut causer à un véhicule de sortir de sa trajectoire dans un virage et n’est pas prise en compte dans un modèle cinématique.
Optimisation
Un régulateur MPC résout un problème d’optimisation. Son objectif est de calculer plusieurs couples (angle, accélération) et de choisir celle qui cause l’erreur la plus faible.
L’algorithme est le suivant :
A gauche, nous calculons l’état actuel via odométrie, localisation, …
Le Solver est ensuite fait en trois parties :
- Contraintes du monde non holonome
- Modèle (cinématique ou dynamique) implémentant l’état t+1
- Coût est une formule calculant suivant l’état t+1, le coût de la trajectoire.
Nous pouvons donc tester plusieurs combinaisons angle, accélération(δ,a). A chaque combinaison est associé un coût. L’algorithme choisit ensuite la couple ayant le coût le plus faible.
Une fois que les premières actuations sont réalisées, nous recalculons les états futurs et prédisons de nouveaux angles.
Le régulateur MPC est très performant mais très difficile à implémenter. En général, le temps passé à développer ce régulateur vaut le résultat obtenu. Un régulateur MPC peut être très performant et permettre à un véhicule d’atteindre des vitesses plus rapides en étant toujours aussi sur. La conduite est plus agréable que dans un régulateur PID.
Résultats
Dans le cadre de mon Nanodegree sur les véhicules autonomes, j’ai implémenté deux régulateurs pour suivre une trajectoire : un régulateur PID et un régulateur MPC. Le régulateur MPC permet d’atteindre des vitesses plus importantes que le régulateur PID (50 vs 30 mph) en permettant une conduite plus agréable et moins oscillatoire.
PID
MPC
Conclusion
Dans le monde de la robotique, il existe un grand nombre de régulateurs. Suivant le type de robot que l’on veut déplacer, le régulateur peut être plus ou moins simple. L’environnement peut aussi jouer un rôle. Dans une voiture autonome, des freinages d’urgence peuvent survenir impliquant un régulateur plus élaboré que sur un robot en intérieur. L’étape de Control est obligatoire pour les robots et drones que l’on souhaite rendre autonome. Cette étape repose cependant sur toutes les briques précédentes (Perception, Localisation, Planning) qui doivent être développées parfaitement. Les régulateurs sont difficilement exportables d’une voiture à une autre car uniques à un véhicule.
Les cinq articles rédigés autour des véhicules autonomes couvrent désormais toutes les étapes de fonctionnement d’une voiture sans chauffeur. Le dernier projet réalisé avec Udacity dans mon nanodegree est l’implémentation de toutes ces briques dans une vraie voiture autonome fonctionnant sous ROS (Robot Operating System). Un dernier article à ce sujet viendra conclure cette série.
Jeremy Cohen.
→ Partageons nos LinkedIn et n’hésitez pas à me suivre !
Références
Projets GitHub sur les régulateurs
- Implémentation C++ d’un régulateur PID : pid-controller
- Implémentation C++ d’un régulateur MPC : mpc-controller