Robot, pórtate bien: Las Leyes de la Robótica

Buscando cosas fantabulosas en StumbleUpon, me encontré con un artículo [1] que menciona las Leyes de la Robótica de Tilden. Yo estaba familiarizado con las Leyes de la Robótica de Asimov, del que me declaro admirador, que han sido popularizadas por distintas obras de ciencia ficción y han pasado a ser un referente al hablar de robots. Estas leyes de Asimov funcionan estableciendo un cierto resguardo para guiar el comportamiento de robots inteligentes y lograr que no dañen a los humanos.

Varias veces me he puesto a darle vueltas al asunto de sobre qué implicancias tiene el definir estas reglas para los robots, y de cómo podría ser realizable la implantación de ellas. Por ejemplo, las leyes asimovianas se enfocan en el aspecto social del robot (la relación humano-robot) y en cómo se establece una jerarquía de relaciones de poder (humano > robot), mientras que las leyes de Tilden se enfocan principalmente en ver al robot como un organismo autónomo. Por eso, escribo este artículo para explorar ideas sobre cómo plantear reglas fundamentales para regir el comportamiento de un robot.

Lo primero, ¿qué es un robot?

La palabra “robot” se hizo conocida en 1920, en la obra R.U.R. de Karel Čapek [2]. Proviene del checo “robota” que significa “labor forzada” y hacía referencia a una forma de esclavitud, de trabajo obligado. En la actualidad vemos que los robots ya se han vuelto comunes como un elemento cultural de la automatización industrial, de la ciencia ficción e incluso del ambiente doméstico con varios proyectos que ya se están haciendo parte de los hogares. Aún así, pese a la masificación del concepto, no existe una definición estricta de sobre qué es un robot ni sobre qué elementos lo componen. Generalmente uno asocia el término a máquinas humanoides con una voz que pareciera venir rebotando desde dentro de un tarro, pero también se puede considerar como robots a programas de software capaces de funcionar de manera autónoma (por ejemplo, bots de conversación como cleverbot [3], o inteligencias artificiales de videojuegos), o más comunmente a máquinas no humanoides que realicen tareas de manera autónoma o semi-autónoma (un gran ejemplo de esto son los robots Kiva, altamente usados en las bodegas de Amazon para organizar sus productos más rápidamente [4]). Pese a las ambigüedades que aún existen para definir el concepto, podemos estar de acuerdo en que los robots son máquinas con un cierto de autonomía capaces de desempeñar ciertas labores.

Máquinas inteligentes

La autonomía de un robot no implica que sea una máquina inteligente, así como la inteligencia artificial no implica la existencia de inteligencia. Sobre esto último quizás me extienda en otra ocasión (la IA es una de las áreas que me apasionan) pero por ahora me limito a mencionar que la inteligencia artificial es, a grandes rasgos, la automatización de comportamientos “racionales”, es decir, lograr que la máquina entregue el resultado que entregaría un humano. Cuando hablamos de una máquina inteligente, en cambio, y nos mantenemos al margen del concepto de “artificial”, llegamos a la idea de sobre qué pasaría si las máquinas alcanzaran la verdadera inteligencia (otro tema que no tiene una definición absoluta). La inteligencia dotaría a la máquina de una autonomía mayor que la estructura dada por su programa o por su construcción, y la dotaría de elementos como la imaginación, la memoria no estructurada, y un aprendizaje similar al aprendizaje humano, capaz de adquirir conocimientos y habilidades en todo tipo de disciplinas. Esto ha sido tema de estudio durante muchos años y Alan Turing propuso un test con el que considerar a una máquina como inteligente. Este test se basa en la idea de que si un juez no puede distinguir a una máquina de un humano, la máquina se considera inteligente. Pero este test se enfoca en el aspecto conductual de la inteligencia, en cómo esta se exterioriza. Incluso ya hay un software que pasó el test de Turing [5]. Lo que no considera este planteamiento es el aspecto interno de la inteligencia, como los motivos o la consciencia.

Robótica Asimoviana

Isaac Asimov [6], gran escritor y científico que vivió entre 1920 y 1992, abordó estos últimos temas en su literatura de ciencia ficción y se volvió uno de los mayores referentes del género. En sus libros como “Yo Robot”, “Sueños de Robot” y “Visiones de Robot” se presenta a los robots como máquinas de mayor complejidad a la actual, capaces de ayudar a los humanos en labores diarias, e inteligentes hasta un cierto grado. Incluso existen robots que no se distinguen de un humano normal o robots que terminan convirtiéndose en uno (como en el cuento “El Hombre Bicentenario”. Sí, el cuento vino antes que la película). Todas estas capacidades se sustentan en la existencia de un “cerebro positrónico”, que es capaz de funcionar de manera análoga al cerebro humano y darles capacidades equivalentes o incluso superiores. Pero en estas obras, el ser humano, para no ser superado por su creación en un nivel de especie (porque es superado en varias capacidades), diseña reglas que pongan al robot, por definición, al servicio del hombre. Así nacen las leyes de la robótica clásicas de la literatura de Asimov:

  1. Un robot no debe dañar a un ser humano o, por su inacción, dejar que un ser humano sufra daño.
  2. Un robot debe obedecer las órdenes que le son dadas por un ser humano, excepto cuando estas órdenes están en oposición con la primera Ley.
  3. Un robot debe proteger su propia existencia, hasta donde esta protección no esté en conflicto con la primera o segunda Leyes.

