%---------------------------------------------------------------------
%
%                          Capítulo 2 ROS
%
%---------------------------------------------------------------------

\chapter{ROS}

\begin{FraseCelebre}
\begin{Frase}
...
\end{Frase}
\begin{Fuente}
...
\end{Fuente}
\end{FraseCelebre}

\begin{resumen}
...
\end{resumen}


%-------------------------------------------------------------------
\section{Introducción a ROS}%http://www.ros.org/about-ros/
\label{cap2:sec:introduccion-a-ros}
%-------------------------------------------------------------------
El Robotics Operation System (ROS), desarrollado originalmente en 2007 por el Laboratorio de Inteligencia Artificial de Stanford (SAIL\footnote{http://ai.stanford.edu/}), mejorado por Willow Garage\footnote{http://www.willowgarage.com/} en 2008 y transferido a la Open Source Robotics Foundation(OSRF) en 2013, es un framework(estructura conceptual y tecnologica de soporte definido) flexible para la escritura de un software robotico. Es una coleccion de herramientas, librerias, y convenciones que tiene por objetivo simplificar la tarea de crear complejos y robustos ambientes roboticos para las distintas plataformas y esta mantenido por la OSRF.
\medskip
Este sistema operativo atiende la gran dificultad de crear un robusto software robotico de proposito general, ya que, desde la perspectiva robotica, los problemas que son triviales para el ser humano frecuentemente varian enormemente entre instancias de tarea y entorno. Poder satisfacer estos requerimientos resulta imposible para un individuo, laboratorio o institucion solos.
\medskip
Como resultado, ROS fue construido desde cero para fomentar el desarrollo de robotica colaborativay asi distintos grupos a nivel mundial pueden contribuir con sus aportes a la comunidad.
\medskip
ROS es el SDK definitivo para el desarrollo de aplicaciones de robots. Proporciona una arquitectura distribuida y contiene algoritmos implementados del estado del arte, mantenidos por expertos en el campo. Es ampliamente adoptado por la investigacion, centros educativos y la industria. Al ser un sistema operativo de codigo abierto mantenido, utilizado y desarrollado por numerosos usuarios y entidades, se trata de una infraestructura muy flexible y adaptable a diversas necesidades.
%%Hasta el momento lleva 10 anhos desde su construccion, es de codigo abierto para poder ser desarrollado porla comunidad. 

%-------------------------------------------------------------------
\section{Conceptos básicos}
\label{cap2:sec:conceptos-basicos}%https://erlerobotics.com/blog/ros-introduction-es/#history
%-------------------------------------------------------------------
\begin{itemize}
\item Nodos: Son los procesos que realizan el calculo. ROS esta diseñado para ser modular en una escala de grano fino; un sistema de contrl de robots comprende por lo general muchos nodos. Por ejemplo, un nodo controla un laser, un nodo contrla los motores de las ruedas, un nodo proporciona una vista gradica del sistema, y asi sucesivamente. Un nodo de ROS se escribe con el uso de las librerias cliente de ROS, roscpp y rospy.
\item Master: Proporciona la informacion necesaria para que todos los nodos sean identificados y se comuniquen, es decir, porporciona el registro de nombre y consulta al resto del grafo de computacion. Sin el maestro, los nodos no serian capaces de encontrar al resto de nodos, intercambiar mensajes o invocar servicios.
\item Parameter Server: Forma parte del Master, y permite guardar los datos de forma centralizada con una clave en una locacion central.
\item Messages: Estos mensajes son usados por los nodos para que puedan comunicarse entre ellos. Es una estructura de datos compuestos que comprende una combinacion de tipos primitivos y mensajes. 
	\begin{itemize}
		\item Primitivos: Los tipos primitivos de datos (integer, floating point, boolean, etc.) estan soportados como los arrays de tipo primitivo.
		\item Mensajes: Los mensajes pueden incluir estructuras y arrays( como las estructuras de C).
	\end{itemize}
\item Topic: Es un nombre que es usado para identificar el contenido del mensaje. Los mensajes son enrutados por un sistema de transporte que utiliza semantica publicador/subscriptor. Un nodo envia mensajes publicando en un topico. Un nodo que esta interesado en cierto tipo de datos se subscribira al topico apropiado. Pueden existir muchos publicadoes concurrentemente para un solo topico. En general, los publicadores y subscriptores no son conscientes de la existencia de los otros. La idea es desacoplar la produccion de informacion de su consumicion. Logicamente, uno puede pensar que un topico es un mensaje fuertemente tipado\footnote{no se permiten violaciones de los tipos de datos, es decir, dado el valor de una variable de un tipo concreto, no se puede usar como si fuera de otro tipo distinto a menos que se haga una conversión.} en un bus. Ese bus tiene un nombre y nadie se puede conectar al bus para enviar o recibir mensajes si no estan correctamente tipados.
\item Services: Es el modelo de comunicacion cliente-servidor. El modelo de publicar/subscriptor es un paradigma de comunicacion muy flexible, pero en muchos casos el transporte en un unico sentido no es suficiente para las interacciones de peticion y respuesta que a menudo se requieren en un sistema distribuido. La peticion y respuesta se realiza a traves de los servicios, que se definen a partir de una estructura de mensajes: una para la peticion y otra para la respuesta. Un nodo proporciona un servicio con un nombre y un cliente, utiliza dicho servicio mediante el envio del mensaje de peticion y espera a la respuesta. La libreria cliente de ROS generalmente presenta esta interaccion como si fuera una llamada a procedimiento remoto.
\item Bags: Es un formato para guardar y reproducir datos de mensajes ROS. Son un mecaninsmo importante para el almacenamiento de datos, como lecturas de sensores, que pueden ser dificilmente adquiridas pero son necesarias para el desarrollo y testeo de algoritmos.
\end{itemize}
\figura{Vectorial/ROS_Concepto_Basico}{width=.8\textwidth}{fig:ROS_CB}%
       {Diagrama de comunicación Nodo a Nodo} 

%-------------------------------------------------------------------
\section{Componentes Principales}
\label{cap2:sec:componentes-principales}
%-------------------------------------------------------------------
\subsection{Infraestructura de comunicaciones}
%-------------------------------------------------------------------
Un sistema de comunicaci\'on es primordial para la implementaci\'on de una aplicaci\'on rob\'otica. El sistema de mensajer\'ia integrado de ROS permite ahorrar tiempo mediante la gesti\'on de los detalles de la comunicaci\'on entre los nodos distribuidos a trev\'es de publicaci\'on an\'onima/m\'etodo de suscripci\'on, obligando a implementar interfaces claras entre los nodos del sistema, mejorando as\'i la encapsulaci\'on y la promoci\'on de la reutilizaci\'on de c\'odigo. La estructura de estas interfaces de mensaje se define en el mensaje de IDL(Interface Description Language).

%-------------------------------------------------------------------
\subsection{Características Robóticas específicas}
%-------------------------------------------------------------------
ROS proporciona librerías robóticas específicas comunes y herramientas para que el robot funcione rápidamente. A continuaci\'on se describir\'an algunas de las características robóticas específicas ofrecidas por ROS.

%-------------------------------------------------------------------
\subsubsection{Mensajes estándar de robot}
%-------------------------------------------------------------------
Años de discusión y desarrollo de la comunidad han dado lugar a un conjunto de formatos de mensajer\'ia estándar que cubren la mayor parte de los casos de uso común en la robótica. Hay definiciones de mensajes de conceptos geométricos como poses, transformadas y vectores; para sensores como cámaras, IMU y láser; y para los datos de navegación como odometría, rutas y mapas; entre muchos otros. Estos mensajes también incrementan la interoperabilidad con las herramientas y características existentes en el ecosistema de ROS.


%-------------------------------------------------------------------
\subsubsection{Librería geométrica de robot} 
%-------------------------------------------------------------------
\figura{Bitmap/Tf}{width=.8\textwidth}{fig:Tf}%
       {Geometría de Robots en ROS}
       
Un reto común en muchos proyectos de robótica es hacer el seguimiento de distintas partes del robot y dónde se localizan con respecto a la otra . Por ejemplo, si desea combinar datos de una cámara con los datos de un láser, lo que necesita saber dónde está cada sensor, en algún marco de referencia común . Por esta raz\'on se utilizar\'a la librería tf (transformada), que mantiene el seguimiento de todas las referencias del sistema robótico. Diseñado para maximizar la eficacia, la librería tf se ha utilizado para administrar las transformadas de los datos para robots con más de un centenar de grados de libertad (figura~\ref{fig:Tf})  y las tasas de actualización de cientos de Hertzios. La librería tf permite definir las transformaciones estáticas, tales como una cámara que se fija a una base móvil, y las transformaciones dinámicas, como una articulación de un brazo robótico.

%-------------------------------------------------------------------
\subsubsection{Unidades Utilizadas} %http://www.ros.org/reps/rep-0103.html 
%-------------------------------------------------------------------
Para poder trabajar con ros de manera general y global se utiliza el siguiente sistema internaciona de medidas mantenidos por la Bureau International des Poids et Mesures \footnote{http://www.bipm.org/en/home/}, las cuales se muestran a continuacion.
\begin{table}[h]
\
\footnotesize
\centering
\begin{tabular}{|l|c|}
\hline
Cantidad & Unidad \\
\hline
longitud & metro \\
masa & kilogramo \\
tiempo & segundo \\
corriente & Amper \\
\hline
\end{tabular}
\caption{Unidades Básicas
   \label{cap2:tab:unidadesbasicas}}
\end{table}
\begin{table}[h]
\
\footnotesize
\centering
\begin{tabular}{|l|c|}
\hline
Cantidad & Unidad \\
\hline
angulo & radian \\
frecuencia & Hertz \\
fuerza & Newton \\
potencia & Watt \\
voltaje & Volt \\
temperatura & Celsius \\
magnetismo & Tesla \\
\hline
\end{tabular}
\caption{Unidades Derivadas
	\label{cap2:tab:unidadesderivadas}}
\end{table}
%-------------------------------------------------------------------
\subsubsection{Estructura del Robot}
\label{cap2:ssec:estructura-del-robot}
%-------------------------------------------------------------------
ROS proporciona un conjunto de herramientas para describir y modelar al robot para que pueda ser comprendido por el resto de su sistema, incluyendo tf, \verb|robot_state_publisher|, rviz, gazebo o cualquier plugins o software compatible. El formato para la descripción de su robot de ROS es URDF (Unified Robot Descripción Format), que consiste en un documento XML en el que se describen las propiedades físicas de su robot, desde la longitud de las extremidades y tamaños de ruedas a la ubicación de los sensores y la apariencia visual de cada parte del robot. Una vez que se define de esta manera, el robot se puede utilizar fácilmente con la librería tf, representada en las tres dimensiones con visualizaciones detalladas, y se utiliza con los simuladores y los planificadores de movimiento.
Es por esto que surge la necesidad de definir algunos conceptos como(ver~\ref{cap4:sec:xml-robot-description-format}):
\begin{itemize}
\item \verb|Link|: C\'odigo que describe la fisica de cada estructura del robot, tales como la matriz inercial, la visualizaci\'on, la colisi\'on, etc.
\item \verb|Joint|: Tambi\'en llamado juntura, es el c\'odigo encargado de determinar la relaci\'on entre los links y los limites de sus comportamientos, como or ejemplo la velocidad m\'axima y m\'inima de movimiento, las constantes de posici\'on y velocidad del motor que determina su curva de movimiento, entre otras.
\item \verb|Parent|: Es el link base o maestro determinado por el joint.
\item \verb|Child|: Es el link esclavo determinado por el joint.
\end{itemize}


%-------------------------------------------------------------------
\subsubsection{Diagnósticos}%http://wiki.ros.org/diagnostics      Overview solamente.
%-------------------------------------------------------------------
%The diagnostics system is designed to collect information from hardware drivers and robot hardware to users and operators for analysis, troubleshooting, and logging. The diagnostics stack contains tools for collecting, publishing, analyzing and viewing diagnostics data.
%The diagnostics toolchain is built around the /diagnostics topic. On this topic, hardware drivers and devices publish diagnostic_msgs/DiagnosticArray messages with the device names, status and specific data points.
%The diagnostic_updater and self_test packages allow nodes to collect and publish diagnostics data. The diagnostic_aggregator can categorize and analyze diagnostics at runtime. Operators and developers can view the diagnostics data using the rqt_robot_monitor package.
El sistema de diagnóstico es diseñado para recoger la información desde controladores de hardware y el hardware del robot a usuarios y operadores para el análisis, solución y logging. El repertorio de diagnóstico contiene herramientas para colectar, publicar, analizar y visualizar datos de diagnóstico. El diagnóstico toolchain es construido en relaci\'on al topic /diagnostic. Sobre este topic, los controladores de hardware y dispositivos publican mensajes \verb|diagnostic_msgs/DiagnosticArray| con los nombres de dispositivos, el estado y puntos de datos específicos. 
\medskip
Los paquetes \verb|diagnostic_updater| y \verb|self_test permiten| a los nodos recoger y publicar datos de diagnóstico. El \verb|diagnostic_aggregator| puede clasificar y analizar el diagnóstico en el tiempo de ejecución. Los operadores y desarrolladores pueden ver los datos de diagnóstico utilizando el paquete de \verb|rqt_robot_monitor|. %insertar imagen
%The diagnostic_analysis package can convert diagnostics logs to CSV files for examination and after-the-fact analysis.
\medskip
El paquete \verb|diagnostic_analysis| puede conevtir el registro de diagn\'osticos a un archivo CSV para examinar y realizar un posterior an\'alisis.
%-------------------------------------------------------------------
\subsection{Herramientas}
%-------------------------------------------------------------------
una de las caracteristicas de ROS es el poderoso conjunto de herramientas de desarrollo que incluye. Estas ayudan con la introspeccion, la depuracion, el trazado, y visualizacion del estado en el desarrollo del sistema las cuales se aprovechan a traves de una extensa coleccion de utilidades de linea de comandos y graficos que simplifican el desarrollo y depuracion. Las mas utilizadas se mostraran a continuacion.


%-------------------------------------------------------------------
\subsubsection{Rosnode}
%-------------------------------------------------------------------
\begin{itemize}
\item \verb|rosnode info node|: Muestra informacion sobre el nodo.
\item \verb|rosnode kill node|: Mata elnodo o envia una señal para matarlo.
\item \verb|rosnode list|: Muestra una lista con los nodos activos.
\item \verb|rosnode machine hostname|: Lista los nodos ejecutandose en una maquina en concreto.
\item \verb|rosnode ping node|: Muestra la conectividad con el nodo.
\item \verb|rosnode cleanup|: Limpia la informacion de registro para nodos inalcanzables.
\end{itemize}

%-------------------------------------------------------------------
\subsubsection{Rostopic}
%-------------------------------------------------------------------
\begin{itemize}
\item \verb|rostopic bw /topic|: Muestra el ancho de banda utilizado por un topico.
\item \verb|rostopic echo /topic|: Muestra el mensaje por la salida estadar.
\item \verb|rostopic find message_type|: Busca topicos que usen el tipo de mensaje especificado.
\item \verb|rostopic hz /topic|: Publica la tasa de publicacion del topico.
\item \verb|rostopic info /topic|: Muestra informacion sobre el topico, el topico publicado, los que estan subscritos y los servicios.
\item \verb|rostopic list|: Muestra informacion sobre los topicos activos.
\item \verb|rostopic pub /topic type args|: Publica datos al topico. Permite crear y publicar datos en cualquier topico directamente desde la linea de comandos.
\item \verb|rostopic type /topic|: Muestra el tipo de topico, es decir, el tipo de mensaje que publica.
\end{itemize}
%-------------------------------------------------------------------
\subsubsection{Rosservice}
%-------------------------------------------------------------------
\begin{itemize}
\item \verb|rosservice call /service args|: Llama al servicio con los argumentos apropiados.
\item \verb|rosservice find msg-type|: Busca los servicios por el tipo de servicio.
\item \verb|rosservice info /service|: Muestra la informacion sobre el servicio.
\item \verb|rosservice list|: Lista los servicios activos.
\item \verb|rosservice type /service|: Muestra el tipo de servicio.
\item \verb|rosservice uri /service|: Muestra el servicio ROSRPC URI.
\end{itemize}
%-------------------------------------------------------------------
\subsubsection{Rosparam}
%-------------------------------------------------------------------
\begin{itemize}
\item \verb|rosparam list|: Lista todos los parametros del servidor.
\item \verb|rosparam get parameter|: Devuelve el valor de un parametro.
\item \verb|rosparam set parameter value|: Establece el valor de un parametro.
\item \verb|rosparam delete parameter|: Elimina un parametro.
\item \verb|rosparam dump file|: Guarda los parametros de servidor de parametros.
\item \verb|rosparam load file|: Carga un fichero con parametros en el servidor de paramatros.
\end{itemize}
%-------------------------------------------------------------------
\subsubsection{Package}
%-------------------------------------------------------------------
\begin{itemize}
\item \verb|rospack|: Este comando se usa para obtener informacion o buscar informacion sobre un paquete.
\item \verb|roscreate-pkg|: Crear un nuevo paquete.
\item \verb|rosmake|: Compilar un paquete.
\item \verb|rosdep|: Instalar en el sistema las dependencias de un paquete.
\item \verb|rxdeps|: Ver las dependencias de un paquete como un grafo.
\end{itemize}
%-------------------------------------------------------------------
\subsubsection{Rosbash}
%-------------------------------------------------------------------
\begin{itemize}
\item \verb|roscd|: Cambiar de directorio.
\item \verb|rosed|: Editar un archivo.
\item \verb|roscp|: Copiar un fichero de algun paquete.
\item \verb|rosd|: Listar los directorios de un paquete.
\item \verb|rosls|: Listar los ficheros de un paquete.
\end{itemize}
%-------------------------------------------------------------------
\subsection{Integración con librerías}
%-------------------------------------------------------------------
\begin{itemize}%pequeña descripcion.
\item \verb|Gazebo|:Gazebo es un simulador de entornos 3D que posibilita evaluar el comportamiento de un robot en un mundo virtual. Permite, entre muchas otras opciones, diseñar robots de forma personalizada, crear mundos virtuales usando sencillas herramientas CAD e importar modelos ya creados. Además, es posible sincronizarlo con ROS de forma que los robots emulados publiquen la información de sus sensores en nodos, así como implementar una lógica y un control que dé ordenes al robot.
\item \verb|Moveit|:Librería de planificación de movimientos que ofrece implementaciones eficientes y bien probados de los algoritmos de planificación que se han utilizado en una amplia variedad de robots, desde plataformas con ruedas sencillas de humanoides para caminar.
\item \verb|Rviz|:proporciona la visualización tridimensional de muchos tipos de datos de los sensores y cualquier robot descrito por URDF. La herramienta rviz puede visualizar muchos de los tipos de mensajes comunes previstos en ROS, como escaneos láser, las nubes de puntos tridimensionales, y las imágenes de cámaras.
\item \verb|V-rep|: Simulador 3D que permite diferentes modos de simulación y trae unos algoritmos a primera vista bastante atractivos para el cálculo de elementos esenciales en cualquier robot como  son la cinemática inversa y la detección de colisiones.
\item \verb|Blender|:Software Open-Source destinado, en primera instancia, al modelado 3D de objetos. Incorpora la posibilidad de dar texturas, definir materiales, iluminar la escena, crear simulaciones... Destaca por sus capacidades para la creación de mallas y animaciones.
\end{itemize}

%-------------------------------------------------------------------
\section*{Conclusión Parcial}%veremos...
%-------------------------------------------------------------------


%-------------------------------------------------------------------
\section*{\ProximoCapitulo}
%-------------------------------------------------------------------
\TocProximoCapitulo

...

% Variable local para emacs, para  que encuentre el fichero maestro de
% compilación y funcionen mejor algunas teclas rápidas de AucTeX
%%%
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "../Tesis.tex"
%%% End:
