Utilisation du squelette robot.py (V - La classe IRControlledTankTask)
Cet article constitue le cinquième et dernier de la série consacrée à la programmation d'applications robotiques en langage Python. Dans cette série, cinq classes ont été présentées successivement :
- La classe Robot.
- La classe RobotTask.
- La classe RobotError.
- La classe RobotExplorer.
- La classe IRControlledTankTask.
La classe IRControlledTankTask s'appuie sur la classe RobotTask. Cette classe se trouve dans le module robot.py. Ce module, téléchargeable ici, doit être inclus dans le projet dans lequel il est utilisé.
La classe IRControlledTankTask
L’essentiel de la programmation d'un robot en Python consiste à créer une nouvelle tâche définissant la liste des instructions permettant de lire les différents capteurs pour effectuer les actions adéquates. En principe, les tâches doivent fonctionner en mode parallèle (multithreading) et être associées à un robot. Le plus simple consiste à dériver la classe RobotTask pour surcharger deux méthodes :
- La méthode setup() qui rassemble les instructions à exécuter une seule fois au démarrage de la tâche.
- La méthode loop() qui rassemble les instructions à exécuter en boucle.
La classe IRControlledTankTask est un exemple de cette démarche adaptée au robot Explorer dont la construction a fait l'objet d'un article intitulé « Construction du robot Explorateur ». Cette tâche permet de piloter un robot à chenilles à l'aide de la télécommande infra-rouge Lego EV3.
Programmation
#1#
from robot import RobotTask
from explorer import RobotExplorer
#2#
class IRControlledTankTask(RobotTask):
#3#
DEFAULT_MOTORS = RobotExplorer.DEFAULT_MOVING_MOTORS
DEFAULT_IRSENSOR = RobotExplorer.DEFAULT_IR_SENSOR
#4#
DEFAULT_CHANNEL = 1
DEFAULT_SPEED = 50
#5#
def __init__(self, robot, motors=DEFAULT_MOTORS, irsensor=DEFAULT_IRSENSOR,
channel=DEFAULT_CHANNEL, speed=DEFAULT_SPEED):
super().__init__(robot)
self._motors = motors
self._irsensor = irsensor
self._channel = channel
self._speed = speed
def loop(self):
#6#
speed_left, speed_right = 0, 0
if self._irsensor.top_left(self._channel):
speed_left = self._speed
if self._irsensor.bottom_left(self._channel):
speed_left = -self._speed
if self._irsensor.top_right(self._channel):
speed_right = self._speed
if self._irsensor.bottom_right(self._channel):
speed_right = -self._speed
self._motors.on(speed_left, speed_right)
from robot import RobotTask
from explorer import RobotExplorer
#2#
class IRControlledTankTask(RobotTask):
#3#
DEFAULT_MOTORS = RobotExplorer.DEFAULT_MOVING_MOTORS
DEFAULT_IRSENSOR = RobotExplorer.DEFAULT_IR_SENSOR
#4#
DEFAULT_CHANNEL = 1
DEFAULT_SPEED = 50
#5#
def __init__(self, robot, motors=DEFAULT_MOTORS, irsensor=DEFAULT_IRSENSOR,
channel=DEFAULT_CHANNEL, speed=DEFAULT_SPEED):
super().__init__(robot)
self._motors = motors
self._irsensor = irsensor
self._channel = channel
self._speed = speed
def loop(self):
#6#
speed_left, speed_right = 0, 0
if self._irsensor.top_left(self._channel):
speed_left = self._speed
if self._irsensor.bottom_left(self._channel):
speed_left = -self._speed
if self._irsensor.top_right(self._channel):
speed_right = self._speed
if self._irsensor.bottom_right(self._channel):
speed_right = -self._speed
self._motors.on(speed_left, speed_right)
Explications
- Importation des classes à partir des modules qui les contiennent. La classe RobotTask est défini dans le module robot.py. La classe RobotExplorer est la classe décrite dans l'article précédent (« kk »). Elle se trouve en principe dans le module explorer.py. Ce peut être un autre module ou même le même fichier dans lequel est programmée IRControlledTankTask. Dans cas, l'importation est inutile.
- La classe IRControlledTankTask est dérivée de la classe RobotTask , passée en paramètre de la déclaration.
- La tâche utilise deux constantes DEFAULT_MOTORS pour les moteurs utilisés et DEFAULT_IRSENSOR pour le capteur infra-rouge. Ces constantes sont initialisées à partir des éléments structurels de la classe RobotExplorer.
- La tâche utilise deux autres constantes, DEFAULT_CHANNEL pour le canal utilisé sur la télécommande infrarouge et DEFAULT_SPEED pour la vitesse passée en paramètre de la méthode on de la classe MoveTank.
- Lors de la construction de la tâche, des variables d'instance sont initialisées à partir des paramètres passés. Par défaut, elles sont initialisées sur la base des constantes déclarées. Le souligné précise qu'elles sont protected, c'est à dire non visibles de l'extérieur, mais visible dans des classes dérivées dans le cas où la classe de la tâche servirait de modèle pour des classe de tâches dérivées.
- Dans cette tâche, la méthode setup() n'a pas besoin d'être surchargée. En revanche les instructions qui caractérisent cette tâche se trouvent dans la boucle loop(). La liste d'instruction est celle déjà vue dans l'article intitulé « Pilotage d'un robot à chenille avec la télécommande infra-rouge en Python ».
Utilisation
La classe IRControlledTankTask s'utilise en association avec la classe Robot ou une classe dérivée. Il faut d'abord instancier cette dernière et passer le robot en paramètre de la tâche. Toutes les tâches du robot sont démarrées en invoquant la méthode run() sur celui-ci.
robot = RobotExplorer()
IRControlledTankTask(robot)
robot.run()
IRControlledTankTask(robot)
robot.run()
Conclusion
Cet article conclut la série décrivant les classe du module robot.py et leur usage. Pour résumer, programmer un robot consiste :
- ajouter le module robot.py au projet Python.
- dériver éventuellement la classe Robot pour intégrer les constantes du robot.
- dériver la classe RobotTask en surchargeant les méthodes setup() et loop() pour définir ce que le robot doit faire.
- instancier ces deux classes comme dans l'exemple ci-dessus et invoquer la méthode run() sur l'instance du robot.
Commentaires
Enregistrer un commentaire