Roomba的玩家阶段迷宫导航

问题描述 投票:1回答:1

这是我的代码:

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

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

谢谢!

java maze player-stage
1个回答
1
投票

看起来你被困在墙上,因为你在距离0.6附近摆动。

例如:

  1. 开车向墙壁倾斜,最终达到<0.6f
  2. 旋转离开墙壁,当> 0.6f时停止。换句话说0.6000001f(例如)
  3. 恢复正常轨迹。
  4. 几乎立即<0.6f
  5. 每2

你会稍微朝向并略微远离墙壁倾斜。

你需要一个缓冲区。一旦你进入MIN_DIS距离墙壁的距离,你需要旋转离开,直到从BUFFER_DIS> MIN_DIS的墙壁到达一些BUFFER_DIS相当大的数量。

编辑:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.