Ich werde das Social Focus Model erklären, eine Art künstliche Potentialmethode. Dies ist ein Modell des menschlichen Menschenverhaltens, das auf der von Helbing befürworteten Dynamik basiert.
Klicken Sie hier für das Originalpapier https://arxiv.org/pdf/cond-mat/9805244.pdf
Grundsätzlich wird es als die Summe von Anziehungskraft und Abstoßungskraft ausgedrückt, wie unten gezeigt.
F_{all} = F_{gall} + F_{others} + F_{obstacle}
Hier ist die Formel der Anziehungskraft, die zwischen dem Fußgänger und dem Ziel wirkt.
F_{all} =\frac{V_0e_t-v_t}{\tau}
$ V_0: Höchstgeschwindigkeit $ $ e_t: Einheitsvektor in Richtung Ziel $ $ \ tau: Zeit bis zum Erreichen von V_0 (Zeitkonstante) $ $ v_t: Aktueller Geschwindigkeitsvektor $
Hier ist die Formel für die Abstoßungskraft, die zwischen Hindernissen und anderen Fußgängern und den Fußgängern wirkt. Die verwendeten Formeln sind die gleichen.
F_{others} = F_{obstacle} = v_rUe^{-\frac{d}{R}}
$ d: Entfernung zu Hindernissen und anderen Fußgängern (ohne Radius) $ $ R, U: Konstante $ $ v_r: Richtung vom Hindernis (Einheitsvektor) $
Es ist geworden.
Aus dieser Formel und den Parametern möchte ich die Flugbahn anzeigen, wenn ein Fußgänger einem Hindernis aus dem Weg geht.
Normalerweise müssen wir Hindernisse und den Radius von Fußgängern berücksichtigen, aber der Einfachheit halber haben wir ihn weggelassen.
# 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:
#Attraktion
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]
#abstoßende Kraft
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)
#Positionsberechnung von Fußgängern
F_all = F_goal + F_obstacle # [N]
#Beschleunigung[m/s^2]
user_acc = F_all / user_mass_N
#Geschwindigkeit[m/s]
user_vel += user_acc * delta_sec
#Position
user_pos += user_vel * delta_sec
#Der Abstand zwischen Fußgänger und Ziel beträgt 0.Beenden Sie, wenn es weniger als 2 m ist
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)
#Zeichnung
#Hindernis
plt.scatter(obstacle_pos[0], obstacle_pos[1], color='b', s=100)
#Flugbahn
plt.plot(user_pos_lines[0,:], user_pos_lines[1,:], color='r')
#Tor
plt.scatter(goal_pos[0], goal_pos[1], color='g', s=200)
plt.show()
print("end")
Auf diese Weise konnte ich eine Flugbahn erstellen, um Hindernissen auf dem Weg zum Ziel auszuweichen.