Dans le monde de l'éducation en ingénierie, il existe de nombreux excellents cours, mais souvent, le programme d'études qui en découle présente un grave inconvénient : le manque de cohérence entre les différentes thématiques. On pourrait objecter : comment cela est-il possible ?
Lors de la création d'un programme d'études, pour chaque cours, des prérequis et un ordre précis dans lequel les disciplines doivent être étudiées sont établis. Par exemple, pour assembler et programmer un robot mobile basique, il est nécessaire de connaître un peu de mécanique pour créer sa structure physique ; les principes de l'électricité selon les lois d'Ohm/Kirchhoff, la représentation des signaux numériques et analogiques ; les opérations avec des vecteurs et des matrices pour décrire les systèmes de coordonnées et les déplacements du robot dans l'espace ; les bases de la programmation concernant la représentation des données, les algorithmes simples et les structures de contrôle, etc., pour décrire le comportement.
Trouve-t-on tout cela dans les cours universitaires ? Bien sûr que oui. Cependant, aux lois d'Ohm/Kirchhoff, nous ajoutons la thermodynamique et la théorie des champs ; en plus des opérations avec les matrices et les vecteurs, il faut se familiariser avec les formes de Jordan ; en programmation, l'étude du polymorphisme — des thèmes qui ne sont pas toujours essentiels pour résoudre un problème pratique simple.
L'enseignement universitaire est extensif : l'étudiant avance sur un large front et ne voit souvent pas le sens ni la pertinence pratique des connaissances acquises. Nous avons décidé de renverser la paradigme de l'enseignement STEM (Science, Technologie, Ingénierie, Mathématiques) universitaire et de créer un programme qui repose sur la cohérence des connaissances, permettant un approfondissement futur, c'est-à-dire anticipant une maîtrise intensive des matières.
L'apprentissage d'un nouveau domaine peut être comparé à l'exploration d'un territoire. Ici, il y a deux options : soit nous avons devant nous une carte très détaillée avec une énorme quantité de détails à étudier (ce qui prend beaucoup de temps) pour comprendre où se trouvent les repères principaux et comment ils se rapportent les uns aux autres ; soit nous pouvons utiliser un plan primitif, qui ne marque que les points principaux et leur disposition mutuelle - une telle carte est suffisante pour commencer à avancer dans la bonne direction, en précisant les détails en cours de route.
Nous avons testé l'approche d'apprentissage intensif STEM lors de l'école d'hiver que nous avons réalisée en collaboration avec les étudiants du MIT, soutenue par
Préparation du matériel
La première partie du programme de l'école était une semaine de cours sur les domaines principaux, incluant l'algèbre, les circuits électriques, l'architecture des ordinateurs, la programmation en Python et une introduction à ROS (Robot Operating System).
Les domaines ont été choisis non pas au hasard : se complétant mutuellement, ils devaient aider les étudiants à voir le lien entre des éléments qui, à première vue, semblaient différents - les mathématiques, l'électronique et la programmation.
Bien sûr, l'objectif principal n'était pas de donner de nombreuses conférences, mais de permettre aux étudiants d'appliquer ces nouvelles connaissances en pratique.
Dans le domaine de l'algèbre, les étudiants pouvaient s'exercer aux opérations sur les matrices et à la résolution de systèmes d'équations, qui sont devenues utiles lors de l'étude des circuits électriques. En apprenant le fonctionnement du transistor et des éléments logiques construits sur sa base, les étudiants ont pu voir leur application dans la structure d'un processeur, et après avoir étudié les bases du langage Python, écrire un programme pour un véritable robot.

Duckietown
Une des tâches de l'école était de minimiser l'utilisation des simulateurs lorsque cela était possible. C'est pourquoi un grand ensemble de circuits électroniques a été préparé, que les étudiants devaient assembler sur une carte d'essai à partir de composants réels et tester en pratique, et Duckietown a été choisi comme base pour les projets.
Duckietown est un projet ouvert comprenant de petits robots autonomes appelés Duckiebot et un réseau de routes sur lesquelles ils se déplacent. Duckiebot est une plateforme à roues équipée d'un micro-ordinateur Raspberry Pi et d'une caméra.
Sur cette base, nous avons préparé un ensemble de tâches possibles, telles que la construction de cartes routières, la recherche d'objets et l'arrêt près d'eux, ainsi que d'autres. Les étudiants pouvaient également proposer leur propre problème et non seulement écrire un programme pour le résoudre, mais aussi le lancer immédiatement sur un vrai robot.
Enseignement
Lors des cours, les enseignants présentaient le matériel à l'aide de présentations préparées à l'avance. Certains cours étaient enregistrés en vidéo, permettant ainsi aux étudiants de les visionner chez eux. Pendant les cours, les étudiants utilisaient des ressources sur leurs ordinateurs, posaient des questions, résolvaient des problèmes ensemble et individuellement, parfois au tableau. À l'issue du travail, un classement de chaque étudiant était établi par matière.

