La simulation robotique dans Unity est aussi simple que 1, 2, 3

Les flux de développement de robots s'appuient sur la simulation pour les tests et la formation, et nous voulons vous montrer comment les roboticiens peuvent utiliser Unity pour la simulation robotique. Dans ce premier billet d'une nouvelle série, nous décrivons un processus de développement robotique courant. De plus, nous présentons un nouvel ensemble d'outils qui rendent la simulation robotique dans Unity plus rapide, plus efficace et plus facile que jamais.
Le développement et le test d'applications à l'aide d'un robot réel étant coûteux et fastidieux, la simulation devient un élément de plus en plus important du développement d'applications robotiques. Valider l'application en simulation avant de la déployer sur le robot peut raccourcir le temps d'itération en révélant rapidement les problèmes potentiels. La simulation permet également de tester plus facilement les cas limites ou les scénarios qui pourraient être trop dangereux à tester dans le monde réel.
Les éléments clés d'une simulation robotique efficace comprennent les attributs physiques du robot, la scène ou l'environnement dans lequel le robot opère et le logiciel qui fonctionne sur le robot dans le monde réel. Il est essentiel de veiller à ce que ces trois éléments de la simulation soient aussi proches que possible du monde réel pour que les essais et la formation soient valables.
L'un des cadres les plus courants pour le développement de logiciels pour robots est le système d'exploitation pour robots (ROS). Il fournit des formats standard pour les descriptions de robots, les messages et les types de données utilisés par des milliers de roboticiens dans le monde, pour des cas d'utilisation aussi variés que l'assemblage industriel, les véhicules autonomes et même le divertissement. Une communauté d'utilisateurs dynamique contribue à l'élaboration de nombreux logiciels libres pour des fonctionnalités communes qui peuvent servir de point de départ au développement de nouveaux systèmes.
Les roboticiens conçoivent souvent une application robotique comme un ensemble modulaire de nœuds ROS qui peuvent être déployés à la fois sur des robots réels et sur des ordinateurs qui s'interfacent avec des simulateurs. Dans une simulation, les développeurs construisent un monde virtuel qui reflète le cas d'utilisation cible du robot réel. En effectuant des tests dans cet écosystème simulé, les utilisateurs peuvent modifier rapidement leurs conceptions avant de les tester dans le monde réel et, enfin, de les déployer en production.

Un flux de travail commun pour le développement de la robotique, où les essais en simulation précèdent les essais en conditions réelles.
Ce billet de blog utilise l'exemple d'une simple tâche de manipulation de type "pick-and-place" pour illustrer comment les utilisateurs peuvent tirer parti d'Unity pour ce flux de travail de simulation.
En suivant le processus ci-dessus, disons que la tâche de notre robot consiste à prendre un objet et à le placer à un endroit donné. Le robot éducatif Niryo One à six axes sert de bras robotique. L'environnement est minimal : une pièce vide, une table sur laquelle le robot est assis et un cube (c'est-à-dire l'objet cible). Pour réaliser la partie de la tâche relative à la planification des mouvements, nous utilisons un ensemble populaire de packages ROS de planification des mouvements, collectivement appelé MoveIt. Lorsque nous sommes prêts à commencer la tâche, nous envoyons une demande de planification du simulateur à MoveIt. La requête contient les poses de toutes les articulations du robot, la pose du cube et la position cible du cube. MoveIt calcule ensuite un plan de mouvement et le renvoie au simulateur pour exécution.
Maintenant que nous avons défini le problème, voyons comment utiliser Unity dans ce flux de travail de simulation.
Une simulation robotique consiste à mettre en place un environnement virtuel - une simple pièce, comme dans cet exemple, ou quelque chose de plus complexe, comme le sol d'une usine avec des tapis roulants, des bacs, des outils et des pièces - et à ajouter à cet environnement une représentation virtuelle du robot à former ou à tester. L'éditeur Unity peut être utilisé pour créer des permutations infinies d'environnements virtuels. Mais comment intégrer nos robots dans ces environnements ?
Lors de la modélisation d'un robot en simulation, nous devons représenter ses mailles visuelles, ses mailles de collision et ses propriétés physiques. Les maillages visuels sont nécessaires pour rendre le robot réaliste. Les maillages de collision sont nécessaires pour calculer les collisions entre les "liens" du robot, les éléments rigides qui relient les articulations, et d'autres objets dans l'environnement, ainsi qu'avec lui-même. Ces maillages sont généralement moins complexes que les maillages visuels afin de permettre un contrôle plus rapide des collisions, ce qui peut nécessiter beaucoup de calculs. Enfin, les propriétés physiques, telles que l'inertie, les coefficients de contact et la dynamique des articulations, sont nécessaires pour une simulation physique précise, c'est-à-dire pour calculer comment les forces exercées sur les liens entraînent des modifications de l'état du robot, par exemple la position, la vitesse ou l'accélération.
Heureusement pour nous, lorsque nous utilisons le flux de développement ROS, il existe une manière standardisée de décrire toutes ces propriétés : Format universel de description des robots (URDF). Les fichiers URDF sont des fichiers XML qui nous permettent de spécifier ces propriétés visuelles, de collision et physiques dans un langage de balisage lisible par l'homme. Les fichiers URDF peuvent également inclure des fichiers de maillage pour spécifier des géométries complexes. L'exemple ci-dessous montre un extrait du fichier URDF du robot Niryo One.

