How to create a dataset of pedestrian walking trajectories in python?

Question:

I am trying to use python to simulate the trajectories of pedestrians walking in an area.

But the searched articles all use the random walk method, which is not quite like the actual pedestrian trajectory. Is there a better way to simulate pedestrian trajectories?

Asked By: Ethan

||

Answers:

There are several model such as
Social Force Model, Cellular Automata, Agent-Based Model and Optimal Steps Models

Here’s an example of how to simulate pedestrian trajectories using the Social Force Model

import numpy as np

# Define simulation parameters
num_pedestrians = 50
simulation_time = 100  # in seconds
time_step = 0.1  # in seconds

# Define physical constants
kappa = 1.2 * 10**5
tau = 0.5
mass = 80  # in kg
v_0 = 1.3  # in m/s
sigma = 0.3  # in m

# Define simulation area
length = 20  # in m
width = 20  # in m
obstacle_position = np.array([[7, 7], [8, 7], [9, 7], [10, 7], [11, 7], [12, 7], [13, 7], [14, 7]])

# Define initial positions and velocities of pedestrians
pedestrian_positions = np.random.rand(num_pedestrians, 2) * np.array([length, width])
pedestrian_velocities = np.zeros((num_pedestrians, 2))

# Define function for computing social forces
def compute_social_forces(position, velocity):
    # Compute attractive force towards destination
    destination = np.array([length/2, width/2])  # middle of simulation area
    attractive_force = (destination - position) / np.linalg.norm(destination - position)

    # Compute repulsive forces from other pedestrians
    repulsive_forces = np.zeros_like(velocity)
    for i in range(num_pedestrians):
        for j in range(num_pedestrians):
            if i == j:
                continue
            r_ij = position[i] - position[j]
            d_ij = np.linalg.norm(r_ij)
            if d_ij < 2 * sigma:
                repulsive_force = kappa * (2 * sigma - d_ij) * (r_ij / d_ij)
                repulsive_forces[i] += repulsive_force

    # Compute repulsive forces from obstacles
    for obstacle_pos in obstacle_position:
        r_ij = position - obstacle_pos
        d_ij = np.linalg.norm(r_ij)
        if d_ij < 2 * sigma:
            repulsive_force = kappa * (2 * sigma - d_ij) * (r_ij / d_ij)
            repulsive_forces += repulsive_force

    # Compute friction force
    friction_force = -mass * tau * velocity

    # Compute total force
    total_force = attractive_force + repulsive_forces + friction_force

    return total_force

# Simulate pedestrian trajectories
for t in np.arange(0, simulation_time, time_step):
    for i in range(num_pedestrians):
        position = pedestrian_positions[i]
        velocity = pedestrian_velocities[i]

        # Compute social forces
        social_forces = compute_social_forces(position, velocity)

        # Compute acceleration
        acceleration = social_forces / mass

        # Update velocity and position
        pedestrian_velocities[i] += acceleration * time_step
        pedestrian_positions[i] += pedestrian_velocities[i] * time_step
 
Answered By: Sara Krauss
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.