Desarrollo robótico - Robot Operating System (ROS)

101
Desarrollo Robótico Robot Operating System (ROS) Vicente García Díaz – [email protected] Universidad de Oviedo, 2012

description

Iniciación al desarrollo con frameworks robóticos. ROS

Transcript of Desarrollo robótico - Robot Operating System (ROS)

Page 1: Desarrollo robótico - Robot Operating System (ROS)

Desarrollo Robótico

Robot Operating System (ROS)

Vicente García Díaz – [email protected]

Universidad de Oviedo, 2012

Page 2: Desarrollo robótico - Robot Operating System (ROS)

Tabla de contenidos

1. Introducción

2. Desarrollo con ROS

3. Comunicación entre máquinas

4. Simulador Gazebo

2

Robot Operating System

Page 3: Desarrollo robótico - Robot Operating System (ROS)
Page 4: Desarrollo robótico - Robot Operating System (ROS)

¿Cómo eran antes todos los robots?

4

Introducción

Page 5: Desarrollo robótico - Robot Operating System (ROS)

¿Cómo son hoy los robots?

5

Introducción

Page 6: Desarrollo robótico - Robot Operating System (ROS)

• Es un framework utilizado para desarrollar aplicaciones robóticas

• Es de código abierto

¿Qué es ROS?

6

Introducción

Hardware

Robot Operating System

Aplicaciones Robóticas

Fuente: http://people.umass.edu/~blaylock/LegoRobotics/

Page 7: Desarrollo robótico - Robot Operating System (ROS)

¿Sobre qué hardware funciona ROS?

7

Introducción

Page 8: Desarrollo robótico - Robot Operating System (ROS)

¿Sobre qué SO funciona ROS?

8

Introducción

Page 9: Desarrollo robótico - Robot Operating System (ROS)

Diferentes distribuciones de ROS

9

Introducción

2010

2012

VirtualBox virtual image with Ubuntu 12.04.1 LTS and ROS Fuerte

Page 10: Desarrollo robótico - Robot Operating System (ROS)

3 años de ROS (2010)

10

Introducción

Fuente: http://www.youtube.com/watch?v=7cslPMzklVo

Page 11: Desarrollo robótico - Robot Operating System (ROS)

Willow Garage

11

Introducción

Page 12: Desarrollo robótico - Robot Operating System (ROS)

¿Qué proporciona ROS?

• OBJETIVO: Crear y ejecutar código a través de diferentes ordenadores y robots

• Funcionalidad del “núcleo” ▫ Abstracción del hardware ▫ Acceso a los componentes del hardware ▫ Mecanismo de paso de mensajes entre procesos ▫ Mecanismos de construcción, pruebas y logging ▫ Gestión de los componentes del sistema

• Funcionalidad “extra” ▫ Simuladores / visualizadores ▫ Librerías matemáticas ▫ Librerías de geometría ▫ Librerías de reconocimiento de imágenes ▫ …

12

Introducción

Page 13: Desarrollo robótico - Robot Operating System (ROS)

Principios de diseño

• Open Source

• Multiplataforma / lenguaje

▫ La comunicación se basa en XML-RPC

▫ Soporta diferentes lenguajes (C++, Python, Java, LISP, Octave, …)

• Procesamiento distribuido

▫ Diseño modular

▫ Los procesos (NODOS) están poco acoplados

• Tool based

13

Introducción

Page 14: Desarrollo robótico - Robot Operating System (ROS)

Basado en componentes externos

• OpenCV

▫ Visión por computador

• Eigen

▫ Trabajo matricial

• ODE+Gazebo

▫ Simulador

• KDL

▫ Cinemática y Dinámica

• TREX

▫ Planificación de alto nivel

14

Introducción

Page 15: Desarrollo robótico - Robot Operating System (ROS)

Recursos organizacionales en ROS

• Package (paquete)

▫ Es la principal unidad de organización en ROS

▫ Análogo a un paquete Java o C#

• Stack (pila)

▫ Es una colección de paquetes con funcionalidad relacionada

▫ Análogo a una librería DLL o JAR

• Node (nodo)

▫ Es un proceso ejecutable

▫ Se incluye dentro de un paquete

15

Introducción Sistema de ficheros

Page 16: Desarrollo robótico - Robot Operating System (ROS)

Paquetes y Pilas

• Tanto los paquetes como las pilas contienen un archivo con metadatos

▫ Proporciona información (p.e., dependencias, flags de compilación, …)

▫ Manifiest.xml

▫ Stack.xml

16

Introducción Sistema de ficheros

Page 17: Desarrollo robótico - Robot Operating System (ROS)

Estructura básica de un paquete

17

Introducción Sistema de ficheros

Package

Nodes Topics

Services

Page 18: Desarrollo robótico - Robot Operating System (ROS)

Stack

Estructura básica de una pila

18

Introducción Sistema de ficheros

Package

Nodes Topics

Services

Package

Nodes Topics

Services

Package

Nodes Topics

Services

Page 19: Desarrollo robótico - Robot Operating System (ROS)

Repositorios

• Son una colección de paquetes y pilas disponibles online

19

Introducción Sistema de ficheros

Page 20: Desarrollo robótico - Robot Operating System (ROS)

Repository

Stack

Estructura básica de un repositorio

20

Introducción Sistema de ficheros

Package

Nodes Topics

Services

Package

Nodes Topics

Services

Stack

