2010-04-13 23 views
1

Voici mon code:Maze Navigation dans le lecteur scène avec Roomba

/* 
Scott Landau 
Robot Lab Assignment 1 
*/  

// Standard Java Libs 

import java.io.*; 

// Player/Stage Libs 

import javaclient2.*; 
import javaclient2.structures.*; 
import javaclient2.structures.sonar.*; 

// Begin 

public class SpinningRobot 

{ 
    public static Position2DInterface pos = null; 
    public static LaserInterface laser = null; 

    public static void main(String[] args) 
    { 
     PlayerClient robot = new PlayerClient("localhost", 6665); 
     laser = robot.requestInterfaceLaser(0, PlayerConstants.PLAYER_OPEN_MODE); 
     pos = robot.requestInterfacePosition2D(0,PlayerConstants.PLAYER_OPEN_MODE); 

     robot.runThreaded (-1, -1); 

     pos.setSpeed(0.5f, -0.25f); 

     // end pos 
     float x, y; 
     x = 46.0f; 
     y = -46.0f; 

     boolean done = false; 

     while(!done){ 

      if(laser.isDataReady()) { 

       float[] laser_data = laser.getData().getRanges(); 

       System.out.println("== IR Sensor =="); 
       System.out.println("Left Wall Distance: "+laser_data[360]); 
       System.out.println("Right Wall Distance: " +laser_data[0]); 

       // if laser doesn't reach left wall, move to detect it 
       // so we can guide using left wall 
       if (laser_data[360] < 0.6f) { 
        while (laser_data[360] < 0.6f) { 

         pos.setSpeed(0.5f, -0.5f); 
        } 
      } else if (laser_data[0] < 0.6f) { 
                            while(laser_data[0<0.6f)          {         pos.setSpeed(0.5f, 0.5f); 
            } 
      } 
       pos.setSpeed(0.5f, -0.25f); 



// end pos? 
done = ((pos.getX() == x) && (pos.getY() == y)); 
      } 

     } 

    } 





} // End 

je tentais d'avoir le Roomba aller en continu à une légère courbe à droite, tourner rapidement de chaque mur, il est venu près si elle l'a reconnu avec son laser. Je ne peux utiliser que laser_data [360] et laser_data [0] pour ce robot. Je pense que cela finirait par naviguer dans le labyrinthe.

Cependant, j'utilise la plateforme Player Stage, et Stage se fige quand le Roomba se rapproche d'un mur en utilisant ce code, je ne sais pas pourquoi.

Aussi, si vous pouvez penser à un meilleur algorithme de navigation labyrinthe, s'il vous plaît faites le moi savoir.

Merci!

+0

Pouvez-vous modifier un peu le formatage? (supprime les lignes vides au moins) – Roman

+0

Comment as-tu fait fonctionner java sur Roomba? –

Répondre

1

On dirait que vous êtes coincé contre un mur parce que vous faites une oscillation d'environ 0,6.

Par exemple:

  1. entraînement pêche à la ligne vers le mur, pour atteindre finalement < 0.6f
  2. Rotation loin du mur, arrêtez-vous lorsque> 0.6f. En d'autres termes, 0,6000001f (par exemple)
  3. Reprendre la trajectoire normale.
  4. Presque immédiatement < 0.6f
  5. Aller à 2

Vous obtiendrez la pêche coincé légèrement vers et légèrement à l'écart du mur.

Vous avez besoin d'une zone tampon. Une fois que vous vous trouvez à une distance de MIN_DIS du mur, vous devez pivoter jusqu'à atteindre BUFFER_DIS depuis le mur où BUFFER_DIS> MIN_DIS est assez important.

EDIT:

On dirait que vous avez quelques questions. Vous vérifiez d'abord si le laser_data est proche d'un mur, et si c'est le cas, vous faites une rotation vers le mur. Vous devez vérifier si elle n'est pas proche d'un mur et tourner vers elle. Deuxièmement, vous êtes dans une boucle très serrée, en ajustant les vitesses des roues. Cela entraînera probablement de mauvaises choses. Vous devez appeler une fonction trackWall() lorsque vous êtes trop loin du mur, qui interrogera laser.isDataReady() dans une boucle séparée. Soit cela, soit vous avez besoin d'une machine d'état dans votre boucle d'interrogation principale. Si ce n'est pas le cas, vous allez inutilement ajuster la vitesse de la roue avec des données laser périmées. Troisièmement, pouvez-vous garantir que le mur sera toujours à moins de 0.6f? Sinon, votre robot tournera à l'infini s'il se trouve loin du mur.

+0

Cela a du sens. Je vais donner un coup de feu et vous faire savoir ce que je rencontre. Merci beaucoup pour votre aide. – Scott

+0

Cependant, mon laser ne peut voir que 0,6f, donc tout ce qu'il ne sait pas est là ... – Scott

+0

Attendez une seconde ... Quelles valeurs peuvent être laser_data et à quoi correspondent-ils? Et quelles directions sont [0] et [360]? Angle-sage, ceux-ci sont la même position. En d'autres termes, si j'ai laser_data [360] == 0.6f, qu'est-ce que cela signifie? –