Difference between revisions of "EA2012 Langages et Canevas pour la robotique de service"

From air
Jump to navigation Jump to search
Line 39: Line 39:
 
=== Introduction ===
 
=== Introduction ===
   
 
ROS (Robot Operating System) est un système d’exploitation pour la robotique de service. ROS est un méta système d’exploitation (entre le système d’exploitation et le middleware), il fournit des services proches d’un système d’exploitation (abstraction du matériel, gestion de la concurrence, des processus…) mais aussi des fonctionnalités de haut niveau (appels asynchrones, appels synchrones, base de données centralisée de données, système de paramétrage du robot…).
ROS (Robot Operating System) est un système d’exploitation complet pour la robotique de service.
 
  +
ROS est développé et maintenu par la société californienne Willow Garage, fondée en 2006 par Scott Hassan, un des premiers employés de Google.
ROS est un méta système d’exploitation, quelque chose entre le système d’exploitation et le middleware.
 
Il fournit des services proches d’un système d’exploitation (abstraction du matériel, gestion de la concurrence, des processus…) mais aussi des fonctionnalités de haut niveau (appels asynchrones, appels synchrones, base de données centralisée de données, système de paramétrage du robot…).
 
ROS est développé et maintenu par une société californienne, Willow Garage, fondée en 2006 par Scott Hassan, un des premiers employés de Google qui a participé au développement de la technologie du moteur de recherche et qui est aussi à l’origine des Yahoo Groups (en fait de eGroups qui est devenu Yahoo Groups). Le PDG de Willow Garage est Steeve Cousin, un ancien d’IBM.
 
   
 
=== Principes ===
 
=== Principes ===
  +
  +
ROS est basé sur 5 principes essentiels :
  +
1
  +
Peer to Peer:
  +
permet le dialogue direct entre les di�érents
  +
acteurs en fonction des besoins
  +
2
  +
Basé sur des outils (microkernel)
  +
: ce design rend le
  +
système plus robuste et évolutif
  +
3
  +
Multi-langages:
  +
peut être facilement implémenté dans
  +
n'importe quel langage, actuellement en Python, C++ et Lisp
  +
et en cours en Java et Lua
  +
4
  +
Légèreté:
  +
ré-utilisabilité maximale, les pilotes et algorithmes
  +
sont contenus dans des exécutables indépendants
  +
5
  +
Gratuit et Open source:
  +
moyen d'accélérer les recherches en
  +
robotique et rendre les bases plus solides
  +
   
 
=== Fonctionnement ===
 
=== Fonctionnement ===

Revision as of 17:58, 24 December 2012

Présentation

File:Humanoid HRP2

Abstract

Service robots are robots that assist humans by performing a job. These robots are becoming more and more available to the general public. Those component based complex systems need to interact and communicate one with another. There is an increasing number of middleware that are designed to facilitate the programming of these robots and to make them supported by various machines. In this presentation, we are going to talk about two specific middleware: ROS & Urbi.

Keywords

robotics development platform, ROS, Urbi, Urbi-script, NXT Mindstorm, WeBots

Résumé

La robotique de service est la robotique qui rend des services utiles aux personnes. Cette robotique s'étend de plus au plus au marché grand public. Ces systèmes complexes à base de composants (moteur, détecteurs...) ont besoin d'interagir et communiquer entre eux. Il existe de plus en plus de middleware qui tendent à rendre la programmation de ces robots plus facile et compatible entre plusieurs machines.

Dans cette présentation, nous allons nous intéresser à deux middleware en particulier qui sont ROS et Urbi.


Mots Clés

Plateforme de developpement robotique, ROS, Urbi, Urbi-script, NXT Mindstorm, WeBots

Synthèse

La robotique de service peut se définir comme la robotique qui exécute des services utiles pour le « bien-être » des personnes et des biens. Cette robotique s'étend au marché grand public : cela va du simple robot jouet au robot d’assistance médicale en passant par des “engins” autonomes qui n’assurent que certaines fonctions domestiques (aspirateurs, tondeuses à gazon, etc.).

Ces robots sont composés de systèmes complexes à base de composants (moteur, détecteurs...) qui ont besoin d'interagir et communiquer entre eux. Il existe de plus en plus de middleware qui tendent à rendre la programmation de ces robots plus facile et compatible entre plusieurs machines. On peut citer YARP (Yet Another Robot Platform) écrit en C++ et qui permet l’interconnexion entre détecteurs, processeurs et articulation, ou encore l'environnement Microsoft Robotics Developer Studio, qui a l’avantage d’offrir deux types de développement : un SDK classique en C#, mais également la possibilité d'utiliser le VPL (Visual Programming Language) pour modéliser et concevoir les comportements avec des graphes.

Nous allons nous intéresser à deux middlware en particulier qui sont ROS et Urbi.

ROS

Introduction

ROS (Robot Operating System) est un système d’exploitation pour la robotique de service. ROS est un méta système d’exploitation (entre le système d’exploitation et le middleware), il fournit des services proches d’un système d’exploitation (abstraction du matériel, gestion de la concurrence, des processus…) mais aussi des fonctionnalités de haut niveau (appels asynchrones, appels synchrones, base de données centralisée de données, système de paramétrage du robot…). ROS est développé et maintenu par la société californienne Willow Garage, fondée en 2006 par Scott Hassan, un des premiers employés de Google.

