Post on 30-Nov-2014
description
Desarrollo Robótico
Robot Operating System (ROS)
Vicente García Díaz – garciavicente@uniovi.es
Universidad de Oviedo, 2012
Tabla de contenidos
1. Introducción
2. Desarrollo con ROS
3. Comunicación entre máquinas
4. Simulador Gazebo
2
Robot Operating System
¿Cómo eran antes todos los robots?
4
Introducción
¿Cómo son hoy los robots?
5
Introducción
• 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/
¿Sobre qué hardware funciona ROS?
7
Introducción
¿Sobre qué SO funciona ROS?
8
Introducción
Diferentes distribuciones de ROS
9
Introducción
2010
2012
VirtualBox virtual image with Ubuntu 12.04.1 LTS and ROS Fuerte
3 años de ROS (2010)
10
Introducción
Fuente: http://www.youtube.com/watch?v=7cslPMzklVo
Willow Garage
11
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 ▫ …
12
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
13
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
14
Introducción
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
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
Estructura básica de un paquete
17
Introducción Sistema de ficheros
Package
Nodes Topics
Services
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
Repositorios
• Son una colección de paquetes y pilas disponibles online
19
Introducción Sistema de ficheros
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
Repository
Stack
Organización general en ROS
21
Introducción Sistema de ficheros
Pkge
Pkge
Stack
Pkge
Repository
Repository
Repository
Fenómeno exponencial
22
Introducción Sistema de ficheros
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
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
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
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
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
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
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
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
Página inicial del Wiki
31
Introducción Wiki
Wiki. Páginas sobre packages
32
Introducción Wiki
Wiki. Páginas sobre stacks
33
Introducción Wiki
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
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
Trabajo con el sistema de archivos en ROS
37
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
38
Desarrollo con ROS Sistema de archivos
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
?
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
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
?
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
?
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
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
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
?
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
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
?
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>
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
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
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
?
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
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
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
?
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
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
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
?
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
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)
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)
?
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)
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)
?
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)
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
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
?
• 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
• 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
?
• 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
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
?
• 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
• 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
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>
• 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
?
• 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
• 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
?
• 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
?
• 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
• 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
• 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
• 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
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
?
• 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
• 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
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
• 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>
• 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
• 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
• 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)
?
¿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
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
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
¿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
Arrancando Gazebo
• Con un mundo virtual vacio (estandard) ▫ $ roslaunch gazebo_worlds empty_world.launch
95
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
96
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_
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
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?
?
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
?
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
?
Bibliografía
101
• ROS - http://www.ros.org
• Gazebo - http://http://gazebosim.org/