Skip to content

Commit

Permalink
fixes #3151
Browse files Browse the repository at this point in the history
  • Loading branch information
ptaillandier committed Aug 6, 2021
1 parent e23da08 commit dd43c11
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,35 @@ global {

bool display_free_space <- false parameter: true;
bool display_force <- false parameter: true;
bool display_waypoint <- false parameter: true;
bool display_target <- false parameter: true;
bool display_circle_min_dist <- true parameter: true;

float P_shoulder_length <- 0.45 parameter: true;
float P_proba_detour <- 0.5 parameter: true ;
bool P_avoid_other <- true parameter: true ;
float P_obstacle_consideration_distance <- 3.0 parameter: true ;
float P_pedestrian_consideration_distance <- 3.0 parameter: true ;
float P_minimal_distance <- 0.0 parameter: true;
float P_tolerance_waypoint <- 0.1 parameter: true;
bool P_use_geometry_waypoint <- true parameter: true;
float P_tolerance_target <- 0.1 parameter: true;
bool P_use_geometry_target <- true parameter: true;

float P_A_pedestrian_SFM parameter: true <- 0.16 category: "SFM" ;
float P_A_obstacles_SFM parameter: true <- 1.9 category: "SFM" ;
float P_B_pedestrian_SFM parameter: true <- 0.1 category: "SFM" ;
float P_B_obstacles_SFM parameter: true <- 1.0 category: "SFM" ;
float P_relaxion_SFM parameter: true <- 0.5 category: "SFM" ;
float P_gama_SFM parameter: true <- 0.35 category: "SFM" ;
float P_lambda_SFM <- 0.1 parameter: true category: "SFM" ;

string P_model_type <- "advanced" among: ["simple", "advanced"] parameter: true ;

float P_A_pedestrian_SFM_advanced parameter: true <- 0.16 category: "SFM advanced" ;
float P_A_obstacles_SFM_advanced parameter: true <- 1.9 category: "SFM advanced" ;
float P_B_pedestrian_SFM_advanced parameter: true <- 0.1 category: "SFM advanced" ;
float P_B_obstacles_SFM_advanced parameter: true <- 1.0 category: "SFM advanced" ;
float P_relaxion_SFM_advanced parameter: true <- 0.5 category: "SFM advanced" ;
float P_gama_SFM_advanced parameter: true <- 0.35 category: "SFM advanced" ;
float P_lambda_SFM_advanced <- 0.1 parameter: true category: "SFM advanced" ;
float P_minimal_distance_advanced <- 0.25 parameter: true category: "SFM advanced" ;

float P_n_prime_SFM_simple parameter: true <- 3.0 category: "SFM simple" ;
float P_n_SFM_simple parameter: true <- 2.0 category: "SFM simple" ;
float P_lambda_SFM_simple <- 2.0 parameter: true category: "SFM simple" ;
float P_gama_SFM_simple parameter: true <- 0.35 category: "SFM simple" ;
float P_relaxion_SFM_simple parameter: true <- 0.54 category: "SFM simple" ;
float P_A_pedestrian_SFM_simple parameter: true <-4.5category: "SFM simple" ;

float step <- 0.1;
int nb_people <- 100;
Expand Down Expand Up @@ -70,20 +79,33 @@ global {
shoulder_length <- P_shoulder_length;
avoid_other <- P_avoid_other;
proba_detour <- P_proba_detour;
minimal_distance <- P_minimal_distance;
A_pedestrians_SFM <- P_A_pedestrian_SFM;
A_obstacles_SFM <- P_A_obstacles_SFM;
B_pedestrians_SFM <- P_B_pedestrian_SFM;
B_obstacles_SFM <- P_B_obstacles_SFM;
relaxion_SFM <- P_relaxion_SFM;
gama_SFM <- P_gama_SFM;
lambda_SFM <- P_lambda_SFM;
use_geometry_waypoint <- P_use_geometry_waypoint;
tolerance_waypoint <- P_tolerance_waypoint;

use_geometry_waypoint <- P_use_geometry_target;
tolerance_waypoint<- P_tolerance_target;
pedestrian_species <- [people];
obstacle_species<-[wall];

pedestrian_model <- P_model_type;


if (pedestrian_model = "simple") {
A_pedestrians_SFM <- P_A_pedestrian_SFM_simple;
relaxion_SFM <- P_relaxion_SFM_simple;
gama_SFM <- P_gama_SFM_simple;
lambda_SFM <- P_lambda_SFM_simple;
n_prime_SFM <- P_n_prime_SFM_simple;
n_SFM <- P_n_SFM_simple;
} else {
A_pedestrians_SFM <- P_A_pedestrian_SFM_advanced;
A_obstacles_SFM <- P_A_obstacles_SFM_advanced;
B_pedestrians_SFM <- P_B_pedestrian_SFM_advanced;
B_obstacles_SFM <- P_B_obstacles_SFM_advanced;
relaxion_SFM <- P_relaxion_SFM_advanced;
gama_SFM <- P_gama_SFM_advanced;
lambda_SFM <- P_lambda_SFM_advanced;
minimal_distance <- P_minimal_distance_advanced;

}
}
}