Package

Nodes Topics

Services

Package

Nodes Topics

Services

Package

Nodes Topics

Services

Page 21: Desarrollo robótico - Robot Operating System (ROS)

Repository

Stack

Organización general en ROS

21

Introducción Sistema de ficheros

Pkge

Pkge

Stack

Pkge

Repository

Repository

Repository

Page 22: Desarrollo robótico - Robot Operating System (ROS)

Fenómeno exponencial

22

Introducción Sistema de ficheros

Page 23: Desarrollo robótico - Robot Operating System (ROS)

Grafo de computación en ROS

• Principales componentes

▫ Nodes

Services

Topics

Messages

▫ Master

▫ Parameter server

▫ Bags

23

Introducción Grafo computacional

roscore

node

node

node

node

node

node

Page 24: Desarrollo robótico - Robot Operating System (ROS)

Nodes

• Es la unidad de procesamiento (proceso)

• Normalmente se utilizan varios nodos

• Un nodo es un ejecutable dentro de un paquete ROS

• Para la construcción de los nodos se utilizan las librerías cliente ▫ roscpp, rospy, rosoct, roslisp, rosjava, roslua,

roscs,…

24

Introducción Grafo computacional

Page 25: Desarrollo robótico - Robot Operating System (ROS)

Topics

• Son nombres que identifican el contenido de un mensaje

• Los nodos son quienes pueden enviar y recibir mensajes

• Patrón de diseño Observer

▫ El Publisher publica mensajes de un determinado topic

▫ El Subscriber se subscribe a mensajes de un determinado topic

25

Introducción Grafo computacional

node publisher

subscriber

subscriber

subscriber

Page 26: Desarrollo robótico - Robot Operating System (ROS)

Messages

• Estructuras de datos simples que se pasan entre los nodos

• Es el contenido de los topics

• Existen tipos primitivos estándar

▫ Integer

▫ Floating point

▫ Boolean

▫ …

• Se pueden crear tipos personalizados

26

Introducción Grafo computacional

Page 27: Desarrollo robótico - Robot Operating System (ROS)

Services

• Arquitectura cliente / servidor entre nodes

• Realmente utilizan dos mensajes, uno en la solicitud y otro en la respuesta

• El nodo “servidor” se mantiene a la espera de las solicitudes

• Cuando el nodo “cliente” realiza una solicitud, el nodo “servidor” realiza un procesamiento y responde al cliente

27

Introducción Grafo computacional

node

solicitud

node

respuesta

Page 28: Desarrollo robótico - Robot Operating System (ROS)

Roscore

• Es una colección de nodos y programas que deben lanzarse antes que cualquier otro elemento

• roscore ejecuta:

▫ El Master

Guarda información sobre topics y services

Permite la comunicación entre nodos

▫ El Parameter Server

▫ El nodo rosout

28

Introducción Grafo computacional

Page 29: Desarrollo robótico - Robot Operating System (ROS)

Bags

• Archivos para guardar y volver a ejecutar datos de comunicación de ROS

• Sirve para memorizar una serie de órdenes y después volver a repetirlas secuencialmente

• No es necesario repetirlas todas

29

Introducción Grafo computacional

Page 30: Desarrollo robótico - Robot Operating System (ROS)

Comunidad

• Web principal ▫ http://www.ros.org

• Wiki ▫ http://www.ros.org/wiki/

• Ticket System ▫ http://www.ros.org/wiki/Tickets

• ROS Answers ▫ http://answers.ros.org/questions/

• The Willow Garage Blog ▫ http://www.willowgarage.com/news

• Mailing List ▫ https://code.ros.org/mailman/listinfo/ros-users

30

Introducción

Page 31: Desarrollo robótico - Robot Operating System (ROS)

Página inicial del Wiki

31

Introducción Wiki

Page 32: Desarrollo robótico - Robot Operating System (ROS)

Wiki. Páginas sobre packages

32

Introducción Wiki

Page 33: Desarrollo robótico - Robot Operating System (ROS)

Wiki. Páginas sobre stacks

33

Introducción Wiki

Page 34: Desarrollo robótico - Robot Operating System (ROS)
Page 35: Desarrollo robótico - Robot Operating System (ROS)

Creación de un workspace

• Es un área para trabajar y crear nuevos stacks y packages ▫ ROS_PACKAGE_PATH ▫ ROS_WORKSPACE

• rosws Para crear un nuevo workspace y/o paquete ▫ $ rosws init miworkspace /opt/ros/fuerte

• Este comando crea una serie de archivos necesarios:

setup.bash, setup.sh, setup.zsh y el archivo oculto .rosinstall en la carpeta miworkspace

• Para activar nuestro nuevo workspace: ▫ $ source miworkspace/setup.bash

35

Desarrollo con ROS Preparación inicial

Page 36: Desarrollo robótico - Robot Operating System (ROS)

Creación de un espacio para packages

• Los nuevos paquetes necesitan estar incluidos en la variable ROS_PACKAGE_PATH

• Utilizando el comando rosws, todos los nuevos paquetes son incluidos automáticamente en la variable ROS_PACKAGE_PATH cuando se invoca al archivo setup.bash del correspondiente workspace ▫ $ mkdir miworkspace/mipackages

▫ $ rosws set /miworkspace/mipackages/

▫ $ source miworkspace/setup.bash