En muchísimas obras de ciencia ficción se mencionan estas leyes como la base del comportamiento robótico (como por ejemplo, Eve no Jikan [7]), pese a que Asimov en sus mismos cuentos buscaba situaciones en las que estas leyes pudieran ser llevadas a contradicciones. De estas mismas contradicciones aparece una nueva ley, la llamada “Ley Cero” (o Zeroth):

  1. Ninguna máquina puede dañar a la Humanidad; o, por inacción, dejar que la Humanidad sufra daño.

En los mismos relatos de Asimov (se recomienda leer algún relato del Ciclo de Trántor [8]) se describe cómo estas leyes motivan a las máquinas a dedicarse durante miles de años a contribuir al desarrollo de la humanidad como especie, incluso contribuyendo en política y en el desarrollo económico.

Pero todo esto lleva a ciertas preguntas técnicas cuando uno piensa en llevar estas leyes a la práctica. ¿Cómo podemos implementar las leyes de la robótica de Asimov en robots reales? Asimov habla de un cerebro positrónico, pero ¿qué debe poder hacer este cerebro positrónico? Partiendo de la Ley 1, el robot debe ser capaz de entender lo que es un humano. Esto implica más que el solo hecho de “reconocer un humano” como se podría hacer con algoritmos de Visión Computacional y Aprendizaje de Máquina. Porque se habla de dañar a un humano, el robot debe entender al ser humano como un organismo vivo, conocer sus propiedades, sus reacciones, sus características físicas y psicológicas. Todo esto implica un tipo de máquina diferente a las que tenemos ahora, mucho más compleja y con un “cerebro” mucho más orgánico, capaz de razonamientos de nivel superior.

Quizás para llegar a ese nivel de razonamiento en las máquinas, debemos diseñarlas de tal forma en que puedan crecer como organismos naturales e ir incrementando en complejidad como un resultado emergente de su interacción con las personas, otras máquinas y el entorno. Aquí es donde es adecuado mencionar las leyes de Tilden.

Las leyes de Tilden (no de Tinder, de Tilden)

 Mark Tilden [9] es uno de los grandes robotistas modernos, famoso por su planteamiento de los robots BEAM. La robótica BEAM [10] (Biology, Electronics, Aesthetics and Mechanics) plantea un diseño de robots mucho más simple que los robots convencionales. Estos robots tienen una mayor tendencia a ser construidos con circuitos analógicos en vez de digitales, lo que muchas veces conlleva la ausencia de microprocesadores. La principal idea de estos robots es que se parezcan mucho más a organismos vivos en vez de a máquinas programables. Siguen siendo máquinas, pero con la ventaja de que pueden reaccionar de una forma mucho más natural a su entorno.

Mark Tilden
Mark Tilden

La idea de la robótica de Tilden es reducir el comportamiento de un robot a sus componentes esenciales, y como este planteamiento es distinto en complejidad de las leyes de Asimov, él planteó su propio conjunto de leyes:

  1. Un robot debe proteger su existencia bajo todo costo.
  2. Un robot debe obtener y mantener acceso a su propia fuente de alimentación.
  3. Un robot debe buscar continuamente mejores fuentes de alimentación.

Se puede ver en estas leyes que el planteamiento es mucho más sencillo en cuanto a costos y a los requerimientos de estas máquinas (en parte, lo que Tilden andaba buscando), lo que las hace mucho más fáciles de implementar en la práctica. A diferencia de las leyes de Asimov, son leyes mucho más “realizables” y abren toda una rama de estudio que ve la robótica de una forma distinta. A la vez, estas leyes plantean al robot de una manera muy similar a los organismos vivos, lo que implica que podrían, hasta un cierto grado, desarrollarse como tales y producir resultados nuevos que no podríamos haber imaginado.

Pero a fines prácticos, la robótica es la creación de herramientas autónomas, y para regularla como tal es que la EPRSC estableció algunos principios sobre los que se debe guiar su desarrollo comercial.

Regulando los robots de ahora

El año 2010, el Engineering and Physical Sciences Research Council (Consejo de Investigación en Ingeniería y Ciencias Físicas) en un conjunto con el Arts and Humanities Research Council (Consejo de Investigación en Artes y Humanidades), ambas instituciones de Reino Unido, desarrollaron un evento en conjunto con el fin de establecer ciertos principios para guiar la investigación en robótica, de manera que esta se pueda integrar en la sociedad para el máximo beneficio de los ciudadanos [11]. Estas leyes se inspiran en las leyes de la robótica de Asimov en el sentido de proteger al ser humano, aunque como se dice en la declaración de principios, estas leyes difícilmente son llevables a la práctica en la vida real ya que un robot no puede conocer todas las formas en las que un ser humano puede ser dañado. Estos principios plantean que la responsabilidad en la robótica cae sobre los humanos que los crean y que, en consecuencia, determinan el funcionamiento de la máquina.

Los principios obtenidos en la reunión de estas dos organizaciones se cristalizan en cinco reglas éticas para la construcción de robots. En sus palabras: “Las cinco reglas éticas de la robótica se consideran como un documento vivo. No se espera que se consideren como leyes rígidas, sino como un instrumento para informar las discusiones y para referencia futura”.

  1. Los Robots son herramientas multiuso. Los robots no deben ser diseñados única o principalmente para matar o dañar humanos, a excepción de casos de seguridad nacional.
  2. Los Humanos, no los Robots, son agentes responsables. Los Robots deben ser diseñados y operados dentro de las leyes existentes y los derechos y libertades fundamentales, incluyendo la privacidad.
  3. Los Robots son productos. Deben ser diseñados usando procesos que aseguren su seguridad.
  4. Los Robots son artefactos fabricados. No deben ser diseñados de una manera engañosa que pueda confundir a usuarios vulnerables; su naturaleza de máquina debe ser transparente.
  5. Siempre debe ser identificable la persona con la responsabilidad legal por un Robot.