Expand Down Expand Up @@ -137,7 +159,7 @@ species people skills: [pedestrian]{

draw triangle(shoulder_length) color: color rotate: heading + 90.0;

if display_waypoint and current_waypoint != nil {
if display_target and current_waypoint != nil {
draw line([location,current_waypoint]) color: color;
}
if display_force {
Expand All @@ -158,7 +180,7 @@ species people skills: [pedestrian]{


experiment normal_sim type: gui {
float minimum_cycle_duration <- 0.05;
float minimum_cycle_duration <- 0.02;
output {
display map type: opengl{
species wall refresh: false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
* Author: Patrick Taillandier
* Description:
* Tags: pedestrian, agent_movement, skill, transport
***/
***/

model pedestrian_simple_environment

global {
Expand All @@ -23,17 +23,29 @@ global {
bool P_avoid_other <- true parameter: true ;
float P_obstacle_consideration_distance <- 5.0 parameter: true ;
float P_pedestrian_consideration_distance <- 5.0 parameter: true ;
float P_minimal_distance <- 0.0 parameter: true;
float P_tolerance_waypoint <- 0.1 parameter: true;
bool P_use_geometry_waypoint <- true parameter: true;

float P_A_pedestrian_SFM parameter: true <- 0.16 category: "SFM" ;
float P_A_obstacles_SFM parameter: true <- 1.9 category: "SFM" ;
float P_B_pedestrian_SFM parameter: true <- 0.1 category: "SFM" ;
float P_B_obstacles_SFM parameter: true <- 1.0 category: "SFM" ;
float P_relaxion_SFM parameter: true <- 0.5 category: "SFM" ;
float P_gama_SFM parameter: true <- 0.35 category: "SFM" ;
float P_lambda_SFM <- 0.1 parameter: true category: "SFM" ;


string P_model_type <- "advanced" among: ["simple", "advanced"] parameter: true ;

float P_A_pedestrian_SFM_advanced parameter: true <- 0.16 category: "SFM advanced" ;
float P_A_obstacles_SFM_advanced parameter: true <- 1.9 category: "SFM advanced" ;
float P_B_pedestrian_SFM_advanced parameter: true <- 0.1 category: "SFM advanced" ;
float P_B_obstacles_SFM_advanced parameter: true <- 1.0 category: "SFM advanced" ;
float P_relaxion_SFM_advanced parameter: true <- 0.5 category: "SFM advanced" ;
float P_gama_SFM_advanced parameter: true <- 0.35 category: "SFM advanced" ;
float P_lambda_SFM_advanced <- 0.1 parameter: true category: "SFM advanced" ;
float P_minimal_distance_advanced <- 0.5 parameter: true category: "SFM advanced" ;


float P_n_prime_SFM_simple parameter: true <- 3.0 category: "SFM simple" ;
float P_n_SFM_simple parameter: true <- 2.0 category: "SFM simple" ;
float P_lambda_SFM_simple <- 2.0 parameter: true category: "SFM simple" ;
float P_gama_SFM_simple parameter: true <- 0.35 category: "SFM simple" ;
float P_relaxion_SFM_simple parameter: true <- 0.54 category: "SFM simple" ;
float P_A_pedestrian_SFM_simple parameter: true <-4.5category: "SFM simple" ;

geometry shape <- square(environment_size);
geometry free_space <- copy(shape);
Expand Down Expand Up @@ -62,17 +74,28 @@ global {
shoulder_length <- P_shoulder_length;
avoid_other <- P_avoid_other;
proba_detour <- P_proba_detour;
minimal_distance <- P_minimal_distance;
A_pedestrians_SFM <- P_A_pedestrian_SFM;
A_obstacles_SFM <- P_A_obstacles_SFM;
B_pedestrians_SFM <- P_B_pedestrian_SFM;
B_obstacles_SFM <- P_B_obstacles_SFM;
relaxion_SFM <- P_relaxion_SFM;
gama_SFM <- P_gama_SFM;
lambda_SFM <- P_lambda_SFM;
use_geometry_waypoint <- P_use_geometry_waypoint;
tolerance_waypoint <- P_tolerance_waypoint;


pedestrian_model <- P_model_type;
if (pedestrian_model = "simple") {
A_pedestrians_SFM <- P_A_pedestrian_SFM_simple;
relaxion_SFM <- P_relaxion_SFM_simple;
gama_SFM <- P_gama_SFM_simple;
lambda_SFM <- P_lambda_SFM_simple;
n_prime_SFM <- P_n_prime_SFM_simple;
n_SFM <- P_n_SFM_simple;
} else {
A_pedestrians_SFM <- P_A_pedestrian_SFM_advanced;
A_obstacles_SFM <- P_A_obstacles_SFM_advanced;
B_pedestrians_SFM <- P_B_pedestrian_SFM_advanced;
B_obstacles_SFM <- P_B_obstacles_SFM_advanced;
relaxion_SFM <- P_relaxion_SFM_advanced;
gama_SFM <- P_gama_SFM_advanced;
lambda_SFM <- P_lambda_SFM_advanced;
minimal_distance <- P_minimal_distance_advanced;
}

pedestrian_species <- [people];
obstacle_species<-[obstacle];
switch scenario {
Expand Down Expand Up @@ -144,7 +167,7 @@ species obstacle {
}
}
experiment big_crowd type: gui {
float minimum_cycle_duration <- 0.05;
float minimum_cycle_duration <- 0.02;
action _init_ {
create simulation with: [scenario :: "big crowd", nb_people::500];
}
Expand All @@ -157,7 +180,7 @@ experiment big_crowd type: gui {
}

experiment frontal_crossing type: gui {
float minimum_cycle_duration <- 0.05;
float minimum_cycle_duration <- 0.02;
action _init_ {
create simulation with: [scenario :: "frontal crossing", nb_people::100];
}
Expand All @@ -173,7 +196,7 @@ experiment frontal_crossing type: gui {
}
}
experiment perpandicular_crossing type: gui {
float minimum_cycle_duration <- 0.05;
float minimum_cycle_duration <- 0.02;
action _init_ {
create simulation with: [scenario :: "perpandicular crossing", nb_people::100];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
init = "[]",
doc = @doc ("The exit hub (several exit connected to each road extremities) that makes it possible to reduce angular distance when travelling to connected pedestrian roads")) })
public class PedestrianRoadSkill extends Skill {

public final static String PEDESTRIAN_ROAD_SKILL = "pedestrian_road";
public final static String LINKED_PEDESTRIAN_ROADS = "linked_pedestrian_roads";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -700,25 +700,27 @@ public double walkWithForceModel(final IScope scope, final IAgent agent, final I
public GamaPoint avoidSFMSimple(final IScope scope, final IAgent agent, final GamaPoint location,
final GamaPoint currentTarget, final double distPercepPedestrian, final double distPercepObstacle,
final IContainer pedestriansList, final IContainer obstaclesList) {

IMap<IShape, GamaPoint> forcesMap = GamaMapFactory.create();

GamaPoint current_velocity = getVelocity(agent).copy(scope);
GamaPoint fsoc = new GamaPoint(0, 0, 0);
double dist = location.euclidianDistanceTo(currentTarget);
double step = scope.getSimulation().getClock().getStepInSeconds();
double speed = getSpeed(agent);
IList<ISpecies> speciesList = getObstacleSpecies(agent);
IList<IAgent> obstacles = GamaListFactory.create(Types.AGENT);
IList<IAgent> pedestrians = GamaListFactory.create(Types.AGENT);

obstacles.addAll(Spatial.Queries.at_distance(scope, pedestriansList, distPercepPedestrian));

obstacles.remove(agent);
obstacles.removeIf(IAgent::dead);
pedestrians.addAll(Spatial.Queries.at_distance(scope, pedestriansList, distPercepPedestrian));
obstacles.addAll(Spatial.Queries.at_distance(scope, obstaclesList, distPercepObstacle));

pedestrians.remove(agent);
pedestrians.removeIf(IAgent::dead);
double lambda = getlAMBDA_SFM(agent);
double gama_ = getGAMA_SFM(agent);
double A = getAPedestrian_SFM(agent);
double n = getN_SFM(agent);
double n_prime = getN_PRIME_SFM(agent);
for (IAgent ag : obstacles) {
for (IAgent ag : pedestrians) {
GamaPoint force = new GamaPoint(0, 0, 0);
double distance = agent.euclidianDistanceTo(ag);
GamaPoint itoj = Points.subtract(ag.getLocation(), agent.getLocation());
Expand Down Expand Up @@ -747,21 +749,20 @@ public GamaPoint avoidSFMSimple(final IScope scope, final IAgent agent, final Ga
force = f_1.add(f_2).multiplyBy(-A * Math.exp(-distance / B));
fsoc = fsoc.add(force);
}

forcesMap.put(ag, force);
}


GamaPoint desiredVelo = currentTarget.copy(scope).minus(location)
.divideBy(dist * Math.min(getSpeed(agent), dist / scope.getSimulation().getClock().getStepInSeconds()));
GamaPoint fdest = desiredVelo.minus(current_velocity).multiplyBy(getRELAXION_SFM(agent));
.divideBy(dist / Math.min(getSpeed(agent), dist / scope.getSimulation().getClock().getStepInSeconds()));
GamaPoint fdest = desiredVelo.minus(current_velocity).dividedBy(getRELAXION_SFM(agent));


forcesMap.put(agent, fdest);
agent.setAttribute(FORCES, forcesMap);
GamaPoint forces = fdest.add(fsoc);
GamaPoint pref_velocity = current_velocity.add(forces.multiplyBy(step));
double norm_vel = Maths.sqrt(scope, pref_velocity.x * pref_velocity.x + pref_velocity.y * pref_velocity.y
+ pref_velocity.z * pref_velocity.z);
if (norm_vel > speed) {
current_velocity = pref_velocity.divideBy(norm_vel * speed);
} else {
current_velocity = pref_velocity;
}
return current_velocity;// .multiplyBy(step);
return current_velocity.add(forces).normalize();
}

public GamaPoint avoidSFM(final IScope scope, final IAgent agent, final GamaPoint location,
Expand Down

0 comments on commit dd43c11

Please sign in to comment.