• Ahora vamos a dejar configurado el entorno para cada vez que se abra una nueva terminal ▫ $ echo "source /opt/ros/fuerte/setup.bash" >> ~/.bashrc

▫ $ echo "export ROS_PACKAGE_PATH=~/miworkspace:$ROS_PACKAGE_PATH" >> ~/.bashrc

▫ $ echo "export ROS_WORKSPACE=~/miworkspace" >> ~/.bashrc

▫ $ echo "export ROS_HOSTNAME=localhost" >> ~/.bashrc

▫ $ echo "export ROS_MASTER_URI=http://localhost:11311" >> ~/.bashrc

36

Desarrollo con ROS Preparación inicial

Page 37: Desarrollo robótico - Robot Operating System (ROS)

Trabajo con el sistema de archivos en ROS

37

Desarrollo con ROS Sistema de archivos

Page 38: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre packages

• rospack ros + pack(age)

• Facilita la obtención de información sin necesidad de utilizar comandos Linux como cd o ls ▫ $ rospack help

▫ $ rospack find [PACKAGE_NAME]

▫ $ rospack find timestamp_tools ▫ >> YOUR_INSTALL_PATH/stacks/driver_common/timestamp_tools

38

Desarrollo con ROS Sistema de archivos

Page 39: Desarrollo robótico - Robot Operating System (ROS)

39

Desarrollo con ROS

1. ¿Cómo obtendrías la lista de nombres de todos los paquetes disponibles?

2. ¿Cómo obtendrías la lista de paquetes de los que depende el paquete rospy? ¿de qué paquetes depende?

3. ¿Cómo obtendrías la lista de paquetes que dependen del paquete roslang?

4. ¿Cómo obtendrías la lista de paquetes que dependen directamente del paquete roslang?

5. ¿Cómo obtendrías la lista de posibles lenguajes cliente, utilizables para implementar funcionalidades en ROS? ¿Qué lenguajes están disponibles en la distribución que estamos utilizando?

Sistema de archivos

?

Page 40: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre stacks

• rosstack ros + stack

• Facilita la obtención de información sin necesidad de utilizar comandos Linux como cd o ls ▫ $ rosstack help

▫ $ rosstack find [STACK_NAME]

▫ $ rosstack find navigation

▫ >> YOUR_INSTALL_PATH/stacks/navigation

40

Desarrollo con ROS Sistema de archivos

Page 41: Desarrollo robótico - Robot Operating System (ROS)

41

Desarrollo con ROS

1. ¿Cómo obtendrías la lista de nombres de todos las pilas disponibles?

2. ¿Cómo obtendrías la lista de paquetes que están dentro de la pila denominada navigation?

3. ¿En qué pila está el paquete image_geometry?

4. Utilizando únicamente un comando, averigua la ruta física en la que se encuentra la pila que contiene al paquete denominado gazebo

Sistema de archivos

?

Page 42: Desarrollo robótico - Robot Operating System (ROS)

Navegación entre packages y stacks (I)

• roscd ros + cd (es parte de la suite denominada rosbash) ▫ $ roscd [locationname[/subdir]]

▫ $ roscd roscpp

▫ $ pwd

▫ >> YOUR_INSTALL_PATH/share/roscpp

▫ $ roscd roscpp/cmake

▫ $ pwd

▫ >> YOUR_INSTALL_PATH/share/roscpp/cmake

1. ¿Con qué comando podríamos comprobar que roscpp está realmente en la ruta YOUR_INSTALL_PATH/share/roscpp?

42

Desarrollo con ROS Sistema de archivos

?

Page 43: Desarrollo robótico - Robot Operating System (ROS)

Navegación entre packages y stacks (II)

• Los comandos de ROS buscan la información en las rutas indicadas en la variable de entorno $ROS_PACKAGE_PATH ▫ $ echo $ROS_PACKAGE_PATH

▫ >> YOUR_INSTALL_PATH/share:YOUR_INSTALL_PATH/stacks

• roscd sin argumentos te lleva al workspace apuntado por la variable de entorno $ROS_WORKSPACE

▫ $ roscd

▫ $ pwd

▫ >> home/YOUR_USER/YOUR_WORKSPACE p.e., /home/viki/miworkspace

• roscd puede llevarte directamente a la carpeta de logs

▫ $ roscd log

43

Desarrollo con ROS Sistema de archivos

Page 44: Desarrollo robótico - Robot Operating System (ROS)

Listado de archivos de un package o stack

• rosls ros + ls (es parte de la suite denominada rosbash) ▫ $ rosls [locationname[/subdir]]

▫ $ rosls navigation

▫ >> Listado con archivos de la pila navigation

▫ $ rosls navigation/move_base

▫ >> Listado con archivos del paquete move_base

• La tecla TABULADOR ayuda a completar el nombre de paquetes y pilas ▫ $ roscd roscpp_tut<<< pulsa la tecla TAB >>>

▫ $ roscd tur<<< pulsa la tecla TAB >>

44

Desarrollo con ROS Sistema de archivos

Page 45: Desarrollo robótico - Robot Operating System (ROS)

45

Desarrollo con ROS

1. ¿Cuántas de las carpetas contenidas en la pila image_common son realmente paquetes? ¿Cómo lo sabríamos?

2. ¿En qué pila están contenidas los paquetes roscpp_tutorials y turtlesim?

Sistema de archivos

?

Page 46: Desarrollo robótico - Robot Operating System (ROS)

Creación de un nuevo package

