課程2:Problem Set 1

課程2:Problem Set 1

2. 練習:Localization

平面環境中機器人的一般有3個座標軸: (x,y,orientation) orientation 是面向的角度。

而立體空間中,飛行機器人,一般有6個座標軸:(x,y,z, roll,pitch,yaw)

狀態變量從3變化爲6,使用基於直方圖的定位,對於內存使用量來說,是指數變化的?

3. 練習:Bayes’ Rule

P(F)=0.001 失火的概率

B = 鄰居說“失火了”

P(鄰居撒謊的概率)=0.1

當鄰居說“失火了”時,

真正起火的概率爲 P1(F|B) = 0.0009

沒有起火的概率爲 P1(~F|B) = 0.0999

歸一化後,P(F|B)=0.0089

                 P(~F|B)=0.991

4. 練習:Localization Program

二維移動的例子,代碼如下:

# -*- coding: utf-8 -*-

# The function localize takes the following arguments:

#

# colors:

#        2D list, each entryeither 'R' (for red cell) or 'G' (for green cell)

#

# measurements:

#        list of measurementstaken by the robot, each entry either 'R' or 'G'

#

# motions:

#        list of actions takenby the robot, each entry of the form [dy,dx],

#        where dx refers tothe change in the x-direction (positive meaning

#        movement to theright) and dy refers to the change in the y-direction

#        (positive meaningmovement downward)

#        NOTE: the *first*coordinate is change in y; the *second* coordinate is

#              change in x

#

# sensor_right:

#        float between 0 and1, giving the probability that any given

#        measurement iscorrect; the probability that the measurement is

#        incorrect is1-sensor_right

#

# p_move:

#        float between 0 and1, giving the probability that any given movement

#        command takes place;the probability that the movement command fails

#        (and the robotremains still) is 1-p_move; the robot will NOT overshoot

#        its destination inthis exercise

#

# The function should RETURN (not just show or print) a 2D list (ofthe same

# dimensions as colors) that gives the probabilities that the robotoccupies

# each cell in the world.

#

# Compute the probabilities by assuming the robot initially has auniform

# probability of being in any cell.

#

# Also assume that at each step, the robot:

# 1) first makes a movement,

# 2) then takes a measurement.

#

# Motion:

#  [0,0] - stay

#  [0,1] - right

#  [0,-1] - left

#  [1,0] - down

#  [-1,0] - up

 

def localize(colors,measurements,motions,sensor_right,p_move):

    # initializes p to auniform distribution over a grid of the same dimensions as colors

    pinit = 1.0 / float(len(colors))/ float(len(colors[0]))

    p = [[pinit for row inrange(len(colors[0]))] for col in range(len(colors))]

   

    # >>> Insert yourcode here <<<

    if len(motions) !=len(measurements):

        print("localize()meet a exception ! the size of motions and measurements should be equal.")

        raise

    #show(p)

    for m inrange(len(motions)):

        print('----enter forloop index {} move is [{}][{}]'.format(m,motions[m][0], motions[m][1]))

        p = move(p,motions[m], p_move)

       print('-------------------------begin to sense()')

        p = sense(p, colors,measurements[m], sensor_right)

        #show(p) # for debug

               

    return p

 

def move(p, movements, p_move):

    print('move() invoked')

    q = [[0 for col inrange(len(p[0]))] for row in range(len(p))]

    newMove = [0,0]

    newMove[0] = movements[0]% len(p)

    newMove[1] = movements[1]% len(p[0])

 

    for r in range(len(p)) :

            for c inrange(len(p[r])) :

                # not move,just copy the p list

                if newMove[0]== 0 and newMove[1] == 0:

                    q[r][c] =p[r][c]

                    continue

                # move thefirst dimention, when move, do not change dimen

                mx = r

                if newMove[0]> 0 : # down

                    mx =(r-newMove[0])%len(p)

                   print("[{0}][{1}] move down\n".format(r,c))

                elifnewMove[0] < 0 : # up

                    mx =(r+newMove[0])%len(p)

                   print("[{0}][{1}] move up\n".format(r,c))

               

                # move thesecond dimention, when move, do not change dimen

                my = c

                if newMove[1]> 0 : # right

                    my =(c-newMove[1])%len(p[r])

                   print("[{0}][{1}] move right\n".format(r,c))

                elifnewMove[1] < 0 : # left

                    my =(c+newMove[1])%len(p[r])

                   print("[{0}][{1}] move left\n".format(r,c))

                   

                q[r][c] = p[mx][my] * p_move + p[r][c] *(1-p_move)

 

                #if q[r][c] !=0:

                #    print('qv = {}, qh = {}'.format(qv, qh))

    #show(p)

    #print('p---move to----q')

    #show(q)

 

    total = 0

    for r in range(len(q)) :

        total += sum(q[r])

   

    for r in range(len(q)) :

            for c inrange(len(q[r])) :

                q[r][c] =q[r][c] / total

                       

    return q

 