Examinons plus en détail la conduite des cours pour chaque matière. La première matière était l'algèbre linéaire. Les étudiants étudiaient en une journée les vecteurs et matrices, les systèmes d'équations linéaires, etc. Les exercices pratiques étaient réalisés de manière interactive : les problèmes proposés étaient résolus individuellement, tandis que l'enseignant et d'autres étudiants faisaient des commentaires et des suggestions.

La deuxième matière était l'électricité et les circuits simples. Les étudiants ont étudié les bases de l'électrodynamique : tension, courant, résistance, loi d'Ohm et lois de Kirchhoff. Les exercices pratiques étaient partiellement réalisés dans un simulateur ou exécutés au tableau, mais une plus grande partie du temps était consacrée à la construction de circuits réels, tels que des circuits logiques, des circuits oscillants, etc.

La prochaine thématique — l'Architecture des ordinateurs — constitue en quelque sorte un pont entre la physique et la programmation. Les étudiants ont étudié des bases fondamentales dont la signification est davantage théorique que pratique. En termes de pratique, les étudiants ont conçu de manière autonome des circuits arithmétiques et logiques dans un simulateur et ont reçu des points pour les travaux réalisés.
Quatrième jour — premier jour de programmation. Le langage de programmation choisi était Python 2, car c'est celui utilisé pour la programmation sous ROS. Cette journée a été structurée de la manière suivante : les enseignants expliquaient le matériel, donnaient des exemples de résolution de problèmes, tandis que les étudiants les écoutaient, assis devant les ordinateurs, et répétaient ce que l'enseignant avait écrit au tableau ou sur la diapositive. Ensuite, les élèves résolvaient des problèmes similaires de manière autonome, les solutions étant ensuite évaluées par les enseignants.
Le cinquième jour était consacré à ROS : les étudiants se familiarisaient avec la programmation des robots. Toute la journée, les étudiants étaient devant les ordinateurs, exécutant le code dont parlait l'enseignant. Ils ont pu lancer indépendamment les principales unités de ROS et se sont également familiarisés avec le projet Duckietown. À la fin de cette journée, les étudiants étaient prêts à commencer la partie projet de l'école — résoudre des problèmes pratiques.

Description des projets choisis
Les étudiants ont été invités à se regrouper par équipes de trois personnes et à choisir un sujet de projet. Au final, les projets suivants ont été acceptés :
1. Calibration des couleurs. Le Duckiebot a besoin d'une calibration de la caméra lors des changements de conditions d'éclairage, d'où la nécessité d'une calibration automatique. Le problème est que les gammes de couleurs sont très sensibles à la luminosité. Les participants ont réalisé un utilitaire qui isolait les couleurs requises (rouge, blanc et jaune) dans l'image et construisait des plages pour chaque couleur au format HSV.
2. Duck Taxi. L'idée de ce projet est que le Duckiebot puisse s'arrêter près d'un certain objet, le saisir et suivre un certain trajet. L'objet choisi était un canard jaune vif.

3. Construction du graphique routier. Il s'agit de construire un graphique des routes et des intersections. L'objectif de ce projet est de construire un graphique des routes sans fournir de données a priori sur l'environnement pour le Duckiebot, en s'appuyant uniquement sur les données de la caméra.
4. Voiture de patrouille. Ce projet a été inventé par les étudiants eux-mêmes. Ils ont proposé d'apprendre à un Duckiebot, le "patrouilleur", à poursuivre un autre — le "contrevenant". Pour cela, un mécanisme de reconnaissance d'objet utilisant le marqueur ArUco a été employé. Une fois la reconnaissance terminée, un signal est envoyé au "contrevenant" pour indiquer la fin de l'opération.

