Roomba的玩家阶段迷宫导航

时间:2010-04-13 16:39:37

标签: java maze player-stage

这是我的代码:

/*
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平台,当Roomba使用此代码靠近墙壁时舞台冻结,我不知道为什么。

另外,如果你能想到更好的迷宫导航算法,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:1)

你似乎被困在墙上,因为你在距离0.6附近摆动。

例如:

  1. 向墙壁倾斜,最终到达< 0.6f
  2. 远离墙壁旋转,当&gt;停止0.6f。换言之0.6000001f(例如)
  3. 恢复正常轨迹。
  4. 几乎立即&lt; 0.6f
  5. 转到2
  6. 你会稍微朝向并略微远离墙壁倾斜。

    您需要一个缓冲区。一旦你进入MIN_DIS距离墙壁的距离,你需要旋转离开,直到你从BUFFER_DIS&gt;的墙壁到达一些BUFFER_DIS。 MIN_DIS相当可观。

    修改

    看起来你有一些问题。首先,您要检查laser_data是否靠近墙壁,如果是,您正在向墙壁旋转。您需要检查它是否不靠近墙壁,然后向它旋转。

    其次,你处于一个非常紧凑的循环中,调整车轮速度。这可能会导致糟糕的事情。当你离墙很远时,你需要调用一个trackWall()函数,它会在一个单独的循环中调查laser.isDataReady()。要么是这样,要么在主轮询循环中需要状态机。如果没有,你就会用过时的激光数据毫无意义地调整车轮速度。

    第三,你能保证隔离墙总是在0.6f以内吗?如果没有,如果它远离墙壁,你的机器人将无限旋转。