def sense(p, colors, measureVal, sensor_right):

    print('sense() invoked')

    q = [[0 for col inrange(len(p[0]))] for row in range(len(p))]

    for r in range(len(p)) :

        for c inrange(len(p[r])) :

            # sense

            if measureVal ==colors[r][c] :

                qrc = p[r][c]* sensor_right

               print("sense [{0}][{1}] measure {2}\n".format(r,c,measureVal))

            else :

                qrc = p[r][c]* (1 - sensor_right)

            q[r][c] = qrc

 

    total = 0

    for r in range(len(q)) :

        total += sum(q[r])

   

    for r in range(len(q)) :

        for c inrange(len(q[r])) :

            q[r][c] = q[r][c]/ total

    return q

 

def show(p):

    rows = ['[' +','.join(map(lambda x: '{0:.5f}'.format(x),r)) + ']' for r in p]

    print('[' + ',\n'.join(rows) + ']')

   

#############################################################

# For the following test case, your output should be

# [[0.01105, 0.02464, 0.06799, 0.04472, 0.02465],

#  [0.00715, 0.01017, 0.08696,0.07988, 0.00935],

#  [0.00739, 0.00894, 0.11272,0.35350, 0.04065],

#  [0.00910, 0.00715, 0.01434,0.04313, 0.03642]]

# (within a tolerance of +/- 0.001 for each entry)

 

colors = [['R','G','G','R','R'],

         ['R','R','G','R','R'],

         ['R','R','G','G','R'],

          ['R','R','R','R','R']]

measurements = ['G','G','G','G','G']

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

p = localize(colors,measurements,motions,sensor_right = 0.7, p_move= 0.8)

show(p) # displays your answer

# the result is :

# [[0.01106,0.02464,0.06800,0.04472,0.02465],

# [0.00715,0.01017,0.08697,0.07988,0.00935],

# [0.00740,0.00894,0.11273,0.35351,0.04066],

# [0.00911,0.00715,0.01435,0.04313,0.03643]]

#

#

#

 

# test 1

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'G'],

#          ['G', 'G', 'G']]

#measurements = ['R']

#motions = [[0,0]]

#sensor_right = 1.0

#p_move = 1.0

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

    

# test 2

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'R'],

#          ['G', 'G', 'G']]

#measurements = ['R']

#motions = [[0,0]]

#sensor_right = 1.0

#p_move = 1.0

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

 

# test 3

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'R'],

#          ['G', 'G', 'G']]

#measurements = ['R']

#motions = [[0,0]]

#sensor_right = 0.8

#p_move = 1.0

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

 

# test 4

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'R'],

#          ['G', 'G', 'G']]

#measurements = ['R', 'R']

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

#sensor_right = 0.8

#p_move = 1.0

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

 

# test 5

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'R'],

#          ['G', 'G', 'G']]

#measurements = ['R', 'R']

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

#sensor_right = 1.0

#p_move = 1.0

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

 

# test 6

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'R'],

#          ['G', 'G', 'G']]

#measurements = ['R', 'R']

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

#sensor_right = 0.8

#p_move = 0.5

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

 

# test 7

#colors = [['G', 'G', 'G'],

#          ['G', 'R', 'R'],

#          ['G', 'G', 'G']]

#measurements = ['R', 'R']

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

#sensor_right = 1.0

#p_move = 0.5

#p = localize(colors,measurements,motions,sensor_right,p_move)

#show(p) # test pass

其實,move()中應該可以不用歸一化,因爲sense()中每次會進行歸一化,而且sense()是每次最後調用的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章