Commit b226ca8e authored by Benedikt Kleinmeier's avatar Benedikt Kleinmeier
Browse files

Implemented "ThreatCognitionModel" partially and refactored "UpdateSchemeEventDriven"

Also renamed:
- Enum value "TARGET_DISTRACTION_STRATEGY" to "TARGET_REPULSION_STRATEGY"
- Class "TargetDistractionStrategy" to "TargetRepulsionStrategy"

VadereSimulator/src/org/vadere/simulator/models/psychology/selfcategorization/locomotion/OSMBehaviorController.java:
- Renamed "reactToBang()" to "maximizeDistanceToThreatAndIncreaseSpeed()"
  and use "pedestrian.getPerceivedThreat()" instead of "pedestrian.getMostImportantStimulus()".

VadereSimulator/src/org/vadere/simulator/models/psychology/selfcategorization/locomotion/UpdateSchemeEventDriven.java:
- Use "pedestrian.getSelfCategory()" instead of "pedestrian.getMostImportantStimulus()"
  to derive specific behavior in "update()" method.

VadereState/src/org/vadere/state/psychology/PsychologyStatus.java:
- Added member variable "perceivedThreat".
parent ecea56e5
Pipeline #203479 passed with stages
in 121 minutes and 43 seconds
{
"name" : "08-Bang-SelfCatThreatModel",
"description" : "",
"release" : "1.7",
"processWriters" : {
"files" : [ {
"type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOutputFile",
"filename" : "density.txt",
"processors" : [ 1 ]
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOverlapOutputFile",
"filename" : "out.txt",
"processors" : [ 3 ]
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.outputfile.NoDataKeyOutputFile",
"filename" : "out1.txt",
"processors" : [ 4 ]
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.outputfile.EventtimePedestrianIdOutputFile",
"filename" : "postvis.traj",
"processors" : [ 6, 7, 8, 9 ]
} ],
"processors" : [ {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianDensityCountingProcessor",
"id" : 1,
"attributesType" : "org.vadere.state.attributes.processor.AttributesPedestrianDensityCountingProcessor",
"attributes" : {
"pedestrianPositionProcessorId" : 2,
"radius" : 1.5
}
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianPositionProcessor",
"id" : 2,
"attributesType" : "org.vadere.state.attributes.processor.AttributesPedestrianPositionProcessor",
"attributes" : {
"interpolate" : true
}
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianOverlapProcessor",
"id" : 3
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.NumberOverlapsProcessor",
"id" : 4,
"attributesType" : "org.vadere.state.attributes.processor.AttributesNumberOverlapsProcessor",
"attributes" : {
"pedestrianOverlapProcessorId" : 3
}
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.MaxOverlapProcessor",
"id" : 5,
"attributesType" : "org.vadere.state.attributes.processor.AttributesMaxOverlapProcessor",
"attributes" : {
"pedestrianOverlapProcessorId" : 3
}
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.FootStepProcessor",
"id" : 6
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.FootStepTargetIDProcessor",
"id" : 7
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.FootStepMostImportantStimulusProcessor",
"id" : 8
}, {
"type" : "org.vadere.simulator.projects.dataprocessing.processor.FootStepSelfCategoryProcessor",
"id" : 9
} ],
"isTimestamped" : true,
"isWriteMetaData" : false
},
"scenario" : {
"mainModel" : "org.vadere.simulator.models.psychology.selfcategorization.SelfCatThreatModel",
"attributesModel" : {
"org.vadere.state.attributes.models.AttributesSelfCatThreat" : {
"attributesLocomotion" : {
"stepCircleResolution" : 4,
"numberOfCircles" : 1,
"optimizationType" : "NELDER_MEAD",
"varyStepDirection" : true,
"movementType" : "ARBITRARY",
"stepLengthIntercept" : 0.4625,
"stepLengthSlopeSpeed" : 0.2345,
"stepLengthSD" : 0.036,
"movementThreshold" : 0.0,
"minStepLength" : 0.1,
"minimumStepLength" : true,
"maxStepDuration" : 1.7976931348623157E308,
"dynamicStepLength" : true,
"updateType" : "EVENT_DRIVEN",
"seeSmallWalls" : false,
"targetPotentialModel" : "org.vadere.simulator.models.potential.fields.PotentialFieldTargetGrid",
"pedestrianPotentialModel" : "org.vadere.simulator.models.potential.PotentialFieldPedestrianCompactSoftshell",
"obstaclePotentialModel" : "org.vadere.simulator.models.potential.PotentialFieldObstacleCompactSoftshell",
"submodels" : [ ]
}
},
"org.vadere.state.attributes.models.AttributesPotentialCompactSoftshell" : {
"pedPotentialIntimateSpaceWidth" : 0.45,
"pedPotentialPersonalSpaceWidth" : 1.2,
"pedPotentialHeight" : 50.0,
"obstPotentialWidth" : 0.8,
"obstPotentialHeight" : 6.0,
"intimateSpaceFactor" : 1.2,
"personalSpacePower" : 1,
"intimateSpacePower" : 1
},
"org.vadere.state.attributes.models.AttributesFloorField" : {
"createMethod" : "HIGH_ACCURACY_FAST_MARCHING",
"potentialFieldResolution" : 0.1,
"obstacleGridPenalty" : 0.1,
"targetAttractionStrength" : 1.0,
"cacheType" : "NO_CACHE",
"cacheDir" : "",
"timeCostAttributes" : {
"standardDeviation" : 0.7,
"type" : "UNIT",
"obstacleDensityWeight" : 3.5,
"pedestrianSameTargetDensityWeight" : 3.5,
"pedestrianOtherTargetDensityWeight" : 3.5,
"pedestrianWeight" : 3.5,
"queueWidthLoading" : 1.0,
"pedestrianDynamicWeight" : 6.0,
"loadingType" : "CONSTANT",
"width" : 0.2,
"height" : 1.0
}
}
},
"attributesSimulation" : {
"finishTime" : 150.0,
"simTimeStepLength" : 0.4,
"realTimeSimTimeRatio" : 0.0,
"writeSimulationData" : true,
"visualizationEnabled" : true,
"printFPS" : false,
"digitsPerCoordinate" : 2,
"useFixedSeed" : true,
"fixedSeed" : 1,
"simulationSeed" : 1
},
"attributesPsychology" : {
"usePsychologyLayer" : true,
"psychologyLayer" : {
"perception" : "SimplePerceptionModel",
"cognition" : "ThreatCognitionModel"
}
},
"topography" : {
"attributes" : {
"bounds" : {
"x" : 0.0,
"y" : 0.0,
"width" : 40.0,
"height" : 16.0
},
"boundingBoxWidth" : 0.5,
"bounded" : true,
"referenceCoordinateSystem" : null
},
"obstacles" : [ ],
"measurementAreas" : [ ],
"stairs" : [ ],
"targets" : [ {
"id" : 1,
"absorbing" : true,
"shape" : {
"x" : 36.0,
"y" : 10.5,
"width" : 2.5,
"height" : 4.5,
"type" : "RECTANGLE"
},
"waitingTime" : 0.0,
"waitingTimeYellowPhase" : 0.0,
"parallelWaiters" : 0,
"individualWaiting" : true,
"deletionDistance" : 0.1,
"startingWithRedLight" : false,
"nextSpeed" : -1.0
}, {
"id" : 2,
"absorbing" : true,
"shape" : {
"x" : 36.0,
"y" : 1.0,
"width" : 2.5,
"height" : 4.5,
"type" : "RECTANGLE"
},
"waitingTime" : 0.0,
"waitingTimeYellowPhase" : 0.0,
"parallelWaiters" : 0,
"individualWaiting" : true,
"deletionDistance" : 0.1,
"startingWithRedLight" : false,
"nextSpeed" : -1.0
}, {
"id" : 0,
"absorbing" : true,
"shape" : {
"radius" : 1.0,
"center" : {
"x" : 20.0,
"y" : 8.0
},
"type" : "CIRCLE"
},
"waitingTime" : 0.0,
"waitingTimeYellowPhase" : 0.0,
"parallelWaiters" : 0,
"individualWaiting" : true,
"deletionDistance" : 0.1,
"startingWithRedLight" : false,
"nextSpeed" : -1.0
} ],
"targetChangers" : [ ],
"absorbingAreas" : [ ],
"sources" : [ {
"id" : 1,
"shape" : {
"x" : 1.0,
"y" : 10.5,
"width" : 2.5,
"height" : 4.5,
"type" : "RECTANGLE"
},
"interSpawnTimeDistribution" : "org.vadere.state.scenario.ConstantDistribution",
"distributionParameters" : [ 1.0 ],
"spawnNumber" : 10,
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 0.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : true,
"targetIds" : [ 1 ],
"groupSizeDistribution" : [ 1.0 ],
"dynamicElementType" : "PEDESTRIAN"
}, {
"id" : 2,
"shape" : {
"x" : 1.0,
"y" : 1.0,
"width" : 2.5,
"height" : 4.5,
"type" : "RECTANGLE"
},
"interSpawnTimeDistribution" : "org.vadere.state.scenario.ConstantDistribution",
"distributionParameters" : [ 1.0 ],
"spawnNumber" : 10,
"maxSpawnNumberTotal" : -1,
"startTime" : 0.0,
"endTime" : 0.0,
"spawnAtRandomPositions" : false,
"useFreeSpaceOnly" : true,
"targetIds" : [ 2 ],
"groupSizeDistribution" : [ 1.0 ],
"dynamicElementType" : "PEDESTRIAN"
} ],
"dynamicElements" : [ ],
"attributesPedestrian" : {
"radius" : 0.195,
"densityDependentSpeed" : false,
"speedDistributionMean" : 1.34,
"speedDistributionStandardDeviation" : 0.26,
"minimumSpeed" : 0.5,
"maximumSpeed" : 2.2,
"acceleration" : 2.0,
"footstepHistorySize" : 4,
"searchRadius" : 1.0,
"walkingDirectionCalculation" : "BY_TARGET_CENTER",
"walkingDirectionSameIfAngleLessOrEqual" : 45.0
},
"teleporter" : null,
"attributesCar" : null
},
"stimulusInfos" : [ {
"timeframe" : {
"startTime" : 15.0,
"endTime" : 15.4,
"repeat" : false,
"waitTimeBetweenRepetition" : 0.0
},
"stimuli" : [ {
"type" : "Bang",
"originAsTargetId" : 0,
"loudness" : 1.0,
"radius" : 10.0
} ]
} ]
}
}
package org.vadere.simulator.control.psychology.cognition;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.perception.types.Bang;
import org.vadere.state.psychology.perception.types.ElapsedTime;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.scenario.Topography;
import org.vadere.state.simulation.FootstepHistory;
import org.vadere.util.geometry.shapes.VPoint;
import java.util.Collection;
/**
* Suppose a threat (a {@link Bang}) occurred.
*
* Check following conditions for a pedestrian:
* <ol>
* <li>Is pedestrian inside threat area.</li>
* <li>Is pedestrian outside threat area.</li>
* <li>If pedestrian outside threat area, test if other pedestrians are nearby
* who have perceived the threat. If so, imitate their behavior if they are ingroup members.</li>
* </ol>
*/
public class ThreatCognitionModel implements ICognitionModel {
private Topography topography;
@Override
public void initialize(Topography topography) {
this.topography = topography;
}
@Override
public void update(Collection<Pedestrian> pedestrians) {
for (Pedestrian pedestrian : pedestrians) {
if (pedestrian.getMostImportantStimulus() instanceof Bang) {
// I.e., pedestrian is inside bang radius.
pedestrian.setPerceivedThreat(pedestrian.getMostImportantStimulus());
pedestrian.setSelfCategory(SelfCategory.INSIDE_THREAT_AREA);
} else if (pedestrian.getMostImportantStimulus() instanceof ElapsedTime) {
if (pedestrian.getPerceivedThreat() != null) {
if (pedIsInsideThreatArea(pedestrian, (Bang) pedestrian.getPerceivedThreat())) {
pedestrian.setSelfCategory(SelfCategory.INSIDE_THREAT_AREA);
} else {
pedestrian.setSelfCategory(SelfCategory.OUTSIDE_THREAT_AREA);
}
} else {
// TODO: Imitate behavior if recognizing an in-group member.
// Maybe, use also cooperative behavior from "CooperativeCognitionModel".
pedestrian.setSelfCategory(SelfCategory.TARGET_ORIENTED);
}
} else {
throw new IllegalArgumentException("Use only \"Bang\" and \"ElapsedTime\" stimuli!");
}
}
}
private boolean pedIsInsideThreatArea(Pedestrian pedestrian, Bang bang) {
VPoint bangOrigin = topography.getTarget(bang.getOriginAsTargetId()).getShape().getCentroid();
double distanceToBang = bangOrigin.distance(pedestrian.getPosition());
boolean isInsideThreatArea = (distanceToBang <= bang.getRadius());
return isInsideThreatArea;
}
}
......@@ -125,11 +125,11 @@ public class OSMBehaviorController {
nextTarget.add(bangOrigin.getId());
pedestrian.setTargets(nextTarget);
pedestrian.setCombinedPotentialStrategy(CombinedPotentialStrategy.TARGET_DISTRACTION_STRATEGY);
pedestrian.setCombinedPotentialStrategy(CombinedPotentialStrategy.TARGET_REPULSION_STRATEGY);
} else {
logger.debug(String.format("Expected: %s, Received: %s"),
logger.debug(String.format("Expected: %s, Received: %s",
Bang.class.getSimpleName(),
mostImportantStimulus.getClass().getSimpleName());
mostImportantStimulus.getClass().getSimpleName()));
}
}
......@@ -141,9 +141,9 @@ public class OSMBehaviorController {
pedestrian.setTargets(changeTarget.getNewTargetIds());
} else {
logger.debug(String.format("Expected: %s, Received: %s"),
logger.debug(String.format("Expected: %s, Received: %s",
ChangeTarget.class.getSimpleName(),
mostImportantStimulus.getClass().getSimpleName());
mostImportantStimulus.getClass().getSimpleName()));
}
}
......
......@@ -7,7 +7,7 @@ import org.vadere.simulator.models.osm.optimization.OptimizationMetric;
import org.vadere.simulator.models.potential.combinedPotentials.CombinedPotentialStrategy;
import org.vadere.simulator.models.potential.combinedPotentials.ICombinedPotentialStrategy;
import org.vadere.simulator.models.potential.combinedPotentials.TargetAttractionStrategy;
import org.vadere.simulator.models.potential.combinedPotentials.TargetDistractionStrategy;
import org.vadere.simulator.models.potential.combinedPotentials.TargetRepulsionStrategy;
import org.vadere.util.geometry.shapes.Vector2D;
import org.vadere.simulator.models.SpeedAdjuster;
import org.vadere.simulator.models.osm.optimization.StepCircleOptimizer;
......@@ -28,7 +28,6 @@ import org.vadere.util.geometry.shapes.VCircle;
import org.vadere.util.geometry.shapes.VPoint;
import java.util.*;
import java.util.stream.Collectors;
public class PedestrianOSM extends Pedestrian {
......@@ -339,8 +338,8 @@ public class PedestrianOSM extends Pedestrian {
this.combinedPotentialStrategy = new TargetAttractionStrategy(this.potentialFieldTarget,
this.potentialFieldObstacle,
this.potentialFieldPedestrian);
} else if (newStrategy == CombinedPotentialStrategy.TARGET_DISTRACTION_STRATEGY) {
this.combinedPotentialStrategy = new TargetDistractionStrategy(this.potentialFieldTarget,
} else if (newStrategy == CombinedPotentialStrategy.TARGET_REPULSION_STRATEGY) {
this.combinedPotentialStrategy = new TargetRepulsionStrategy(this.potentialFieldTarget,
this.potentialFieldObstacle,
this.potentialFieldPedestrian);
} else {
......
......@@ -3,10 +3,10 @@ package org.vadere.simulator.models.potential.combinedPotentials;
/**
* All available potential strategies.
*
* Use these enum values to create objects imlementing {@link org.vadere.simulator.models.potential.combinedPotentials.ICombinedPotentialStrategy}
* Use these enum values to create objects implementing {@link org.vadere.simulator.models.potential.combinedPotentials.ICombinedPotentialStrategy}
* by using the factory pattern.
*/
public enum CombinedPotentialStrategy {
TARGET_ATTRACTION_STRATEGY,
TARGET_DISTRACTION_STRATEGY
TARGET_REPULSION_STRATEGY
}
......@@ -9,7 +9,7 @@ import org.vadere.util.geometry.shapes.IPoint;
import java.util.Collection;
/**
* Combine potential so that agents get attracted by targets.
* Combine potential so that agents are attracted by targets.
*/
public class TargetAttractionStrategy implements ICombinedPotentialStrategy {
private IPotentialFieldTarget potentialFieldTarget;
......
......@@ -9,14 +9,14 @@ import org.vadere.util.geometry.shapes.IPoint;
import java.util.Collection;
/**
* Combine potential so that agents get distracted by targets.
* Combine potential so that agents are repelled by targets.
*/
public class TargetDistractionStrategy implements ICombinedPotentialStrategy {
public class TargetRepulsionStrategy implements ICombinedPotentialStrategy {
private IPotentialFieldTarget potentialFieldTarget;
private PotentialFieldObstacle potentialFieldObstacle;
private PotentialFieldAgent potentialFieldAgent;
public TargetDistractionStrategy(IPotentialFieldTarget potentialFieldTarget, PotentialFieldObstacle potentialFieldObstacle, PotentialFieldAgent potentialFieldAgent) {
public TargetRepulsionStrategy(IPotentialFieldTarget potentialFieldTarget, PotentialFieldObstacle potentialFieldObstacle, PotentialFieldAgent potentialFieldAgent) {
this.potentialFieldTarget = potentialFieldTarget;
this.potentialFieldObstacle = potentialFieldObstacle;
this.potentialFieldAgent = potentialFieldAgent;
......
......@@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable;
import org.vadere.simulator.models.osm.OptimalStepsModel;
import org.vadere.simulator.models.osm.PedestrianOSM;
import org.vadere.simulator.models.potential.combinedPotentials.CombinedPotentialStrategy;
import org.vadere.simulator.models.potential.combinedPotentials.TargetAttractionStrategy;
import org.vadere.state.attributes.scenario.AttributesAgent;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.perception.types.Bang;
......@@ -123,23 +124,27 @@ public class OSMBehaviorController {
// I.e., a new target is set for the agent. The agent does not move here!
// Therefore, trigger only a single bang event and then use "ElapsedTime" afterwards
// to let the agent walk.
public void reactToBang(PedestrianOSM pedestrian, Topography topography) {
Stimulus mostImportantStimulus = pedestrian.getMostImportantStimulus();
public void maximizeDistanceToThreatAndIncreaseSpeed(PedestrianOSM pedestrian, Topography topography) {
Stimulus perceivedThreat = pedestrian.getPerceivedThreat();
// TODO: Change only if "pedestrian.getCombinedPotentialStrategy != TARGET_DISTRACTION_STRATEGY".
if (mostImportantStimulus instanceof Bang) {
Bang bang = (Bang) pedestrian.getMostImportantStimulus();
if (perceivedThreat instanceof Bang && pedestrian.getCombinedPotentialStrategy() instanceof TargetAttractionStrategy) {
Bang bang = (Bang) perceivedThreat;
Target bangOrigin = topography.getTarget(bang.getOriginAsTargetId());
LinkedList<Integer> nextTarget = new LinkedList<>();
nextTarget.add(bangOrigin.getId());
pedestrian.setTargets(nextTarget);
pedestrian.setCombinedPotentialStrategy(CombinedPotentialStrategy.TARGET_DISTRACTION_STRATEGY);
pedestrian.setCombinedPotentialStrategy(CombinedPotentialStrategy.TARGET_REPULSION_STRATEGY);
// TODO: Maybe, sample speed-up from a distribution or define it as a configurable attribute.
double escapeSpeed = pedestrian.getFreeFlowSpeed() * 2.0;
pedestrian.setFreeFlowSpeed(escapeSpeed);
} else {
logger.debug(String.format("Expected: %s, Received: %s"),
logger.debug(String.format("Expected: %s, Received: %s",
Bang.class.getSimpleName(),
mostImportantStimulus.getClass().getSimpleName());
perceivedThreat.getClass().getSimpleName()));
}
}
......@@ -151,9 +156,9 @@ public class OSMBehaviorController {
pedestrian.setTargets(changeTarget.getNewTargetIds());
pedestrian.setNextTargetListIndex(0);
} else {
logger.debug(String.format("Expected: %s, Received: %s"),
logger.debug(String.format("Expected: %s, Received: %s",
ChangeTarget.class.getSimpleName(),
mostImportantStimulus.getClass().getSimpleName());
mostImportantStimulus.getClass().getSimpleName()));
}
}
......
......@@ -4,7 +4,6 @@ import org.jetbrains.annotations.NotNull;
import org.vadere.simulator.models.osm.PedestrianOSM;
import org.vadere.simulator.models.psychology.selfcategorization.PedestrianSelfCatThreat;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.perception.types.*;
import org.vadere.state.scenario.*;
import java.util.Comparator;
......@@ -52,31 +51,28 @@ public class UpdateSchemeEventDriven implements DynamicElementAddListener, Dynam
return;
}
Stimulus mostImportantStimulus = pedestrian.getMostImportantStimulus();
// TODO: Maybe, use a state table with function pointers to a template function myFunc(ped, topography, time)
if (pedestrian.getSelfCategory() == SelfCategory.TARGET_ORIENTED) {
osmBehaviorController.makeStepToTarget(pedestrian, topography);
} else if (pedestrian.getSelfCategory() == SelfCategory.COOPERATIVE) {
PedestrianOSM candidate = osmBehaviorController.findSwapCandidate(pedestrian, topography);
if (mostImportantStimulus instanceof ElapsedTime) {
if (pedestrian.getSelfCategory() == SelfCategory.TARGET_ORIENTED) {
if (candidate != null) {
pedestrianEventsQueue.remove(candidate);
osmBehaviorController.swapPedestrians(pedestrian, candidate, topography);
pedestrianEventsQueue.add((PedestrianSelfCatThreat) candidate);
} else {
osmBehaviorController.makeStepToTarget(pedestrian, topography);
} else if (pedestrian.getSelfCategory() == SelfCategory.COOPERATIVE) {
PedestrianOSM candidate = osmBehaviorController.findSwapCandidate(pedestrian, topography);
if(candidate != null) {
pedestrianEventsQueue.remove(candidate);
osmBehaviorController.swapPedestrians(pedestrian, candidate, topography);
pedestrianEventsQueue.add((PedestrianSelfCatThreat)candidate);
} else {
osmBehaviorController.makeStepToTarget(pedestrian, topography);
}
// TODO: else if (pedestrian.getSelfCategory() == SelfCategory.LEFT_BANG_AREA)
// Change target to safe zone and "makeStepToTarget()".
}
} else if (mostImportantStimulus instanceof Wait || mostImportantStimulus instanceof WaitInArea) {
} else if (pedestrian.getSelfCategory() == SelfCategory.OUTSIDE_THREAT_AREA) {
// TODO: Change target to safe zone (i.e., use closest target) and "makeStepToTarget()".
osmBehaviorController.makeStepToTarget(pedestrian, topography);
} else if (pedestrian.getSelfCategory() == SelfCategory.WAIT) {
osmBehaviorController.wait(pedestrian, timeStepInSec);
} else if (mostImportantStimulus instanceof Bang) {
// TODO: Increase pedestrians free-flow velocity by a fixed factor of 1.5 or 2.
osmBehaviorController.reactToBang(pedestrian, topography);
} else if (pedestrian.getSelfCategory() == SelfCategory.INSIDE_THREAT_AREA) {