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で、「この方法だと世界を知っている必要がある」とかいう質問に対する返答をされていた