Calibration des Couleurs
L'objectif du projet Color Calibration était d'ajuster la gamme de couleurs détectables des marquages selon les nouvelles conditions d'éclairage. Sans ces ajustements, la détection des lignes d'arrêt, des séparateurs de voies et des bordures de route devenait incorrecte. Les participants ont proposé une solution basée sur le prétraitement des modèles de couleurs des marquages : rouge, jaune et blanc.
Pour chacune de ces couleurs, une plage prédéfinie de valeurs HSV ou RGB est spécifiée. À l'aide de cette plage, toutes les zones contenant des couleurs appropriées dans l'image sont identifiées, et la plus grande d'entre elles est sélectionnée. Cette zone est considérée comme la couleur à mémoriser. Ensuite, des formules statistiques sont utilisées, telles que le calcul de la moyenne et de l'écart-type, pour évaluer la nouvelle plage de couleurs.
Cette plage est enregistrée dans les fichiers de configuration de la caméra Duckiebot et peut être utilisée par la suite. L'approche décrite a été appliquée aux trois couleurs, formant ainsi des plages pour chaque couleur de marquage.
Les tests ont montré une reconnaissance presque parfaite des lignes de marquage, sauf dans les cas où des matériaux de marquage en ruban brillant étaient utilisés, reflétant tellement les sources de lumière que sous l'angle de la caméra, le marquage semblait blanc indépendamment de sa couleur d'origine.

Duck Taxi
Le projet Duck Taxi visait à mettre en place un algorithme pour localiser le canard passager dans la ville, puis à le transporter vers le point désiré. Les participants ont décomposé cette tâche en deux : détection et navigation dans le graphe.
Les étudiants ont effectué la détection du canard, en partant du principe qu'un canard est toute zone de l'image que l'on peut reconnaître comme jaune, avec un triangle rouge (bec) dessus. Dès qu'une telle zone est détectée dans un cadre, le robot doit s'en approcher, puis s'arrêter pendant quelques secondes, imitant l'atterrissage du passager.
Ensuite, avec le graphe routier de tout Duckietown préalablement enregistré dans sa mémoire et la position du robot, ainsi qu'avec le point de destination comme entrée, les participants construisent un chemin du point de départ au point d'arrivée en utilisant l'algorithme de Dijkstra pour trouver des chemins dans le graphe. Les résultats sont présentés sous forme d'un ensemble de commandes — des tournants à chaque intersection suivante.

Graph des Routes
L'objectif de ce projet était de construire un graphe - un réseau routier dans Duckietown. Les nœuds du graphe résultant sont les intersections, et les arcs sont les routes. Pour cela, le Duckiebot doit explorer la ville et analyser son itinéraire.
Au cours de ce projet, l'idée de créer un graphe pondéré, où le coût de l'arête est déterminé par la distance (temps nécessaire pour le parcourir) entre les intersections, a été envisagée, mais finalement abandonnée. La mise en œuvre de cette idée s'est avérée trop laborieuse, et il n'y aurait pas eu assez de temps dans le cadre de l'école.
Lorsque le Duckiebot atteint une nouvelle intersection, il choisit une route sortant de l'intersection par laquelle il ne s'est pas encore déplacé. Une fois toutes les routes de toutes les intersections parcourues, le bot conserve en mémoire une liste d'adjacence des intersections, qui est ensuite transformée en image à l'aide de la bibliothèque Graphviz.
L'algorithme proposé par les participants n'est pas adapté à un Duckietown arbitraire, mais a bien fonctionné dans une petite ville composée de quatre intersections, utilisée dans le cadre de l'école. L'idée était de compléter chaque intersection avec un marqueur ArUco contenant un identifiant de l'intersection, afin de suivre l'ordre de passage aux intersections.
Le schéma de fonctionnement de l'algorithme développé par les participants est présenté dans l'illustration.

Patrol Car
L'objectif de ce projet est de détecter, poursuivre et arrêter un bot contrevenant dans la ville de Duckietown. Le bot de patrouille doit circuler sur l'anneau extérieur de la route dans la ville à la recherche d'un bot contrevenant connu à l'avance. Après avoir détecté l'infracteur, le bot de patrouille doit le suivre et l'amener à s'arrêter.
Le travail a commencé par la recherche d'une idée pour la détection du bot dans le cadre et la reconnaissance de l'infracteur. L'équipe a proposé d'équiper chaque bot dans la ville d'un marqueur unique à l'arrière - tout comme les voitures réelles ont des plaques d'immatriculation. Pour cela, des marqueurs ArUco ont été choisis. Ils avaient déjà été utilisés dans Duckietown auparavant, car il est facile de travailler avec eux et ils permettent de déterminer l'orientation du marqueur dans l'espace et la distance qui le sépare.
Ensuite, il a fallu faire en sorte que le robot patrouilleur se déplace strictement sur le cercle extérieur sans s'arrêter aux intersections. Par défaut, le Duckiebot se déplace dans une voie et s'arrête à la ligne d'arrêt. Ensuite, grâce à des panneaux de signalisation, il détermine la configuration de l'intersection et prend une décision sur la direction à prendre. Chacune des étapes décrites est régie par un état du automate fini du robot. Afin d'éliminer les arrêts à l'intersection, l'équipe a modifié l'automate d'états pour que, à l'approche de la ligne d'arrêt, le robot passe immédiatement à l'état de franchissement de l'intersection tout droit.
L'étape suivante a été de résoudre le problème de l'arrêt du robot contrevenant. L'équipe a supposé que le robot patrouilleur pouvait accéder par SSH à chacun des robots de la ville, c'est-à-dire disposer d'informations sur les données d'authentification et l'identifiant de chaque robot. Ainsi, après la détection du contrevenant, le robot patrouilleur a commencé à se connecter par SSH au robot contrevenant et à désactiver son système.
Après avoir confirmé que la commande d'arrêt avait été exécutée, le robot patrouilleur s'est également arrêté.
L'algorithme de fonctionnement du robot patrouilleur peut être représenté sous la forme du schéma suivant :