• roscreate-pkg Permite crear un paquete ROS y su contenido básico ▫ $ roscreate-pkg [package_name]

▫ $ roscreate-pkg [package_name] [depend1] [depend2]…

▫ >> Paquete creado

▫ $ roscd

▫ $ cd mipackages/

▫ $ roscreate-pkg mistutoriales std_msgs rospy roscpp

• Se crean los siguientes archivos: ▫ CMakeLists.txt

▫ Include/mistutoriales/

▫ mainpage.dox

▫ Makefile

▫ manifest.xml

▫ Src/

46

Desarrollo con ROS Creación de un package

Page 47: Desarrollo robótico - Robot Operating System (ROS)

47

Desarrollo con ROS

1. Crea un nuevo paquete dentro de mipackages llamado mispruebas que dependa de los paquetes std_msgs, rospy, roscpp y roslisp

2. ¿Con qué comando comprobarías la ruta de cada uno de los dos paquetes creados anteriormente (mistutoriales y mispruebas)?

3. Muestra las dependencias directas del paquete mistutoriales

4. Muestra las dependencias directas e indirectas del paquete mistutoriales

Creación de un package

?

Page 48: Desarrollo robótico - Robot Operating System (ROS)

Manifiest.xml

• $ cat manifest.xml

48

Desarrollo con ROS Creación de un package

<package> <description brief="mistutoriales"> mistutoriales </description> <author>viki</author> <license>BSD</license> <review status="unreviewed" notes=""/> <url>http://ros.org/wiki/mistutoriales</url> <depend package="std_msgs"/> <depend package="rospy"/> <depend package="roscpp"/> </package>

Page 49: Desarrollo robótico - Robot Operating System (ROS)

Construcción del package

•rosmake ros + make

• Permite construir los paquetes teniendo en cuenta sus dependencias ▫ $ rosmake [package]

▫ $ rosmake [package1] [package2]…

▫ $ rosmake mistutoriales mispruebas

▫ >> Paquetes construidos (compilados)

49

Desarrollo con ROS Creación de un package

Page 50: Desarrollo robótico - Robot Operating System (ROS)

Inicio del motor de ejecución de ROS

• roscore ros + core ▫ $ roscore

• Es una colección de nodos y programas básicos necesarios para trabajar con ROS

• Es esencial para que los nodos puedan comunicarse • Sirve para inicializar el: ▫ El Master ▫ El Parameter Server ▫ El nodo rosout

• Se pueden cambiar los nodos que se cargan con roscore ▫ $ roscd roslaunch/resources ▫ $ cat roscore.xml

50

Desarrollo con ROS Motor de ejecución y nodes

Page 51: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre nodes (I)

• rosnode ros + node

• Muestra información sobre los nodos que se están ejecutando ▫ $ rosnode help

▫ $ rosnode list

▫ $ rosnode info [node]

1. ¿Cuántos nodos se están ejecutando “por defecto”?

2. Muestra información sobre él/ellos

51

Desarrollo con ROS Motor de ejecución y nodes

?

Page 52: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre nodes (II)

52

Desarrollo con ROS Topics

Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://localhost:35579/ ... Pid: 23792

Page 53: Desarrollo robótico - Robot Operating System (ROS)

Ejecución de nodes

• Se necesitan los paquetes turtlesim y rxtools ▫ $ sudo apt-get install ros-<distro>-rx ros-<distro>-turtlesim

• rosrun ros + run • Para ejecutar nodos que están dentro de un paquete

▫ $ rosrun [package_name] [node_name]

▫ $ rosrun turtlesim turtlesim_node

• Se puede personalizar el nombre de los nodos ▫ $ rosrun [package_name] [node_name] __name:=[nuevo_nombre]

53

Desarrollo con ROS Motor de ejecución y nodes

Page 54: Desarrollo robótico - Robot Operating System (ROS)

54

Desarrollo con ROS

1. Muestra la lista de todos los nodos que se están ejecutando en este momento

2. Intenta detener, mediante un comando de ROS el nodo que está ejecutando la ventana de la tortuga

3. Vuelve a ejecutar el nodo turtlesim_node, pero ahora cambiale el nombre a mi_tortuga

4. Muestra la lista de todos los nodos en funcionamiento

Motor de ejecución y nodes

?

Page 55: Desarrollo robótico - Robot Operating System (ROS)

Comunicación entre nodos

• Antes de continuar, habrá que ejecutar un nuevo nodo además de mi_tortuga ▫ $ rosrun turtlesim

turtle_teleop_key

• Ambos nodos se están comunicando

mediante un Topic de ROS

• Turtle_teleop_key está publicando las pulsaciones de las teclas sobre el topic

• Mi_tortuga está subscrito al topic para recibir las pulsaciones de las teclas

55

Desarrollo con ROS Topics

Page 56: Desarrollo robótico - Robot Operating System (ROS)

Grafo de información sobre topics

• rxgraph Muestra los nodos y los topics (temas) que actualmente se están ejecutando ▫ $ rxgraph

56

Desarrollo con ROS Topics

Page 57: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre topics (I)

• rostopic ros + topic

• Muestra información sobre los topics ▫ $ rostopic

▫ $ rostopic echo [topic]

▫ $ rostopic echo /turtle1/command_velocity

1. ¿Ves algo? ¿Qué ocurre? ¿Cómo podría verse información útil?