Estos principios sirven como una base para la legislación sobre robótica, para guiar un desarrollo de la industria de una manera que asegure el beneficio de la ciudadanía. Como un complemento, se adjuntan siete “mensajes de alto nivel” para motivar la responsabilidad en la industria y la investigación en robótica.

  1. Creemos que los robots tienen el potencial de causar un impacto inmensamente positivo en la sociedad. Queremos motivar la investigación responsable en robótica.
  2. Las malas prácticas nos afectan a todos.
  3. Enfrentar las preocupaciones del público nos ayudará a progresar.
  4. Es importante demostrar que nosotros, como robotistas, estamos comprometidos con los mejores estándares de las prácticas.
  5. Para entender el contexto y las consecuencias de nuestras investigaciones, debemos trabajar con expertos de otras disciplinas incluyendo: ciencias sociales, leyes, filosofía y artes.
  6. Debemos considerar la ética sobre la transparencia: hay límites a lo que debe estar abiertamente disponible.
  7. Cuando vemos informaciones erróneas en la prensa, debemos tomar el tiempo para contactar a los periodistas responsables.

Así como para ir cerrando

Si me preguntan con cual de estas leyes me quedo, me pongo el sombrero y me voy enojado (no uso sombrero, es sólo una metáfora). Cada una de estas leyes se planteó en un contexto puntual que quería ser abordado. Las leyes de Asimov nacen en el contexto de la robótica de su ciencia ficción y deben siempre primero considerarse en ese contexto; para eso es recomendable además de conocer esas leyes, leer su literatura, no se van a arrepentir. Ponen una base de sobre cómo deben comportarse los robots con respecto a los humanos, y los plantea como herramientas que pueden ayudarnos a crecer como sociedad. Pero aún hay muchas tareas que los robots estándar que están siendo desarrollados aún no son capaces de abordar. Tilden nos abre todo un planteamiento distinto que se vale de varias disciplinas para conceptualizar a los robots como entes dinámicos capaces de desarrollarse de manera similar a los organismos vivos. Nos ayuda un poco a abrir la mente sobre cómo podemos plantear los problemas que queremos solucionar con máquinas y a la vez hace la bella tarea de integrar varias disciplinas en la discusión. Esto último se considera en las leyes propuestas por EPSRC / AHRC, que se encargan de plantear principios acordes a la robótica moderna como industria que se está integrando de gran manera en la sociedad.

Todos estos planteamientos contribuyen a que nos preguntemos cómo queremos que se desarrolle la robótica de aquí hacia al futuro. Quizás aún faltan leyes que plantear, cosa casi segura, y por eso las discusiones deben seguir abiertas y deben considerar desde el ingeniero más especializado en control hasta los niños que se crían con películas de ciencia ficción que les dan una perspectiva confusa de la robótica real, para que así podamos todos ser beneficiados por el desarrollo tecnológico y por estas criaturitas tan fabulosas.