Principes

ROS est basé sur 5 principes essentiels : 1 Peer to Peer: permet le dialogue direct entre les di�érents acteurs en fonction des besoins 2 Basé sur des outils (microkernel)

ce design rend le

système plus robuste et évolutif 3 Multi-langages: peut être facilement implémenté dans n'importe quel langage, actuellement en Python, C++ et Lisp et en cours en Java et Lua 4 Légèreté: ré-utilisabilité maximale, les pilotes et algorithmes sont contenus dans des exécutables indépendants 5 Gratuit et Open source: moyen d'accélérer les recherches en robotique et rendre les bases plus solides


Fonctionnement

ROS File System

ROS Computation Graph

Intérêt et avantages

Urbi

Urbi-Logo.png


Gostaï

Urbi est une plateforme logicielle de developpement pour la robotique développé par Gostaï [1] en 2006. L'entreprise a été fondé en 2006 par Jean-Christophe Baillie, ancien enseignant chercheur à l'ENSTA ParisPolytech où il a créé le laboratoire de Robotique Cognitive. Le modèle économique de Gostaï repose sur un ensemble de solutions et services d’aide à la création d’applications qui gravitent autour de sa plateforme logicielle opensource (Gostai Lab, Gostai Studio, GostaiNet). Gostaï a été rachetée [2] par le français Aldebaran Robotics [3] l’été 2012, et Urbi est passé sous licence BSD depuis octobre 2012 afin de favoriser l'adoption d'Urbi.

Plateforme logicielle

Urbi permet de s'affranchir d'un grand nombre d'opérations récurrentes et complexes dans le développement pour la robotique. Il est écrit en C++ et est donc compatible avec un grand nombre de plateforme qui compile du C++. Il se base sur une architecture en composants distributés. Ces composants, appelés UObjects, peuvent s’executer en local (sur le robot) ou à distance (sur un serveur de contrôle) pour les robots qui ne disposent pas d’assez de puissance et/ou mémoire. C’est le cas du Minidstorm NXT, qui se contrôle avec Urbi à distance.

Architecture client/serveur de Urbi

Urbiscript

L’interêt du C++ vise clairement la performance de l’execution sur des machines qui ne peuvent pas se permettre de gaspiller la moindre ressource. Cependant, pour la partie algorithme, interconnexion et orthestration des composants, Gostaï à mis au point un langage de script plus flexible et plus facile à maintenir : UrbiScript

Urbiscript permet entre autre :

* Execution de script dynamique
* Programmation événementielle et parallélisme
* Orienté objet pour instancier et manipuler les UObjects
* Coordonne l'ensemble des composants
* Intuitive et asaptés aux débutants comme au developpeurs confirmés

Démonstration Urbi et NXT Mindstorm

Pour la démonstration on utilise le Lego NXT de Mindstorm.


Avancer et reculer

 Global.wheels.speed = 50;
 sleep (3s);
 Global.wheels.speed = −50;
 sleep (2s);
 Global.wheels.speed = 0;

Tourner

L'opérateur '&' permet d'éxecuter deux instructions en même temps. Dans l'exemple ci-dessous, la roue de gauche recule tandis que celle de droite avance, ce qui permet de tourner !

 Global.wheelL.speed = - 50 time:1s &
 Global.wheelR.speed = 50 time:1s;
 
 Global.wheelL.speed = 0 time:2s &
 Global.wheelR.speed = 0 time:2s;

Explorer

On va utiliser le concept de tag pour encapsuler un comportement particulier, puis controller ce tag directement pour arrêter l'action, la reprendre, ou la mettre en pause.

 var Global.explorer = Tag.new;
 explorer:
 {
   every(500ms)
     wheels.speed = 25;
 },

Arrêter le robot :

 explorer.freeze()
 wheels.speed = 0;


Reprendre l'exploration :

 explorer.unfreeze()

Détecter les obstacles

La detection des obstacles se fait via le composant sonar (capteur ultrason) qui renseigne sur la distance qui sépare l'obstacle et le robot. Dès que cette distance passe sous une valeur seuil, on freeze le tag de l'exploration, on fait marche arriere, on tourne legerement, puis on reprend l'exploration.


 var Global.DistanceDanger = 25;
 var Global.detecter = Tag.new;
 detecter:
 {
  at (sonar.val < Global.DistanceDanger)
  {
   explorer.freeze;
   // Marche arrièr
   wheels.speed = - 50 time:1500ms;
   // Tourner
   {Global.wheelL.speed = - 50 & Global.wheelR.speed = 50} & sleep(600ms);
   stop();
   explorer.unfreeze;
  },
 },

Contrôler

Pour contrôler le robot, on utilise le bouton de contact (bumper). A chaque fois que l'on presse sur le bouton, on permute l'etat du robot : Soit on passe en mode exploration, soit on l'arrête.

 var Global.currentState = 0;
 
 at (bumper.val == 1)
 {
  if(Global.currentState == 0)
  {
   echo("On");
   Global.currentState = 1;
   explorer.unfreeze;
   detecter.unfreeze;
  }
  else
  {
   echo("Off");
   explorer.freeze;
   detecter.freeze;
   wheels.speed = 0;
   Global.currentState = 0;
  }|
 },

Liens