Grosse nouveauté cette année 2015, le code embarqué sur les robots exploite une implémentation réalisée par mes soins de réseaux de Petri. Cet outil nous a permis entre autres choses de gérer les deux pinces présentes sur un de nos robots, de manière graphique et thread-safe. Les pinces travaillent en effet de manière simultanée et une synchronisation logicielle est nécessaire pour un fonctionnement correct et sans détérioration matérielle. Tout le reste de la logique de haut niveau a également été réalisée en réseau de Pétri.
Les réseaux de Petri (également appelés Place-Transition) sont donc constitués de places et de transitions. Une place est typiquement associée à une action (par exemple, faire tourner un moteur), tandis que les transitions vérifient que les conditions sont réunies pour permettre à une autre place d'être exécutée.
L'exécution de plusieurs places en parallèle est bien sûr supportée, et s'avère être très pratique en automatique (bouger un élément du robot pendant qu'un autre effectue une action éventuellement indépendante). Il existe beaucoup de méthodes permettant de prouver l'exactitude d'un réseau de Petri, rendant son utilisation particulièrement adaptée pour une application temps réel et fiable.
J'ai réalisé sur mon temps libre un éditeur de résaux de Petri en C#, qui compte un peu plus de 10 000 lignes de code. Un runtime écrit en C++ (2 600 lignes de code) permet d'exécuter les réseaux de Petri depuis un projet C++, ici le code existant du Club Robot.
L'éditeur génère lui-même le code C++, le compile en librairie dynamique et permet d'en suivre l'exécution. Un débuggueur intégré permet d'afficher les états actifs, d'ajouter des points d'arrêt à l'exécution et d'évaluer des expressions dans le programme principal (afficher la valeur de retour de fonctions C++ à un instant t dans le programme principal, par exemple). L'avantage de la librairie dynamique est que l'utilisateur peut modifier à la volée le réseau de Petri, rendant immédiatement disponible les modifications sans avoir à relancer le programme principal.
Codé en C#, l'éditeur utilise les frameworks Mono et Gtk#. Il est donc multi-plateforme et a été testé avec succès sur Linux, OS X et Windows (sous Windows, seule l'ouverture et la modification de documents est gérée, les autres fonction reposent sur la norme POSIX).
Le code est disponible ici : https://github.com/rems4e/petri.
Ci-dessous l'interface de l'éditeur avec un réseau de Petri simple. On voit deux états initiaux (1 et 2), le cercle de plus grand diamètre est une macro contenant un autre réseau, simplifiant l'affichage pour des réseaux complexes.
Le paneau en bas de la fenêtre affiche les résultats de recherche d'une expression dans une entité (action, transition ou commentaire)
Ci-dessous l'interface du débuggueur. Les états verts sont les états actifs au moment où la capture d'écran a été faite.
Les états entourés de rouge sont des états avec un point d'arrêt. On voit ici que l'exécution est bloquée dans un état, et qu'il suffit de cliquer sur "Continuer" en haut de la fenêtre pour continuer l'exécution.