6. 6
Introducción
¿Qué es ROS?
• Es un framework utilizado para desarrollar aplicaciones
robóticas
• Es de código abierto
Aplicaciones Robóticas
Robot Operating System
Fuente: http://people.umass.edu/~blaylock/LegoRobotics/
Hardware
12. 12
Introducción
¿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
▫ …
13. 13
Introducción
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
14. 14
Introducción
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
15. 15
Introducción Sistema de ficheros
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
16. 16
Introducción Sistema de ficheros
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
17. 17
Introducción Sistema de ficheros
Estructura básica de un paquete
Package
Nodes
Topics
Services
18. 18
Introducción Sistema de ficheros
Estructura básica de una pila
Stack
Package
Package Nodes
Topics
Nodes Services
Topics
Services
Package
Nodes
Topics
Services
19. 19
Introducción Sistema de ficheros
Repositorios
• Son una colección de paquetes y pilas disponibles online
20. 20
Introducción Sistema de ficheros
Estructura básica de un repositorio
Repository
Stack
Stack Package
Package Nodes
Package
Topics
Nodes Nodes
Services
Topics Package Topics
Services
Services
Nodes Package
Topics
Nodes
Services
Topics
Services
21. 21
Introducción Sistema de ficheros
Organización general en ROS
Repository
Repository Repository
Stack
Pkge
Stack
Pkge
Repository Pkge
23. 23
Introducción Grafo computacional
Grafo de computación en ROS
• Principales componentes
▫ Nodes
Services node
Topics node
node
Messages roscore
node
▫ Master node
▫ Parameter server node
▫ Bags
24. 24
Introducción Grafo computacional
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,…
25. 25
Introducción Grafo computacional
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
subscriber
publisher node subscriber
subscriber
26. 26
Introducción Grafo computacional
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
27. 27
Introducción Grafo computacional
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 solicitud
node node
respuesta
28. 28
Introducción Grafo computacional
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
29. 29
Introducción Grafo computacional
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
30. 30
Introducción
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
35. 35
Desarrollo con ROS Preparación inicial
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
36. 36
Desarrollo con ROS Preparación inicial
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
38. 38
Desarrollo con ROS Sistema de archivos
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
39. 39
Desarrollo con ROS Sistema de archivos
?
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?
40. 40
Desarrollo con ROS Sistema de archivos
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
41. 41
Desarrollo con ROS Sistema de archivos
?
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
42. 42
Desarrollo con ROS Sistema de archivos
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?
43. 43
Desarrollo con ROS Sistema de archivos
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
44. 44
Desarrollo con ROS Sistema de archivos
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 >>
45. 45
Desarrollo con ROS Sistema de archivos
?
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?
46. 46
Desarrollo con ROS Creación de un package
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/
47. 47
Desarrollo con ROS Creación de un package
?
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
48. 48
Desarrollo con ROS Creación de un package
Manifiest.xml
• $ cat manifest.xml
<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>
49. 49
Desarrollo con ROS Creación de un package
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)
50. 50
Desarrollo con ROS Motor de ejecución y nodes
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
51. 51
Desarrollo con ROS Motor de ejecución y nodes
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
52. 52
Desarrollo con ROS Topics
Obtención de información sobre nodes (II)
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
53. 53
Desarrollo con ROS Motor de ejecución y nodes
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]
54. 54
Desarrollo con ROS Motor de ejecución y nodes
?
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
55. 55
Desarrollo con ROS Topics
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
56. 56
Desarrollo con ROS Topics
Grafo de información sobre topics
• rxgraph Muestra los nodos y los topics (temas) que
actualmente se están ejecutando
▫ $ rxgraph
57. 57
Desarrollo con ROS Topics
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?
58. 58
Desarrollo con ROS Topics
Obtención de información sobre topics (II)
• rostopic ros + topic
▫ $ rostopic list -h
▫ $ rostopic list -v
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
59. 59
Desarrollo con ROS Topics (Messages)
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
60. 60
Desarrollo con ROS Topics (Messages)
?
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?
61. 61
Desarrollo con ROS Topics (Messages)
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
62. 62
Desarrollo con ROS Topics (Messages)
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
63. 63
Desarrollo con ROS Topics (Messages)
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
64. 64
Desarrollo con ROS Services y Parameters
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]
65. 65
Desarrollo con ROS Services y Parameters
?
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?
66. 66
Desarrollo con ROS Services y Parameters
Obtención de información sobre parameters
• 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
67. 67
Desarrollo con ROS Services y Parameters
Obtención de información sobre parameters
• 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
68. 68
Desarrollo con ROS Depuración
Inicio del sistema de depuración
• 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
69. 69
Desarrollo con ROS Depuración
?
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?
70. 70
Desarrollo con ROS Depuración
Niveles de criticidad
• 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)
71. 71
Desarrollo con ROS roslaunch
Ejecución de un grupo de nodes
• 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
73. 73
Desarrollo con ROS roslaunch
Lanzamiento del archivo .launch
• Para ejecutar las dos tortugas “gemelas”
▫ $ roslaunch mistutoriales turtlemimic.launch
1. Publica datos sobre una tortuga, para que las dos
tortugas den vueltas
?
74. 74
Desarrollo con ROS rosed
Edición de archivos de un paquete
• 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
75. 75
Desarrollo con ROS Creación de messages y services
Creación de messages y services
• 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
76. 76
Desarrollo con ROS Creación de messages y services
Creación de un message
• 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
?
77. 77
Desarrollo con ROS Creación de messages y services
Creación de un service
• 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
?
78. 78
Desarrollo con ROS Creación de messages y services
Compilación de messages y services
• Necesitamos volver a generar código para los diferentes
lenguajes
▫ $ rosmake mistutoriales
• Genmsg genera una carpeta msg_gen
• Gensrv genera una carpeta srv_gen
79. 79
Desarrollo con ROS Creación de publishers y subscribers
Creación de un publisher
• La idea es crear un nodo “publicador” que emita un mensaje
▫ $ roscd mistutoriales
▫ $ mkdir scripts
80. 80
Desarrollo con ROS Creación de publishers y subscribers
Creación de un subscriber
• 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
81. 81
Desarrollo con ROS Creación de publishers y subscribers
?
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?
82. 82
Desarrollo con ROS Creación de services y clients
Creación de un service
• La idea es crear un nodo “servicio” que sume dos números
▫ $ roscd mistutoriales
▫ $ scripts/sumador.py
▫ $ chmod +x scripts/sumador.py
83. 83
Desarrollo con ROS Creación de services y clients
Creación de “cliente” que utilice el servicio creado previamente
• La idea es crear un nodo
un client
▫ $ scripts/sumador.py
▫ $ chmod +x scripts/cliente_sumador.py
▫ $ make
84. 84
Desarrollo con ROS Creación de services y clients
?
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?
85. 85
Desarrollo con ROS Trabajo con archivos .bag
Guardar y recuperar datos
• Vamos a guardar datos, pero primero inicializamos el sistema
▫ $ roscore
▫ $ rosrun turtlesim turtlesim_node
▫ $ rosrun turtlesim turtle_teleop_key
▫ $ rostopic list -v
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>
86. 86
Desarrollo con ROS Trabajo con archivos .bag
Guardar datos
• 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
87. 87
Desarrollo con ROS Trabajo con archivos .bag
bag: 2009-12-04-15-02-56.bag
Visualizar datos version: 1.2
start_time: 1259967777871383000
end_time: 1259967797238692999
• rosbag ros + bag length: 19367309999
topics:
• Se puede saber lo que - name: /rosout
hay en un archivo bag count: 2
▫ $ rosbag info datatype: roslib/Log
<your bagfile> 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
88. 88
Desarrollo con ROS Trabajo con archivos .bag
Recuperar datos (volver a ejecutar)
• 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é?
89.
90. 90
Comunicación entre máquinas
¿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
91. 91
Comunicación entre máquinas
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
92. 92
Comunicación entre máquinas
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
93.
94. 94
Simulador Gazebo
¿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
95. 95
Simulador Gazebo
Arrancando Gazebo
• Con un mundo virtual vacio (estandard)
▫ $ roslaunch gazebo_worlds empty_world.launch
96. 96
Simulador Gazebo
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
97. 97
Simulador Gazebo
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_
/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
98. 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?
99. 99
Simulador Gazebo
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
100. 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