Commit d79aa619 authored by Julian Zobel's avatar Julian Zobel
Browse files

Merge remote-tracking branch 'origin/jz/int-dmaa' into jz/lab-cpp

# Conflicts:
#	pom.xml
parents 61ef6f09 e50cb014
...@@ -207,7 +207,7 @@ public class DefaultHost implements SimHost { ...@@ -207,7 +207,7 @@ public class DefaultHost implements SimHost {
@Override @Override
public String toString() { public String toString() {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
sb.append("Host {"); sb.append("Host " + this.getId().value() +" {");
sb.append("GroupID="); sb.append("GroupID=");
if (this.properties != null) if (this.properties != null)
sb.append(this.properties.getGroupID()); sb.append(this.properties.getGroupID());
......
...@@ -197,6 +197,7 @@ public abstract class AbstractTopologyComponent implements TopologyComponent { ...@@ -197,6 +197,7 @@ public abstract class AbstractTopologyComponent implements TopologyComponent {
return host; return host;
} }
@Deprecated
@Override @Override
public Topology getTopology() { public Topology getTopology() {
return topology; return topology;
......
...@@ -28,8 +28,6 @@ import javax.persistence.Column; ...@@ -28,8 +28,6 @@ import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.logging.log4j.Level;
import de.tud.kom.p2psim.api.topology.movement.UAVMovementModel; import de.tud.kom.p2psim.api.topology.movement.UAVMovementModel;
import de.tud.kom.p2psim.api.uav.MulticopterModel; import de.tud.kom.p2psim.api.uav.MulticopterModel;
import de.tud.kom.p2psim.impl.energy.components.ActuatorComponent; import de.tud.kom.p2psim.impl.energy.components.ActuatorComponent;
...@@ -301,9 +299,7 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -301,9 +299,7 @@ public class StateMulticopterMovement implements UAVMovementModel {
Monitor.log(StateMulticopterMovement.class, Monitor.Level.WARN, Monitor.log(StateMulticopterMovement.class, Monitor.Level.WARN,
"(Horizontal Flight) The Multicopter is not properly aligned to the target. Deviation: " + Math.toDegrees(horizontalAngleToPosition(currentTargetPosition))+"°", positionVector); "(Horizontal Flight) The Multicopter is not properly aligned to the target. Deviation: " + Math.toDegrees(horizontalAngleToPosition(currentTargetPosition))+"°", positionVector);
} }
double v = flightVelocity(); double v = flightVelocity();
if(v != velocityVector.getLength() && Math.abs(v - velocityVector.getLength()) > MARGIN) { if(v != velocityVector.getLength() && Math.abs(v - velocityVector.getLength()) > MARGIN) {
Monitor.log(StateMulticopterMovement.class, Monitor.Level.WARN, Monitor.log(StateMulticopterMovement.class, Monitor.Level.WARN,
...@@ -346,6 +342,10 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -346,6 +342,10 @@ public class StateMulticopterMovement implements UAVMovementModel {
constTime = (double) constantPhaseTime / Time.SECOND; constTime = (double) constantPhaseTime / Time.SECOND;
constDist = constTime * v; constDist = constTime * v;
if(constDist > distanceToTarget) {
throw new UnsupportedOperationException("Multicopter Movement: The approximated step distance exceeds the distance to the target");
}
directionVector.normalize(); // should be valid anyways? directionVector.normalize(); // should be valid anyways?
positionVector = positionVector.plus(directionVector.scale(constDist)); positionVector = positionVector.plus(directionVector.scale(constDist));
...@@ -404,6 +404,10 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -404,6 +404,10 @@ public class StateMulticopterMovement implements UAVMovementModel {
vint = 0; vint = 0;
} }
if(decDist > positionVector.distanceTo(currentTargetPosition)) {
throw new UnsupportedOperationException("Multicopter Movement: The approximated step distance exceeds the distance to the target");
}
directionVector.normalize(); // should be valid anyways? directionVector.normalize(); // should be valid anyways?
positionVector = positionVector.plus(directionVector.scale(decDist)); positionVector = positionVector.plus(directionVector.scale(decDist));
velocityVector = directionVector.scale(vint); velocityVector = directionVector.scale(vint);
...@@ -504,6 +508,7 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -504,6 +508,7 @@ public class StateMulticopterMovement implements UAVMovementModel {
PositionVector tangentPoint = calculateCircleTangentExitPoint(circleCenter, turnRadius, currentTargetPosition, angleToTarget); PositionVector tangentPoint = calculateCircleTangentExitPoint(circleCenter, turnRadius, currentTargetPosition, angleToTarget);
try {
// calculate circular path from the current location to the destination tangent point // calculate circular path from the current location to the destination tangent point
double circleAngle = 2 * Math.asin(positionVector.distanceTo(tangentPoint) / (2 * turnRadius)); double circleAngle = 2 * Math.asin(positionVector.distanceTo(tangentPoint) / (2 * turnRadius));
double circleDistance = circleAngle * turnRadius; double circleDistance = circleAngle * turnRadius;
...@@ -533,13 +538,14 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -533,13 +538,14 @@ public class StateMulticopterMovement implements UAVMovementModel {
positionVector = new PositionVector(circleLocationX, circleLocationY, positionVector.getZ()); positionVector = new PositionVector(circleLocationX, circleLocationY, positionVector.getZ());
currentAngleOfAttack = uav.pitchAngleForHorizontalVelocity(curveVelocity); currentAngleOfAttack = uav.pitchAngleForHorizontalVelocity(curveVelocity);
// direction vector is the tangent at the new position // direction vector is the tangent at the new position
// x' = x cos θ − y sin θ // x' = x cos θ − y sin θ
// y' = x sin θ + y cos θ // y' = x sin θ + y cos θ
double xn = directionVector.getX() * Math.cos(circleAngle) - directionVector.getY() * Math.sin(circleAngle); double xn = directionVector.getX() * Math.cos(circleAngle) - directionVector.getY() * Math.sin(circleAngle);
double yn = directionVector.getX() * Math.sin(circleAngle) + directionVector.getY() * Math.cos(circleAngle); double yn = directionVector.getX() * Math.sin(circleAngle) + directionVector.getY() * Math.cos(circleAngle);
directionVector = new PositionVector(xn, yn); directionVector = new PositionVector(xn, yn);
directionVector.normalize(); directionVector.normalize();
...@@ -559,6 +565,11 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -559,6 +565,11 @@ public class StateMulticopterMovement implements UAVMovementModel {
// remaining time // remaining time
return time - constantPhaseTime; return time - constantPhaseTime;
}
catch(Exception e) {
System.out.println();
return 0;
}
} }
...@@ -945,6 +956,14 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -945,6 +956,14 @@ public class StateMulticopterMovement implements UAVMovementModel {
PositionVector T1 = new PositionVector(T1x, T1y, positionVector.getZ()); PositionVector T1 = new PositionVector(T1x, T1y, positionVector.getZ());
PositionVector T2 = new PositionVector(T2x, T2y, positionVector.getZ()); PositionVector T2 = new PositionVector(T2x, T2y, positionVector.getZ());
// pick the other one, if one is the current location
if(T1.equals(positionVector)) {
return T2;
}
else if(T2.equals(positionVector)) {
return T1;
}
// now define which point to use for exiting // now define which point to use for exiting
double aT1 = horizontalAngleToPosition(T1); double aT1 = horizontalAngleToPosition(T1);
double aT2 = horizontalAngleToPosition(T2); double aT2 = horizontalAngleToPosition(T2);
...@@ -979,6 +998,13 @@ public class StateMulticopterMovement implements UAVMovementModel { ...@@ -979,6 +998,13 @@ public class StateMulticopterMovement implements UAVMovementModel {
tangentPoint = Math.abs(aT1) < Math.abs(aT2) ? T1 : T2; tangentPoint = Math.abs(aT1) < Math.abs(aT2) ? T1 : T2;
} }
} }
else if(angleToTarget == 0) {
throw new AssertionError();
}
if(tangentPoint == null) {
throw new AssertionError();
}
return tangentPoint; return tangentPoint;
} }
......
...@@ -132,13 +132,6 @@ public class SocialGroupMovementModel extends ModularMovementModel { ...@@ -132,13 +132,6 @@ public class SocialGroupMovementModel extends ModularMovementModel {
groupAttractionAssignment.updateTargetAttractionPoint(ms, assignment); groupAttractionAssignment.updateTargetAttractionPoint(ms, assignment);
} }
} }
// //attractionAssigment.addComponent(ms);
// if(placeNodesAtAP) {
// IAttractionPoint assignment = attractionAssigment.getAssignment(ms);
// ms.updateCurrentLocation(this.addOffset(new PositionVector(assignment),
// (assignment.hasRadius() ? Math.max(assignment.getRadius(), 25.0) : 25.0)));
// attractionAssigment.updateTargetAttractionPoint(ms, assignment);
// }
} }
setTimeBetweenMoveOperations(timeBetweenMoveOperation); setTimeBetweenMoveOperations(timeBetweenMoveOperation);
...@@ -209,16 +202,9 @@ public class SocialGroupMovementModel extends ModularMovementModel { ...@@ -209,16 +202,9 @@ public class SocialGroupMovementModel extends ModularMovementModel {
} }
else { else {
throw new UnsupportedOperationException("SimLocationActuator " + host + " is neither in a group nor a single node"); throw new UnsupportedOperationException("SimLocationActuator " + host + " is neither in a group nor a single node");
} }
// TODO maybe remodel the group movement to do a whole group?
} }
// TODO Move each group
Event.scheduleWithDelay(timeBetweenMoveOperation, this, null, EVENT_MOVE); Event.scheduleWithDelay(timeBetweenMoveOperation, this, null, EVENT_MOVE);
} }
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction; package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
import java.util.Random; import java.util.Random;
import de.tud.kom.p2psim.api.scenario.ConfigurationException; import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
...@@ -114,7 +113,7 @@ public class RandomAttractionGenerator extends AbstractAttractionProvider { ...@@ -114,7 +113,7 @@ public class RandomAttractionGenerator extends AbstractAttractionProvider {
// if this point is closer than the given minimum distance to another point, or the radii of the points would overlap, // if this point is closer than the given minimum distance to another point, or the radii of the points would overlap,
// or if the radius would exceed the simulation area // or if the radius would exceed the simulation area
// then discard this attraction point and create a new one // then discard this attraction point and create a new one
if(posVec.distanceTo(ap) < minimumDistance || (posVec.distanceTo(ap) - radius - ap.getRadius()) < 0 ) { if((posVec.distanceTo(ap) - radius - ap.getRadius()) < minimumDistance ) {
i--; i--;
c++; c++;
continue create; continue create;
......
...@@ -137,8 +137,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior { ...@@ -137,8 +137,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
for(SimLocationActuator host : movementModel.getAllLocationActuators()) { for(SimLocationActuator host : movementModel.getAllLocationActuators()) {
stayDuration.put(host.getHost().getId(), new Tuple<Long, Long>(0L, Time.getCurrentTime())); stayDuration.put(host.getHost().getId(), new Tuple<Long, Long>(0L, Time.getCurrentTime()));
} }
if(!enableGroups) { if(!enableGroups) {
return; return;
...@@ -187,9 +186,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior { ...@@ -187,9 +186,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
if(maxGroupSize == minGroupSize) if(maxGroupSize == minGroupSize)
return minGroupSize; return minGroupSize;
else { else {
// int groupsize = (int) Math.max(1, rand.nextGaussian() * 0.93 + 2.76);
int groupsize = rand.nextInt(maxGroupSize - minGroupSize + 1) + minGroupSize; int groupsize = rand.nextInt(maxGroupSize - minGroupSize + 1) + minGroupSize;
//System.out.println("[AbstractGroupForming] Group Size: " + groupsize + " ("+minGroupSize+"/"+maxGroupSize+")");
return groupsize; return groupsize;
} }
//return rand.nextInt(maxGroupSize - minGroupSize) + minGroupSize; //return rand.nextInt(maxGroupSize - minGroupSize) + minGroupSize;
...@@ -214,8 +211,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior { ...@@ -214,8 +211,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
if(targetDestination.hasRadius()) { if(targetDestination.hasRadius()) {
destination = movementModel.addOffset(destination, targetDestination.getRadius() / 3); destination = movementModel.addOffset(destination, targetDestination.getRadius() / 3);
} }
group.setDestination(destination); group.setDestination(destination);
setGroupMeetingPoint(group); setGroupMeetingPoint(group);
...@@ -229,7 +225,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior { ...@@ -229,7 +225,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
groupCon.removeLeftGroupAtTimeEntry(member); groupCon.removeLeftGroupAtTimeEntry(member);
} }
} }
groupCon.addGroup(group); groupCon.addGroup(group);
// Inform analyzer of new group // Inform analyzer of new group
......
...@@ -26,6 +26,7 @@ import java.util.LinkedList; ...@@ -26,6 +26,7 @@ import java.util.LinkedList;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.api.topology.movement.local.LocalMovementStrategy; import de.tud.kom.p2psim.api.topology.movement.local.LocalMovementStrategy;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer; import de.tud.kom.p2psim.impl.topology.movement.modularosm.ISocialGroupMovementAnalyzer;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.AttractionPoint;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter; import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup; import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
...@@ -179,8 +180,9 @@ public class DefaultGroupForming extends AbstractGroupForming { ...@@ -179,8 +180,9 @@ public class DefaultGroupForming extends AbstractGroupForming {
if (either.hasLeft()) { if (either.hasLeft()) {
// Do nothing // Do nothing
} }
else if(leader.getCurrentTargetAttractionPoint() instanceof BasicAttractionPoint) { else if(leader.getCurrentTargetAttractionPoint() instanceof BasicAttractionPoint && !(leader.getCurrentTargetAttractionPoint() instanceof AttractionPoint) ) {
// do nothing, only intermediate AP // do nothing, only intermediate AP
transition.reachedAttractionPoint(leader, leader.getCurrentTargetAttractionPoint());
} }
else { else {
transition.reachedAttractionPoint(leader, leader.getCurrentTargetAttractionPoint()); transition.reachedAttractionPoint(leader, leader.getCurrentTargetAttractionPoint());
......
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller;
import java.io.FileInputStream;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml.CancelParsingSAXException;
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml.SimulationSetupInformationHandler;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
public class SimulationSetupInformationProvider {
private static final SimulationSetupInformationProvider ONLY_INSTANCE = new SimulationSetupInformationProvider();
private SimulationSetupInformationHandler _handler = new SimulationSetupInformationHandler();
private SimulationSetupInformationProvider() {
}
public static SimulationSetupInformationProvider getOnlyInstance() {
return ONLY_INSTANCE;
}
public Location getUpperLeft() {
return _handler.getUpperLeft();
}
public Location getLowerRight() {
return _handler.getLowerRight();
}
public static void init(String pNetFileLocation) {
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new FileInputStream(pNetFileLocation), ONLY_INSTANCE._handler);
} catch (CancelParsingSAXException e) {
return;
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}
/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of PeerfactSim.KOM.
*
* PeerfactSim.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkRoute;
public class VehicleInformationContainer {
private Location _position;
private double _heading;
private double _speed;
private RoadNetworkRoute _route;
public VehicleInformationContainer(Location pPosition, double pHeading,
double pSpeed, RoadNetworkRoute pRoute) {
_position = pPosition;
_heading = pHeading;
_speed = pSpeed;
_route = pRoute;
}
public Location getPosition() {
return _position;
}
public double getHeading() {
return _heading;
}
public double getSpeed() {
return _speed;
}
public RoadNetworkRoute getRoute() {
return _route;
}
public void setRoute(RoadNetworkRoute pRoute) {
_route = pRoute;
}
}
\ No newline at end of file
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.csv;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
public class RoadSideUnitInformationHandler {
private List<Location> _positions = new ArrayList<>();
private boolean _observedAreaSet = false;
private double _startX = -1;
private double _startY = -1;
private double _endX = -1;
private double _endY = -1;
public List<Location> getIntersections() {
if (!_observedAreaSet) {
return _positions;
} else {
List<Location> result = new ArrayList<>();
for (Location position : _positions) {
if (_startX <= position.getLongitudeOrX() && position.getLongitudeOrX() <= _endX && _startY <= position.getLatitudeOrY() && position.getLatitudeOrY() <= _endY) {
result.add(new PositionVector(position.getLongitudeOrX() - _startX, position.getLatitudeOrY() - _startY, 0));
}
}
return result;
}
}
public void parseIntersectionsFile(String pRoadSideUnitDataPath) {
File file = new File(pRoadSideUnitDataPath);
try {
FileInputStream inputStream = new FileInputStream(file);
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains(";")) {
String[] split = line.split(";");
if (split.length == 2) {
double x = Double.parseDouble(split[0]);
double y = Double.parseDouble(split[1]);
_positions.add(new PositionVector(x, y, 0));
}
}
}
scanner.close();
} catch (FileNotFoundException e) {
System.err.println("Unable to read file " + e.getMessage());
}
}
public void setObservedArea(double pStartX, double pStartY, double pEndX, double pEndY) {
_startX = pStartX;
_startY = pStartY;
_endX = pEndX;
_endY = pEndY;
_observedAreaSet = true;
}
}
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml;
import org.xml.sax.SAXException;
public class CancelParsingSAXException extends SAXException {
/**
*
*/
private static final long serialVersionUID = 1L;
}
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
public class SimulationSetupInformationHandler extends DefaultHandler {
private Location _upperLeft;
private Location _lowerRight;
@Override
public void startElement(String pUri, String pLocalName, String pQName, Attributes pAttributes)
throws SAXException {
if (pQName.equals("location")) {
String meterBoundary = pAttributes.getValue("convBoundary");
if (meterBoundary != null) {
String[] edges = meterBoundary.split(",");
_upperLeft = new PositionVector(Double.valueOf(edges[0]), Double.valueOf(edges[1]), 0);
_lowerRight = new PositionVector(Double.valueOf(edges[2]), Double.valueOf(edges[3]), 0);
}
throw new CancelParsingSAXException();
}
}
public Location getLowerRight() {
return _lowerRight;
}
public Location getUpperLeft() {
return _upperLeft;
}
}
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml;
import java.util.HashMap;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.VehicleInformationContainer;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
public class VehicleDataInformationHandler extends DefaultHandler {
private boolean _next = true;
private boolean _run = true;
private HashMap<String, VehicleInformationContainer> _vehiclePositions = new HashMap<>();
private double _currentStep = -1;
private boolean _observedAreaSet = false;
private double _startX = -1;
private double _startY = -1;
private double _endX = -1;
private double _endY = -1;
private HashMap<String, VehicleInformationContainer> _nextVehiclePositions = new HashMap<>();
private double _nextStep = -1;
private static final String doublePattern = "-?[0-9]*\\.?[0-9]+";
private boolean _terminated = false;
@Override
public void startElement(String pUri, String pLocalName, String pQName, Attributes pAttributes)
throws SAXException {
if (pQName.equals("timestep")) {
while (!_next) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
_next = false;
String value = pAttributes.getValue("time");
if (value.matches(doublePattern)) {
_nextStep = Double.valueOf(value);
}
} else if (pQName.equals("vehicle")) {
String id = pAttributes.getValue("id");
String lonString = pAttributes.getValue("x");
String latString = pAttributes.getValue("y");
String speedString = pAttributes.getValue("speed");
String headingString = pAttributes.getValue("angle");
if (lonString.matches(doublePattern) && latString.matches(doublePattern) && headingString.matches(doublePattern) && speedString.matches(doublePattern) ) {
double lon = Double.valueOf(lonString);
double lat = Double.valueOf(latString);
double heading = Double.valueOf(headingString);
double speed = Double.valueOf(speedString);
if (_observedAreaSet) {
if (_startX <= lon && lon <= _endX && _startY <= lat && lat <= _endY) {
_nextVehiclePositions.put(id, new VehicleInformationContainer(new PositionVector(lon - _startX, lat - _startY, 0), heading, speed, null));
}
} else {
_nextVehiclePositions.put(id, new VehicleInformationContainer(new PositionVector(lon, lat, 0), heading, speed, null));
}
}
}
}
@Override
public void endElement(String pUri, String pLocalName, String pQName) throws SAXException {
if (pQName.equals("timestep")) {
_run = false;
} else if (pQName.equals("fcd-export")) {
while (!_next) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
_next = false;
_run = false;
_terminated = true;
}
}
public void setObservedArea(double pStartX, double pStartY, double pEndX, double pEndY) {
_startX = pStartX;
_startY = pStartY;
_endX = pEndX;
_endY = pEndY;
_observedAreaSet = true;
}
public boolean isTerminated() {
return _terminated;
}
public HashMap<String, VehicleInformationContainer> getVehiclePositions() {
return _vehiclePositions;
}
public void readNext() {
while (_run) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
_vehiclePositions = _nextVehiclePositions;
_currentStep = _nextStep;
_nextStep = -1;
_nextVehiclePositions = new HashMap<>();
_run = true;
_next = true;
}
public boolean isRunning() {
return _run;
}
public double getStep() {
return _currentStep;
}
}
package de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.VehicleInformationContainer;
import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.csv.RoadSideUnitInformationHandler;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.api.SimulationSetupExtractor;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.api.VehicleController;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetwork;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkRoute;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.exception.NoAdditionalRouteAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.exception.NoExitAvailableException;
public class XMLSimulationController implements VehicleController, SimulationSetupExtractor, Runnable {
private String _vehicleDataPath;
private String _roadSideUnitDataPath;
private List<String> _vehicles;
private Map<Double, Map<String, VehicleInformationContainer>> _positonsByTimestamp = new HashMap<>();
private int _futureInformation = 0;
private boolean _initalized = false;
private VehicleDataInformationHandler _vehicleDataInformationHandler = new VehicleDataInformationHandler();
private RoadSideUnitInformationHandler _roadSideUnitInformationHandler = new RoadSideUnitInformationHandler();
private double _start = -1;
private double _step;
public XMLSimulationController(String pVehicleDataPath, String pRoadSideUnitDataPath) {
this(pVehicleDataPath);
_roadSideUnitDataPath = pRoadSideUnitDataPath;
}
public XMLSimulationController(String pVehicleDataPath) {
_vehicleDataPath = pVehicleDataPath;
}
@Override
public void init(long timeBetweenMoveOperations) {
if (!_initalized) {
if (_vehicleDataPath != null) {
Thread thread = new Thread(this);
thread.start();
for (int i = 0; i < _futureInformation; i++) {
nextStep(Time.SECOND);
}
}
if (_roadSideUnitDataPath != null) {
_roadSideUnitInformationHandler.parseIntersectionsFile(_roadSideUnitDataPath);
}
_initalized = true;
}
}
@Override
public Location getVehiclePosition(String pVehicleID) {
return getVehiclePosition(_step, pVehicleID);
}
public VehicleInformationContainer requestVehicleInformation(String pVehicleID) {
return _vehicleDataInformationHandler.getVehiclePositions().get(pVehicleID);
}
@Override
public boolean nextStep(long pTimeScale) {
_vehicleDataInformationHandler.readNext();
_step = _vehicleDataInformationHandler.getStep() - _futureInformation;
if (_start == -1) {
_start = _vehicleDataInformationHandler.getStep();
}
double newStep = _step + _futureInformation;
if (!_positonsByTimestamp.containsKey(newStep)) {
Map<String, VehicleInformationContainer> vehiclePositions = new HashMap<>();
_positonsByTimestamp.put(newStep, vehiclePositions);
List<String> allVehicles = new ArrayList<>(_vehicleDataInformationHandler.getVehiclePositions().keySet());
for (String vehicle : allVehicles) {
VehicleInformationContainer vehiclePosition = requestVehicleInformation(vehicle);
if (vehiclePosition != null) {
vehiclePositions.put(vehicle, vehiclePosition);
}
}
}
return !_vehicleDataInformationHandler.isTerminated();
}
@Override
public List<String> getAllVehicles() {
return getAllVehicles(_step);
}
@Override
public double getStep() {
return _step;
}
@Override
public double getStart() {
return _start;
}
@Override
public void run() {
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new FileInputStream(_vehicleDataPath), _vehicleDataInformationHandler);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void setObservedArea(double pStartX, double pStartY, double pEndX, double pEndY) {
_vehicleDataInformationHandler.setObservedArea(pStartX, pStartY, pEndX, pEndY);
_roadSideUnitInformationHandler.setObservedArea(pStartX, pStartY, pEndX, pEndY);
}
@Override
public Location getVehiclePosition(double pStep, String pVehicleID) {
Map<String, VehicleInformationContainer> map = _positonsByTimestamp.get(pStep);
return map.get(pVehicleID).getPosition();
}
@Override
public List<String> getAllVehicles(double pStep) {
Map<String, VehicleInformationContainer> map = _positonsByTimestamp.get(pStep);
return new ArrayList<>(map.keySet());
}
@Override
public double getMaximumAvailablePrediction() {
double max = Collections.max(_positonsByTimestamp.keySet());
return max;
}
@Override
public List<Location> getAllIntersections(boolean pCluster) {
return _roadSideUnitInformationHandler.getIntersections();
}
@Override
public double getScenarioWidth() {
return -1;
}
@Override
public double getScenarioHeight() {
return -1;
}
@Override
public double getVehicleLength(String pVehicleID) {
throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
}
@Override
public RoadNetworkRoute getCurrentRoute(String pVehicleID) {
throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
}
@Override
public RoadNetwork getRoadNetwork() {
return null;
}
@Override
public void rerouteVehicle(String pVehicle, RoadNetworkRoute pRoute) {
throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
}
@Override
public RoadNetworkRoute findNewRoute(String pVehicle)
throws NoAdditionalRouteAvailableException {
throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
}
@Override
public RoadNetworkRoute findNewRoute(String pVehicle,
List<RoadNetworkEdge> pEdgesToAvoid, boolean pKeepDestination)
throws NoAdditionalRouteAvailableException,
NoExitAvailableException {
throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
}
@Override
public void stopVehicle(String pVehicle) {
throw new UnsupportedOperationException("This method is not supported for " + getClass().getSimpleName());
}
@Override
public double getVehicleSpeed(String pVehicleID) {
return _vehicleDataInformationHandler.getVehiclePositions().get(pVehicleID).getSpeed();
}
@Override
public double getVehicleHeading(String pVehicleID) {
return _vehicleDataInformationHandler.getVehiclePositions().get(pVehicleID).getHeading();
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment