Clase Pilot: Manejo de motores avanzado

CircunferenciaHasta ahora hemos visto distintos métodos de la clase motor que nos han resultado útiles para navegar con el robot. Sin embargo no es fácil con estos métodos recorrer distancias precisas (por ejemplo una recta de 50 cm). Existe una librería en LeJOS llamada navigation que nos permite resolver estos problemas fácilmente. En este artículo os introduciré al uso de la clase Pilot, y finalmente pondré (como siempre) un programa de prueba.

Manejo avanzado de motores:
La clase Pilot de la librería de clases navigation nos ofrece un manejo sencillo y preciso para robots trípodes (son aquellos que tienen dos ruedas con tracción diferencial, y una tercera rueda detrás basculante (básicamente el montaje estándar del NXT). Lo primero que necesitamos para usar esta clase es importar la librería donde se encuentra:

import lejos.robotics.navigation.*;

Una vez importada podremos declararla dentro de nuestro programa con la siguiente línea:

Pilot navegador = new TachoPilot(diametro_ruedas, distancia_ruedas, Motor.A, Motor.C);

Donde el diámetro ruedas es el diámetro (en este caso en centímetros) que se puede encontrar escrito en el lateral de la rueda. La distancia entre las ruedas es la distancia física entre el centro de una y otra rueda. Posteriormente se pondrán los dos motores que se van a utilizar, yo en este caso he puesto el motor A y C como ejemplo.

Con esta clase tendremos también un tacómetro, pero en este caso estará más relacionado con la distancia recorrida por el robot en sí que por los motores individuales. Por ejemplo:

void reset(): Resetea el valor del tacómetro para los dos motores.

float getTravelDistance(): Devuelve la distancia recorrida por el robot desde la última vez que se llamo a reset().

Para moverse a cierto sitio la clase Pilot tiene unas funcionas denóminadas travel (del verbo inglés viajar) que nos permiten movernos la distancia deseada:

void travel(float distancia): Recorre en una linea recta la distancia marcada. Puesto que esta distancia es un float. admite números decimales, lo que permite una mayor precisión.

void travel(float distancia, boolean devolverControl): Recorre en una linea recta la distancia marcada. Como pasaba con el método rotate de la clase motor, si devolverControl vale true se podrán seguir ejecutando cosas mientras este método está aún en funcionamiento.

void travelArc(float radio, float distancia): Recorre en una curva (cuyo radio es el definido) la distancia marcada.

void travelArc(float radio, float distancia, boolean devolverControl): Recorre en una curva cuyo radio es el definido la distancia marcada. Como pasaba con el método rotate de la clase motor, si devolverControl vale true se podrán seguir ejecutando cosas mientras este método está aún en funcionamiento.

También hay otros métodos que nos pueden resultar útiles a la hora de manejar el robot como:

void rotate(float angulo): Este rotate es distinto al de la clase Motor. Lo que hace es girar el robot sobre el sitio el número de grados indicados. Este método también cuenta con la opción de devolverControl.

void arc(float radio, float angulo): El robot se mueve describiendo una curva (cuyo radio es el descrito) a lo largo de los grados indicados. Si se omite el valor del angulo el robot describirá circunferencias indeterminadamente o hasta que el método stop() sea llamado.

La clase Pilot cuenta también con muchos métodos de la clase Motor, aunque en este caso los suele aplicar a las dos ruedas. Estos métodos son por ejemplo: forward(), backward(), setSpeed(), stop()

Gracias a estos nuevos métodos podemos plantearnos nuevos retos. Con imaginación cualquier cosa es posible.

Programa de prueba: Dibujando figuras geométricas:
Como programa de prueba para la clase Pilot es una gran idea tener un programa que dibuje figuras geométricas del tamaño deseado. En este programa incluiré varios de los métodos comentados anteriormente, con el objetivo de que os acostumbréis a su uso.

Este programa de prueba lo que hará es dibujar un cuadrado de 30cm de lado, posteriormente se recolocará y dibujará un circulo de 30cm de diámetro, y finalmente se volverá a recolocar para dibujar un ocho de 30cm aproximadamente. El código del programa es el siguiente:

import lejos.nxt.*;
import lejos.robotics.navigation.*;

public class figuras {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Pilot navigator = new TachoPilot(5.6f, 11.4f, Motor.A, Motor.C);
navigator.reset();

//Cuadrado
navigator.travel(30);
navigator.rotate(90);
navigator.travel(30);
navigator.rotate(90);
navigator.travel(30);
navigator.rotate(90);
navigator.travel(30);
navigator.rotate(90);

//Recolocación
Thread.sleep(500);
navigator.travel(15);
Thread.sleep(500);

//Circunferencia
navigator.arc(15,360);

//Recolocación
Thread.sleep(500);
navigator.rotate(90);
navigator.travel(15);
Thread.sleep(500);

//Ocho
navigator.arc((float) 6.25,360);
navigator.arc((float) -6.25,360);

LCD.drawInt((int)navigator.getTravelDistance(), 6,4);
Button.waitForPress();
}

}

La explicación sería:

11 – Definimos la clase Pilot con su método constructor, indicando el diámetro de las ruedas del robot así como la distancia entre ellas, y especificamos que motores vamos a usar.

12 – Es importante resetear el contador del tacómetro al principio del programa.

15 a 22 – Aquí es donde dibujamos el cuadrado. Lo que hacemos es movernos 30cm y girar 90 grados para encarar la siguiente recta. Esto repetido cuatro veces dará como resultado un cuadrado.

25 a 27 – Adelantamos un poco el robot para que la circunferencia que vamos a hacer a continuación nos quede centrada dentro del cuadrado.

30 – Hacemos una circunferencia de 30cm de diámetro, o lo que es lo mismo: 15 cm de radio.

33 a 36 – nos colocamos de manera que el ocho que vamos a hacer a continuación nos quede centrado dentro del círculo.

39 y 40 – Dibujamos el ocho con dos circunferencias unidas de 7,5 cm de radio, lo que dará una longitud total al ocho de 30cm (cuatro veces el radio -> 4 por 7,5). Lo que significa (float) es que convertimos ese 7.5 a un valor con decimales de tipo float para que la función arc() lo admita como parámetro. A esto se le llama comúnmente casting o conversión de tipos.

43 – Mostramos por pantalla la distancia recorrida total en centímetros. Como podéis observar se hace otro casting, convirtiendo el número decimal de tipo float que devuelve el método getTravelDistance() al tipo entero int que necesita el método drawInt().

Espero que os haya quedado más o menos claro. Y aquí como siempre os dejo un video demostración:

Circulo:

Cuadrado:

Ocho:

Como siempre decir que cualquier duda la podéis preguntar en el foro, que para eso esta.

2 thoughts on “Clase Pilot: Manejo de motores avanzado

  1. hola muy bueno el tutorial quisiera saber si se puden manejar los motores de manera independientes es decir uno despues de otro asi mismo con la clase pilot

    Gracias