2. ¿Ha cambiado el grafo mostrado por rxgraph?

57

Desarrollo con ROS Topics

?

Page 58: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre topics (II)

• rostopic ros + topic ▫ $ rostopic list -h

▫ $ rostopic list -v

58

Desarrollo con ROS Topics

Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher * /rosout [rosgraph_msgs/Log] 3 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/command_velocity [turtlesim/Velocity] 2 subscribers * /rosout [rosgraph_msgs/Log] 1 subscriber

Page 59: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre messages

• rostopic ros + topic • Para que un publicador y un subscriptor puedan entenderse,

han de utilizar el mismo tipo de mensaje • El tipo de un topic es equivalente a pensar en el tipo de

mensaje que se publica sobre el topic ▫ $ rostopic type [topic] ▫ $ rostopic type /turtle1/command_velocity

• rosmsg ros + msg (message) • Para ver los detalles de un mensaje ▫ $ rosmsg

▫ $ rosmsg show [message] ▫ $ rosmsg show turtlesim/Velocity

59

Desarrollo con ROS Topics (Messages)

Page 60: Desarrollo robótico - Robot Operating System (ROS)

60

Desarrollo con ROS

1. ¿A qué topic está subscrito el nodo rosout?

2. ¿Qué tipo tiene dicho topic?

3. ¿Qué tipo de datos manejan los mensajes asociados a dicho topic?

Topics (Messages)

?

Page 61: Desarrollo robótico - Robot Operating System (ROS)

Publicación de datos sobre un topic

• rostopic ros + topic ▫ $ rostopic pub [topic] [msg_type] [args]

▫ $ rostopic pub -1 /turtle1/command_velocity

turtlesim/Velocity -- 2.0 1.8

▫ $ rostopic pub /turtle1/command_velocity

turtlesim/Velocity -r 1 -- 2.0 -1.8

61

Desarrollo con ROS Topics (Messages)

Page 62: Desarrollo robótico - Robot Operating System (ROS)

Frecuencia de publicación de messages

• rostopic ros + topic ▫ $ rostopic hz [topic]

▫ $ rostopic hz /turtle1/command_velocity

1. ¿Con qué frecuencia se publica el topic turtle1/pose? 2. ¿Qué tipo de datos manejan los mensajes asociados a

dicho topic? 3. Crea un nuevo subscriptor para mostrar la información que

se publica con el topic turtle1/pose 4. ¿Cambia el grafo? 5. Crea un nuevo subscriptor para obtener el color dado por

el sensor de la tortuga

62

Desarrollo con ROS Topics (Messages)

?

Page 63: Desarrollo robótico - Robot Operating System (ROS)

Información gráfica sobre los datos

• rxplot Muestra los nodos y los topics (temas) que actualmente se están ejecutando ▫ $ rxplot [topic][field1:field2:…]

▫ $ rxplot turtle1/pose/x:y

63

Desarrollo con ROS Topics (Messages)

Page 64: Desarrollo robótico - Robot Operating System (ROS)

Obtención de información sobre services

• rosservice ros + service • Los servicios son otra forma de comunicación entre nodos • Permiten enviar un request y recibir una response

▫ $ rosservice

▫ $ rosservice list –n

▫ $ rosservice type clear

▫ $ rosservice call [service] [args]

▫ $ rosservice call clear

• rossrv ros + srv (service) • Para ver los detalles de un servicio

▫ $ rossrv

▫ $ rossrv show [service]

64

Desarrollo con ROS Services y Parameters

Page 65: Desarrollo robótico - Robot Operating System (ROS)

65

Desarrollo con ROS

1. Muestra, utilizando un único comando, el nodo, la URI, el tipo y los argumentos que acepta el servicio spawn

2. Muestra los detalles del tipo de servicio spawn (es decir, los datos que acepta como entrada y como salida)

3. Invoca al servicio spawn pasándole como parámetros 3 2 0.4 "“, ¿qué ocurre?

4. Vuelve a invocar el servicio con otros parámetros, ¿para qué sirve el último parámetro?

Services y Parameters

?

Page 66: Desarrollo robótico - Robot Operating System (ROS)

• rosparam ros + parameter • Los parámetros permiten manipular y guardar datos en el ROS

Parameter Server • Diferentes tipos de datos:

▫ Integer 1 ▫ Float 1.0 ▫ String hello ▫ Boolean true ▫ List [1, 2, 3] ▫ Dictionary {a: b, c: d}

• Utilización ▫ $ rosparam

▫ $ rosparam list

▫ $ rosparam get background_r

▫ $ rosparam set background_r 255

▫ $ rosservice call clear

66

Desarrollo con ROS Services y Parameters

Obtención de información sobre parameters

Page 67: Desarrollo robótico - Robot Operating System (ROS)

• rosparam ros + parameter • Se puede obtener información de todos los parámetros

almacenados en el servidor al mismo tiempo ▫ $ rosparam get /

• Para guardar todos los parámetos en formato YALM ▫ $ rosparam dump params.yaml ▫ $ cat params.yaml

• Para recuperar todos los parámetos en formato YALM ▫ $ rosparam load params.yaml

1. Pon el color del fondo de la pantalla de la tortuga en

verde

67

Desarrollo con ROS Services y Parameters

Obtención de información sobre parameters

?

Page 68: Desarrollo robótico - Robot Operating System (ROS)

• rxconsole Para ver mensajes de depuración

