Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| mapping_integration_web [2018/02/13 14:45] – v0.1 mgp3202018 | mapping_integration_web [2020/07/03 17:38] (current) – Tag0 Added: pepper mai | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| Cette documentation explique comment créer une carte à partir d'un robot pour l' | Cette documentation explique comment créer une carte à partir d'un robot pour l' | ||
| + | Ce travail se base sur cet article : [[https:// | ||
| + | |||
| + | Vidéo de démonstration de la solution : [[https:// | ||
| ===== Liste des packages utilisés ===== | ===== Liste des packages utilisés ===== | ||
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| - | * http:// | + | * http:// |
| + | * http:// | ||
| + | * http:// | ||
| + | * http:// | ||
| + | |||
| + | Tous ces packages peuvent être installés en utilisant la commande : | ||
| + | sudo apt-get install ros-< | ||
| + | La liste des packages disponibles sur une distribution ROS peut être affichée comme ceci : | ||
| + | apt-cache search ros-< | ||
| + | |||
| + | Pour Pepper, il faut utiliser ROS Kinetic (installable sur Ubuntu 16.04).\\ | ||
| + | Pour RB-1, il faut utiliser ROS Indigo (installable sur Ubuntu 14.04). | ||
| ===== Création d'un rosbag ===== | ===== Création d'un rosbag ===== | ||
| Line 23: | Line 37: | ||
| On se connecte au robot. Pour Pepper : | On se connecte au robot. Pour Pepper : | ||
| roslaunch pepper_bringup pepper_full_py.launch nao_ip: | roslaunch pepper_bringup pepper_full_py.launch nao_ip: | ||
| - | Pour RB1 : | + | Pour RB1 (il faut au préalable être connecté au WiFi du robot) |
| export ROS_MASTER_URI=http:// | export ROS_MASTER_URI=http:// | ||
| On lance l' | On lance l' | ||
| Line 29: | Line 43: | ||
| rosbag record -O </ | rosbag record -O </ | ||
| rosbag record -O </ | rosbag record -O </ | ||
| - | On fait maintenant se déplacer le robot comme on le souhaite.\\ On arrête ensuite l' | + | On fait maintenant se déplacer le robot comme on le souhaite. On arrête ensuite l' |
| On peut inspecter le contenu du rosbag avec la commande : | On peut inspecter le contenu du rosbag avec la commande : | ||
| rosbag info < | rosbag info < | ||
| Line 40: | Line 54: | ||
| NB : il faut **impérativement** lancer cette commande avant de lancer tous les nodes. | NB : il faut **impérativement** lancer cette commande avant de lancer tous les nodes. | ||
| rosparam set use_sim_time true | rosparam set use_sim_time true | ||
| - | On génère ensuite une carte à l'aide de //slam_gmapping/ | + | On génère ensuite une carte à l'aide de [[http://wiki.ros.org/gmapping# |
| + | Par exemple, pour RB1, la commande suivante génère une carte exploitable : | ||
| rosrun gmapping slam_gmapping scan: | rosrun gmapping slam_gmapping scan: | ||
| On rejoue le bag : | On rejoue le bag : | ||
| - | rosbag play --clock </ | + | rosbag play --clock <nom_du_bag>.bag |
| - | Avant d' | + | Avant d' |
| rosrun map_server map_saver -f < | rosrun map_server map_saver -f < | ||
| + | Exemple de carte obtenue avec les lasers de RB-1 :\\ | ||
| + | {{: | ||
| + | Les traits que l'on voit sont des aberrations dues aux lasers, on peut réduire leur impact en jouant sur les paramètres lors de la génération de la carte (paramètre // | ||
| ==== Spécificités de Pepper ==== | ==== Spécificités de Pepper ==== | ||
| - | + | Les lasers de Pepper n' | |
| - | ==== Spécificités | + | On lance un nodelet manager : |
| + | | ||
| + | On lance notre nodelet depth_image_proc/ | ||
| + | **Erreur bloquante ici, à revoir.** | ||
| + | rosrun nodelet nodelet load depth_image_proc/ | ||
| + | On lance image_proc qui retire la distorsion des images : | ||
| + | rosrun image_proc image_proc image_raw:=image camera_info: | ||
| + | On lance notre nodelet depth_image_proc/ | ||
| + | rosrun nodelet nodelet load depth_image_proc/ | ||
| + | On lance le package // | ||
| + | rosrun pointcloud_to_laserscan pointcloud_to_laserscan_node cloud_in:=/points | ||
| + | Puis on génère la carte comme vu dans la partie 3. | ||
| ===== Intégration de la carte dans une interface Web ===== | ===== Intégration de la carte dans une interface Web ===== | ||
| + | |||
| + | Le principe est le suivant : // | ||
| + | \\ | ||
| + | Pour cela, on publie un topic de map à partir du fichier de map enregistré.\\ | ||
| + | NB : il faut bien utiliser le fichier .yaml et non le fichier .pgm de la carte. | ||
| + | rosrun map_server map_server < | ||
| + | On lance le WebSocket : | ||
| + | roslaunch rosbridge_server rosbridge_websocket.launch | ||
| + | |||
| + | Voici le code HTML de la page que nous avons utilisé. Attention à bien avoir les fichiers des librairies css et javascript positionnées au bon endroit. | ||
| + | < | ||
| + | <code html> | ||
| + | |||
| + | < | ||
| + | <html lang=" | ||
| + | < | ||
| + | <!-- Required meta tags --> | ||
| + | <meta charset=" | ||
| + | <meta name=" | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | <meta name=" | ||
| + | <link rel=" | ||
| + | |||
| + | <!-- jQuery first, then Popper.js, then Bootstrap JS --> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | <!-- Bootstrap CSS --> | ||
| + | <link rel=" | ||
| + | <link rel=" | ||
| + | |||
| + | < | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <nav class=" | ||
| + | <div class=" | ||
| + | |||
| + | <!-- Brand --> | ||
| + | <a class=" | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <div class=" | ||
| + | <div class=" | ||
| + | < | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | $(document).ready(function() { | ||
| + | |||
| + | // Variables sur la map | ||
| + | var posImageX = 0; | ||
| + | var posImageY = 0; | ||
| + | var widthMap = 0; | ||
| + | var heightMap = 0; | ||
| + | var resolutionMap = 0; | ||
| + | var svg; | ||
| + | |||
| + | // Position d' | ||
| + | var posOriginX = 0; | ||
| + | var posOriginY = 0; | ||
| + | |||
| + | // Position du clic | ||
| + | var posClicX, posClicY; | ||
| + | |||
| + | // Connexion à ROS | ||
| + | var ros = new ROSLIB.Ros({ | ||
| + | url : ' | ||
| + | }); | ||
| + | |||
| + | ros.on(' | ||
| + | console.log(" | ||
| + | }); | ||
| + | |||
| + | // On souscrit au topic / | ||
| + | // ---------------------------------- | ||
| + | var listenerMetaData = new ROSLIB.Topic({ | ||
| + | ros : ros, | ||
| + | name : '/ | ||
| + | messageType : ' | ||
| + | }); | ||
| + | |||
| + | listenerMetaData.subscribe(function(message) { | ||
| + | |||
| + | console.log(" | ||
| + | |||
| + | // On récupère les métadonnées de la map | ||
| + | posOriginX = message.origin.position.x; | ||
| + | posOriginY = message.origin.position.y; | ||
| + | widthMap = message.width; | ||
| + | heightMap = message.height; | ||
| + | resolutionMap = message.resolution; | ||
| + | listenerMetaData.unsubscribe(); | ||
| + | |||
| + | console.log(' | ||
| + | |||
| + | // On créé le viewer | ||
| + | var viewer = new ROS2D.Viewer({ | ||
| + | divID : ' | ||
| + | width : widthMap, | ||
| + | height : heightMap | ||
| + | }); | ||
| + | |||
| + | // Préparation de la map | ||
| + | var gridClient = new ROS2D.OccupancyGridClient({ | ||
| + | ros : ros, | ||
| + | rootObject : viewer.scene | ||
| + | }); | ||
| + | |||
| + | // Scale the canvas to fit to the map | ||
| + | gridClient.on(' | ||
| + | viewer.scaleToDimensions(gridClient.currentGrid.width, | ||
| + | viewer.shift(gridClient.currentGrid.pose.position.x, | ||
| + | }); | ||
| + | |||
| + | var image = $('# | ||
| + | posImageX = image.offset().left; | ||
| + | posImageY = image.offset().top; | ||
| + | |||
| + | // On créé le svg | ||
| + | svg = document.createElementNS(" | ||
| + | svg.setAttribute(' | ||
| + | svg.setAttribute(' | ||
| + | svg.setAttribute(' | ||
| + | svg.setAttribute(' | ||
| + | document.body.appendChild(svg); | ||
| + | |||
| + | $('# | ||
| + | posClicX = e.pageX - posImageX; | ||
| + | posClicY = e.pageY - posImageY; | ||
| + | |||
| + | console.log(' | ||
| + | |||
| + | $(' | ||
| + | var shape = document.createElementNS(" | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | svg.appendChild(shape); | ||
| + | }); | ||
| + | |||
| + | // On souscrit au topic /amcl_pose | ||
| + | // ---------------------------------- | ||
| + | var listener = new ROSLIB.Topic({ | ||
| + | ros : ros, | ||
| + | name : '/ | ||
| + | messageType : ' | ||
| + | }); | ||
| + | |||
| + | console.log(" | ||
| + | |||
| + | listener.subscribe(function(message) { | ||
| + | |||
| + | var posX = (0 + (message.pose.pose.position.x - posOriginX)/ | ||
| + | var posY = (heightMap + -1*(message.pose.pose.position.y - posOriginY)/ | ||
| + | |||
| + | console.log(' | ||
| + | $(' | ||
| + | var shape = document.createElementNS(" | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | shape.setAttributeNS(null, | ||
| + | svg.appendChild(shape); | ||
| + | // | ||
| + | |||
| + | }); | ||
| + | }); | ||
| + | |||
| + | }); | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| ===== Affichage de la localisation du robot ===== | ===== Affichage de la localisation du robot ===== | ||
| + | |||
| + | Pour la localisation du robot, on utilise le package //amcl//.\\ | ||
| + | Si ce n'est pas déjà fait, on publie la carte : | ||
| + | rosrun map_server map_server < | ||
| + | On lance la lecture du bag : | ||
| + | rosbag play --clock < | ||
| + | On lance la détection AMCL à partir des lasers (pour RB1, /// | ||
| + | rosrun amcl amcl scan: | ||
| + | La page Web s' | ||
| + | |||
| + | ===== Travaux futurs ===== | ||
| + | ==== Pour Pepper ==== | ||
| + | |||
| + | * Troubleshooting de l' | ||
| + | * Normalement, | ||
| + | |||
| + | ==== Pour le déplacement de RB-1 à la localisation spécifiée ==== | ||
| + | |||
| + | * Publier les coordonnées de destination depuis l' | ||
| + | * Utiliser ces coordonnées pour déplacer RB-1 (probablement grâce au package // | ||
| + | {{tag> pepper ros }} | ||