2019-04-29-机器人世界

python

Posted by berlinfog on April 29, 2019

机器人世界

与人类一样,机器人通过它的“感官”来感知世界。例如,无人驾驶汽车使用视频、雷达与激光雷达来观察周围的世界。随着汽车不断地收集数据,它们会建立起一个3D观察世界,在这个世界,汽车可以知道自己在哪里,其他物体(如树木、行人和其他车辆)在哪里,以及它应该去哪里!

在这一部分中,为了简单起见,我们将首先使用1D世界然后再用2D世界表示,因为通常情况下,你需要用2D来解决某个问题。

  • 你需要做一系列的练习,从中增加对机器人本地化的理解。
  • 尽最大努力去做这些练习题。如果遇到了问题或想确认答案,可以查阅解决方案。

你可以在下列两个地方找到解决方案:1.在左上角的jupyter目录中的一个notebook中;或者,2.在练习题之后出现的视频中。

这些环境的网格表示称为 离散 表示。离散只意味着机器人可到之处(例如在一个网格单元中)的有限数量。这是因为机器人与类似无人驾驶汽车这样的自动驾驶汽车都需要使用地图来确定它们的位置,并且地图可以将它们划分为多个网格和部分。

在定位在机器人周围移动的物体时,你会看到连续的概率分布。连续意味着这些物体可以在机器人周围的任何地方,并且它们的运动是平滑的。

练习库

这个本地化课程中的大多数notebook都可以在workspace中找到。

下面,让我们从1D示例开始吧。

机器人世界:1-D

首先,假设你有一个生活在1-D世界中的机器人。你可以将这个1-D世界看做是一个单车道道路。

我们可以将这条道路视为一个阵列,并将其分解为很多网格单元,便于机器人理解。在这种情况下,这条道路是一个一维网格,有5个不同的空间。机器人只能向前或向后移动。如果机器人从网格上掉下来,它将环绕回到另一侧(这被称为循环世界)。

均匀分布

机器人有一张地图,因此它知道这个1D世界中只有5个空间。但是,它没有感觉到任何东西或没有发生移动。那么,对于这个5个单元格的长度(5个值的列表),机器人在这些位置中的任何一个位置的概率分布p是多少?

由于机器人最初不知道它在哪里,所以在任何空间中的概率是相同的!这就是概率分布,因此所有这些概率的总和应该等于1,所以1/5 spaces = 0.2。所有概率相同(并且具有最大不确定性)的分布称为均匀分布

In [ ]:

# importing resources
import matplotlib.pyplot as plt
import numpy as np

In [ ]:

# uniform distribution for 5 grid cells
# we use "p" to represent probability
p = [0.2, 0.2, 0.2, 0.2, 0.2]
print(p)

我还将包含一个辅助函数,用于可视化此概率分布。下面的函数display_map将会输出一个条形图,用于显示机器人在每个网格空间中的概率。对于概率范围,y轴的范围为0到1。在均匀分布中,这看起来像一条扁平线。如果你想将它们分开,可以选择每个条的宽度<= 1。

In [ ]:

def display_map(grid, bar_width=1):
    if(len(grid) > 0):
        x_labels = range(len(grid))
        plt.bar(x_labels, height=grid, width=bar_width, color='b')
        plt.xlabel('Grid Cell')
        plt.ylabel('Probability')
        plt.ylim(0, 1) # range of 0-1 for probability values 
        plt.title('Probability of the robot being at each cell in the grid')
        plt.xticks(np.arange(min(x_labels), max(x_labels)+1, 1))
        plt.show()
    else:
        print('Grid is empty')

# call function on grid, p, from before
display_map(p)

现在,如果这个1D世界是8个网格单元而不是5个,情况会怎样呢?

练习:编写一个函数,它需要输入机器人世界中的空间数(在本例中为8),并返回机器人在每个空间中的初始概率分布p

此函数应将概率存储在列表中。所以在这个例子中,会有一个包含8个概率的列表。

In [ ]:

# ex. initialize_robot(5) = [0.2, 0.2, 0.2, 0.2, 0.2]
def initialize_robot(grid_length):
    ''' Takes in a grid length and returns 
       a uniform distribution of location probabilities'''
    p = []
    return p

In [ ]:

p = initialize_robot(8)
print(p)
display_map(p)

现在,你已经了解了机器人最初是如何看待简单的一维世界。接下来,让我们通过使它四处移动并感知它的环境来了解它是如何定位自己的!