¿Cierto que son adorables? ¿Sí? (Fuente de la imagen: http://www.notimerica.com/sociedad/noticia-nao-robot-poliglota-sera-nuevo-trabajador-bancos-tokio-2020-20150203145049.html)
¿Cierto que son adorables? ¿Sí? (Fuente de la imagen: http://www.notimerica.com/sociedad/noticia-nao-robot-poliglota-sera-nuevo-trabajador-bancos-tokio-2020-20150203145049.html)

Y bueno, ya que llegaron leyendo hasta aquí… ¿se les ocurre alguna ley que agregar? Súmense a la discusión 😉

Referencias

  1. Tilden’s Laws of Robotics: https://en.wikipedia.org/wiki/Tilden%27s_Laws_of_Robotics
  2. Origen de la palabra robot: http://www.xatakaciencia.com/robotica/el-origen-de-la-palabra-robot
  3. Cleverbot: http://www.cleverbot.com/
  4. CNET News – Meet the robots making Amazon even faster: https://www.youtube.com/watch?v=UtBa9yVZBJM
  5. ABC.es Ciencia – Un ordenador pasa por primera vez el test de Turing y convence a los jueces de que es humano http://www.abc.es/ciencia/20140609/abci-superordenador-supera-primera-test-201406091139.html
  6. Isaac Asimov – Divulgación científica y ciencia ficción: http://www.asimov.es/
  7. Eve no Jikan: http://myanimelist.net/anime/3167/Eve_no_Jikan
  8. Ciclo de Trántor: https://es.wikipedia.org/wiki/Saga_de_la_Fundaci%C3%B3n
  9. The Evolution of a Roboticist: http://www.botmag.com/the-evolution-of-a-roboticist-mark-tilden/
  10. Robótica BEAM: https://es.wikipedia.org/wiki/Rob%C3%B3tica_BEAM
  11. EPSRC Principles of Robotics: https://www.epsrc.ac.uk/research/ourportfolio/themes/engineering/activities/principlesofrobotics/

Entrando a picar más profundo en ROS

Si leyeron el artículo anterior, quizás les dieron ganas de profundizar más en ROS. Como el tutorial anterior era una introducción, no entré en tantos detalles. Ahora pretendo explicar más sobre los elementos fundamentales a entender cuando se trabaja con ROS.

Dentro de ROS existen ciertos conceptos clave que entender y algunas aplicaciones asociadas a estos elementos que nos harán la vida más sabrosa al trabajar. Dentro de esos elementos están los nodos, los tópicos, los servicios, los mensajes, el servidor de parámetros, y otros más. Más abajo iré explicándolos paso a paso y escribiendo las referencias oficiales de cada tema.

Logo ROS

ROS como un sistema distribuido

Como mencioné en el otro artículo, ROS es un framework distribuido. Su idea principal es que los robots son sistemas en los que una falla en un componente no debe dañar el funcionamiento de la máquina completa. Para esto, se pensó para funcionar implementado en programas con funciones puntuales, los nodos, que se comunican entre sí para obtener el funcionamiento completo del robot. Análogo a lo que en otros sistemas distribuidos hace la labor de coordinar el trabajo global, como el namenode en Hadoop, en ROS existe una aplicación que coordina la ejecución de todos los otros nodos: el roscore.

Roscore

El roscore [1] es un conjunto de herramientas necesarias para hacer funcionar los demás nodos de ROS. Es la primera aplicación que se debe ejecutar para que el resto funcione. Esta aplicación se encarga de llamar al nodo Master [2], que se encarga de hacer que los nodos se puedan encontrar unos a otros y de gestionar las llamadas a tópicos y servicios. También se encarga de llamar al servidor de parámetros [3], que se utiliza para almacenar variables que deben estar disponibles para todos los nodos mediante APIs. Por último, roscore abre un nodo que sirve como la salida estándar de ROS para generar logs e impresiones por consola que se publican en el tópico “/rosout”, el nodo rosout [4].

Para lanzar el roscore, basta llamarlo desde la consola y quedará funcionando. La mayoría de las aplicaciones incluidas al instalar ROS dependen de que el roscore esté funcionando.

roscore
... logging to /home/bruno/.ros/log/1976e978-2e49-11e5-aa44-b803058568da/roslaunch-cronidea-2483.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://cronidea:51918/
ros_comm version 1.11.13

SUMMARY
========

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.13

NODES

auto-starting new master
process[master]: started with pid [2497]
ROS_MASTER_URI=http://cronidea:11311/

setting /run_id to 1976e978-2e49-11e5-aa44-b803058568da
process[rosout-1]: started with pid [2510]
started core service [/rosout]

También existe otra forma de ejecutar aplicaciones, que es mediante roslaunch. Al ejecutar roslaunch, se ejecutará un archivo .launch que especifica mediante una notación XML una serie de parámetros y nodos a lanzar. Al usar roslaunch, si no está corriendo el roscore, se ejecuta automáticamente antes de ejecutar los contenidos del archivo .launch.

ROS también puede ejecutarse usando varias máquinas, de las que sólo una estará corriendo el roscore. Pero como aún no he trabajado con ROS en varias máquinas, prefiero hablar de eso cuando tenga más experiencia.

Paquetes y Nodos

Como ya mencioné varias veces, ROS está pensado para funcionar con programas puntuales llamados nodos [5]. Los nodos se organizan en paquetes (packages [6]) que generalmente incluyen varios nodos de funciones similares o complementarias. Los paquetes también se puede organizar en stacks, pero eso ya es irse por las ramas para el alcance de este tutorial. Lo habitual es que el sistema de un robot utilice distintos nodos para ejecutar las tareas necesarias. Por ejemplo, un nodo puede encargarse de recibir imágenes de la cámara y publicarlas en un tópico particular, otro nodo puede leer las imágenes desde ese tópico y aplicar algún proceso de detección de objetos. Otro nodo puede leer los resultados de la detección de objetos y planificar una ruta, mientras que otro nodo leerá la ruta y aplicará los comandos de movimiento que seguirán esa ruta.

Para ejecutar un nodo, se llama la instrucción rosrun seguida del nombre del paquete y el nombre del nodo. Por ejemplo, cuando en el tutorial anterior se ejecutó el simulador de tortuga, se llamó:

rosrun turtlesim turtlesim_node

y se comenzó a ejecutar el simulador.

También se pueden pasar argumentos a los nodos que se ejecuten, por ejemplo en el nodo “image_view” del paquete “image_view” que se encarga de mostrar imágenes, se puede especificar el tópico en el que se están publicando las imágenes usando la forma:

rosrun image_view image_view image:=/camera/image

Rosnode

Rosnode [7] es una herramienta para obtener información de los nodos en ejecución. Imaginemos que está funcionando el nodo del simulador de tortuga. Si ejecutamos “rosnode list” podemos ver la lista de nodos en ejecución. En este caso mostraría:

/rosout
/turtlesim

(Nótese que el nombre con el que se registra un nodo no es necesariamente el mismo nombre con el que se ejecuta el nodo)

Ahora podemos usar “rosnode info turtlesim” y obtener información sobre los tópicos a los que publica el nodo, a los que está suscrito y los servicios que tiene abiertos.

--------------------------------------------------------------------------------
Node [/turtlesim]
Publications:
 * /turtle1/color_sensor [turtlesim/Color]
 * /rosout [rosgraph_msgs/Log]
 * /turtle1/pose [turtlesim/Pose]

Subscriptions:
 * /turtle1/cmd_vel [unknown type]

Services:
 * /turtle1/teleport_absolute
 * /turtlesim/get_loggers
 * /turtlesim/set_logger_level
 * /reset
 * /spawn
 * /clear
 * /turtle1/set_pen
 * /turtle1/teleport_relative
 * /kill

contacting node http://cronidea:36697/ ...
Pid: 8877
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound
    * transport: TCPROS

Existen otras opciones más con las que se puede usar rosnode. Para verlas todas, basta con escribir “rosnode” en la terminal.

Tópicos

Dentro de un robot (o una simulación), son muchos los datos que fluyen de manera constante. Imágenes, datos de acelerómetros, nubes de puntos, estados de motores, necesitan estar siendo publicados continuamente para que el sistema funcione en tiempo real. Especificar canales de comunicación cada vez que un nodo quiere enviarle datos de este tipo a otro nodo no sería eficiente por varias razones: habría que saber de antemano desde donde y hasta donde hay que enviar los datos, hay que controlar la sincronía de los envíos… Para evitar estos problemas, ROS posee una forma de comunicación del estilo Publish/Subscribe [9] en el que un elemento envía mensajes (los publica) y otro elemento recibe mensajes (se suscribe a ellos). En ROS esto se hace a través de tópicos [8]. Los tópicos son un medio de comunicación pensado en la transmisión asíncrona de mensajes. Todos los datos que tengan que ser publicados constantemente y estar disponibles para que otros nodos se publican a través de tópicos.

Los nodos son quienes abren y leen tópicos. Para poder leer o publicar en un tópico, el mensaje entregado tiene que tener un cierto tipo. Existen tipos predefinidos para comunicar distintos datos, como el “geometry_msgs/Twist” que es el mensaje estándar para comandos de movimiento, y también se pueden definir tipos de mensajes de acuerdo a las necesidades de la aplicación.

Rostopic

Rostopic [10] es la herramienta para interactuar con los tópicos de ROS. Tiene funciones similares a las de “rosnode” y otras que son propias de la naturaleza de los tópicos. Una de las funciones más comunes es “rostopic list” que nos muestra la lista de los tópicos abiertos. En este caso la ejecuté habiendo lanzado el simulador de tortuga y me mostró lo siguiente:

/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

“rostopic info” puede mostrar información de un tópico en particular, por ejemplo “rostopic info /turtle1/cmd_vel” muestra:

Type: geometry_msgs/Twist

Publishers: None

Subscribers:
 * /turtlesim (http://cronidea:49932/)

Como sabemos que el tópico cmd_vel de la tortuga recibe comandos del tipo geometry_msgs/Twist (también podríamos haberlo sabido llamando directamente a “rostopic type /turtle1/cmd_vel”), podemos publicar un mensaje en este tópico para que la tortuga se mueva. Para publicar un mensaje usamos “rostopic pub”.
Escribimos:

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

y verificamos que la tortuga del simulador se movió en la dirección indicada.

Figura 1: Tortuga moviéndose luego de un mensaje publicado en /turtle1/cmd_vel
Figura 1: Tortuga moviéndose luego de un mensaje publicado en /turtle1/cmd_vel

Para monitorear los mensajes publicados en un tópico, podemos usar “rostopic echo”. Antes de enviar el mensaje al simulador de la tortuga, ejecuté “rostopic echo /turtle1/cmd_vel” en una terminal y me mostró esto:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.8
---

Existen varias opciones más con las que se puede ejecutar rostopic. Para verlas todas basta con escribir “rostopic” en la consola.

Servicios

Existe otra forma de comunicación en la que sólo en ciertas ocasiones necesitamos que se ejecute un procedimiento o necesitamos que la llamada venga acompañada de una respuesta. Esto en ciertos contextos se llama Remote Procedure Call o RPC, que permite que procesos intercambien información de manera directa. En ROS esta forma de comunicación se lleva a cabo mediante los servicios.

Los servicios se definen mediante un nombre y dos tipos de servicio: uno de consulta y otro de respuesta.

Rosservice

Una de las formas en las que se puede llamar un servicio es mediante rosservice. Imaginemos que estamos corriendo el simulador de tortuga y que queremos añadir una tortuga más a la simulación. Si ejecutamos “rosservice list” podemos ver que hay un servicio “/spawn” abierto.

/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level

Ejecutando “rosservice info /spawn” podemos ver información sobre este servicio:

Node: /turtlesim
URI: rosrpc://cronidea:59998
Type: turtlesim/Spawn
Args: x y theta name

Ahí se puede ver que este servicio requiere 4 argumentos para llamarse, así que para generar una nueva tortuga podemos escribir:

rosservice call /spawn 5 7 1.57 William

Y tendremos una nueva tortuga llamada William en la simulación.

Figura 2: William, “el musculoso”, ha entrado en escena

Ahora, si llamamos a “rosservice list” podemos ver que se han habilitado servicios nuevos:

/William/set_pen
/William/teleport_absolute
/William/teleport_relative
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level

Podemos llamar a uno de ellos para cambiar la posición de William.

rosservice call /William/teleport_absolute 1 1 2.5

Y William juntará su Ki y se teletransportará.

Figura 3: William teletransportado
Figura 3: William teletransportado (It’s over 9000!)

Para ver todas las opciones de rosservice hay que llamarlo en la terminal.

Servidor de Parámetros

El servidor de parámetros es un espacio común para almacenar variables para todos los nodos. Es gestionado por el Master. Para ejemplificar el uso del servidor de parámetros es conveniente usar ejemplos más avanzados, por lo que los detalles pueden quedar para otra ocasión. Un ejemplo a grandes rasgos puede ser el lanzar un robot en simulación. Un robot se puede especificar en un archivo .xacro que es una sintaxis simplificada del estándar .urdf. Un nodo puede procesar el archivo .xacro y generar el .urdf correspondiente. Este archivo quedará en el servidor de parámetros, desde donde un nodo puede enviarlo al simulador. Así mismo en el servidor de parámetros se pueden guardar valores como por ejemplo las constantes PID del controlador de un motor.

Rosparam

Rosparam [12] es la herramienta estándar para interactuar con el servidor de parámetros desde la línea de comandos. Si llamamos a “rosparam list” vemos todos los parámetros almacenados. Al abrir el roscore se muestra algo así:

/rosdistro
/roslaunch/uris/host_cronidea__36626
/rosversion
/run_id

Lo mismo que antes: si queremos ver todas las opciones, escribimos rosparam en la consola.

Para ir cerrando

Así como para ir terminando el tutorial, estos son los elementos principales con los que se desarrollan las aplicaciones de ROS. Cuando se quieren desarrollar aplicaciones nuevas, generalmente el proceso consiste en implementar un paquete y programar sus nodos usando las bibliotecas disponibles de ROS (hasta donde sé, lo más común es trabajar con C++ y Python). Espero que a alguien le sea de utilidad este paseo por los elementos principales y que se motive a seguir aprendiendo. En tal caso, yo me motivaré a hacer más tutoriales.

Referencias

  1. Roscore: http://wiki.ros.org/roscore
  2. ROS Master: http://wiki.ros.org/Master
  3. ROS Parameter Server: http://wiki.ros.org/Parameter%20Server
  4. Rosout: http://wiki.ros.org/rosout
  5. ROS Nodes: http://wiki.ros.org/Nodes
  6. ROS Packages: http://wiki.ros.org/rosbuild/Packages
  7. Rosnode: http://wiki.ros.org/rosnode
  8. ROS Topics: http://wiki.ros.org/Topics
  9. Publish Subscribe Pattern: https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
  10. Rostopic: http://wiki.ros.org/rostopic
  11. ROS Parameter Server: http://wiki.ros.org/Parameter%20Server
  12. Rosparam: http://wiki.ros.org/rosparam

Entrando al mundo de la robótica contemporánea con ROS

En los últimos años, la robótica ha dado saltos tremendos que si bien, no ha alcanzado esas sociedades extremadamente automatizadas que nos muestra la ciencia ficción (R. Daneel Olivaw [1], la humanidad necesita tu apoyo), ha logrado grandes progresos y contribuciones y, de lo que trata el tema de hoy, ha motivado a más gente a entrar al mundo de la robótica.

Es común ver, cuando se habla de educación en robótica, que en carreras de orientación tecnológica y que no necesariamente son de especialización robótica se hacen talleres en los que los participantes pueden interactuar con pequeños robots, o armar los suyos propios con diversos sensores y actuadores. Esto es una experiencia altamente recomendable y disfrutable para personas con cualquier nivel de experiencia, incluso niños o personas sin formación en áreas tecnológicas. Pero cuando uno quiere profundizar e investigar en el área se pregunta, ¿cómo se puede cruzar esa barrera que separa el taller de robótica de la robótica comercial que uno ve en la TV o en internet? Bueno, hacer un primer acercamiento no es tan difícil.

Las personas que me conocen de cerca me habrán escuchado hablar en algunas ocasiones sobre el Software Libre y la importancia de las tecnologías abiertas. Aún hay quien dice que las tecnologías abiertas no son oportunidades para competir en el mercado… pero yo creo que a esas personas les falta un poco de visión de mundo. Basta considerar el hecho anunciado recientemente de que 486 de los 500 supercomputadores más rápidos del mundo funcionan con Linux [2][3]. Bajo mi perspectiva, vivimos en una sociedad tan interconectada que es imposible que un sólo individuo se adueñe de una idea. Las ideas complejas que benefician a mucha gente, se desarrollan desde una colectividad, ya que es en la colectividad dónde pueden nutrirse y refinarse a una velocidad que las hace usables. Así, vamos poco a poco pasando de una economía enfocada en productos (ideas desde un único agente) a una economía basada en servicios, o sea, “qué es lo que hacemos con una idea”. Y en el mundo de la robótica hace tiempo se dieron cuenta de esto, de que el avance es demasiado rápido como para intentar hacerlo todo desde un único lugar para poder competir. Así es como nació ROS, uno de los frameworks de robótica más robustos y populares en la actualidad.

ROS: Robotic Operating System

Los orígenes de ROS se remontan al Laboratorio de Inteligencia Artificial de Stanford y posteriormente su desarrollo fue acogido por la incubadora de robótica Willow Garage [4]. Estos esfuerzos han dado origen a una gran comunidad y a un conjunto de herramientas abiertas que permiten avanzar sin tener que reinventar la rueda.

Logo ROSTécnicamente, ROS no es un sistema operativo. Generalmente, se lo considera un middleware o un framework y ambas expresiones son más acertadas. Si hablamos de sistemas operativos, lo común es que asociemos ROS a Ubuntu, que es donde funcionan la mayoría de sus aplicaciones. Existen iniciativas para utilizar ROS junto a otros sistemas operativos, pero lo más común es usar ROS junto con Ubuntu (existen formas de instalarlo en Fedora, pero no todos los paquetes funcionan [5]), así que está de más decir que es un framework pensado para trabajar en Linux (¡yay!).

ROS funciona en un sistema basado en nodos. Tenemos un nodo maestro que gestiona las comunicaciones entre los distintos nodos que se van conectando. Cada nodo puede ser un programa que implemente las bibliotecas de ROS y desarrolle una función puntual, así se logran diseños modularizados en los que el sistema general no depende de manera crítica en la presencia de un componente (“Por una yegua coja no vamos a perder la trilla.”). Y esto último es algo fundamental en la robótica, ya que el sistema debe ser robusto a errores imprevistos. Incluso, los nodos pueden ejecutarse en varias máquinas para aligerar el cómputo y desarrollarlo de manera distribuida.

rqt_graph: aplicación de ROS que permite ver los nodos funcionando y su comunicación mediante los tópicos
Figura 1: rqt_graph, una aplicación de ROS que permite ver los nodos funcionando y su comunicación mediante los tópicos

La comunicación en ROS se realiza mediante tópicos y servicios. Los tópicos son canales de comunicación al estilo publisher-subscriber [6]. Un nodo puede abrir un tópico en el que publica un tipo de dato particular. Por ejemplo, yo tengo un dron Parrot AR.Drone 2.0 (ya hablaré de esa criatura, ahora que llegó su repuesto y puedo volver a usarlo <3) que mediante un nodo llamado ardrone_autonomy [7] puede publicar las imágenes que se reciben del dron en el tópico ardrone/front/image_raw. Luego otra aplicación se comporta como suscriptor de ese tópico y lee los datos publicados. Así se separa el proceso de producir datos y de procesarlos, lo que hace posible el que los distintos nodos estén desarrollados en distintos lenguajes de programación. Existen tipos de datos predefinidos para levantar tópicos para las distintas labores habituales en la comunicación en robótica, ya sea recibir datos de sensores o publicar comandos de control. Además, se pueden definir nuevos tipos de mensajes de acuerdo a las necesidades particulares de cada aplicación.

Los servicios son interfaces que un nodo abre a una determinada función. Otro nodo cliente, puede realizar una llamada a un servicio y solicitar que otro nodo realice una tarea, e incluso que envíe cierta información de vuelta. A diferencia de los tópicos, que están constantemente publicando independientemente de si son leídos o no, los servicios funcionan de acuerdo a cuando son llamados. Un ejemplo de servicio es el abierto por el simulador Gazebo, que permite reiniciar una simulación, devolviendo todos los robots instanciados a sus posiciones originales; para ejecutarlo, basta con hacer una llamada a /gazebo/reset_simulation. También hay tipos de mensajes para los servicios y se pueden desarrollar otros nuevos.

Además, ROS cuenta con diversas herramientas que ayudan a trabajar sobre esta arquitectura orientada a nodos. Por ejemplo, están las herramientas rqt, como rqt_graph (Figura 1) que permite ver un grafo con todos los nodos funcionando y los tópicos como flechas desde los nodos que publican hacia los nodos que están suscritos.

También ROS cuenta con un servidor de parámetros que guarda variables y datos que sean comunes a todo el entorno que se está ejecutando, como por ejemplo el modelo de un robot que se esté simulando o las especificaciones de un robot real con el que se esté conectado.

Instalar ROS

El desarrollo de ROS se ha enfocado fuertemente en Ubuntu como plataforma principal. Existen otras plataformas sobre las que se puede instalar [8], pero yo tengo una instalación sobre Ubuntu, así que sobre esta puedo hablar con conocimiento de causa. ROS se basa en distribuciones, que son cambios mayores en sus herramientas principales junto con conjuntos de paquetes compatibles con estas herramientas. Las distribuciones llevan nombres de acuerdo a las letras del abecedario y sus logos tienen que ver con tortugas (creo que tiene que ver con que el ejemplo más básico en ROS se basa en gráficos de tortuga [9]). La versión actual es Jade Turtle, pero yo tengo instalada la versión anterior, que es Indigoo Igloo y es una de las versiones con más soporte (y sobre la que se desarrollaron unos módulos para el dron con los que quiero empezar a trabajar). Para comenzar, yo creo que es recomendable instalar cualquiera de las dos ya que la mayoría del desarrollo se ha estandarizado. Por ahora, para seguir con el conocimiento de causa, vamos con Indigo.

Instalar ROS en Ubuntu es relativamente sencillo si se hace instalando desde los repositorios. Se puede instalar desde los archivos fuente, pero no se recomienda a menos que la ocasión lo requiera. Los pasos de la instalación se pueden encontrar en inglés en [11].

Mi versión de Ubuntu es la 14.04.2 (Trusty Tahr). Indigo es compatible con las versiones 13.10 y 14.04.

Para comenzar la instalación, hay que asegurarse de que los repositorios permitan la instalación desde los componentes “restricted”, “universe” y “multiverse”. En mi instalación venían habilitados por defecto, así que no tuve que hacer ningún cambio. En caso de necesitar configurarlos, se pueden seleccionar en “Sistema > Administración > Orígenes del Software”o revisar el artículo [10].

Luego se configura el sistema para que acepte paquetes desde packages.ros.org y se acepta su clave:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116

Es conveniente revisar que el índice de paquetes esté actualizado ejecutando:

sudo apt-get update

Luego, basta instalar el paquete que incluye todas las aplicaciones de ROS. El paquete más completo, y el que yo instalé, es ros-indigo-desktop-full que incluye todas las herramientas gráficas y las bibliotecas genéricas de robótica.

sudo apt-get install ros-indigo-desktop-full

También existen alternativas que incluyen menos cosas (porque creo recordar que esa versión pesaba como un giga) como ros-indigo-desktop y ros-indigo-ros-base.

sudo apt-get install ros-indigo-desktop

Además, se pueden instalar los paquetes de manera individual de la forma:

sudo apt-get install ros-indigo-NOMBRE_DEL_PAQUETE

Para gestionar las dependencias de paquetes de ROS que vayamos a instalar, se debe instalar rosdep. Esto sirve cuando vayamos a probar algún paquete descargado como código fuente.

sudo rosdep init
rosdep update

Para dejar el sistema listo para usar, hay que registrar las variables de entorno de ROS. Esto se puede hacer añadiendo un archivo de configuración predeterminado al final del archivo .bashrc.

echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc

Para seleccionar las variables de entorno de una versión particular de ROS, se puede ejecutar source con el archivo predeterminado.

source /opt/ros/indigo/setup.bash

Otro paquete conveniente de instalar es rosinstall que permite instalar aplicaciones y gestionar sus dependencias de manera más automática.

sudo apt-get install python-rosinstall

Para verificar que todo está instalado y funcionando, abrimos una terminal y escribimos “roscore” y presionamos Enter. Deberíamos ver lo siguiente:

... logging to /home/bruno/.ros/log/70729674-2d80-11e5-9a3d-b803058568da/roslaunch-cronidea-3040.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is &lt;1GB.

started roslaunch server http://cronidea:60080/
ros_comm version 1.11.13

SUMMARY
========

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.13

NODES

auto-starting new master
process[master]: started with pid [3053]
ROS_MASTER_URI=http://cronidea:11311/

setting /run_id to 70729674-2d80-11e5-9a3d-b803058568da
process[rosout-1]: started with pid [3066]
started core service [/rosout]

Esto significa que lanzamos el nodo principal (master) de ROS y sus componentes, y que ahora podemos empezar a abrir otros nodos.

Un primer ejemplo de funcionamiento

Para usar ROS, es necesario que esté corriendo el roscore. Si lo hicimos funcionar como se mencionó recién, ahora abrimos otra consola y lanzamos el nodo del simulador de tortuga. Este simulador dibuja una tortuga en la pantalla y queda a la escucha de comandos de control para moverla en dos dimensiones. Esta tortuga recibe mensajes del tipo “Twist” en el tópico “/turtle1/cmd_vel”, que es el tipo de mensajes estándar que se utiliza para controlar un robot. Puede servir para hacer demostraciones o incluso poner a prueba ciertos algoritmos.

Para lanzar el simulador de tortuga, escribimos:

rosrun turtlesim turtlesim_node

Las aplicaciones de ros se organizan en paquetes, los que pueden contener varios nodos. En este caso “rosrun” busca en el paquete “turtlesim” el nodo “turtlesim_node”. Si todo funciona bien, deberíamos ver en la consola algo como:

[ INFO] [1437246767.585809489]: Starting turtlesim with node name /turtlesim
[ INFO] [1437246767.603619905]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

y una imagen con el simulador funcionando.

Figura 2: turtlesim_node funcionando
Figura 2: turtlesim_node funcionando

Al lanzar el simulador de tortuga, se abrirán nuevos tópicos. El simulador abre el tópico mencionado antes “/turtle1/cmd_vel” en el que recibe comandos de movimiento, y dos tópicos más: “/turtle1/color_sensor” y “/turtle1/pose” en los que publica el color del pixel en el que está y la posición que tiene en la imagen. Para ver los tópicos actualmente abiertos, se puede ejecutar en otra terminal:

rostopic list

y aparecerá algo como:

/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

Ahora que la tortuga está suscrita a un tópico en el que recibe comandos, podemos publicar comandos a ese tópico. Para hacer un primer ejemplo, usaremos el nodo “turtle_teleop_key” que viene en el paquete “turtlesim”. Este nodo recibe las entradas de las flechas del teclado y publica mensajes para controlar la tortuga.

rosrun turtlesim turtle_teleop_key

Deberíamos ver:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.

Usando las teclas, la tortuga comenzará a moverse.

Figura 3: turtlesim_node recibiendo comandos de control
Figura 3: turtlesim_node recibiendo comandos de control

Si abrimos otra consola y lanzamos rqt_graph, podemos ver todos los nodos funcionando y sus respectivos tópicos.

rosrun rqt_graph rqt_graph
Figura 4: rqt_graph con los nodos y tópicos de la tortuga
Figura 4: rqt_graph con los nodos y tópicos de la tortuga

Dónde seguir

En este tutorial, mostré un poco sobre cómo funciona ROS, uno de los frameworks de robótica más populares en la actualidad. Para ver su popularidad, basta considerar la cantidad de robots del DARPA Robotics Challenge que lograron grandes resultados usándolo (18 de 23 equipos [12]). Estos mismos principios mostrados en el breve ejemplo de la tortuga, son los que subyacen a toda la arquitectura de ROS y permiten desarrollar complejas aplicaciones distribuidas de alto desempeño.

Para seguir aprendiendo, los pasos siguientes son profundizar en los nodos, los tópicos, los servicios y aplicaciones como el simulador Gazebo o el visualizador RViz. Un buen punto de partida son los tutoriales oficiales de ROS [13]. Además, pretendo hacer más tutoriales para ir profundizando en varios temas que he aplicado.

Referencias

  1. R. Daneel Olivaw en Wikipedia: https://es.wikipedia.org/wiki/R._Daneel_Olivaw
  2. “It’s Official: Linux is the King of Supercomputing”: http://fossbytes.com/supercomputer-operating-system-linux/
  3. Top 500 Supercomputers: http://www.top500.org/statistics/details/osfam/1
  4. Historia de ROS: http://www.ros.org/history/
  5. Instalando ROS en Fedora 19: http://www.jann.cc/2013/04/29/building_ros_on_fedora_19.html
  6. Patrón Publisher-Subscriber: https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
  7. Nodo ROS ardrone_autonomy: http://ardrone-autonomy.readthedocs.org/en/latest/
  8. Instalación de ROS Indigo: http://wiki.ros.org/indigo/Installation
  9. Gráficas Tortuga: https://es.wikipedia.org/wiki/Gr%C3%A1ficas_tortuga
  10. Repositorios de Ubuntu: http://doc.ubuntu-es.org/Repositorios_desde_Ubuntu
  11. Instalación de ROS en Ubuntu: http://wiki.ros.org/indigo/Installation/Ubuntu
  12. ROS y la revolución en la robótica: http://www.zdnet.com/article/long-live-ros-why-the-robotics-revolution-is-being-driven-by-open-source-development/
  13. Tutoriales de ROS: http://wiki.ros.org/ROS/Tutorials/