Пример #1
0
def online_slam(init,moves,Landmarks,measurements,measurement_factor=2,movement_factor =1):
    labels0 = [0]+Landmarks
    labels = [0,1]+Landmarks
    i = 0
    if init != None:
        O = {(i,i):1}
        j = {i:init}
    
    
    measurement = measurements.next()
    for (c, v) in measurement.items():
        O[(i, i)] = O.get((i, i), 0) + measurement_factor
        O[(c, c)] = O.get((c, c), 0) + measurement_factor
          
        O[(i, c)] = O.get((i, c), 0) - measurement_factor
        O[(c, i)] = O.get((c, i), 0) - measurement_factor
          
        j[i] = j.get(i, 0) - measurement_factor * v
        j[c] = j.get(c, 0) + measurement_factor * v
    
    
    for m in moves:
        c = i + 1
        
        O[(i, i)] = O.get((i, i), 0) + movement_factor
        O[(c, c)] = O.get((c, c), 0) + movement_factor
          
        O[(i, c)] = O.get((i, c), 0) - movement_factor
        O[(c, i)] = O.get((c, i), 0) - movement_factor
          
        j[i] = j.get(i, 0) - movement_factor * m
        j[c] = j.get(c, 0) + movement_factor * m
        
        measurement = measurements.next()
        i = c
        for (c, v) in measurement.items():
            O[(i, i)] = O.get((i, i), 0) + measurement_factor
            O[(c, c)] = O.get((c, c), 0) + measurement_factor
          
            O[(i, c)] = O.get((i, c), 0) - measurement_factor
            O[(c, i)] = O.get((c, i), 0) - measurement_factor
          
            j[i] = j.get(i, 0) - measurement_factor * v
            j[c] = j.get(c, 0) + measurement_factor * v
        
        B = [O.get((0,0),0)]
        C = [j.get(0,0)]
        A = [O.get(labels[a],0) for a in range(1,len(labels))]
        Oprime = [[O.get((labels[a],labels[b]),0) for b in range(1,len(labels))] for a in range(1,len(labels))]
        jPrime = [j.get(a,0) for a in range(1,len(labels))]
        
        OPrimeMat  =matrix(Oprime)
        AMat = matrix([A])
        BMat = matrix([B])
        CMat = matrix([C])
        JPrimeMat = matrix([jPrime])
        Onew = OPrimeMat - AMat.transpose()*BMat.inverse()*AMat
        j_new = JPrimeMat - (AMat.transpose()*BMat.inverse()*CMat).transpose()
        
        O = {(labels0[a],labels0[b]):Onew.value[a][b] for b in range(len(labels0)) for a in range(len(labels0))}
        j = {labels0[a]:j_new.value[0][a] for a in range(len(labels0))}
        
        i=0
    return labels,O,j
Пример #2
0
def solve_slam(labels,O,j):
    OMatrix = matrix( [[O.get((labels[a],labels[b]),0) for b in range(len(labels))] for a in range(len(labels))] )
    jMAtrix =  matrix([[j.get(labels[a],0) for a in range(len(labels))]]).transpose()
    Oinv = OMatrix.inverse()
    m = Oinv*jMAtrix
    return m