• rxloggerlevel Para cambiar el nivel de detalle

• Para ver el funcionamiento vamos a cerrar todos los nodos y dejar solamente roscore ejecutado ▫ $ rxconsole

▫ $ rxloggerlevel

68

Desarrollo con ROS Depuración

Inicio del sistema de depuración

Page 69: Desarrollo robótico - Robot Operating System (ROS)

69

Desarrollo con ROS

1. Inicia el nodo turtlesim_node (mi_tortuga)

2. Inicia el nodo turtle_teleop_key

3. ¿Qué muestra el logger?

4. Mueve con las flechas la tortuga hasta la pared (borde de la pantalla)

5. ¿Qué muestra el logger?

6. Cambia el nivel de criticidad que tiene ros.turtlesim de Info a Debug ¿Qué ocurre ahora?

Depuración

?

Page 70: Desarrollo robótico - Robot Operating System (ROS)

• Los niveles tienen el siguiente orden:

▫ Fatal mayor prioridad

▫ Error

▫ Warn

▫ Info

▫ Debug menor prioridad

• Se selecciona un nivel y se obtienen todos los mensajes de igual o superior prioridad (criticidad)

70

Desarrollo con ROS Depuración

Niveles de criticidad

Page 71: Desarrollo robótico - Robot Operating System (ROS)

• roslaunch ros + launch

• Para ejecutar varios nodos al mismo tiempo (definidos en un fichero) ▫ $ roslaunch [package] [filename.launch]

• Para crear el fichero launch ▫ Paramos todos los nodos que se estaban ejecutando para empezar de cero

▫ $ roscd mistutoriales

▫ $ mkdir launch

▫ $ cd launch

▫ El siguiente paso es ir a la ruta Homemiworkspacemipackagemistutoriales y crear un archivo llamado turtlemimic.launch

71

Desarrollo con ROS roslaunch

Ejecución de un grupo de nodes

Page 72: Desarrollo robótico - Robot Operating System (ROS)

72

Desarrollo con ROS roslaunch

Turtlemimic.launch <launch> <group ns="turtlesim1"> <node pkg="turtlesim" name="sim" type="turtlesim_node"/> </group> <group ns="turtlesim2"> <node pkg="turtlesim" name="sim" type="turtlesim_node"/> </group> <node pkg="turtlesim" name="mimic" type="mimic"> <remap from="input" to="turtlesim1/turtle1"/> <remap from="output" to="turtlesim2/turtle1"/> </node> </launch>

Page 73: Desarrollo robótico - Robot Operating System (ROS)

• Para ejecutar las dos tortugas “gemelas” ▫ $ roslaunch mistutoriales turtlemimic.launch

1. Publica datos sobre una tortuga, para que las dos tortugas den vueltas

73

Desarrollo con ROS roslaunch

Lanzamiento del archivo .launch

?

Page 74: Desarrollo robótico - Robot Operating System (ROS)

• rosed ros + edit (es parte de la suite denominada rosbash) ▫ $ rosed [package_name] [filename]

▫ $ rosed roscpp Logger.msg

▫ $ rosed [package_name] <tab>

• Si no funciona es que no está instalado el editor utilizado por defecto ▫ $ sudo apt-get install vim

74

Desarrollo con ROS rosed

Edición de archivos de un paquete

Page 75: Desarrollo robótico - Robot Operating System (ROS)

• Los paquetes pueden contener dos carpetas especiales: ▫ msg Contiene archivos para describir mensajes

▫ srv Contiene archivos para describir servicios

• Los archivos están compuestos de texto plano con un tipo y nombre por línea. Tipos: ▫ int8, int16, int32, int64, float32, float64, string, time,

duration, variable-length array[], fixed-length array[C]

• Existe un tipo especial que es Header

75

Desarrollo con ROS Creación de messages y services

Creación de messages y services

Page 76: Desarrollo robótico - Robot Operating System (ROS)

?

• Crearemos un mensaje en el paquete previo ▫ $ roscd mistutoriales ▫ $ mkdir msg ▫ $ echo "int64 num" > msg/Num.msg

• Tenemos un archivo de texto, falta crear el código fuente

para los diferentes lenguajes (C++, Python, …)

• Hay que abrir CMakeLists.txt del paquete mistutoriales y eliminar el comentario (#) en la línea rosbuild_genmsg()

1. Utiliza un comando de ROS para que muestre el contenido

del mensaje que acabamos de crear

76

Desarrollo con ROS Creación de messages y services

Creación de un message

Page 77: Desarrollo robótico - Robot Operating System (ROS)

?

• Crearemos un servicio en el paquete previo ▫ $ roscd mistutoriales

▫ $ mkdir srv

• En este punto podríamos crear un servicio “a mano” pero vamos a utilizar una herramienta de ROS para copiar archivos entre paquetes ▫ $ roscp [package_name] [file_to_copy_path] [copy_path]

▫ $ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

• Hay que abrir CMakeLists.txt del paquete mistutoriales y eliminar el comentario (#) en la línea rosbuild_gensrv()

1. Utiliza un comando de ROS para que muestre el contenido del

servicio que acabamos de crear 2. ¿Qué ocurre si hacemos lo mismo pero sin indicar el nombre del

paquete

77

Desarrollo con ROS Creación de messages y services

Creación de un service

Page 78: Desarrollo robótico - Robot Operating System (ROS)

• Necesitamos volver a generar código para los diferentes lenguajes ▫ $ rosmake mistutoriales

• Genmsg genera una carpeta msg_gen

• Gensrv genera una carpeta srv_gen

78

Desarrollo con ROS Creación de messages y services

Compilación de messages y services

Page 79: Desarrollo robótico - Robot Operating System (ROS)

• La idea es crear un nodo “publicador” que emita un mensaje ▫ $ roscd mistutoriales

▫ $ mkdir scripts

79

Desarrollo con ROS Creación de publishers y subscribers

Creación de un publisher

Page 80: Desarrollo robótico - Robot Operating System (ROS)

• La idea es crear un nodo “subscriptor” que se subscriba a la emisión de un mensaje ▫ $ scripts/listener.py

▫ $ chmod +x scripts/listener.py

▫ $ make

80

Desarrollo con ROS Creación de publishers y subscribers

Creación de un subscriber

Page 81: Desarrollo robótico - Robot Operating System (ROS)

81

Desarrollo con ROS

1. Cierra todo lo que estuviera ejecutándose referido a ROS

2. Inicia el core de ROS

3. Ejecuta el nodo talker

4. Ejecuta el nodo listener

5. ¿Qué aspecto tiene el grafo que muestra las relaciones entre nodos?

6. ¿En qué carpeta se encuentra la definición del mensaje String?

Creación de publishers y subscribers

?

Page 82: Desarrollo robótico - Robot Operating System (ROS)

• La idea es crear un nodo “servicio” que sume dos números ▫ $ roscd mistutoriales

▫ $ scripts/sumador.py

▫ $ chmod +x scripts/sumador.py

82

Desarrollo con ROS Creación de services y clients

Creación de un service

Page 83: Desarrollo robótico - Robot Operating System (ROS)

• La idea es crear un nodo “cliente” que utilice el servicio creado previamente ▫ $ scripts/sumador.py

▫ $ chmod +x scripts/cliente_sumador.py

▫ $ make

83

Desarrollo con ROS

Creación de un client Creación de services y clients

Page 84: Desarrollo robótico - Robot Operating System (ROS)

84

Desarrollo con ROS

1. Cierra todo lo que estuviera ejecutándose referido a ROS

2. Inicia el core de ROS

3. Ejecuta el nodo sumador

4. Ejecuta el nodo cliente_sumador

5. ¿Qué aspecto tiene el grafo que muestra las relaciones entre nodos?

6. ¿En qué carpeta se encuentra la definición del servicio AddTwoInts?

? Creación de services y clients

Page 85: Desarrollo robótico - Robot Operating System (ROS)

• Vamos a guardar datos, pero primero inicializamos el sistema ▫ $ roscore

▫ $ rosrun turtlesim turtlesim_node

▫ $ rosrun turtlesim turtle_teleop_key

▫ $ rostopic list -v

85

Desarrollo con ROS Trabajo con archivos .bag

Guardar y recuperar datos

Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher * /rosout [roslib/Log] 2 publishers * /rosout_agg [roslib/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber * /rosout [roslib/Log] 1 subscriber>

Page 86: Desarrollo robótico - Robot Operating System (ROS)

• rosbag ros + bag

• Para guardar datos generados ▫ $ mkdir bagfiles

▫ $ cd bagfiles

▫ $ rosbag record -a

• Ahora estamos guardando los datos de todos los temas publicados…

• Para probarlo podemos mover la tortuga…

• Una vez publicados varios mensajes, se puede cerrar la aplicación rosbag y ver el archivo generado

86

Desarrollo con ROS Trabajo con archivos .bag

Guardar datos

Page 87: Desarrollo robótico - Robot Operating System (ROS)

• rosbag ros + bag

• Se puede saber lo que hay en un archivo bag ▫ $ rosbag info

<your bagfile>

87

Desarrollo con ROS Trabajo con archivos .bag

Visualizar datos bag: 2009-12-04-15-02-56.bag version: 1.2 start_time: 1259967777871383000 end_time: 1259967797238692999 length: 19367309999 topics: - name: /rosout count: 2 datatype: roslib/Log md5sum: acffd30cd6b6de30f120938c17c593fb - name: /turtle1/color_sensor count: 1122 datatype: turtlesim/Color md5sum: 353891e354491c51aabe32df673fb446 - name: /turtle1/command_velocity count: 23 datatype: turtlesim/Velocity md5sum: 9d5c2dcd348ac8f76ce2a4307bd63a13 - name: /turtle1/pose count: 1121 datatype: turtlesim/Pose md5sum: 863b248d5016ca62ea2e895ae5265cf9

Page 88: Desarrollo robótico - Robot Operating System (ROS)

• rosbag ros + bag • Para volver a enviar los mensajes grabados

▫ $ rosbag play <your bagfile>

1. Crea un bag denominado mibolsa que sólo guarde los temas /turtle1/command_velocity y /turtle1/pose

2. Sin mover la tortuga, guarda los mensajes durante un tiempo y visualiza el contenido de mibolsa

3. ¿Cuántos tipos de mensajes se guardan?¿Por qué?

88

Desarrollo con ROS Trabajo con archivos .bag

Recuperar datos (volver a ejecutar)

?

Page 89: Desarrollo robótico - Robot Operating System (ROS)
Page 90: Desarrollo robótico - Robot Operating System (ROS)

¿Cuál es la idea?

• Trabajar con ROS utilizando más de una máquina

• ROS está diseñado con el trabajo distribuido en mente

• Idealmente un nodo no debe tener en cuenta en qué máquina se está ejecutando

• Se podría mover a otra máquina…

• …aunque no siempre es adecuado

90

Comunicación entre máquinas

Page 91: Desarrollo robótico - Robot Operating System (ROS)

Pasos a realizar

1. Sólo hace falta un master (core), por lo que hay que elegir la máquina en la que se ejecutará

2. Todos los nodos han de configurarse para utilizar el mismo master

▫ ROS_MASTER_URI

3. Debe existir una conectividad entre los equipos completa

en ambas direcciones

4. Cada máquina debe tener un nombre asignado, conocido por las otras máquinas

91

Comunicación entre máquinas

Page 92: Desarrollo robótico - Robot Operating System (ROS)

Comandos involucrados

• $ hostname devuelve el nombre del equipo • Iniciamos el master en una máquina llamada “LIDER” ▫ $ ssh LIDER ▫ $ roscore

• Iniciamos un nodo en “LIDER” ▫ $ ssh LIDER

▫ $ export ROS_MASTER_URI=http://LIDER:11311 ▫ $ rosrun rospy_tutorials listener

• Iniciamos un nodo en otra máquina llamada “TRABAJO” ▫ $ ssh TRABAJO ▫ $ export ROS_MASTER_URI=http://LIDER:11311 ▫ $ rosrun rospy_tutorials talker

92

Comunicación entre máquinas

Page 93: Desarrollo robótico - Robot Operating System (ROS)
Page 94: Desarrollo robótico - Robot Operating System (ROS)

¿Qué es Gazebo?

• No siempre disponemos de los robots reales

• Y a veces no queremos utilizarlos para probarlos bajo ciertas condiciones

• En esos casos se suele utilizar un simulador

• Gazebo es uno de los más conocidos y completos

• Se integra perfectamente con ROS

94

Simulador Gazebo

Page 95: Desarrollo robótico - Robot Operating System (ROS)

Arrancando Gazebo

• Con un mundo virtual vacio (estandard) ▫ $ roslaunch gazebo_worlds empty_world.launch

95

Simulador Gazebo

Page 96: Desarrollo robótico - Robot Operating System (ROS)

Inserción de modelos en el mundo

• Modelo de un robot PR2 ▫ $ sudo apt-get install ros-fuerte-pr2-simulator

▫ $ rosmake pr2_gazebo

▫ $ roslaunch pr2_gazebo pr2.launch

96

Simulador Gazebo

Page 97: Desarrollo robótico - Robot Operating System (ROS)

Obtención de datos del robot

• Obtención del estado del robot

▫ Todos los topics del robot $ rostopic list

▫ Sólo los que contengan la palabra “base_” $ rostopic list | grep base_

97

Simulador Gazebo

/base_bumper /base_controller/command /base_controller/state /base_hokuyo_node/parameter_descriptions /base_hokuyo_node/parameter_updates /base_odometry/odom /base_odometry/odometer /base_odometry/state /base_pose_ground_truth /base_scan

Page 98: Desarrollo robótico - Robot Operating System (ROS)

98

Simulador Gazebo

1. Obtén el estado actual del odómetro (mostrando lo publicado en un topic)

2. Ejecuta un grupo de nodos que están en el archivo teleop_keyboard.launch, dentro del paquete pr2_teleop. ¿Para qué parece servir?

3. ¿Cambia el estado actual del odómetro?

4. Manteniendo todo abierto, muestra información sobre el topic llamado /base_controller/command. ¿Qué tipo de mensaje utiliza? ¿De qué nodo obtiene su información? ¿Qué nodo obtiene información de este topic?

5. ¿Cuál es la composición del tipo de mensaje llamado geometry_msgs/Twist?

?

Page 99: Desarrollo robótico - Robot Operating System (ROS)

Control del robot

• En lugar de mover el robot mediante un nodo ya construido, podremos utilizar el comando rostpic pub para publicar mensajes de tipo geometry_msgs/Twist ▫ $ rostopic pub /base_controller/command geometry_msgs/Twist –r 15 '{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: { x: 0.0, y: 0.0, z: -0.6} }‘

▫ $ rostopic pub -r 15 /base_controller/command geometry_msgs/Twist '{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: { x: 0.0, y: 0.0, z: 0.4} }’

• Los valores deberían verse reflejados en el nodo

/base_odometry/state

1. Escribe el código de un nodo en un nuevo paquete para indicarle la velocidad al robot. Pruébalo

99

Simulador Gazebo

?

Page 100: Desarrollo robótico - Robot Operating System (ROS)

100

Simulador Gazebo

1. Muestra información sobre el topic llamado /base_scan. ¿Qué tipo de mensaje utiliza? ¿De qué nodo obtiene su información? ¿Qué nodo obtiene información de este topic?

2. ¿Cuál es la composición del tipo de mensaje llamado sensor_msgs/LaserScan?

3. Obtén (subscríbete) únicamente el primer mensaje que se envíe a través del

topic /base_scan (utiliza un comando de ROS)

4. Escribe el código de un nodo en un nuevo paquete para obtener los datos recibidos en el escáner. Pruébalo

?

Page 101: Desarrollo robótico - Robot Operating System (ROS)

Bibliografía

101

• ROS - http://www.ros.org

• Gazebo - http://http://gazebosim.org/