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

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

谢谢!

4

1 回答 1

1

看起来你被卡在墙上了,因为你在 0.6 左右摆动。

例如:

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

你会被卡在稍微朝向和稍微远离墙壁的角度。

你需要一个缓冲区。一旦您到达距离墙壁的 MIN_DIS 距离内,您需要旋转离开,直到您从墙壁到达一些 BUFFER_DIS,其中 BUFFER_DIS > MIN_DIS 相当多。

编辑:

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

其次,您处于一个非常紧凑的 while 循环中,正在调整轮速。这可能会导致不好的事情。当您离墙太远时,您需要调用 trackWall() 函数,该函数将在单独的循环中轮询laser.isDataReady()。要么,要么你的主轮询循环中需要一个状态机。如果没有,您就是在用陈旧的激光数据毫无意义地调整轮速。

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

于 2010-04-13T17:14:47.200 回答