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.