Este documento proporciona una introducción a ROS (Robot Operating System). Explica que ROS es un framework de código abierto para el desarrollo de software de robótica que facilita la reutilización de código y componentes a través de una arquitectura modular y de mensajería. También describe algunos conceptos clave de ROS como nodos, topics, paquetes, namespaces y transformaciones de coordenadas. Finalmente, incluye ejemplos de código para publicar y suscribirse a topics así como definir y usar mensajes personalizados.
7. 7
¿Qué es ROS?
Un framework para desarrollo de software para
robots, bajo el concepto de META Sistema Operativo
Su objetivo primario es la reutilización de código en
I+D en Robótica
Fue desarrollado en 2007 por el Stanford Artificial Intelligence
Laboratory y continuó su desarrollo la empresa Willow Garage
Gestionado y mantenido por la
Open Source Robotics Foundation
18. 18
El grafo de ROS
Arquitectura
http://www.andrewng.org/portfolio/stair-stanford-artificial-intelligence-robot/
http://ai.stanford.edu/~asaxena/stairmanipulation/
Visión y agarre
Navegación
Reconoc. voz y
respuesta
23. 23
Los paquetes son simplemente localizaciones en el sistema de archivos
• Paquete rospy_tutorials
• Nodo talker ejecutable en /opt/ros/kinetic/share/rospy_tutorials
rosrun
Conceptos clave
$ rosrun PACKAGE EXECUTABLE [ARGS]
$ rosrun rospy_tutorials talker
25. 25
Namespaces
Robot con 2 cámaras
• left/image
• right/image
Nombres de dominio y re-mapeado
Conceptos clave
26. 26
Remapping
Los nombres puede ser remapeados en tiempo real
• Streaming de video: nodo image_view , topic image
Nombres de dominio y re-mapeado
Conceptos clave
$ ./image_view image:= right/image
27. 27
Incluir un nodo (push a node) en un Namespace
En el directorio donde está el programa camera
• Lanza el nodo camera con el nombre right
Nombres de dominio y re-mapeado
Conceptos clave
$ ./camera.py __ns:= right
Si lanzamos 2 veces el mismo nodo (no remapeamos),
la instancia más antigua es eliminada
28. 28
Herramienta de línea de comandos para automatizar el lanzamiento
de conjuntos de nodos de ROS
roslaunch
Conceptos clave
$ roslaunch PACKAGE LAUNCH_FILE
<launch>
<node name="talker"
pkg="rospy_tutorials"
type="talker.py"
output="screen" />
<node name="listener"
pkg="rospy_tutorials"
type="listener.py"
output="screen" />
</launch>
Notación XML
35. 35
Suscripción
Topics
$ roscore
$ rosrun basics topic_subscriber.py
#Publicar desde la línea de comandos
$ rostopic pub counter std_msgs/Int32 1000000
$ rostopic info counter
Refresca rqt_graph
36. 36
If a topic is marked as latched when it is
advertised, subscribers automatically get
the last message sent when they subscribe
to the topic
Latched topics
Topics
pub = rospy. Publisher('map' , nav_msgs/OccupancyGrid, latched=True)
publish once
37. 37
Cuidado al usar C++ y Python
• Uint8
• C++: 8 bits sin signo
• Python: con signo
Tipos de mensajes
Topics
Con estos tipos primitivos se
construyen los MENSAJES:
• std_msgs package
• common_msgs package
38. 38
• Usar tipos primitivos y combinarlos
• Directorio scr/basics/msg
• Tras la definición -> catkin_make
Definición de un mensaje (1)
Topics
EJEMPLO: publicar números complejos aleatorios
• Complex.msg
float32 real
float32 imaginary
39. 39
1. Package.xml (manifest.xml). Añadir:
• <build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
2. CMakeLists.txt …
Definición de un mensaje (2)
Topics
40. 40
2. CMakeLists.txt
Definición de un mensaje (3)
Topics
find_package(catkin REQUIRED
COMPONENTS
roscpp
rospy
std_msgs
# Add message_generation here,
after the other packages
message_generation
)
catkin_package(
…
CATKIN_DEPENDS message_runtime
)
add_message_files(
FILES
Complex.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
$ cd ~/catkin_ws
$ catkin_make
$ rosmsg show Complex
41. 41
message_publisher.py
Topics
#!/usr/bin/env Python
import rospy
from basics.msg import Complex
from random import random
rospy. init_node('message_publisher' )
pub = rospy. Publisher('complex' , Complex)
rate = rospy. Rate(2)
while not rospy. is_shutdown():
msg = Complex()
msg. real = random()
msg. imaginary = random()
pub. publish(msg)
rate. sleep()
43. 43
Listando los mensajes
Topics
$ rosmsg show Complex
# Lista los tipos de mensaje del paquete
$ rosmsg package basics
# Mensajes compuestos
$ rosmsg show PointStamped