Je vais expliquer le modèle de mise au point sociale, qui est un type de méthode de potentiel artificiel. Il s'agit d'un modèle de comportement des foules humaines basé sur la dynamique préconisée par Helbing.
Cliquez ici pour le papier original https://arxiv.org/pdf/cond-mat/9805244.pdf
Fondamentalement, il est exprimé comme la somme de la force d'attraction et de la force de répulsion comme indiqué ci-dessous.
F_{all} = F_{gall} + F_{others} + F_{obstacle}
Voici la formule de la force attractive qui opère entre le piéton et le but.
F_{all} =\frac{V_0e_t-v_t}{\tau}
$ V_0: Vitesse maximale $ $ e_t: Vecteur unitaire dans la direction du but $ $ \ tau: Temps pour atteindre V_0 (constante de temps) $ $ v_t: Vecteur de vitesse actuel $
Voici la formule de la force répulsive qui agit entre les obstacles et les autres piétons et les piétons. Les formules utilisées sont les mêmes.
F_{others} = F_{obstacle} = v_rUe^{-\frac{d}{R}}
$ d: Distance aux obstacles et autres piétons (hors rayon) $ $ R, U: constante $ $ v_r: Direction depuis l'obstacle (vecteur unitaire) $
Il est devenu.
A partir de cette formule et de ces paramètres, je souhaite afficher la trajectoire lorsqu'un piéton évite un obstacle.
Normalement, nous devons considérer les obstacles et le rayon des piétons, mais par souci de simplicité, nous l'avons omis.
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
V0 = 1.34 # [m/s] Speed of equilibrium (= max speed)
tau = 0.5 # [sec] Time to reach V0 ziteisuu
delta_sec = 0.01 #[sec]
U = 10.0 # [m^2/s^2]
R = 0.2 # [m]
user_mass_kg = 55 # [kg]
user_mass_N = user_mass_kg / 9.8 # [N]
user_pos = np.array([0.0, 0.0]) # 0=x, 1=y[m]
user_vel = np.array([0.3, 0.0]) # 0=x, 1=y[m/s]
map_size = np.array([10, 10]) # 0=x, 1=y[m]
goal_pos = np.array([10, 5]) # 0=x, 1=y[m]
obstacle_pos = np.array([6, 3]) # 0=x, 1=y[m]
user_pos_lines = user_pos.reshape((2,1))
while True:
#Attraction
dist_xy = goal_pos - user_pos
dist_norm = np.linalg.norm(dist_xy, ord=1)
e = dist_xy / dist_norm
F_goal = (V0 * e - user_vel) / tau # [N]
#force répulsive
dist_xy = user_pos - obstacle_pos
dist_norm = np.linalg.norm(dist_xy, ord=2)
v_r = dist_xy / dist_norm
F_obstacle = v_r * U * np.exp((-1) * dist_norm / R)
#Calcul de la position des piétons
F_all = F_goal + F_obstacle # [N]
#accélération[m/s^2]
user_acc = F_all / user_mass_N
#la vitesse[m/s]
user_vel += user_acc * delta_sec
#position
user_pos += user_vel * delta_sec
#La distance entre le piéton et le but est de 0.Terminer quand il fait moins de 2m
if np.linalg.norm(goal_pos - user_pos) < 0.2:
break
user_pos_lines = np.append(user_pos_lines, user_pos.reshape((2,1)), axis=1)
#dessin
#Obstacle
plt.scatter(obstacle_pos[0], obstacle_pos[1], color='b', s=100)
#Trajectoire
plt.plot(user_pos_lines[0,:], user_pos_lines[1,:], color='r')
#objectif
plt.scatter(goal_pos[0], goal_pos[1], color='g', s=200)
plt.show()
print("end")
De cette façon, j'ai pu créer une trajectoire pour éviter les obstacles en me dirigeant vers le but.
Recommended Posts