Travail sur des projets
Le travail a été organisé dans un format similaire à Scrum : chaque matin, les étudiants planifiaient leurs tâches pour la journée, et le soir, ils faisaient un rapport sur le travail accompli.
Au cours des premiers et derniers jours, les étudiants ont préparé des présentations décrivant la tâche donnée et les méthodes de solution. Pour aider les étudiants à suivre leurs plans, des enseignants de Russie et d'Amérique étaient constamment présents dans les salles où se déroulait le travail sur les projets, répondant aux questions. La communication se faisait principalement en anglais.
Résultats et démonstration
Le travail sur les projets a duré une semaine, à l'issue de laquelle les étudiants ont présenté leurs résultats. Tous ont préparé des présentations dans lesquelles ils ont parlé de ce qu'ils avaient appris dans cette école, des leçons les plus importantes qu'ils en ont tirées, de ce qu'ils ont aimé ou non. Ensuite, chaque équipe a présenté son projet. Toutes les équipes ont réussi à accomplir les tâches assignées.
L'équipe chargée de la calibration des couleurs a terminé son projet plus rapidement que les autres, ce qui leur a permis de préparer également la documentation de leur programme. En revanche, l'équipe qui s'occupait du graph des routes a continué à peaufiner et à corriger ses algorithmes jusqu'à la dernière journée avant la présentation du projet.

Conclusion
Après la fin de l'école, nous avons demandé aux étudiants d'évaluer les activités passées et de répondre à des questions sur la mesure dans laquelle l'école a répondu à leurs attentes, les compétences qu'ils ont acquises, etc. Tous les étudiants ont noté qu'ils avaient appris à travailler en équipe, à répartir les tâches et à planifier leur temps.
Les étudiants ont également été invités à évaluer l'utilité et la difficulté des cours suivis. Deux groupes d'évaluations se sont ainsi formés : pour certains, les cours n'ont pas représenté de grande difficulté, tandis que d'autres les ont évalués comme très complexes.
Cela signifie que l'école a pris la bonne direction, en restant accessible aux débutants dans un domaine ou un autre, tout en fournissant des matériaux de révision et de renforcement aux étudiants expérimentés. Il convient de noter que le cours de programmation (Python) a été presque unanimement considéré comme facile mais utile. Le cours le plus difficile, selon les étudiants, était celui sur l'Architecture des ordinateurs.
Lorsque les étudiants ont été interrogés sur les défauts et les qualités de l'école, beaucoup ont répondu qu'ils appréciaient le style d'enseignement choisi, dans lequel les enseignants fournissaient rapidement et individuellement de l'aide et répondaient aux questions soulevées.
Les étudiants ont également souligné qu'ils appréciaient de travailler avec une planification quotidienne de leurs tâches et de fixer eux-mêmes des délais. En revanche, ils ont noté un manque de connaissances fournies, qui étaient nécessaires pour travailler avec le bot : lors de la connexion, de la compréhension des bases et des principes de son fonctionnement.
Pratiquement tous les étudiants ont noté que l'école avait dépassé leurs attentes, ce qui témoigne d'une bonne direction dans l'organisation de l'école. Par conséquent, il est important de conserver les principes généraux lors de l'organisation de la prochaine école, en tenant compte et en essayant de corriger les défauts signalés par les étudiants et les enseignants, éventuellement en modifiant la liste des cours ou la durée de leur enseignement.
Auteurs de l'article : l'équipe dans
P.S. Notre blog d'entreprise a un nouveau nom. Il sera désormais dédié aux projets éducatifs de JetBrains.
Source : habr.com
