Diferencia entre revisiones de «Java»
(No se muestran 13 ediciones intermedias de otro usuario) | |||
Línea 15: | Línea 15: | ||
Dada la gran comunidad de programadores Java, puede ser de interés para muchos manejar el robot mediante dicho lenguaje. Por esta razón, el objetivo del trabajo fue traducir al lenguaje Java las funciones necesarias para el manejo del robot butiá. Dichas funciones se encuentran implementadas en el lenguaje Python actualmente. | Dada la gran comunidad de programadores Java, puede ser de interés para muchos manejar el robot mediante dicho lenguaje. Por esta razón, el objetivo del trabajo fue traducir al lenguaje Java las funciones necesarias para el manejo del robot butiá. Dichas funciones se encuentran implementadas en el lenguaje Python actualmente. | ||
Además se implementaron ejemplos básicos de manejo del robot para mostrar cómo utilizar la nueva API. | Además se implementaron ejemplos básicos de manejo del robot para mostrar cómo utilizar la nueva API. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Línea 34: | Línea 20: | ||
Antes de comenzar con la implementación de la API en Java se investigaron algunas cosas que se debían utilizar. | Antes de comenzar con la implementación de la API en Java se investigaron algunas cosas que se debían utilizar. | ||
− | Por un lado se realizó un estudio básico del lenguaje Python para poder entender la sintáxis de dicho lenguaje. Esto era necesario para poder | + | Por un lado se realizó un estudio básico del lenguaje Python para poder entender la sintáxis de dicho lenguaje. Esto era necesario para poder comprender correctamente el comportamiento de las funciones que se debían traducir. |
Por otro lado se estudió el manejo básico de sockects, necesario para que el cliente (Java) se comunicara con el servidor (Python). | Por otro lado se estudió el manejo básico de sockects, necesario para que el cliente (Java) se comunicara con el servidor (Python). | ||
+ | ==Desarrollo== | ||
− | + | Primero se analizaron los archivos en Python, para luego comenzar a traducir las funciones al lenguaje Java. Durante la implementación, se trató en todo momento que el código fuera lo más similar posible al código en Python. Algunas cosas no fueron posibles realizarlas de forma similar dada las diferencias en los lenguajes. Un ejemplo de esto es la sintáxis utilizada en Python para establecer los parámetros de una función, donde se pueden definir parámetros opcionales. En Java, se debe sobrescribir la función para las distintas cantidades de parámetros que se requieran. | |
− | + | A continuación se muestra un ejemplo de una función en Python y luego su traducción en Java. Esta función realiza la comunicación con el servidor, ejecutando un comando desde el cliente: | |
− | + | ||
− | A continuación se muestra un ejemplo de una función en Python y luego | + | |
'''Cliente Python:''' | '''Cliente Python:''' | ||
Línea 96: | Línea 81: | ||
} | } | ||
</source> | </source> | ||
− | |||
==¿Cómo utilizar la API en Java?== | ==¿Cómo utilizar la API en Java?== | ||
Línea 119: | Línea 103: | ||
java -jar javabot_robedu.jar | java -jar javabot_robedu.jar | ||
− | Una vez levantado el cliente, pueden ingresarse los diferentes comandos para comunicarse con el | + | Una vez levantado el cliente, pueden ingresarse los diferentes comandos para comunicarse con el servidor y manejar el robot. |
[https://www.youtube.com/watch?v=_7E9b8iP8CI Aquí] puede verse un video ejemplo, donde se manejan los motores de butiá mediante el cliente java. | [https://www.youtube.com/watch?v=_7E9b8iP8CI Aquí] puede verse un video ejemplo, donde se manejan los motores de butiá mediante el cliente java. | ||
Línea 125: | Línea 109: | ||
java -jar javabot_robedu.jar localhost puerto | java -jar javabot_robedu.jar localhost puerto | ||
− | |||
− | |||
=== Importando el jar y utilizando las funciones === | === Importando el jar y utilizando las funciones === | ||
Línea 150: | Línea 132: | ||
Luego, para utilizar la funciones debe hacerse: | Luego, para utilizar la funciones debe hacerse: | ||
− | + | ButiaFunctions robot = new ButiaFunctions(cliente); | |
A continuación se muestran algunas de las funciones sobre los sensores: | A continuación se muestran algunas de las funciones sobre los sensores: | ||
Línea 162: | Línea 144: | ||
'''Opción 2:''' | '''Opción 2:''' | ||
+ | |||
Si no se especifica el cliente, se asume que por defecto el servidor está en localhost:2009. Para utilizar las funciones hacer: | Si no se especifica el cliente, se asume que por defecto el servidor está en localhost:2009. Para utilizar las funciones hacer: | ||
Línea 170: | Línea 153: | ||
robot.getButton(port, board) | robot.getButton(port, board) | ||
+ | == Ejemplos básicos == | ||
− | = | + | === Realizando un cuadrado === |
− | + | ||
− | == Realizando un cuadrado == | + | |
A continuación se muestra el código necesario para realizar un cuadrado con la API. | A continuación se muestra el código necesario para realizar un cuadrado con la API. | ||
Línea 179: | Línea 161: | ||
<source lang="java"> | <source lang="java"> | ||
− | < | + | import functions.ButiaFunctions; |
+ | try { | ||
+ | ButiaFunctions robot = new ButiaFunctions(); // POr defecto servidor en localhost, puerto 2009. | ||
+ | for(int i=0; i<4; i++){ | ||
+ | robot.set2MotorSpeed(0, 400, 0, 400, 0); | ||
+ | sleep(100); | ||
+ | robot.set2MotorSpeed(1, 400, 0, 400, 0); | ||
+ | sleep(10); // Calibrar | ||
− | == Seguidor de líneas == | + | } |
+ | |||
+ | } catch (InterruptedException ex) { | ||
+ | |||
+ | Logger.getLogger(javabot_client.class.getName()).log(Level.SEVERE, null, ex); | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | === Seguidor de líneas === | ||
A continuación se muestra el código necesario para realizar un seguidor de líneas con la API . | A continuación se muestra el código necesario para realizar un seguidor de líneas con la API . | ||
Línea 187: | Línea 186: | ||
<source lang="java"> | <source lang="java"> | ||
− | + | import functions.ButiaFunctions; | |
+ | |||
+ | ButiaFunctions robot = new ButiaFunctions(); // POr defecto servidor en localhost, puerto 2009. | ||
+ | |||
+ | //Codigo seguidor de lineas. | ||
+ | |||
+ | boolean run = true; | ||
+ | while (run){ | ||
+ | try { | ||
+ | while (robot.getGrey(1, 0)<31000 && robot.getGrey(4, 0)<25000){ // Calibrar. | ||
+ | robot.set2MotorSpeed(0, 400, 0, 400, 0); | ||
+ | sleep(100); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
+ | while(robot.getGrey(1, 0)>=31000){ // Si es negro | ||
+ | robot.set2MotorSpeed(0, 400, 1, 400, 0);//giro a la derecha | ||
+ | sleep(10); | ||
+ | } | ||
+ | |||
+ | while(robot.getGrey(4, 0)>=25000){ // Si es negro | ||
+ | robot.set2MotorSpeed(1, 400, 0, 400, 0);//giro a la izquierda | ||
+ | sleep(10); | ||
+ | } | ||
+ | |||
+ | } catch (InterruptedException ex) { | ||
+ | Logger.getLogger(javabot_client.class.getName()).log(Level.SEVERE, null, ex); | ||
+ | } | ||
+ | |||
+ | } | ||
− | <source> | + | </source> |
[https://www.youtube.com/watch?v=IIIS_nr5jaU Aquí] se muestra un video del paso a paso para realizar el seguidor de líneas en NetBeans, mostrando cuáles son las importaciones que hay que hacer para utilizar la API. | [https://www.youtube.com/watch?v=IIIS_nr5jaU Aquí] se muestra un video del paso a paso para realizar el seguidor de líneas en NetBeans, mostrando cuáles son las importaciones que hay que hacer para utilizar la API. | ||
[https://www.youtube.com/watch?v=MtHbW-hjnZY Aquí] se muestra un video del seguidor de líneas realizado en el video anterior con la API Java. | [https://www.youtube.com/watch?v=MtHbW-hjnZY Aquí] se muestra un video del seguidor de líneas realizado en el video anterior con la API Java. | ||
+ | |||
+ | |||
+ | |||
+ | ==Anexo== | ||
+ | |||
+ | ===Actas=== | ||
+ | ===3 de junio de 2015=== | ||
+ | * Fueron planteadas las principales características del proyecto. | ||
+ | * Se habló sobre cuáles eran los archivos de la API en Python que se necesitaban traducir. Se recomendó analizar el archivo functions.py. Luego de analizado este archivo, se decidió que los archivos a traducir eran 2: | ||
+ | #[http://sourceforge.net/p/butia/code/ci/master/tree/turtlebots/pybot/functions.py functions.py] | ||
+ | #[http://sourceforge.net/p/butia/code/ci/master/tree/turtlebots/pybot/pybot_client.py pybot_client.py] | ||
+ | |||
+ | |||
+ | === 24 de junio de 2015 === | ||
+ | * Se probaron los ejemplos realizados. | ||
+ | * Se establecieron las pautas para la entrega y presentación. | ||
+ | |||
+ | ==Código fuente== | ||
+ | *[[Archivo:javabotG6_2015.tar.gz]] |
Revisión actual del 22:47 29 jun 2015
Realización de una API en JAVA para manejar el robot butiá en ese lenguaje. Se presentan además ejemplos básicos.
Contenido
Integrantes
- Santiago Behak
- Gonzalo Mercadante
- Fernanda Toledo
Tutor
- Federico Andrade
Objetivo
Dada la gran comunidad de programadores Java, puede ser de interés para muchos manejar el robot mediante dicho lenguaje. Por esta razón, el objetivo del trabajo fue traducir al lenguaje Java las funciones necesarias para el manejo del robot butiá. Dichas funciones se encuentran implementadas en el lenguaje Python actualmente. Además se implementaron ejemplos básicos de manejo del robot para mostrar cómo utilizar la nueva API.
Investigación
Antes de comenzar con la implementación de la API en Java se investigaron algunas cosas que se debían utilizar. Por un lado se realizó un estudio básico del lenguaje Python para poder entender la sintáxis de dicho lenguaje. Esto era necesario para poder comprender correctamente el comportamiento de las funciones que se debían traducir. Por otro lado se estudió el manejo básico de sockects, necesario para que el cliente (Java) se comunicara con el servidor (Python).
Desarrollo
Primero se analizaron los archivos en Python, para luego comenzar a traducir las funciones al lenguaje Java. Durante la implementación, se trató en todo momento que el código fuera lo más similar posible al código en Python. Algunas cosas no fueron posibles realizarlas de forma similar dada las diferencias en los lenguajes. Un ejemplo de esto es la sintáxis utilizada en Python para establecer los parámetros de una función, donde se pueden definir parámetros opcionales. En Java, se debe sobrescribir la función para las distintas cantidades de parámetros que se requieran.
A continuación se muestra un ejemplo de una función en Python y luego su traducción en Java. Esta función realiza la comunicación con el servidor, ejecutando un comando desde el cliente:
Cliente Python:
def _doCommand(self, msg, ret_type = str):
"""
Executes a command in butia.
@param msg message to be executed
"""
msg = msg + '\n'
ret = ERROR
self._lock.acquire()
try:
self._client.send(msg)
ret = self._client.recv(1024)
ret = ret[:-1]
except Exception, e:
self._process_error(e)
try:
ret = ret_type(ret)
except:
ret = ERROR
self._lock.release()
return ret
Cliente Java:
public String doCommand(String msg) {
/* Executes a command in butia.@param msg message to be executed*/
msg = msg + '\n';
String ret = "";
try {
this.lock.acquire();
DataOutputStream outToServer = new DataOutputStream(client.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream()));
outToServer.write(msg.getBytes());
outToServer.flush();
char[] respuesta = new char[1024];
inFromServer.read(respuesta);
ret = String.valueOf(respuesta);
} catch (Exception e) {
ret = "" + ERROR;
process_error(e);
}
this.lock.release();
return ret;
}
¿Cómo utilizar la API en Java?
Antes de empezar
En el caso de usar pyBot se debe ejecutar:
python pybot_server.py
Para habilitar el DEBUG:
python pybot_server.py DEBUG
Luego de iniciado el servidor, podemos conectarnos desde el cliente javabot_robedu.jar.
Utilizando el cliente java desde la consola
Una vez que se tiene corriendo el servidor, se puede ejecutar el cliente desde la consola de la siguiente forma:
java -jar javabot_robedu.jar
Una vez levantado el cliente, pueden ingresarse los diferentes comandos para comunicarse con el servidor y manejar el robot. Aquí puede verse un video ejemplo, donde se manejan los motores de butiá mediante el cliente java.
Por defecto, se asume que el serivdor está en el host = localhost y puerto = 2009. Si se desea especificar otro host o puerto, puede ejecutarse de la siguiente manera:
java -jar javabot_robedu.jar localhost puerto
Importando el jar y utilizando las funciones
Si se quiere realizar un programa y utilizar la API en Java, se debe importar la librería javabot_robedu.jar en el proyecto. Las importaciones que pueden necesitarse son:
import functions.ButiaFunctions; import javabot_client.javabot_client;
Para poder utilizar las funciones, hay 2 formas de hacerlo:
Opción 1:
Se especifica el cliente con el que se acceden a la funciones para manejar el robot. Al cliente puede pasarse el host y puerto del serividor, o por defecto utilizar localhost y puerto 2009. A continuación se muestran los constructores para el cliente:
javabot_client cliente = new javabot_client(); // Por defecto localhost:2009.
javabot_client cliente = new javabot_client(host, puerto); // Especificando el host y puerto del servidor.
Luego, para utilizar la funciones debe hacerse:
ButiaFunctions robot = new ButiaFunctions(cliente);
A continuación se muestran algunas de las funciones sobre los sensores:
robot.getButton(port, board) // obtiene el valor del sensor botón conectado en el puerto port robot.getDistance(port, board) // obtiene el valor del sensor de distancia conectado en el puerto port robot.getGray(port, board) // obtiene el valor del sensor de grises conectado en el puerto port robot.getLight(port, board) // obtiene el valor del sensor de luz conectado en el puerto port
Opción 2:
Si no se especifica el cliente, se asume que por defecto el servidor está en localhost:2009. Para utilizar las funciones hacer:
ButiaFunctiones robot = new ButiaFunctions();
Y luego por ejemplo:
robot.getButton(port, board)
Ejemplos básicos
Realizando un cuadrado
A continuación se muestra el código necesario para realizar un cuadrado con la API.
import functions.ButiaFunctions;
try {
ButiaFunctions robot = new ButiaFunctions(); // POr defecto servidor en localhost, puerto 2009.
for(int i=0; i<4; i++){
robot.set2MotorSpeed(0, 400, 0, 400, 0);
sleep(100);
robot.set2MotorSpeed(1, 400, 0, 400, 0);
sleep(10); // Calibrar
}
} catch (InterruptedException ex) {
Logger.getLogger(javabot_client.class.getName()).log(Level.SEVERE, null, ex);
}
Seguidor de líneas
A continuación se muestra el código necesario para realizar un seguidor de líneas con la API .
import functions.ButiaFunctions;
ButiaFunctions robot = new ButiaFunctions(); // POr defecto servidor en localhost, puerto 2009.
//Codigo seguidor de lineas.
boolean run = true;
while (run){
try {
while (robot.getGrey(1, 0)<31000 && robot.getGrey(4, 0)<25000){ // Calibrar.
robot.set2MotorSpeed(0, 400, 0, 400, 0);
sleep(100);
}
while(robot.getGrey(1, 0)>=31000){ // Si es negro
robot.set2MotorSpeed(0, 400, 1, 400, 0);//giro a la derecha
sleep(10);
}
while(robot.getGrey(4, 0)>=25000){ // Si es negro
robot.set2MotorSpeed(1, 400, 0, 400, 0);//giro a la izquierda
sleep(10);
}
} catch (InterruptedException ex) {
Logger.getLogger(javabot_client.class.getName()).log(Level.SEVERE, null, ex);
}
}
Aquí se muestra un video del paso a paso para realizar el seguidor de líneas en NetBeans, mostrando cuáles son las importaciones que hay que hacer para utilizar la API.
Aquí se muestra un video del seguidor de líneas realizado en el video anterior con la API Java.
Anexo
Actas
3 de junio de 2015
- Fueron planteadas las principales características del proyecto.
- Se habló sobre cuáles eran los archivos de la API en Python que se necesitaban traducir. Se recomendó analizar el archivo functions.py. Luego de analizado este archivo, se decidió que los archivos a traducir eran 2:
24 de junio de 2015
- Se probaron los ejemplos realizados.
- Se establecieron las pautas para la entrega y presentación.