URDF de Niryo One robot
Afin de faciliter l'importation de robots dans Unity, nous publions URDF Importer, un paquetage Unity open-source permettant d'importer un robot dans une scène Unity à l'aide de son fichier URDF. Ce paquet tire parti de notre nouvelle prise en charge des "articulations" dans Unity, rendue possible par les améliorations apportées à PhysX 4.1. Cette mise à jour nous permet de modéliser avec précision les caractéristiques physiques d'un robot afin d'obtenir des simulations cinématiques plus réalistes.
Lorsqu'il est installé dans l'éditeur Unity, ce paquet permet à l'utilisateur de sélectionner un fichier URDF à importer. Il analyse le fichier XML en coulisses et stocke les liens et les articulations dans les classes C# appropriées. Il crée ensuite une hiérarchie de GameObjects, où chaque GameObject est un composant ArticulationBody représentant un lien particulier dans le robot. Il attribue les propriétés de l'URDF aux champs correspondants de l'ArticulationBody. Lorsque les utilisateurs ajoutent un robot à Unity, l'importateur URDF crée automatiquement un contrôleur rudimentaire de type clavier-articulation. Les utilisateurs peuvent remplacer ce contrôleur par un contrôleur personnalisé en utilisant les API d'ArticulationBody.
Par exemple, voici la ressource Niryo One Unity, créée après l'importation du fichier URDF ci-dessus.

