AI for Robotics - localization

2013-05-05

Udacityのロボットカーのクラス、昔途中までやったんだけど途中で放置してしまったので、もう一度やりなおしてみる。ブログにメモっとかないと、何をやったかひとつも覚えていないという記憶力の無さ。

Lesson 1: Localization (pdf)(動画)

  • 自分がどこにいるかを判定する、Localizationという問題を、1次元の世界で説明
  • senseで、センサーからの入力によって、事前確率と乗算し、正規化して確率分布にする。
  • moveでロボットを移動させるが、ロボットは完全に正確に移動するわけではないので、確率は鈍化する。convolutionで確率を足し合わせる。
p = [0.2, 0.2, 0.2, 0.2, 0.2]
world = ['green', 'red', 'red', 'green', 'green']
measurements = ['red', 'red']
motions = [1, 1]
pHit = 0.6
pMiss = 0.2
pExact = 0.8
pOvershoot = 0.1
pUndershoot = 0.1

def sense(p, Z):
q = []
for i in xrange(len(p)):
hit = (world[i] == Z)
q.append(p[i] * (hit * pHit + (1 - hit) * pMiss))
total = sum(q)
for i in xrange(len(q)):
q[i] /= total
return q

def move(p, U):
q = []
n = len(p)
for i in xrange(n):
exact = p[(i - U) % n] * pExact
overshoot = p[(i - (U + 1)) % n] * pOvershoot
undershoot = p[(i - (U - 1)) % n] * pUndershoot
q.append(exact + overshoot + undershoot)
return q

for i in xrange(len(measurements)):
p = sense(p, measurements[i])
p = move(p, motions[i])
print p

Problem Set 1

  • ベイズの定理の問題とか
  • 2次元の世界でのLocalizationを判定するプログラムを書く
colors = [['red', 'green', 'green', 'red' , 'red'],
['red', 'red', 'green', 'red', 'red'],
['red', 'red', 'green', 'green', 'red'],
['red', 'red', 'red', 'red', 'red']]

measurements = ['green', 'green', 'green' ,'green', 'green']


motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]

sensor_right = 0.7

p_move = 0.8

def show(p):
for i in range(len(p)):
print p[i]

#DO NOT USE IMPORT
#ENTER CODE BELOW HERE
#ANY CODE ABOVE WILL CAUSE
#HOMEWORK TO BE GRADED
#INCORRECT

def move(p, dir):
q = []
for r in range(len(p)):
row = []
for c in range(len(p[r])):
v = p[(r - dir[0]) % len(p)][(c - dir[1]) % len(p[r])] * p_move
v += p[r][c] * (1.0 - p_move)
row.append(v)
q.append(row)
return q

def sense(p, colors, Z):
q = []
for r in range(len(p)):
row = []
for c in range(len(p[r])):
z = colors[r][c] == Z
v = sensor_right * z + (1.0 - sensor_right) * (1 - z)
row.append(p[r][c] * v)
q.append(row)
return q

def normalize(p):
total = 0.0
for r in range(len(p)):
total += sum(p[r])

q = []
for r in range(len(p)):
row = []
for c in range(len(p[r])):
row.append(p[r][c] / total)
q.append(row)
return q

def uniform(rows, columns):
return [[1.0 / (rows * columns)] * columns] * rows

p = uniform(len(colors), len(colors[0]))
for i in range(len(measurements)):
p = move(p, motions[i])
p = sense(p, colors, measurements[i])
p = normalize(p)

#Your probability array must be printed
#with the following code.

show(p)
  • histogram filtersというらしい
  • 最後のQAで、「この方法だと世界を知っている必要がある」とかいう質問に対する返答をされていた