Introducción

En los sistemas operativos existen diferentes variables que permiten modificar el comportamiento de este así como de las aplicaciones instaladas en él. A este conjunto de valores asignados se les conoce como Variables de Entorno. Por ejemplo, es posible modificar el valor del idioma del sistema realizando una asignación del siguiente tipo:

$LANG = en_US.UTF-8

Una de las formas más comunebas para realizar este tipo de acciones es mediante una terminal o utilizando comandos bash. En ambos casos, cada vez que se modifica el valor de una variable, ésta solo es expresada en el entorno de trabajo actual utilizado. Para solucionar aquel inconveniente, el uso de un archivo .bashrc es fundamental, ya que este es ejecutado cada vez cuando una nueva terminal es abierta.

Para el caso de ROS, este también utiliza sus propias Variables de Entorno para hacer efectivas las distintas configuraciones que se pueden realizar, ya sea, a nivel general de la aplicación o en particular para cada tipo de robot. Por ejemplo, es posible configurar la ubicación del core o raíz del framework o incluir la dirección de los paquetes creados tal como sigue:

$ROS_ROOT=/home/user/ros/ros

$TURTLEBOT_BASE=kobuki

Problema

Descripción del problema

Tal como fue mencionado en la sección anterior, la configuración de las Variables de Entorno de ROS se realiza mediante una asignación sobre una variable definida para este framework, las cuales podrían ser efectuadas sobre un archivo .bashrc de modo que los valores puedan ser almacenados permanentemente.

Sin embargo, al modificar el archivo .bashrc para almacenar estos valores, se podrían presentar los siguientes problemas:

  • Configuración directa sobre archivo .bashrc: esta acción es efectuada abriendo el archivo mencionado de forma directa sobre algún editor de texto, lo cual podría en algunos casos modificar de manera accidental otras Variables de Entorno de ROS.
  • Aplicar cambios permanentemente: al efectuar la modificación sobre .bashrc, estos cambios deben ser aplicados utilizando el comando source cada vez que se edite el archivo mencionado, generando en muchas ocasiones inconvenientes como olvidar el uso de esta acción.
  • Contenido adicional de otros software en .bashrc: el archivo .bashrc podría contener muchas otras configuraciones para diferentes aplicaciones instaladas en una máquina, por lo que la modificación accidental de una de éstas podría generar estados no esperados sobre estos software y no así sobre el framework de ROS.
  • Diferentes configuraciones: generalmente, el archivo .bashrc podría almacenar configuraciones para diferentes robots, las cuales a su vez mantienen distintos valores para las Variables de Entorno las que son comentadas en caso de no uso y des comentadas en caso contrario.

¿Cómo es solucionado/sobrellevado el problema hoy?

