Download XRemoteBot - jatic 2016
Document related concepts
no text concepts found
Transcript
II JORNADAS ARGENTINAS DE TECNOLOGÍA, INNOVACIÓN Y CREATIVIDAD 2016– TRABAJO DE ESTUDIANTE XRemoteBot Fernando López; Claudia Banchoff; Claudia Queiruga Facultad de Informática - UNLP, Argentina {flopez,cbanchoff,cqueiruga}@linti.unlp.edu.ar Innovación educativa basada en la tecnología Resumen Este artículo se basa en la tesina de grado presentada por Fernando López en el año 2015 con la dirección de Claudia Banchoff y Claudia Queiruga. La tesina consistió en el desarrollo del sistema XRemoteBot, documentación del proceso de desarrollo y fundamentación de algunas decisiones de diseño tomadas. XRemoteBot es una aplicación que permite programar robots en diferentes lenguajes de programación de forma remota a través de Internet. En el presente artículo se brinda una descripción del sistema cliente-servidor XRemoteBot, las motivaciones de su creación y algunos detalles de su implementación. Este sistema está pensado para ser utilizado en cursos de programación introductorios para compartir robots entre distintas instituciones. También oculta las distintas APIs “oficiales” de los robots usados bajo una API web genérica que expone las funcionalidades principales compartidas entre los robots didácticos más comunes. Esta API web permite implementar librerías cliente para programar los robots usando diferentes lenguajes de programación. El sistema presentado en la tesina consistió del servidor y tres bibliotecas para programar los robots en Python, Ruby y Javascript. Palabras clave: Enseñanza de programación de computadoras, programación de robots, cursos online, control remoto de dispositivos des: ¿cómo pueden las instituciones que no cuentan Introducción Desde 2009, en el contexto del proyecto “Pro- con robots, acceder a los mismos? y, ¿cómo optimi- gramando con robots y software libre”, se utilizan zar la comunicación entre el robot y la computado- robots para enseñar programación en escuelas se- ra de manera tal de evitar adquirir tantos módulos cundarias usando el lenguaje Python. de comunicación XBee como robots2 ? A lo largo del proyecto se utilizaron dos robots XRemoteBot, fue diseñado para afrontar am- diferentes, con distintas características de hardware bos requerimientos, proveyendo una arquitectura pero con funcionalidades muy parecidas: los robots cliente-servidor que permite tanto compartir robots Scribbler de Parallax y los robots Multiplo N6 de a través de Internet, como también compartir el RobotGroup. El cambio se debió a la facilidad de uso de un único dongle XBee que permita contro- la adquisición de estos últimos y de estar basados lar múltiples robots desde múltiples computadoras 1 en hardware libre . Ambos robots pueden ser controlarlos de forma inalámbrica programándolos en Python [Díaz et al., 2012]. En el desarrollo de las distintas actividades realizadas con los robots se presentaron dos inquietu1 https://www.kickstarter.com/projects/ 1689254125/multiplo-create-your-own-robot/ description en la red local. XRemoteBot provee una API genérica y extensible que permite controlar tanto robots Multiplo 2 Cabe aclarar que el costo de estos módulos con su correspondiente adaptador USB representa una parte importante del costo total del robot y que al momento de confeccionar la tesina la empresa proveedora de los mismos aseguraba que ya no era posible adquirir estos módulos en el país por las restricciones aduaneras de la época. II JORNADAS ARGENTINAS DE TECNOLOGÍA, INNOVACIÓN Y CREATIVIDAD 2016– TRABAJO DE ESTUDIANTE N6 como Scribblers. Esto es posible ya que ambos el sistema, solicitar una clave (una api_key) pa- robots cuentan con características similares al po- ra poder controlar robots con alguno de los clien- seer dos ruedas con motores de corriente continua, tes disponibles, visualizar los robots vía streaming al menos un sensor de obstáculos y sensores infra- de video y programarlos con el cliente Javascript. rrojos que permiten detectar cambios de contraste Además cuenta con algunas guías de uso para los en el suelo para programar, por ejemplo, seguidores distintos clientes. Esta interfaz web se puede ver de línea. en la figura 1. Desarrollo A XRemoteBot está compuesto por un servidor es- C crito en el lenguaje de programación Python y tres clientes escritos en Python, Ruby y Javascript. D El servidor de XRemoteBot provee una API B JSON para interactuar con robots didácticos de forma remota y compartiendo un único enlace físico – A: Area de texto para codificar. con los robots. Está implementado en Python usan- – B: Area que simula una consola. Los programas puedan imprimir texto en este área. do el framework web Tornado [Dory et al., 2012], – C: Transmisión de video. Muestra los robots en tiempo real. SQLAlchemy3 para acceder a la base de datos y los – D: Caja de “tips” o consejos. 4 5 módulos DuinoBot y Myro para la comunicación Figura 1: Interfaz web de XRemoteBot con los robots. El cliente Javascript de XRemoteBot se encuen- El servidor es además, el responsable de comuni- tra integrado con el servidor y puede ser utilizado carse con los robots y manejar un sistema de usua- desde una vista web provista por el mismo. Los rios y de reserva de robots que evita que dos usua- clientes Python y Ruby son independientes y per- rios envíen instrucciones al mismo robot al mismo miten crear programas que se ejecuten desde fuera tiempo. del navegador para enseñar a programar en estos El servidor puede configurarse modificando un lenguajes usando un entorno de programación tra- archivo denominado configuration.py, permi- dicional. tiendo dos modalidades de uso: “servidor público” XRemoteBot es un rediseño y una reescritura 6 y “servidor no público”. completa de RemoteBot , un servidor simple rea- La modalidad “servidor público” permite el ac- lizado como aplicación auxiliar de una aplicación ceso remoto a los robots. En esta modalidad es 7 Android desarrollada como trabajo final para la necesario contar con una api_key para controlar materia Laboratorio de Software [Queiruga et al., a los robots y se habilita un sistema de reservas 2013]. El servidor XRemoteBot posee una inter- temporales, que permite solamente a un usuario faz web que puede ser utilizada para registrarse en controlar a un robot en un determinado momen- 3 http://www.sqlalchemy.org/ 4 https://github.com/Robots-Linti/duinobot/ blob/master/README.md 5 http://wiki.roboteducation.org/Myro 6 https://github.com/fernandolopez/remotebot 7 https://github.com/fernandolopez/ remotebot4Android to. Adicionalmente pueden transmitirse vía streaming los movimientos del robot en la misma interfaz web. El esquema de conexión planteado para esta modalidad se puede ver en la figura 2a. II JORNADAS ARGENTINAS DE TECNOLOGÍA, INNOVACIÓN Y CREATIVIDAD 2016– TRABAJO DE ESTUDIANTE Python Internet Ruby Javascript en un browser Python Ruby Javascript en un browser Código 1: Ejemplo con XRemoteBot para Python menu menu (a) Esquema de conexión (b) Esquema de conexión de XRemoteBot en modo de XRemoteBot en modo “servidor público” “servidor no público” Figura 2: Esquema de conexión de XRemoteBot require 'xremotebot ' s = XRemoteBot :: Server.new('servidor ', ,→ 8000, 'api', 'api_key ') r = Robot.new s, s.fetch_robot r.forward 100, 1 En la modalidad “servidor no público” no es necesario ningún tipo de autenticación para utilizar los robots y se deshabilita el sistema de reservas, r.turnLeft 50, 2 print r.getObstacle Código 2: Ejemplo usando XRemoteBot para Ruby de esta manera un usuario puede utilizar cualquier robot, incluso uno que esté en uso por otro usuario. var s = new Server('servidor :8000 ', 'api - Esta modalidad está pensada para el uso en el aula, utilizando una única computadora conectada a los robots a través de XBee o Bluetooth. Se puede ver ,→ key'); s.onConnect(function (){ s.fetch_robot ().then(function(robot_obj){ var r = new Robot(s, robot_obj); el esquema de conexión esperado en la figura 2b. r.forward (100, 1); Cabe destacar que en esta modalidad, si se desha- r.turnLeft (50, 2); bilita el streaming de video, el servidor puede ser r.getObstacle ().then(function(obstacle) ,→ { la computadora de uno de los alumnos, ya que el println(obstacle); servidor requeriría muchos menos recursos. Al diseñar e implementar los clientes de XRemoteBot se intentó mantener el estilo de programación del módulo DuinoBot original de la forma }); }); }); Código 3: Ejemplo de XRemoteBot en Javascript más fiel posible. Aunque en el caso del cliente Javascript, por limitaciones del entorno, no se logró Los códigos anteriores representan un ejemplo imitar este estilo tan fielmente como en los otros típico de uso de los robots: reservan un robot, lo clientes. mueven hacia adelante a velocidad máxima por 1 Los clientes de Python y Ruby poseen una API segundo, lo hacen girar a izquierda a velocidad me- muy similar cómo se puede ver en los códigos de dia durante 2 segundos y finalmente muestran un ejemplo 1 y 2. Esto permite adaptar los manuales valor booleano que indica si existe algún obstáculo y materiales de programación del proyecto “Pro- enfrente del robot. gramando con robots y software libre” fácilmente para poder reutilizarlos con XRemoteBot. from xremotebot import * s = Server('ws:// servidor :8000/ api', ' ,→ api_key ') r = Robot(s, s.fetch_robot ()) r.forward (100, 1) Los movimientos, que pueden recibir por parámetro un tiempo de demora, se implementan en estos clientes utilizando dos mensajes (uno que comienza el movimiento y otro que lo detiene), para pausar la ejecución el tiempo indicado se utilizan la función time.sleep() de Python y el méto- r.turnLeft (50, 2) do Kernel.sleep de Ruby, estas rutinas suspen- print(r.getObstacle ()) den la ejecución del hilo actual durante el núme- II JORNADAS ARGENTINAS DE TECNOLOGÍA, INNOVACIÓN Y CREATIVIDAD 2016– TRABAJO DE ESTUDIANTE ro de segundos que se envíe como parámetro8 9 . enfoques son distintos y no apuntan a los mismos Lamentablemente no es posible emular fácilmente objetivos que XRemoteBot. este comportamiento en Javascript debido a que Al evaluar el diseño del protocolo de comunica- las operaciones bloqueantes afectan a la interfaz ciones de capa de aplicación para XRemoteBot se del navegador. Esto generó que la API del cliente decidió utilizar información estructurada represen- Javascript sea considerablemente distinta a las de tada en algún protocolo de serialización estándar. los otros clientes. Se realizó un esfuerzo para si- Por esto se relevó el protocolo JSON [ECMA, 2013] mular el comportamiento de la API DuinoBot en junto con los protocolos de serialización BSON16 Javascript como se puede ver en el ejemplo 3 pe- y CBOR [IETF, 2013] de estructura similar pero ro este código no es semánticamente equivalente a con formato binario a fin de evaluar si hay alguna los anteriores ya que solamente se garantiza la de- diferencia de desempeño significativa entre JSON mora en la ejecución de las instrucciones entre los y estos formatos. En la evaluación se priorizó el métodos del robot. Para realizar una pausa en la desempeño en Javascript, donde no hubo grandes ejecución entre métodos del robot e instrucciones diferencias en los tiempos se serialización y deseria- regulares de Javascript es necesario utilizar la API lización, siendo JSON el más rápido de los formatos de Promises10 [ECMA, 2015], como se muestra en en las pruebas realizadas. la invocación a Robot#getObstacle(), donde se A fin de soportar clientes Javascript ejecutándo- ejecuta println() luego de obtener la lectura del se en navegadores web se eligió usar el protocolo sensor de obstáculos del robot. WebSocket [Wang et al., 2013] para la comunicación entre los clientes y el servidor. Esto llevó a la Proceso de implementación de la innovación elección del framework web Tornado para Python, En una primer etapa se relevaron algunas alter- combinando peticiones HTTP normales con Web- nativas existentes para controlar robots o micro- que es adecuado para comunicaciones asincrónicas Sockets. controladores de forma remota, para determinar si El protocolo de capa de aplicación diseñado co- existen herramientas que aborden el mismo proble- difica en el formato JSON una serie de campos que ma y para analizar sus diseños. permite simular el pasaje de mensajes como en un Se evaluaron los proyectos Educabot11 , Gobot12 , 13 14 Cylon.js , VCar 15 lenguaje orientado a objetos, en la misma se iden- y Tele Toyland . Todos estos tifica al receptor del mensaje, al método a invocar proyectos presentan distintas formas de conectarse y se envía un arreglo de argumentos. Además el e interactuar con robots y con otros dispositivos protocolo contempla su uso en APIs para WebSoc- (como en el caso de Tele Toyland), sin embargo sus kets asincrónicas como la de Javascript identifican- 8 https://docs.python.org/2/library/time.html# time.sleep 9 http://ruby-doc.org/core-2.2.3/Kernel.html# method-i-sleep 10 https://developer.mozilla.org/en/docs/Web/ JavaScript/Reference/Global_Objects/Promise 11 http://www.educabot.org/ 12 http://gobot.io 13 http://cylonjs.com/ 14 http://www.hellspark.com/new/css/vcar/vcar. html 15 http://www.teletoyland.com do cada mensaje y respuesta con un identificador numérico que permite asociarlos. Las respuestas a estos mensajes pueden representar un valor retornado por la operación o un error, que opcionalmente los clientes pueden convertir en una excepción. El hecho de modelar el protocolo de esta forma 16 http://bsonspec.org/ II JORNADAS ARGENTINAS DE TECNOLOGÍA, INNOVACIÓN Y CREATIVIDAD 2016– TRABAJO DE ESTUDIANTE permite que sea fácilmente extensible agregando no disponen de robots para el desarrollo de su prác- nuevas entidades y métodos. tica y aquellas que aún contando con los robots podrían realizar actividades en forma remota. Resultados Todos los desarrollos implementados se han publicado con una licencia MIT y pueden ser descargados desde el sitio GitHub17 . Referencias Dory, M., Parrish, A., and Berg, B. (2012). Introduction to Tornado. O’Reilly Media, Inc. Los distintos clientes incorporados en este traba- Díaz, J. F., Banchoff Tzancoff, C. M., Martin, S., jo permiten programar los robots en cualquier pla- and López, F. (2012). Aprendiendo a programar taforma donde se puedan ejecutar sus intérpretes con juegos y robots. (abarcando computadoras con los sistemas opera- http://hdl.handle.net/10915/19307. tivos GNU/Linux, *BSD, Windows y Mac). XRemoteBot fue desarrollado con tecnologías abiertas y diseñado especialmente para cubrir una necesidad real planteada por escuelas que se contactaron interesadas en el proyecto “Programando con robots y software libre”. Se implementaron ECMA (2013). ECMA-404: The JSON Data Interchange Format. First edition. http://www.ecma-international.org/ publications/standards/Ecma-404.htm. ECMA (2015). ECMA-262: ECMAScript 2015 clientes para tres lenguajes de programación: Pyt- Language Specification. Sixth (draft march 17, hon, Ruby y Javascript, que permiten ampliar los 2015) edition. alcances del proyecto. Por un lado incorporando http://wiki.ecmascript.org/doku.php? nuevos lenguajes de programación para programar id=harmony:specification_drafts. los robots y por otro lado, sirviendo como medio alternativo de acceso a cursos de programación de robots. Conclusiones IETF (2013). RFC 7049 - Concise Binary Object Representation (CBOR). http://tools.ietf.org/html/rfc7049. Queiruga, C. A., Banchoff Tzancoff, C. M., and Ló- XRemoteBot es un dispositivo educativo que pez, F. (2013). RemoteBot: una aplicación que contribuye a una de las líneas de investigación del combina robots y dispositivos móviles. http:// LINTI vinculada con acercar la programación a la sedici.unlp.edu.ar/handle/10915/27274. escuela. El servidor fue diseñado para agregar fácilmente soporte para nuevos robots, principalmente si los mismos están equipados con sensores y mecanismos de locomoción similares a los robots soportados originalmente. Este trabajo permite la incorporación de nuevos destinatarios del proyecto, entre ellos escuelas que 17 http://github.com/fernandolopez/xremotebot y http://github.com/fernandolopez/ xremotebot-clients Wang, V., Salim, F., and Moskovits, P. (2013). The Definitive Guide to HTML5 WebSocket. Apress, Berkely, CA, USA, 1st edition.