Programmation d'un robot MindStorm par héritage d'une classe de robot existante en Python
L'intérêt de la programmation objet est d'utiliser l'héritage pour créer une nouvelle classe à partir d'une classe de base en ne programmant que ce qui constitue la différence entre les deux classes.
Dans le présent article, on va créer une nouvelle classe de robot en remplaçant la classe MoveTank qui commande les moteurs animant les chenilles, par la classe MoveSteering.
Il est évident que l'utilisation de la classe MoveSteering pour commander un robot à chenille à l'aide de la télécommande infra-rouge ne présente pas un intérêt pratique. En effet cette classe a été conçu pour un robot doté d'une commande
de direction dont on peut gérer progressivement la valeur par un paramètre steering qui peut varier de -100 (complètement à gauche) à +100 (complètement à droite) en passant par 0 (tout droit).
Ce qui nécessite un capteur supplémentaire de type potentiomètre actionné par un volant par exemple. En revanche cela va permettre d'illustrer le principe d'héritage.
Programmation
Le code ce ce programme va s'appuyer sur la classe IRControlledTank développée dans l'article intitulé « Programmation objet d'un robot MindStrom en Pyhton » qui se trouve dans le fichier remoteir2.py.
Dans l'IDE VSCode, créer un nouveau fichier remoteir3.py dans le même répertoire que remoteir2.py.
Codage
#!/usr/bin/env python3
#1#
from ev3dev2.motor import MoveSteering, OUTPUT_B, OUTPUT_C
from remoteir2 import IRControlledTank
#2#
class IRControlledSteering(IRControlledTank):
#3#
DEFAULT_MOTORS = MoveSteering(OUTPUT_B, OUTPUT_C)
DEFAULT_IRSENSOR = IRControlledTank.DEFAULT_IRSENSOR
DEFAULT_SPEED = IRControlledTank.DEFAULT_SPEED
DEFAULT_STEERING = 100
def __init__(self, motors=DEFAULT_MOTORS, irsensor=DEFAULT_IRSENSOR,
speed=DEFAULT_SPEED, steering=DEFAULT_STEERING):
#4#
super().__init__(motors, irsensor, speed)
self._steering = steering
#5#
def loop(self):
if not self._irsensor.top_left(1) and not self._irsensor.top_right(1):
self._motors.on(0, 0)
if self._irsensor.top_left(1) and self._irsensor.top_right(1):
self._motors.on(0, self._speed)
elif self._irsensor.top_left(1):
self._motors.on(-self._steering, self._speed)
elif self._irsensor.top_right(1):
self._motors.on(self._steering, self._speed)
if __name__ == '__main__':
robot = IRControlledSteering()
robot.run()
#1#
from ev3dev2.motor import MoveSteering, OUTPUT_B, OUTPUT_C
from remoteir2 import IRControlledTank
#2#
class IRControlledSteering(IRControlledTank):
#3#
DEFAULT_MOTORS = MoveSteering(OUTPUT_B, OUTPUT_C)
DEFAULT_IRSENSOR = IRControlledTank.DEFAULT_IRSENSOR
DEFAULT_SPEED = IRControlledTank.DEFAULT_SPEED
DEFAULT_STEERING = 100
def __init__(self, motors=DEFAULT_MOTORS, irsensor=DEFAULT_IRSENSOR,
speed=DEFAULT_SPEED, steering=DEFAULT_STEERING):
#4#
super().__init__(motors, irsensor, speed)
self._steering = steering
#5#
def loop(self):
if not self._irsensor.top_left(1) and not self._irsensor.top_right(1):
self._motors.on(0, 0)
if self._irsensor.top_left(1) and self._irsensor.top_right(1):
self._motors.on(0, self._speed)
elif self._irsensor.top_left(1):
self._motors.on(-self._steering, self._speed)
elif self._irsensor.top_right(1):
self._motors.on(self._steering, self._speed)
if __name__ == '__main__':
robot = IRControlledSteering()
robot.run()
Explications
- Comme dans tous les programmes Python, il faut d'abord importer les objets utilisés. Comme la classe IRControlledTank est utilisée comme classe de base, il faut l'importer à partir du module remoteir2 programmé dans l'article intitulé « Programmation objet d'un robot MindStrom en Pyhton ». Comme pour l'exercice précédent le groupe de moteurs MoveSteering et les ports OUTPUT_B et OUTPUT_C sont importés à partir du module ev3dev2.motor. En revanche, il n'est pas utile d'importer la classe InfraredSensor car le capteur infrarouge est hérité de la classe IRControlledTank.
- Le fait de passer en paramètre la classe IRControlledTank en paramètre lors de la déclaration de la classe IRControlledSteering indique que celle-ci est construite par héritage à partir de IRControlledTank.
- DEFAULT_MOTORS, DEFAULT_IRSENSOR, DEFAULT_SPEED et DEFAULT_STEERING sont des variables de classe pour définir les objets d'interfaces du robot par défaut. Sauf pour DEFAULT_MOTORS à laquelle on affecte le nouveau groupe de moteur de classe MoveSteering, et DEFAULT_STEERING à laquelle on affecte le coéfficient maximum de 100, les autres valeurs reprennent les valeur par défaut de la classe de base.
- A la construction de la nouvelle classe, on invoque d'abord le constructeur de la classe de base. Puis on initialise la nouvelle variable d'instance self._steering. Les autres variables d'instance, présentes dans la classe de base, sont initialisées via l'invocation de la fonction __init__() de la classe de base super().
- Le jeu d'instruction de la fonction loop() défini un comportement du robot identique au programme défini dans la classe de base. Cependant pour arriver au même résultat, le codage en est significativement différent pour tenir compte des caractéristiques des moteurs MoveSteering. C'est la seule fonction à programmer, les autres sont héritées de la classe de base et fonctionnent de façon identique. L'action de programmer de façon différente une fonction existant dans la classe de base s'appelle une surcharge.
Commentaires
Enregistrer un commentaire