这是我的代码:
/*
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使用此代码靠近墙壁时舞台冻结,我不知道为什么。
另外,如果你能想到更好的迷宫导航算法,请告诉我。
谢谢!
答案 0 :(得分:1)
你似乎被困在墙上,因为你在距离0.6附近摆动。
例如:
你会稍微朝向并略微远离墙壁倾斜。
您需要一个缓冲区。一旦你进入MIN_DIS距离墙壁的距离,你需要旋转离开,直到你从BUFFER_DIS&gt;的墙壁到达一些BUFFER_DIS。 MIN_DIS相当可观。
修改强>
看起来你有一些问题。首先,您要检查laser_data是否靠近墙壁,如果是,您正在向墙壁旋转。您需要检查它是否不靠近墙壁,然后向它旋转。
其次,你处于一个非常紧凑的循环中,调整车轮速度。这可能会导致糟糕的事情。当你离墙很远时,你需要调用一个trackWall()函数,它会在一个单独的循环中调查laser.isDataReady()。要么是这样,要么在主轮询循环中需要状态机。如果没有,你就会用过时的激光数据毫无意义地调整车轮速度。
第三,你能保证隔离墙总是在0.6f以内吗?如果没有,如果它远离墙壁,你的机器人将无限旋转。