{"id":6184,"date":"2024-06-05T15:40:54","date_gmt":"2024-06-05T14:40:54","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/istiaprojetsei2\/?p=6184"},"modified":"2024-06-06T10:29:30","modified_gmt":"2024-06-06T09:29:30","slug":"bras-robot-industriel","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/polytech_2A\/2024\/06\/05\/bras-robot-industriel\/","title":{"rendered":"Virtual Robot Arm"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Bonjour ! Nous sommes Axel, Baptiste et Kilian, trois \u00e9tudiant de Peip 2 \u00e0 Polytech Angers. Nous avons eu pour consigne de choisir un projet que nous essayerions de mener \u00e0 bien en une centaine d&#8217;heure. Notre passion pour l&#8217;informatique nous a pouss\u00e9s \u00e0 choisir &#8220;Virtual Robot Arm&#8221;. Ce projet consiste \u00e0 programmer les mouvements d&#8217;un bras robot industriel et essayer de rendre l&#8217;exp\u00e9rience la plus r\u00e9aliste et immersive possible. Pour y parvenir, nous pourrons \u00e9galement utiliser la <strong>r\u00e9alit\u00e9 virtuelle<\/strong> !<\/p>\n\n\n\n<p class=\"has-text-align-left has-black-color has-text-color has-link-color wp-elements-1 wp-block-paragraph\">D\u00e9couvrez notre projet de simulation robotique, o\u00f9 nous avons utilis\u00e9 Unity pour cr\u00e9er un environnement virtuel sophistiqu\u00e9 afin de contr\u00f4ler et programmer les mouvements du robot industriel ABB IRB 5720. Ce projet vous fait d\u00e9couvrir les pr\u00e9mices de la mod\u00e9lisation et de l&#8217;animation d&#8217;un bras robot industriel, en mettant en avant les d\u00e9fis que nous avons pu rencontrer et les solutions que nous avons mises en place.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXdQ-y9TWQs7T-O3crFlwQJTkRXVB7vaBZOWMFoknMqVexV6L5UscqnEf3fQQnNPgXzvbPjSQ5RpTlkpZPTaBgFbMQ3wTaJb8oGdXkoqeg9Au-SthWjF3zq1Uygpv3QwfYMkcyIwTxvVqSarWEfBLCRxMzOe?key=ssQFh6ugNSDW8HPBnka1gw\" width=\"294\" height=\"286\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">La D\u00e9couverte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans un premier temps, nous avons d\u00fb nous familiariser avec le robot, le logiciel Unity, le langage de programmation. Tout cela constituait des nouveaut\u00e9s pour nous. Nous avons donc pass\u00e9 quelques dizaines d&#8217;heures \u00e0 apprendre comment manipuler l&#8217;interface, \u00e0 prendre en main C#, le langage de programmation que nous avons utilis\u00e9 et \u00e0 configurer tous les angles limites du robot \u00e0 l&#8217;aide de la documentation. Ceci ne constituait que les bases de notre projet, que nous nous devions d&#8217;acqu\u00e9rir avant de pouvoir commencer \u00e0 r\u00e9ellement programmer le robot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici quelques exemples de code \u00e9crit avec le langage C# :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Booleen == true)\n        {\n\n            if (FirstGrab &lt; 5)\n            {\n                ccdik.solver.IKPosition = CibleJaune.position; \/\/Va \u00c3  la position de la Cible\n                FirstGrab += 1;\n            }\n            Invoke(\"Grab\", 0.06f);\/\/Laisse le temps au robot d'aller vers la target avant de la grab\n            \/\/enleve la gravit  de l'objet (s'il en a une)\n            if (CibleJaune.GetComponent&lt;Rigidbody&gt;() != null)\n            {\n                CibleJaune.GetComponent&lt;Rigidbody&gt;().isKinematic = true;\n            }\n\t}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette portion de code se trouve dans la partie Update (extrait du code qui se joue 60 fois\/s) et correspond \u00e0 la capture de la boule cible par le robot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">Scripts de base<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois les diff\u00e9rents outils pris en main, nous avons pu entamer la programmation du robot. L&#8217;objectif \u00e9tait de faire en sorte que l&#8217;utilisateur puisse contr\u00f4ler le robot. Nous avons donc impl\u00e9menter la possibilit\u00e9 de contr\u00f4ler chacune des articulations du robot \u00e0 l&#8217;aide de deux touches du clavier. Cinq articulations sont contr\u00f4lables, il nous a donc fallu configurer dix touches. Chacune des articulations ne peut que pivoter, alors, chaque touche permet un sens de rotation de la pi\u00e8ce concern\u00e9e.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Articulation 1 (Verte) : A-Z<\/li>\n\n\n\n<li>Articulation 2 (Bleu fonc\u00e9) : E-R<\/li>\n\n\n\n<li>Articulation 3 (Rose) : T-Y<\/li>\n\n\n\n<li>Articulation 4 (Jaune) : U-I<\/li>\n\n\n\n<li>Articulation 5 (Bleu clair) : O-P<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>if ( Input.GetKeyDown(KeyCode.A))\n    {\n        Part2.GetComponent&lt;Transform&gt;().Rotate(-Vector3.up * 0.5f, Space.World);\n    }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lors de l&#8217;appui sur le bouton &#8220;A&#8221; du clavier, la partie 1 va tourner de 0.5 degr\u00e9 par frame sur l&#8217;axe y vertical.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si configurer les d\u00e9placements du bras robot \u00e9tait la premi\u00e8re \u00e9tape, notre projet ne s&#8217;arr\u00eate pas l\u00e0. L&#8217;objectif principal d&#8217;un bras industriel de ce type est la manipulation d&#8217;objets de 90 \u00e0 180 kilogrammes. Il \u00e9tait donc n\u00e9cessaire de pr\u00e9voir une option pour attraper un objet. Dans notre syst\u00e8me de capture, l&#8217;approche est simplifi\u00e9e : la partie finale du robot, repr\u00e9sent\u00e9e par la partie nomm\u00e9e \u201cend\u201d du robot, doit simplement avoir la m\u00eame position que la cible. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Notre script r\u00e9cup\u00e8re la position de l\u2019objet qu\u2019il veut attraper et la position de la partie \u201cend\u201d du robot. Ensuite le script calcul la distance entre les deux points, si la distance est plus grande que l\u2019allonge du robot, alors le script s&#8217;occupant de la capture de la cible ne s&#8217;ex\u00e9cutera pas. Si au contraire, la premi\u00e8re \u00e9tape est pass\u00e9e avec succ\u00e8s, le robot ira \u00e0 la position de la sph\u00e8re, c\u2019est-\u00e0-dire que l&#8217;on change la position de la partie \u201cend\u201d par la position de la sph\u00e8re. En faisant \u00e7a tout le bras robot va se d\u00e9placer jusqu\u2019\u00e0 l\u2019objectif, en respectant les limites de rotations fix\u00e9es pr\u00e9c\u00e9demment. Il faut ensuite faire en sorte que la sph\u00e8re reste attach\u00e9e au robot lorsqu&#8217;il se d\u00e9place. Pour ce faire nous allons utiliser la technique du parent\/enfant. Nous allons dans la hi\u00e9rarchie de Unity, d\u00e9placer la sph\u00e8re et la mettre en enfant de la partie <em>end\u00a0<\/em>. Ainsi, la cible restera solidaire du robot, en nous pourrons bel et bien, attraper, d\u00e9placer et rel\u00e2cher un objet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">Automatisation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois ces programmes de base bien d\u00e9finis, nous avons cr\u00e9\u00e9 un script permettant d&#8217;automatiser les mouvements du robot. L\u2019automatisation est la plus longue et fastidieuse t\u00e2che de ce projet. Bien qu\u2019apportant son lot de probl\u00e8mes, il est une part essentielle de notre simulation. Nous pouvons ainsi voir le robot bouger de mani\u00e8re autonome. Son parcours est le suivant, tout d\u2019abord, gr\u00e2ce au package Final IK (qui permet de faire de la cin\u00e9matique inverse) il va aller chercher les positions de ses diff\u00e9rentes cibles. Une fois les positions (du pav\u00e9 au sol et de la sph\u00e8re correspondante) il va se remettre dans sa position initiale. Ensuite il se d\u00e9place doucement vers la boule, l\u2019attrape, se met dans sa position de transport et va d\u00e9poser la boule sur l\u2019endroit pr\u00e9vu. Ce fut un travail assez long puisqu\u2019il nous aura occup\u00e9s au total entre 20 et 30 heures. Nous sommes tr\u00e8s fiers du travail fourni m\u00eame s\u2019il y a une grande quantit\u00e9 d\u2019am\u00e9liorations possibles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">Exp\u00e9rience utilisateur et immersion<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">1 &#8211; Ambiance sonore<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour qu&#8217;une simulation soit la plus compl\u00e8te possible, les programmes doivent \u00eatre fonctionnels \u00e9videmment, mais l&#8217;exp\u00e9rience utilisateur doit aussi \u00eatre fluide et immersive. Pour y arriver, nous avons d&#8217;abord d\u00e9cid\u00e9s d&#8217;impl\u00e9menter une ambiance sonore. Un son qui se jouerait lors des mouvements du robot pour simuler le bruit qu&#8217;il pourrait produire. Puisque l&#8217;activer et le d\u00e9sactiver provoquait une latence qui rendait l&#8217;exp\u00e9rience moins fid\u00e8le \u00e0 la r\u00e9alit\u00e9, nous avons pris la d\u00e9cision de laisser le son se jouer en boucle, mais avec un volume nul, et n&#8217;augmenter le volume que lorsqu&#8217;au moins une des articulations effectuent une rotation. Voici le son que nous avons impl\u00e9ment\u00e9 :<\/p>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"https:\/\/blog.univ-angers.fr\/istiaprojetsei2\/files\/2024\/06\/Mouvement_robot.mp3\"><\/audio><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il s&#8217;agit d&#8217;un court extrait de sample que nous avons coup\u00e9 et mis en boucle pour avoir le son le plus continu possible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2 &#8211; R\u00e9alit\u00e9 Virtuelle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La r\u00e9alit\u00e9 virtuelle est l&#8217;apog\u00e9e de la simulation r\u00e9aliste. Nous avons alors, autant que possible essay\u00e9 de comprendre et ma\u00eetriser cet outil afin de rendre notre exp\u00e9rience la plus fluide et conforme possible. \u00c9tant parfaitement \u00e9tranger \u00e0 cette nouvelle technologie, nous avons eu besoin de M.Richard pour nous y initier, lequel nous a fourni un script C# dans lequel se trouvent les bases pour coder en VR. Il y a par exemple la connexion du casque VR et de ses manettes, la d\u00e9tection des inputs des manettes, etc\u2026<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En s&#8217;appuyant sur cette aide, nous avons adapt\u00e9 tous nos anciens scripts pour qu&#8217;ils puissent fonctionner avec le mat\u00e9riel VR. C\u2019est-\u00e0-dire plus concr\u00e8tement que nous avons chang\u00e9 les clics du clavier par le clic d\u2019un bouton ou le d\u00e9placement d\u2019un joystick.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici les contr\u00f4les que nous avons finalement utilis\u00e9s :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.univ-angers.fr\/istiaprojetsei2\/files\/2024\/06\/VR-blog-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"822\" height=\"333\" src=\"https:\/\/blog.univ-angers.fr\/istiaprojetsei2\/files\/2024\/06\/VR-blog-1.png\" alt=\"\" class=\"wp-image-6541\" srcset=\"https:\/\/blog.univ-angers.fr\/polytech_2A\/files\/2024\/06\/VR-blog-1.png 822w, https:\/\/blog.univ-angers.fr\/polytech_2A\/files\/2024\/06\/VR-blog-1-300x122.png 300w, https:\/\/blog.univ-angers.fr\/polytech_2A\/files\/2024\/06\/VR-blog-1-768x311.png 768w, https:\/\/blog.univ-angers.fr\/polytech_2A\/files\/2024\/06\/VR-blog-1-500x203.png 500w\" sizes=\"auto, (max-width: 822px) 100vw, 822px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons en somme pu d\u00e9velopper de nombreuses comp\u00e9tences durant ces mois de travail. Ainsi, nos capacit\u00e9s de d\u00e9veloppement, de gestion du temps et du stress s&#8217;en retrouvent grandement am\u00e9lior\u00e9es. Nous pouvons donc dire qu\u2019il nous a pr\u00e9par\u00e9 aux d\u00e9fis qui nous seront impos\u00e9s d\u00e8s l\u2019ann\u00e9e prochaine. Il a \u00e9galement \u00e9t\u00e9 b\u00e9n\u00e9fique, pour chacun de nous, vis-\u00e0-vis de notre projet professionnel nous dirigeant vers certaines sp\u00e9cialit\u00e9s ou non. Enfin nous tenions \u00e0 remercier nos professeurs encadrants, P.Richerd et E.Richard pour l\u2019aide qu\u2019ils ont su nous apporter tout au long de la r\u00e9alisation du projet ainsi que Polytech Angers de nous avoir offert cette opportunit\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Merci pour votre lecture, en esp\u00e9rant avoir r\u00e9ussi \u00e0 attiser votre curiosit\u00e9 !\u00a0<\/p>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\">Axel WEIL<\/p>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\"> Baptiste GUICHETEAU<\/p>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\">Kilian CHAMPIN<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bonjour ! Nous sommes Axel, Baptiste et Kilian, trois \u00e9tudiant de Peip 2 \u00e0 Polytech Angers. Nous avons eu pour consigne de choisir un projet que nous essayerions de mener \u00e0 bien en une centaine d&#8217;heure. Notre passion pour l&#8217;informatique &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/polytech_2A\/2024\/06\/05\/bras-robot-industriel\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":108253,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[613],"tags":[],"class_list":["post-6184","post","type-post","status-publish","format-standard","hentry","category-2023-2024"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/posts\/6184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/users\/108253"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/comments?post=6184"}],"version-history":[{"count":12,"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/posts\/6184\/revisions"}],"predecessor-version":[{"id":6546,"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/posts\/6184\/revisions\/6546"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/media?parent=6184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/categories?post=6184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/polytech_2A\/wp-json\/wp\/v2\/tags?post=6184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}