# Robot Operating System

Sistema Operativo Robótico (en inglés Robot Operating System, ROS) es un framework para el desarrollo de software para robots que provee la funcionalidad de un sistema operativo en un clúster heterogéneo. ROS se desarrolló originalmente en 2007 bajo el nombre de switchyard por el Laboratorio de Inteligencia Artificial de Stanford para dar soporte al proyecto del Robot con inteligencia artificial de Stanford (STAIR Archivado el 21 de enero de 2013 en Wayback Machine.). Desde 2008, el desarrollo continua primordialmente en Willow Garage, un instituto de investigación robótico con más de veinte instituciones colaborando en un modelo de desarrollo federado.
ROS provee los servicios estándar de un sistema operativo tales como abstracción del hardware, control de dispositivos de bajo nivel, implementación de funcionalidad de uso común, paso de mensajes entre procesos y mantenimiento de paquetes. Está basado en una arquitectura de grafos donde el procesamiento toma lugar en los nodos que pueden recibir, mandar y multiplexar mensajes de sensores, control, estados, planificaciones y actuadores, entre otros. La librería está orientada para un sistema UNIX (Ubuntu (Linux)) aunque también se está adaptando a otros sistemas operativos como Fedora, Mac OS X, Arch, Gentoo, OpenSUSE, Slackware, Debian o Microsoft Windows, considerados como 'experimentales'.
ROS tiene dos partes básicas: la parte del sistema operativo, ros, como se ha descrito anteriormente y ros-pkg, una suite de paquetes aportados por la contribución de usuarios (organizados en conjuntos llamados pilas o en inglés stacks) que implementan la funcionalidades tales como localización y mapeo simultáneo, planificación, percepción, simulación, etc.
ROS es software libre bajo términos de licencia BSD. Esta licencia permite libertad para uso comercial e investigador. Las contribuciones de los paquetes en ros-pkg están bajo una gran variedad de licencias diferentes.

## Historia

En algún momento a principios de 2007, las primeras piezas de lo que eventualmente se convertiría en ROS comenzaban a nacer en la Universidad de Stanford. Eric Berger y Keenan Wyrobek, estudiantes de doctorado que trabajan en el laboratorio de robótica de Kenneth Sailsbury en Stanford, dirigían el Programa de robótica personal. Mientras trabajaban en robots para realizar tareas de manipulación en entornos humanos, los dos estudiantes notaron que muchos de sus colegas se encontraban alejados por diversas circunstancias de la robótica. En un intento por remediar esta situación, los dos estudiantes se propusieron hacer un sistema base que proporcionaría un punto de partida y estructuras básicas para que otros en la academia lo construyeran.

## Diseño
### Filosofía

ROS fue diseñado pensando en el Código abierto con la intención de que los usuarios pudieran elegir la configuración de las herramientas y bibliotecas que interactuaran con el núcleo de ROS y para que de esta forma sus usuarios pudieran cambiar sus desarrollos de software para adaptarse a su robot y área de aplicación. Como tal, hay muy poco que sea realmente esencial para ROS, más allá de la estructura general dentro de la cual los programas deben existir y comunicarse. En cierto sentido, ROS es la tubería subyacente detrás de los nodos y el paso de mensajes. Sin embargo, en realidad, ROS es mucho más que plomería. ROS es un conjunto rico y maduro de herramientas en un amplio conjunto de capacidades proporcionadas por paquetes y como resultado de lo anterior un ecosistema en constante crecimiento.

### Modelo computacional gráfico

Los procesos ROS se representan como nodos (ROS NODES) en una estructura gráfica, conectados por bordes llamados ROS topics. [65] Los ROS NODES pueden pasar mensajes entre sí a través de los ROS topics, realizar llamadas de servicio a otros nodos, proporcionar un servicio para otros nodos o establecer o recuperar datos compartidos de una base de datos común llamada servidor de parámetros (paramter server). Un proceso llamado ROS Master hace que todo esto sea posible al registrar nodos para sí mismo, configurar la comunicación de nodo a nodo para los temas y controlar las actualizaciones del servidor de parámetros. Los mensajes y las llamadas de servicio no pasan por el MASTER, sino que el MASTER establece la comunicación entre pares y entre todos los procesos de nodo y después de que estos se registren con el MASTER. Esta arquitectura descentralizada se presta bien a los robots, que a menudo consisten en un subconjunto de hardware informático en red, y pueden comunicarse con computadoras externas para realizar cálculos pesados.

## Herramientas

La funcionalidad del núcleo ROS se expande con una variedad de herramientas que permiten a los desarrolladores: visualizar y recopilar información, navegar de manera sencilla la estructura de paquetes y crear código para automatizar tareas complejas y otros procesos de configuración. La suma de estas herramientas aumentan las posibilidades de los sistemas que utilizan ROS, proveyendo a estos de soluciones simples a tareas comunes en el desarrollo dentro de la robótica. Estas herramientas son provistas por medio de paquetes como otro algoritmo, pero a diferencia de brindar implementaciones de hardware o algoritmos para tareas del robot, estos paquetes proveen tareas y herramientas separadas que las incluidas por el núcleo de la mayoritaria de las instalaciones modernas de ROS.