Un robot virtuel Niryo One dans Unity, importé via URDF Importer
Maintenant que le robot est dans l'éditeur Unity, nous devons tester notre algorithme de planification de mouvement, en l'exécutant dans un ensemble de nœuds ROS. Pour ce faire, nous devons mettre en place une interface de communication entre Unity et ROS. Unity doit transmettre à ROS des messages contenant des informations d'état - à savoir les positions du robot, de l'objet cible et de l'emplacement de la cible - ainsi qu'une demande de planification au service de déplacement. À son tour, ROS doit renvoyer à Unity un message de trajectoire correspondant au plan de mouvement (c'est-à-dire la séquence des positions articulaires requises pour accomplir la tâche de prise et de dépose).
Deux nouveaux packages d'intégration ROS-Unity facilitent désormais la connexion entre Unity et ROS. Ces paquets permettent aux messages ROS d'être transmis entre les nœuds ROS et Unity avec une faible latence ; lors d'un test sur une seule machine, un simple message textuel est passé d'Unity à un abonné ROS en quelques millisecondes et une image 1036 x 1698 en quelques centaines de millisecondes.
Puisque la communication dans ROS utilise un modèle pub/sub, la première exigence pour la communication ROS-Unity est d'avoir des classes dans Unity correspondant aux types de messages ROS. Lorsque les utilisateurs ajoutent le package ROS-TCP-Connector Unity à l'éditeur Unity, ils peuvent utiliser le plugin MessageGeneration pour générer des classes C#, y compris des fonctions de sérialisation et de désérialisation, à partir des fichiers ROS .msg et .srv. Le paquet ROS-TCP-Connector comprend également des scripts que l'utilisateur peut étendre pour publier des messages depuis Unity vers un sujet ROS, s'abonner dans Unity à des messages sur un sujet ROS, et créer des requêtes et des réponses de service ROS. Du côté de ROS, un paquetage ROS appelé ROS-TCP-Endpoint peut créer un point d'extrémité pour permettre la communication entre les nœuds ROS et une scène Unity en utilisant ces scripts ROS-TCP-Connector.
Voyons maintenant comment utiliser ces paquets d'intégration ROS-Unity pour la tâche à accomplir. Tout d'abord, nous utilisons les paquets d'intégration ROS-Unity pour créer un éditeur dans Unity afin d'envoyer les données de pose à ROS via TCP. Du côté de ROS, nous devons mettre en place un ROS-TCP-Endpoint pour souscrire à ces messages de pose.
Ensuite, nous allons créer un bouton "Publier" dans la scène Unity ainsi qu'un callback OnClick. Cette fonction de rappel fait une demande de service au planificateur de mouvement MoveIt. La demande de service comprend la position actuelle du robot, la position de l'objet cible et l'emplacement de la cible. Lorsque MoveIt reçoit la demande de planification, il tente de calculer un plan de déplacement. En cas de succès, le service renvoie le plan, c'est-à-dire une séquence de positions articulaires, et un script Unity exécute la trajectoire à l'aide des API ArticulationBody. Dans le cas contraire, il renvoie un message d'échec.
L'image ci-dessous montre une simulation Unity du bras Niryo One effectuant avec succès la tâche de prise et de déplacement.

Simulation d'une tâche de pick-and-place sur un robot Niryo One dans Unity en utilisant ROS et MoveIt pour la planification des mouvements
Cet exemple n'est qu'un début. Les développeurs peuvent utiliser cette démo comme base pour créer des scènes Unity plus complexes, ajouter différents robots et intégrer d'autres paquets ROS. Restez à l'écoute pour les prochains billets qui traiteront de l'intégration de la vision par ordinateur et des tâches orientées vers l'apprentissage automatique dans un cadre de simulation robotique.
Ces outils jettent les bases d'une nouvelle génération de tests et de formations en simulation et facilitent plus que jamais l'utilisation d'Unity pour la simulation robotique. Notre équipe travaille d'arrache-pied pour permettre ces cas d'utilisation de nouvelle génération, notamment la formation à l'apprentissage automatique pour la robotique, la modélisation de capteurs, les tests à l'échelle, etc. Restez à l'écoute de notre prochain article de blog dans cette série, qui vous montrera comment former un modèle d'apprentissage automatique basé sur la vision pour estimer la pose de l'objet cible dans la tâche de prise et de dépose.
Commencez à utiliser nos outils de simulation robotique gratuitement. Consultez notre tutoriel sur le pick-and-place sur GitHub.
Pour d'autres projets de robotique, visitez le Unity Robotics Hub sur GitHub. Pour savoir comment notre équipe facilite l'apprentissage des systèmes de vision artificielle à l'aide d'Unity, lisez notre série de blogs sur la vision artificielle.
Pour plus d'informations sur la façon dont Unity peut être utilisé pour répondre à vos besoins en matière de simulation robotique, visitez notre page officielle sur la robotique.
Si vous souhaitez contacter directement notre équipe pour poser des questions, faire part de vos commentaires ou de vos suggestions, envoyez-nous un courriel à l'adresse unity-robotics@unity3d.com.
