sábado, 5 de mayo de 2018
7ª hora Open Course
En las imágenes anteriores, introducimos el concepto de movimiento a nuestro código para el cálculo de probabilidades de posición y localización de nuestro robot.
Aquí tenemos que si consideramos cíclico el espacio donde se mueve nuestro robot, tendremos que además de la probabilidad de localización, tendremos la probabilidad de movimiento. tendremos que calcular la probabilidad de encontrarse en un punto como hemos hecho antes, dos veces, una antes de desplazarse y otra después.
Para ello un vector ( 0 0 0 1 0) con Velocidad=1 , encontramos que después de nuestro primer calculo tendrá la siguiente forma ( 0 0 0 0.6 0), en el siguiente paso ( 0.6 0 0 0.6 0.6); en el siguiente ( 0.06 0 0 0.06 0.48) y en el último paso (0.1 0 0 0.1 0.8). En este punto, sabemos que el robot estará en el último punto con una probabilidad de un 0.8.
5 y 6ª Hora Open Course
Por 4 vez, abajo explico lo poco que se aprecia la fotografía.
Así que actualizaremos la medida con la corrección para que se adecue a una distribución de probabilidad. Además incluiremos un segundo factor donde verificaremos la posición de nuestro robot. Y añadiremos el concepto de movimiento a nuestra función,
Integración en python:
p=[0.2 , 0.2 , 0.2 , 0.2 , 0.2]
#Z="red"
pHit=0.6
def loc(p , Z):
q=[]
for i in range(len(p)):
hit=(measurements==world[i])
q.append(p[i]*(hit*pHit+(1-hit)*pMiss))
for i in range(len(q)):
q[i]=q[i]*k
print p
3ª y 4ª Hora Open Course
De nuevo, aquí la explicación de lo de arriba.
El curso prosigue con la integración de las funciones de localización y movimiento.
Integración en python de la función de localización :
Z="red"
pHit=0.6
def loc(p , Z):
q=[]
for i in range(len(p)):
hit=(Z==world[i])
q.append(p[i]*(hit*pHit+(1-hit)*pMiss))
return q
2ª Hora Open Course
Este vector modificado, no lo podemos considerar útil para la estadística dado que la probabilidad de sus partes no suma uno. Para rectificar este error que hemos creado, dividimos todo por la suma de las componentes del vector.
La integración en python:
int* p=new int[i];
p[i]=1.0/n
}
1ªHora Open Course
Dado que al escanear mis apuntes no he podido recogerlos con mayor calidad, os explico las notas recogidas.
En las notas que he tomado durante la primera hora del curso, he destacado la información sobre la localización autónoma del robot,
En esta primera hora, se nos explicaba como un robot puede encontrarse a si mismo.
Uno de los ejemplos que ponen es el uso de gps, el cual tiene ciertas taras, como la inexactitud a una escala tan baja como la que opera un coche autónomo. Para eso usan lasers y ciertos sensores.
Mediante estadística resaltamos ciertas ares y definimos una función (similar a la física cuántica, donde también definimos la posibilidad de encontrar un átomo, pero de menor complejidad ).
De esta manera obtenemos una función que se vera modificada por el movimiento, donde encontraremos una probabilidad de estar, por ejemplo, en un cuadro rojo frente a la de estar en uno verde. Es decir, si hay 5 casillas, dos de color rojo y 3 de color verde, la probabilidad de estar en una de ellas será 0.2 o un 20%. De igual manera, al avanzar una casilla tendremos que habrá un 80% de probabilidades de estar en la casilla siguiente, un 10% de seguir en la que estamos y un 10% de haber avanzado un poco de más y continuar en la casilla siguiente a la que queríamos.
viernes, 4 de mayo de 2018
HORA 9 OPEN COURSE
# Write a function 'kalman_filter' that implements a multi-
# dimensional Kalman Filter for the example given
from math import *
class matrix:
# implements basic operations of a matrix class
def __init__(self, value):
self.value = value
self.dimx = len(value)
self.dimy = len(value[0])
if value == [[]]:
self.dimx = 0
def zero(self, dimx, dimy):
# check if valid dimensions
if dimx < 1 or dimy < 1:
raise ValueError, "Invalid size of matrix"
else:
self.dimx = dimx
self.dimy = dimy
self.value = [[0 for row in range(dimy)] for col in range(dimx)]
def identity(self, dim):
# check if valid dimension
if dim < 1:
raise ValueError, "Invalid size of matrix"
else:
self.dimx = dim
self.dimy = dim
self.value = [[0 for row in range(dim)] for col in range(dim)]
for i in range(dim):
self.value[i][i] = 1
def show(self):
for i in range(self.dimx):
print(self.value[i])
print(' ')
def __add__(self, other):
# check if correct dimensions
if self.dimx != other.dimx or self.dimy != other.dimy:
raise ValueError, "Matrices must be of equal dimensions to add"
else:
# add if correct dimensions
res = matrix([[]])
res.zero(self.dimx, self.dimy)
for i in range(self.dimx):
for j in range(self.dimy):
res.value[i][j] = self.value[i][j] + other.value[i][j]
return res
def __sub__(self, other):
# check if correct dimensions
if self.dimx != other.dimx or self.dimy != other.dimy:
raise ValueError, "Matrices must be of equal dimensions to subtract"
else:
# subtract if correct dimensions
res = matrix([[]])
res.zero(self.dimx, self.dimy)
for i in range(self.dimx):
for j in range(self.dimy):
res.value[i][j] = self.value[i][j] - other.value[i][j]
return res
def __mul__(self, other):
# check if correct dimensions
if self.dimy != other.dimx:
raise ValueError, "Matrices must be m*n and n*p to multiply"
else:
# multiply if correct dimensions
res = matrix([[]])
res.zero(self.dimx, other.dimy)
for i in range(self.dimx):
for j in range(other.dimy):
for k in range(self.dimy):
res.value[i][j] += self.value[i][k] * other.value[k][j]
return res
def transpose(self):
# compute transpose
res = matrix([[]])
res.zero(self.dimy, self.dimx)
for i in range(self.dimx):
for j in range(self.dimy):
res.value[j][i] = self.value[i][j]
return res
# Thanks to Ernesto P. Adorio for use of Cholesky and CholeskyInverse functions
def Cholesky(self, ztol=1.0e-5):
# Computes the upper triangular Cholesky factorization of
# a positive definite matrix.
res = matrix([[]])
res.zero(self.dimx, self.dimx)
for i in range(self.dimx):
S = sum([(res.value[k][i])**2 for k in range(i)])
d = self.value[i][i] - S
if abs(d) < ztol:
res.value[i][i] = 0.0
else:
if d < 0.0:
raise ValueError, "Matrix not positive-definite"
res.value[i][i] = sqrt(d)
for j in range(i+1, self.dimx):
S = sum([res.value[k][i] * res.value[k][j] for k in range(self.dimx)])
if abs(S) < ztol:
S = 0.0
try:
res.value[i][j] = (self.value[i][j] - S)/res.value[i][i]
except:
raise ValueError, "Zero diagonal"
return res
def CholeskyInverse(self):
# Computes inverse of matrix given its Cholesky upper Triangular
# decomposition of matrix.
res = matrix([[]])
res.zero(self.dimx, self.dimx)
# Backward step for inverse.
for j in reversed(range(self.dimx)):
tjj = self.value[j][j]
S = sum([self.value[j][k]*res.value[j][k] for k in range(j+1, self.dimx)])
res.value[j][j] = 1.0/tjj**2 - S/tjj
for i in reversed(range(j)):
res.value[j][i] = res.value[i][j] = -sum([self.value[i][k]*res.value[k][j] for k in range(i+1, self.dimx)])/self.value[i][i]
return res
def inverse(self):
aux = self.Cholesky()
res = aux.CholeskyInverse()
return res
def __repr__(self):
return repr(self.value)
########################################
# Implement the filter function below
def kalman_filter(x, P):
for n in range(len(measurements)):
# measurement update
z=matrix([[measurements[n]]])
y=z-H*x
S=H*P*H.transpose()+R
K=P*H.transpose()*S.inverse()
x=x+(K*y)
P=(I-K*H)*P
# prediction
x=F*x+u
P=F*P*F.transpose()
return x,P
############################################
### use the code below to test your filter!
############################################
measurements = [1, 2, 3]
x = matrix([[0.], [0.]]) # initial state (location and velocity)
P = matrix([[1000., 0.], [0., 1000.]]) # initial uncertainty
u = matrix([[0.], [0.]]) # external motion
F = matrix([[1., 1.], [0, 1.]]) # next state function
H = matrix([[1., 0.]]) # measurement function
R = matrix([[1.]]) # measurement uncertainty
I = matrix([[1., 0.], [0., 1.]]) # identity matrix
print(kalman_filter(x, P))
# output should be:
# x: [[3.9996664447958645], [0.9999998335552873]]
# P: [[2.3318904241194827, 0.9991676099921091], [0.9991676099921067, 0.49950058263974184]]