### rviz

rviz es una herramienta de simulación y visualización 3d para robots, el ambiente en el que estos se desempeñan y la información de sensores que estos generan dentro de este. Es altamente configurable y posee distintos tipos de plugins y formatos de visualización. Algunas de las aplicaciones comunes de RViz incluyen la visualización de datos de sensores como cámaras, LIDAR (Light Detection and Ranging), IMU (Inertial Measurement Unit) y otros sensores utilizados en robótica. También se utiliza para mostrar información sobre la posición y orientación de los robots, planificación de trayectorias, mapeo en 2D y 3D, y la visualización de datos de simulaciones robóticas.

### rosbag

rosbag es una herramienta de línea de comandos para grabar y reproducir datos de mensajes y comunicaciones dentro de ROS. rosbag utiliza un formato de archivo llamado bags, que registra los mensajes de ROS mediante escuchar los ROS topic y grabando los mensajes en la medida que son emitidos. Reproducir los mensajes desde bag es mayormente lo mismo que tener los ROS nodes originales reproduciendo esta. Esto hace de bags una herramienta muy útil para capturar la información que posteriormente se puede usar analizar y posteriormente ser usada para el desarrollo de paquetes ROS por ejemplo. Mientas rosbag es una herramienta puramente de línea de comando, también posee una implementación rqt llamada rqt_bag que brinda una interfaz gráfica.

### catkin

Catkin es la herramienta de compilación de ROS actual, habiendo reemplazado a rosbuild. Catkin está basada en CMake, es multiplataforma, de código abierto e independiente del lenguaje de programación. Catkin proporciona una estructura de directorios estándar en la que se organizan las dependencias y los archivos fuente del proyecto. Además, proporciona herramientas para compilar, vincular y crear bibliotecas y ejecutables de ROS. También ayuda a administrar las dependencias entre los paquetes de ROS y permite crear paquetes independientes que se pueden usar y compartir entre diferentes proyectos.

### rosbash

El paquete rosbash package provee un conjunto de herramientas que aumentan la funcionalidad del Bash. Estas herramientas incluyen rosls, roscd y roscp, que replican las funcionalidades de ls, cd, y cp respectivamente. La versión de ROS de estas herramientas de línea de comando permiten a los usuarios usar el nombre de los paquetes ROS en vez de los nombres de los archivos, abreviando de esta forma la extensión de los mismos. Es paquete incluye el auto completado por medio de tab en la mayoría de las utilidades ROS, y también rosed que permite la edición de los archivos seleccionados en el editor de código preferido y también rosrun que permite la ejecución de archivos mediante paquetes ROS. Rosbash brinda soporte a las mismas funcionalidades para zsh y tcsh, en una menor cuantía.

### roslaunch

roslaunch es una herramienta usada para ejecutar múltiples nodos ROS de forma local o remota, de igual forma es usado para configurar parámetros en un servidor de parámetros ROS. Los archivos de configuración roslaunch, cuyo código está escrito usando XML pueden de forma sencilla automatizar complejos procesos de arranque y configuraciones con un solo comando. Las secuencias de comandos dentro de archivos roslaunch pueden anidar dentro de ellas llamadas a otras secuencias de comandos roslaunch, inicio de nodos ROS en máquinas específicas y hasta reiniciar procesos que han caído durante esta.

## Aplicaciones

Las áreas que incluye ROS son:
* Un nodo principal de coordinación.
* Publicación o subscripción de flujos de datos: imágenes, estéreo, láser, control, actuador, contacto, etc.
* Multiplexación de la información.
* Creación y destrucción de nodos.
* Los nodos están perfectamente distribuidos, permitiendo procesamiento distribuido en múltiples núcleos, multiprocesamiento, GPUs y clústeres.
* Login.
* Parámetros de servidor.
* Testeo de sistemas.
Las áreas que incluirán las aplicaciones de los paquetes de ROS son:
* Percepción
* Identificación de Objetos
* Segmentación y reconocimiento
* Reconocimiento facial
* Reconocimiento de gestos
* Seguimiento de objetos
* Egomoción
* Comprensión de movimiento
* Estructura de movimientos (SFM)
* Visión estéreo: percepción de profundidad mediante el uso de dos cámaras
* Movimientos
* Robots móviles
* Control
* Planificación
* Agarre de objetos

## Historial de versiones

Una versión de ROS puede ser incompatible con otra. Normalmente están referidas por un sobrenombre en vez de por una versión numérica. Las versiones, desde la más actual a la primera versión, son:
| Distribución | Fecha de Lanzamiento | Fecha EOL |
| Melodic Morenia | 23 de mayo de 2018 | Versión estable actual: 2023-05-30 |
| Lunar Loggerhead | 23 de mayo de 2017 | Versión estable actual: 2019-05-30 |
| Kinetic Kame | 23 de mayo de 2016 | Versión estable actual: 2021-05-30 |
| Jade Turtle | 23 de mayo de 2015 | Versión antigua, sin servicio técnico: 2017-05-30 |
| Indigo Igloo | 22 de julio de 2014 | Versión antigua, con servicio técnico: 2019-04-30 |
| Hydro Medusa | 4 de septiembre de 2013 | Versión antigua, sin servicio técnico: 2014-05-31 |
| Groovy Galapagos | 31 de diciembre de 2012 | Versión antigua, sin servicio técnico: 2014-07-31 |
| Fuerte Turtle | 23 de abril de 2012 | Versión antigua, sin servicio técnico: -- |
| Electric Emys | 30 de agosto de 2011 | Versión antigua, sin servicio técnico: -- |
| Diamondback | 2 de marzo de 2011 | Versión antigua, sin servicio técnico: -- |
| C Turtle | 2 de agosto de 2010 | Versión antigua, sin servicio técnico: -- |
| Box Turtle | 2 de marzo de 2010 | Versión antigua, sin servicio técnico: -- |
| Leyenda:Versión antiguaVersión antigua, con soporte técnicoÚltima versiónÚltima versión previaLanzamiento futuro ||||

## Robots y hardware soportado

Entre los robots y hardware soportado por ROS se pueden encontrar:
* Willow Garage PR2 Archivado el 20 de junio de 2010 en Wayback Machine.: robot personal que está siendo desarrollado por Willow Garage.
* Donaxi: robot de servicio desarrollado en el laboratorio de Control y Robótica de UPAEP
* PR1: robot personal desarrollado en el laboratorio de Ken Salisbury en Stanford.
* Robotnik: Empresa española de ingeniería especializada en robots móviles, brazos robóticos y soluciones industriales con arquitectura sobre ROS.
* Robot de Shadow Archivado el 8 de septiembre de 2012 en Wayback Machine.: mano robótica diestra motorizada desarrollada por la empresa Shadow y la cual se está desarrollando mediante el consorcio de un proyecto europeo dentro del marco europeo (FP7). Entre los participantes de este proyecto se pueden encontrar la empresa Shadow Robot, la Université Pierre et Marie Curie-Paris (Francia) o la Universidad Carlos III de Madrid (España).
* HERB: desarrollado en CMU dentro del programa de robótica personal de Intel.
* STAIR I y II Archivado el 8 de noviembre de 2011 en Wayback Machine.: robots desarrollados en el laboratorio de Andrew Ng en la Universidad de Stanford.
* Koen Buys (Embedded Sensor Lab): el laboratorio de robótica de la Katholieke Universiteit Leuven (Bélgica), donde han desarrollado la Beagleboard.
* Aldebaran Nao: el Humanoid Robots Lab de la University of Freiburg desarrolló una integración en ROS para el Humanoide Nao.
* Husky A200: robot desarrollado (e integrado en ROS).

### ROS-Industrial

ROS-Industrial es un proyecto de código abierto (de licencia BSD (Legacy)/Apache 2,0 (preferred)) que amplía las capacidades avanzadas de ROS a la automatización industrial y la robótica. El repositorio ROS-industrial incluye interfaces para Manipuladores industriales comunes, pinzas, sensores y redes de dispositivos. También proporciona bibliotecas de software para la calibración automática de sensores 2D/3D, proceso de trazado/planificación de movimiento, aplicaciones como Scan-N-plan, herramientas de desarrollador como el plugin de ROS Qt Creator, y un currículo de entrenamiento que es específico para las necesidades de los fabricantes. ROS-I cuenta con el apoyo de un consorcio internacional de miembros de la industria y la investigación. El proyecto comenzó como un esfuerzo colaborativo entre Yaskawa Motoman Robotics, Southwest Research Institute y Willow Garage para apoyar el uso de ROS para la automatización industrial, con el repositorio de github que se fundó en enero de 2012 por Shaun Edwards (SwRI). Actualmente, el consorcio se divide en tres grupos: el consorcio ROS-industrial Américas (liderado por SwRI y ubicado en San Antonio, Texas), el consorcio ROS-industrial Europe (liderado por Fraunhofer IPA y ubicado en Stuttgart, Alemania) y el consorcio ROS-industrial Asia Pacific (liderado por Advanced Centro de remanufactura y tecnología (ARTC) y Universidad Tecnológica de Nanyang (UTN) y ubicado en Singapur).
Los consorcios apoyan a la comunidad global ROS-industrial mediante la realización de la formación ROS-I, proporcionando apoyo técnico y estableciendo la hoja de ruta futura para ROS-I, así como la realización de proyectos de la industria conjuntamente y de manera pre-competitiva para desarrollar nuevas capacidades de ROS-I.