Навигация по лабиринту на сцене игрока с Roomba - PullRequest
1 голос
/ 13 апреля 2010

Вот мой код:

/*
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

Я пытался заставить Roomba двигаться непрерывно по небольшому правому изгибу, быстро отворачиваясь от каждой стены, к которой она приблизилась, если узнала ее своим лазером. Я могу использовать только laser_data [360] и laser_data [0] для этого одного робота. Я думаю, что это в конечном итоге приведет к лабиринту.

Однако я использую платформу Player Stage, и Stage зависает, когда Roomba подходит к стене, используя этот код, я понятия не имею, почему.

Также, если вы можете придумать лучший алгоритм навигации в лабиринте, пожалуйста, дайте мне знать.

Спасибо!

1 Ответ

1 голос
/ 13 апреля 2010

Кажется, что вы застряли у стены, потому что колеблетесь на расстоянии 0,6.

Например:

  1. Двигайтесь под углом к ​​стене, в конечном итоге достигая <0.6f </li>
  2. Вращаться от стены, останавливаться, когда> 0,6f. Другими словами, 0.6000001f (например)
  3. Возобновить нормальную траекторию.
  4. Почти сразу <0,6f </li>
  5. Перейти к 2

Вы застрянете, слегка наклонившись к стене и немного от нее.

Вам нужна буферная зона. Как только вы окажетесь на расстоянии MIN_DIS от стены, вам нужно повернуть в сторону, пока вы не достигнете некоторого BUFFER_DIS от стены, где BUFFER_DIS> MIN_DIS на достаточную сумму.

EDIT:

Похоже, у вас есть несколько проблем. Сначала вы проверяете, находится ли laser_data рядом со стеной, и вращаетесь ли вы к стене. Вам нужно проверить, не близко ли это к стене, и повернуть к ней.

Во-вторых, вы находитесь в очень узком цикле, регулируя скорость колес. Это, вероятно, приведет к плохим вещам. Вам нужно вызвать функцию trackWall (), когда вы находитесь слишком далеко от стены, которая будет опрашивать laser.isDataReady () в отдельном цикле. Либо так, либо вам нужен конечный автомат в вашем основном цикле опроса. Если нет, то вы бессмысленно регулируете скорость вращения колеса с помощью устаревших данных лазера.

В-третьих, можете ли вы гарантировать, что стена всегда будет в пределах 0,6f? Если нет, ваш робот будет вращаться бесконечно, если он далеко от стены.

...