Javier Santos Paniego
César Pérez Fernández

jueves, 18 de febrero de 2010

Práctica1

Llego el dia de la primera exhibicion seria de Hansf10. A continuación se detallan los tejemanejes que es capaz de hacer este ser de poligonal mentalidad.










1) Control basico del motor

Al pulsar cualquier boton el robot activa el motor conectado a su puerto A,desactivandose si se vuelve a pulsar. El programa BasicMotor1.java regula ese comportamiento, su codigo se detalla a continuación.

import lejos.nxt.*;
public class BasicMotor1 {
public static void main(String[] args) {
Motor.A.setSpeed(900);
while(true){
Button.waitForPress();
Motor.A.forward();
Button.waitForPress();
Motor.A.stop();
}
}
}



Una variante del anterior es BasicMotor2.java. Su mision es que al pulsar cualquier botón el motor gire 45 grados y posteriormente se detenga.

import lejos.nxt.*;
public class BasicMotor2 {
public static void main(String[] args) {
Motor.A.setSpeed(900);
while(true){
Button.waitForPress();
Motor.A.rotate(45);
}
}
}



Como no hay dos sin tres tenemos tambien BasicMotor3.java que se comporta igual que
BasicMotor2.java pero usando el metodo rotateTo() en lugar de rotate().

import lejos.nxt.*;
public class BasicMotor3 {
public static void main(String[] args) {
Motor.A.setSpeed(900);
while(true){
Button.waitForPress();
int TachoCountActual=Motor.A.getTachoCount();
Motor.A.rotateTo(TachoCountActual + 45);
}
}
}

2) Visualizacion de la odometria del motor

Se ha usado uno de los motores conectado al puerto B y una pieza en forma de pseudoele enganchada a su eje. El programa Odometria.java se encarga de leer continuamente la posición en grados en la que el eje y la pseudoele se unen. La posicion donde esten situadas al arrancar el programa marca el valor de 0 grados.

import lejos.nxt.*;
public class Odometria {
public static void main(String[] args)throws Exception {
while(true){
LCD.clear();
LCD.drawString("Giro:", 2, 1);
int TachoCountActual=Motor.B.getTachoCount()%360;
if (TachoCountActual<0){
TachoCountActual=360+TachoCountActual;
}
LCD.drawInt(TachoCountActual, 2, 3);
Thread.sleep(100);
}
}
}



3) Cuadrado de calibracion de movimiento

Esta es una de las habilidades que mas satisfaccion produciran al lector de este blog si disfruta de cosas tales como la imagen de un perro trazando circulos al persiguir su propia cola. El programa responsable es Cuadro.java.Por desgracia no hemos conseguido crear el cuadrado correctamente. Creemos que debido a que los métodos que se encargan del giro del robot solo admitian valores enteros se perdia precision.

import lejos.nxt.Motor;
import lejos.robotics.navigation.TachoPilot;

public class Cuadro {
static TachoPilot tp;
public void Cuadrado(float length) throws InterruptedException
{
for(int i = 0; i<4>
{
tp.travel(length);
tp.rotate(-90);
}
}
public static void main(String[] args) throws InterruptedException
{
tp = new TachoPilot(5.6f,10.5f,Motor.C,Motor.B);
Cuadro cu = new Cuadro();
cu.Cuadrado(40);
}
}

Colocacion del lapiz para pintar el papel:





Resultado :




5) Visualizacion de la trayectoria

Este es el codigo que hace a hansf10 mas parlanchin contandonos toda su trayectoria mediante una matriz 3x1. Indica la posición en el eje "x", la posición en el eje "y" y el angulo actuales.

import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.robotics.navigation.TachoPilot;

public class MovCuadro {
static TachoPilot tp;
static float x=0;
static float y=0;
static float ang=0;
private void UpdateCoord1(int dist){
x=(float)(x+dist*(Math.cos(ang*3.14159/180)));
y=(float)(y+dist*(Math.sin(ang*3.14159/180)));
}
private void UpdateCoord2(float nuevoAng){
ang=(int)(ang+nuevoAng);
}
private void ShowCoord(){
LCD.clear();
LCD.drawString("x:",2,2);
LCD.drawString("y:",2,3);
LCD.drawString("G:",2,4);
LCD.drawInt((int)x,4,2);
LCD.drawInt((int)y,4,3);
LCD.drawInt((int)ang,4,4);
}
public void Cuadrado(float length) throws InterruptedException{
for (int j=0;j<10;j++){
tp.setMoveSpeed(90);
tp.setTurnSpeed(90);
x=0;
y=0;
ang=0;
for(int i = 1; i<=4 ; i++)
{
tp.reset();
tp.travel(length);
UpdateCoord1((int)tp.getTravelDistance());
ShowCoord();
Thread.sleep(5000);
tp.rotate(-90);
UpdateCoord2(tp.getAngle());
ShowCoord();
Thread.sleep(5000);
}
Thread.sleep(20000);
}
}
public static void main(String[] args) throws InterruptedException
{
tp = new TachoPilot(5.6f,12f,Motor.C,Motor.B);
MovCuadro cu = new MovCuadro();
cu.Cuadrado(40);
}
}

Uno de los problemas que hemos tenido en la parte de odometria fue que al dar mas de una vuelta nos salían valores mayores a 360º o menores 0º (segun la direccion en que moviéramos). El primero lo solucionamos haciendo un modulo de 360 del grado actual y el segundo sumando 360º (calculando asi su equivalente positivo). Intentamos un nuevo diseño diferente al predefinido pero tuvimos que desistir ya que nos dimos cuenta que al girar habia problemas con la distribución del peso y como consecuencia derrapaba una de las ruedas. Finalmente por falta de tiempo no hemos podido hacer el apartado de la matriz de covarianzas, asique la proxima vez procuraremos prestar mas atención a los plazos de entrega.



* Diseño alternativo que intentamos y tuvimos que descartar




No hay comentarios: