1
coordinates = [(0, 2), (0, 1), (1, 2), (1, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]

我已经创建了一个上面提到的 Python 数组。它包含点 (x,y) 的元组。我会假设我从第一点开始(而不是起点)。我想按给定的顺序移动到点。我拥有的唯一运动功能是rotate90Degrees(direction)左右方向分别为 1 或 -1。而forward(time)时间在哪里移动多长时间。我假设时间 = 1 相当于坐标系中的一个单位。有没有一种聪明的方法可以轻松地将 this 更改为运动指令,而无需巨大的 if/else if/else?到目前为止我所拥有的:

start = coordinates[0]
for x in range(1,len(coordinates)):
    finish = coordinates[x]
    change.append((finish[0] - start[0],finish[1] - start[1]))
    start = coordinates[x]
4

2 回答 2

1

好的,所以您的机器人面向某个已知的基本方向并且位于某个已知位置,并且您希望它移动到另一个位置。

首先,您需要一个将方向映射到位移的元组列表。我将使用标准单位圆,角度为 90 度的倍数:

atod = [(1, 0), (0, 1), (-1, 0), (0, -1)]

因此,朝向方向移动0意味着您的 x 坐标每单位时间增加 1,而您的 y 坐标不变,依此类推。方向是从 0 到 3 的整数,包括 0 到 3。

现在代码需要弄清楚如何进行。我将从机器人当前面对的任何方向开始。假设所需的位移是 (-2, 1)并且dir0atod[dir](1, 0)。忽略那个为零的;除以-21你得到-2,所以这个方向不好,我们必须旋转。哪一条路?检查每一个,看看哪种方式有帮助。如果这两种方法都没有帮助,你需要做一个 180 度,朝你喜欢的任何方向做。

所以我们做了我们的旋转,现在我们在方向1并且atod[dir](0, 1)。所以我们要前进1。这样做。现在你必须再次旋转,再次移动,你就完成了。

于 2016-02-22T22:29:36.813 回答
0

您可以沿北/南或东/西轴移动,因为您的旋转限制为 90 度。

您可以观察到任何运动都将具有北/南分量和东/西分量。

如果你的动作始终如一,那么你离下一步只有一个 90 度的转身:

1. turn east or west
2. move east or west
3. turn north or south
4. move north or south
5. You should be at your target
6. turn east or west
7. move east or west
8. turn north or south
9. move north or south
10. you should be at your (next) target

... ETC。

如果我们假设您的机器人开始面向北,那么您的循环应该首先转向东/西,然后移动,然后转向北/南。

这是一个开始。这可能是您的全局数据和主代码。

Robot_pos = coordinates[0]
Robot_facing = NORTH

for next_pos in coordinates[1:]:
    move_robot(next_pos)

如果我们假设 x 是东/西,y 是北/南,那么对于 move_robot,您会得到类似的东西:

def move_robot(new_pos):
    """
    Move robot from ``Robot_pos`` to ``new_pos`` given. The robot
    is assumed to be facing either north or south upon entry, so
    east/west movement is done first.
    """

    delta_x = ...
    turn_robot(EAST or WEST)
    forward( some amount )

    # similarly for Y

你必须在你的turn_robot()代码中有点聪明,以优化你是否开始面向正面或负面的方向。不过,它应该始终是一个 90 度旋转。

于 2016-02-22T23:27:07.817 回答