Skip to content
Snippets Groups Projects
Commit ef22b4f8 authored by Lacroix Paul's avatar Lacroix Paul
Browse files

update position

parent 24d68aa6
Branches
No related tags found
No related merge requests found
......@@ -3,6 +3,8 @@ from math import cos, sin
import numpy as np
import matplotlib.pyplot as plt
from yolov3.utils import detect_image, detect_realtime, detect_video, Load_Yolo_model, detect_video_realtime_mp
### Carte ###
pixel_x_ext, pixel_y_ext = [242, 220, 165, 110, 63, 33, 22, 34, 63, 110, 165, 220, 243, 310, 334, 388, 443, 490, 521, 531, 520, 489, 443, 388, 333, 310], [76, 64, 52, 64, 95, 141, 196, 252, 298, 330, 340, 328, 318, 316, 328, 339, 329, 298, 251, 196, 142, 95, 64, 53, 64, 77]
......@@ -20,6 +22,20 @@ sigma_position = 0.02
sigma_direction = 0.05
dep_x, dep_y, dep_theta = 0,0,0
nb_particule = 30
pos = [[dep_x, dep_y, dep_theta] for i in range(nb_particule)]
F = 1000 #Focale camera
h_reel = 0.2 #Hauteur d'un plot
y_0 = 2048/2 #Milieu de l'image
# class position:
# def __init__(self, pos_x, pos_y, nb_particule):
# self.__pos = [pos_x, pos_y]*nb_particule
def normalisation(W):
a = sum(W)
......@@ -28,10 +44,23 @@ def normalisation(W):
def distance(x_1, y_1, x_2, y_2):
return np.sqrt((x_1-x_2)**2 + (y_1-y_2)**2)
def boite2coord(x1,y1,x2,y2):
d = F*h_reel/abs(y1-y2)
y_r = -((x1+x2)/2 - y0)*d/F
sin_theta= y_r/d
x_r = d*(1-sin_theta**2)**0.5
return x_r,y_r
def distance_Chamfer(A_x, A_y, B_x, B_y):
m = len(A_x)
n = len(B_x)
if m==0 or n==0:
return 0.0001
res = 0
tab = [[distance(A_x[i], A_y[i], B_x[j], B_y[j]) for i in range(m)] for j in range(n)]
......@@ -47,9 +76,9 @@ def distance_Chamfer(A_x, A_y, B_x, B_y):
def motion_update(commande, position):
vitesse, direction = commande
x,y,theta = position
new_x = x + vitesse*cos(direction) + rd.gauss(0, sigma_position)
new_y = y + vitesse*sin(direction) + rd.gauss(0, sigma_position)
new_theta = theta - direction + rd.gauss(0, sigma_direction)
new_x = x + vitesse*cos(direction+theta) + rd.gauss(0, sigma_position)
new_y = y + vitesse*sin(direction+theta) + rd.gauss(0, sigma_position)
new_theta = theta + direction + rd.gauss(0, sigma_direction)
return (new_x, new_y, new_theta)
......@@ -123,8 +152,46 @@ def low_variance_resampling(X,W):
X_t.append(X[i])
return X_t
def get_position(pos, u_t):
image_path = "./IMAGES/IMG_2345.JPEG"
video_path = "./IMAGES/test.mp4"
yolo = Load_Yolo_model()
boxes = detect_image(yolo, image_path, "./IMAGES/111.jpg", input_size=YOLO_INPUT_SIZE, show=True, CLASSES=TRAIN_CLASSES, rectangle_colors=(255,0,0))
#detect_video(yolo, video_path, './IMAGES/detected.mp4', input_size=YOLO_INPUT_SIZE, show=False, CLASSES=TRAIN_CLASSES, rectangle_colors=(255,0,0))
#detect_realtime(yolo, '', input_size=YOLO_INPUT_SIZE, show=True, CLASSES=TRAIN_CLASSES, rectangle_colors=(255, 0, 0))
#detect_video_realtime_mp(video_path, "Output.mp4", input_size=YOLO_INPUT_SIZE, show=True, CLASSES=TRAIN_CLASSES, rectangle_colors=(255,0,0), realtime=False)
liste_x =[]
liste_y =[]
for i in boxes:
x,y = boite2coord(i[0],i[1],i[2],i[3])
liste_x.append(x)
liste_y.append(y)
z_t = []
for i in range(len(liste_x)):
z_t.append((liste_x[i], liste_y[i]))
pos, W = particle_filter(pos, u_t, z_t)
pos_calc = [0,0,0]
for i in range(len(a)):
pos_calc[0] += a[i][0]*W[i]
pos_calc[1] += a[i][1]*W[i]
pos_calc[2] += a[i][2]*W[i]
return pos_calc
if __name__ == "__main__":
pos = [(1.314, 1.162, 3.14/3.6) for i in range(10)]
#pos = [(2.5*rd.random(), 1.5*rd.random(), 6.28*rd.random()) for i in range(50)]
liste_x = [0.37409758380473157,
0.6517064494114153,
......@@ -144,7 +211,7 @@ if __name__ == "__main__":
for i in range(len(liste_x)):
observation.append((liste_x[i], liste_y[i]))
commande = (0.138841, 0.3)
commande = (0.138841, -0.)
a,W = particle_filter(pos, commande, observation)
print(a,W)
......@@ -154,9 +221,9 @@ if __name__ == "__main__":
plt.figure(1)
plt.plot(pos_initiale[0], pos_initiale[1], 'o')
plt.plot(pos_initiale[0], pos_initiale[1], 'o', label='Position initale')
plt.arrow(pos_initiale[0], pos_initiale[1], 0.07*cos(pos_initiale[2]), 0.07*sin(pos_initiale[2]))
plt.plot(pos_finale[0], pos_finale[1], 'o')
plt.plot(pos_finale[0], pos_finale[1], 'o', label='Position finale')
plt.arrow(pos_finale[0], pos_finale[1], 0.07*cos(pos_finale[2]), 0.07*sin(pos_finale[2]))
plt.plot(coord_x_ext, coord_y_ext,'+')
......@@ -164,14 +231,24 @@ if __name__ == "__main__":
pos_x = []
pos_y = []
for k in range(len(a)):
i = a[k]
pos_x.append(i[0])
pos_y.append(i[1])
plt.arrow(i[0], i[1], 0.07*cos(i[2]), 0.07*sin(i[2]))
plt.annotate(W[k], [i[0], i[1]])
#for k in range(len(a)):
#i = a[k]
#pos_x.append(i[0])
#pos_y.append(i[1])
#plt.arrow(i[0], i[1], 0.07*cos(i[2]), 0.07*sin(i[2]))
#plt.annotate(W[k], [i[0], i[1]])
plt.plot(pos_x,pos_y,'x', label='Positions possibles')
pos_calc = [0,0,0]
for i in range(len(a)):
pos_calc[0] += a[i][0]*W[i]
pos_calc[1] += a[i][1]*W[i]
pos_calc[2] += a[i][2]*W[i]
plt.plot(pos_x,pos_y,'.')
plt.plot(pos_calc[0], pos_calc[1], 'o', label='Moyenne pondérée des positions calculées')
plt.arrow(pos_calc[0], pos_calc[1], 0.07*cos(pos_calc[2]), 0.07*sin(pos_calc[2]))
plt.legend()
plt.show()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment