【问题标题】:How to get a direction for a robot from a method in a sensor class?如何从传感器类中的方法获取机器人的方向?
【发布时间】:2012-01-30 02:35:09
【问题描述】:

我正在使用 LRV(最近访问最少)算法制作程序。基本上,我为机器人设计了穿过网格(这是一个二维字符数组)的算法。机器人在遍历网格时检查每个单元格是EMPTY(由'O'定义)、OCCUPIED(由'S'定义)还是BLOCKED(由'X'定义)。这些单元只能被称为传感器的对象占据(这有自己的类)。 BLOCKED 单元格不能被遍历。每次机器人必须移动时,它都会从传感器接收一个方向。所以一开始机器人会被放置在网格上,它会放下一个传感器并从中获取方向,或者从预先存在的传感器中获取方向。

现在我已经解释了我的程序,我的具体问题是, 我有一个类 Sensor,它有一个返回 INT 的getVisitingDirection 方法。 每个方向都有一个计数器(INT 类型的北、南、东和西) 这是课程。

package ITI1121A;
public class Sensor {

private int cColumns;
private int cRows;
private int North;
private int South;
private int West;
private int East;

public Sensor(int sX, int sY) { 

cColumns = sX;
cRows = sY;
South= -1;
North = -1;
West = -1;
East = -1;

}
/* ADD YOUR CODE HERE */
public int getX ()
{return cColumns;}
public int getY ()
{return cRows;}

public int getVisitingDirection(GridMap g1)
  boolean temp;
{
  if(cRows==0){
  //top row
    if(cColumns==0){
    temp=g1.isCellBlocked(cColumns+1,cRows);
    if (temp=false){
    return West++;
    }

    }

  }

}

public void increaseCounter(int direction)
{}

}

现在我被困在 getVisitingDirection,我尝试使用 if 语句来检查网格的左上边缘(坐标 0,0),是的,就是这样。 我希望该方法给机器人一个方向,然后增加该方向的计数器。 甚至在这里得到这个概念也有真正的困难。 任何帮助将不胜感激! 谢谢 瓦伦

【问题讨论】:

  • Sau 机器人被放置在 (3,3) 并在 (3,4) 放置一个传感器,然后传感器将指示机器人移动到 (2,3) 然后?机器人在 (3,3) => 他的最后一个位置放置了一个新传感器?还是 (3,4) 处的那个传感器不断向网格中的任何位置发出命令?
  • 放置在(3,3),检查是否为空,如果是则放置'S'..然后从'S'获取下一步移动的方向,依此类推。每次机器人检测到单元中的传感器时,它都会询问方向
  • 啊!那么机器人和传感器可以“共存”在同一个单元格上吗?机器人位于 (5,5) 处,那里没有传感器。然后它在 (5,5) 放置一个传感器并询问方向,是这样吗?
  • 机器人检查当前单元格的内容。如果它是空的,它会将一个传感器放在那里,并从该传感器请求一个沿网格移动的方向。如果单元被占用,机器人会向位于单元的传感器请求相同的信息。
  • 每当传感器掉入单元中时,它都会在本地为机器人可以移动到的四个可能方向(北、东、南、西)中的每一个维护一个计数器。根据传感器的位置和环境的拓扑结构,某些方向可能无效。例如,位于网格左上角单元格的传感器永远不会向机器人推荐北或西,因为它们超出了环境的范围。同样,与被阻塞单元相邻的传感器永远不会向机器人推荐该方向。

标签: java grid sensors robot


【解决方案1】:

我已经在伪代码中添加了一个函数,它应该让你走上正确的道路。

// lets assume binary code where 0000 represents top, right, bottom, left 
// (0011 would mean can go bottom or left)
public int getVisitingDirection()
{
    String tmpBinary = "b"; // to initialize the field

    // check if can go up
    tmpBinary += (cCollums>0&&checkIfUpIsBlocked()) "1" : "0";
    // TODO check if can go right (compare with size + 1)
    // check if can go bottom (compare with size +1 )
    // check if can go left (check if > 0)

    // when this runs tmpBinary will be in the form of a binary representation
    // this will be passed to the robot that can then chooses where to go
    // 1111 would mean that all squares are clear to go
    // 1101 would mean top, right and left
    // etc...

}

private boolean checkIfUpIsBlocked()
{
    // TODO must check if the cell is blocked
    return true;
}

请注意,您必须创建 checkIfUpIsBlocked + 方法。

接缝还不错。
您可能希望通过枚举更改 int 字段,因为它们更易于阅读且不易出现人为错误。

如何使用 int 数字返回路线?
您可以使用二进制逻辑并返回单个 int 来表示多个方向。

0000 (int 0)  => no possible direction
0001 (int 1)  => left direction
0010 (int 2)  => bottom direction
0011 (int 3)  => left and bottom
0100 (int 4)  => right direction
(...)
1111 (int 15) => all directions possible

【讨论】:

  • 好吧,这很有帮助。但是我必须保留方向 INT,我现在的问题是如何从代表方向的 getVisitingDirection() 返回一个 INT。
  • 我有 isCellBlocked() getElementAt() 之类的方法我现在必须让 isLeftOf() isRightOf() isAbove() isBelow() 正确? @弗兰基
  • @Mjall2 更新了答案,因此您可以更好地掌握十进制和二进制之间的关系,以及如何使用它来使用单个 int 映射多个方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多