Al analizar las distintas herramientas presentes para ROS, por ejemplo, las desarrolladas utilizando RQT (QT para ROS), se aprecia que no hay solución distinta a la examinada en las secciones anteriores, dado que precisamente al observar los foros de discusión de este framework (http://answers.ros.org/questions/) es posible dar cuenta que las modificaciones de Variables de Entorno se realizan exclusivamente modificando el archivo .bashrc y posteriormente ejecutando el comando source para guardar los cambios permanentemente en el sistema tal como fue enunciado anteriormente.

Solución

Requerimientos que necesita la aplicación que soluciona el problema

La solución planteada utilizará las herramientas estándar que utiliza el framework de ROS, ya sea a nivel de lenguaje de programación así como en las aplicaciones externas de las cuales hace uso. Por ello, se describen los siguientes requerimientos mínimos para elaborar esta solución:

  • Sistema operativo Ubuntu: de acuerdo a la documentación oficial de ROS (http://wiki.ros.org/ROS/Installation) , la última versión soportada y estable para este framework se refiere a las versiones de Ubuntu Trusty (14.04), Utopic (14.10) y Vivid (15.04). Otras distribuciones de UNIX no están claramente soportadas ya que se encuentran en una etapa experimental.
  • Python 2.5 o superior: el lenguaje de programación utilizado en la aplicación a desarrollar será Python en su versión 2.5 o superior dado que según expresa la documentación oficial (http://wiki.ros.org/PyStyleGuide) la transición a una versión superior está debidamente soportada. Además cabe mencionar que las librerías utilizadas serán las estándares que presenta esta versión, por lo que no será necesario descargar ni incorporar nuevos módulos externos.
  • RQT: esta herramienta es una adaptación para ROS del framework QT, librería utilizada para el desarrollo de Interfaces Gráficas de Usuario (GUI), líneas de comandos y consolas para servidores. Distribución de ROS: de acuerdo a lo expuesto en la documentación de RQT (http://wiki.ros.org/rqt/Tutorials/Create%20your%20new%20rqt%20plugin) , la distribución mínima para ser usada al momento de crear una aplicación bajo este framework es Groovy más el buildsystem catkin

Lista detallada de las funcionalidades que va a brindar el proyecto

De acuerdo a lo señalado en la sección anterior, la solución a desarrollar va a constar de una Interfaz Gráfica de Usuario (GUI) que permitirá realizar las siguientes acciones.

Configurar y listar Variables de Entorno generales de ROS

La aplicación permitirá agregar nuevas Variables de Entorno que son de uso común para el sistema en general, tales como la ruta requerida para Python (PYTHONPATH = path) o la raíz del núcleo de ROS (ROS_ROOT=/home/user/ros/ros). Estas variables podrán ser incluidas en el sistema mediante un pequeño formulario en el cual se adjunte el nombre y el valor que está tendrá.

De manera adicional, también se podrá listar cada uno de los valores configurados por la aplicación así como eliminar ciertas asignaciones realizadas a cada una de las Variables de Entorno mencionadas.

Configurar y listar Variables de Entorno de ROS por Robot

Como se mencionó en la evaluación del problema, al tener varios robots con distintas configuraciones, lo que se tiende a realizar es comentar y descomentar las diferentes Variables de Entorno de modo que así se pueda mantener guardada la configuración para cierto robot sin olvidar las que otros tenían y que de una u otra manera puedan ser usada en el futuro.

Para contrarrestar este dilema, se propone realizar la configuración de cada robot de forma independiente, permitiendo guardar sus propias Variables de Entorno a través de una GUI de modo que puedan ser seteadas las variables ingresando el valor estipulado de cada una de éstas. Así, cada vez que se guarde un nuevo robot, éste ya poseerá una configuración previamente almacenada y solamente con la elección de uno de éstos las variables serán restituidas por los valores que ya posee. Con este accionar, al tener diferentes configuraciones de robot guardadas, se eliminará el ciclo de comentar-descomentar y con solo un par clicks se podrán cambiar las Variables de Entorno para distintos autómatas.

Diseño de la solución

En esta sección se describe la especificación del diseño de la aplicación, el cual consta de la descripción de la arquitectura y la presentación de los mockups.

Arquitectura

Mediante la Figura 1, se representa la arquitectura de la aplicación que consta de tres módulos principales. GUI robots

  • Módulo GUI: En este módulo se implementa la interfaz gráfica de nuestra aplicación que interactua directamente con el módulo CRUD para la gestión del archivo XML.

  • Módulo CRUD: En este módulo es el encargado de gestionar toda la operación CRUD del archivo XML y bash. Así mismo, implementa funciones para el parseo del archivo XML al archivo bash para su posterior inclusión al archivo .bashrc.

  • Módulo de ROS: En este módulo se implementa funcionalidades para la inclusión del archivo bash a .bashrc y la publicación en el sistema operativo mediante la ejecucion del comando source .bashrc.

En lo que respecta al modelo de datos, estructurado mediante el formato XML, se puede encontrar en https://github.com/tchambil/rqt_env/blob/master/htbot.xml. El modelo describe las etiquetas padres <robots> y <general> con sus respectivos etiquetas hijos. En la sección <robots> cada robot tendrá un identificador y un atributo status que permitirá determinar si el Robot está activo o no (ejemplo, <ROBOT ID="turtlebot" STATUS="1">) de igual forma la sección <general> tendrá sus etiquetas hijo.

Diseño

La aplicación constará de tres formularios: La Figura 2 representa al formulario General que permite gestionar las variables de entorno de ROS. La Figura 3 representa al formulario list Robot que permite gestionar mediante la lista los robots que actualmente tienen alguna configuración en el sistema e indicando si están activos o no. La figura 4, representa al formulario Robot que permite gestionar las variables de entorno por cada Robot(por ejemplo en la Figura se muestra toda las variables de Turtlebot). Los tres formularios contienen los siguientes elementos: List, que almacena las variables de entorno con sus respectivos valores asignados; el botón add, permite agregar un nueva fila en lista habilitando los campos para agregar el nombre de la nueva variable y su respectivo valor; el botón Save, permite guardar la lista la lista que fue modifica o agregada el nuevo elemento; el botón Modify, habilita la lista para la modificación de la variable seleccionada; el botón Remove, permite eliminar el elemento seleccionado de la lista; el boton Apply, permite aplicar toda la consideración y publicar en el sistema operativo; el botón Cancel, permite cancelar la operación que se esté realizando. GUI robots environment GUI robots environment GUI robots environment GUI robots

Código de Fuente

De forma de utilizar el estándar de ´ROS´ para la colaboración dentro de la comunidad, el código de la solución estará alojado en el siguiente repositorio de github: https://github.com/hsarmiento/rqt_env

Limitaciones

De acuerdo a lo explicado anteriormente, al editar el archivo .bashrc y luego ejecutar el comando source sobre este, los cambios son efectuados sobre la terminal actual en la que se está trabajando y no así sobre las otras, por lo que se deben aplicar la sentencia source sobre todas las consolas de modo que actualicen los valores de las Variables de Entorno en ella. De la misma forma, la aplicación a desarrollar tendrá la misma restricción dado que el accionar para incluir y actualizar las variables seteadas será bajo los mismos comandos en una consola.

También, ya que las Variables de Entorno pueden ser modificadas directamente sobre el archivo .bashrc y no así en la aplicación a elaborar, nada puede asegurar que las variables modificadas/seteadas en la herramienta a generar exhiban de manera íntegra los cambios efectuados en el sistema.

Testing

De acuerdo a la documentación establecida para el desarrollo de herramientas utilizando rqt (http://wiki.ros.org/rqt/Tutorials/Create%20your%20new%20rqt%20plugin), las pruebas de las aplicaciones realizadas sobre esta librería deben efectuarse bajo Unit Testing, es decir, que éstas sean automatizables, que cubran la mayor parte del código y que puedan ser repetible. Para ello, ROS provee una herramienta interna llamada rosunit (http://wiki.ros.org/rosunit) , la cual soporta actualmente gtest (Google test) y Python unittest.

Validación

Al igual que otros software o aplicaciones desarrolladas para cualquier plataforma, existen criterios de usabilidad que permiten una correcta evaluación para una herramienta elaborada para ROS. Según la documentación oficial de la Open Source Robotics Foundation (http://wiki.osrfoundation.org/Usability) existen instrumentos que pueden ser usados antes de entregar un trabajo a la comunidad, tales como la Evaluación Heurística o los Test de Mínimo Esfuerzo de Usabilidad.

Contacto de ROS para desarrollar/validar la solución

Los principales contactos para desarrollar y validar la solución se refieren a los involucrados con el proyecto rqt, el cual se encuentra en un estado de mantenida con su principal mantenedor Dirk Thomas y autores Dirk Thomas, Dorian Scholz y Aaron Blasdel. A su vez y para la herramienta de testing de la aplicación, se utilizará rosunit el cual tambien está en un estado de mantenida con su correspondiente mantenedor Dirk Thomas y su autor Ken Conley

Conclusión

Esperamos que la herramienta que permita configurar las Variables de Entorno de ROS pueda ser aceptada por la comunidad dado que al analizar el foro de este framework, existen muchas preguntas en cuanto a cómo efectuar este tipo de asignaciones, especialmente por personas novatas que se están integrando recientemente al uso de robots. Si bien, existen algunas limitaciones propiamente tal del sistema operativo, la idea principal es poder efectuar es tipo de accionar mediante una GUI dado que no todos los usuarios están insertos en el mundo de controlar mediante la modificación directa de archivos del sistema para proyectar sus ideas sobre un robot.