@Override public void addObjectAtSamePosition(RoadUser newObj, RoadUser existingObj) { checkExists(existingObj); addObjectAt(newObj, getPosition(existingObj)); }
@Override public void initRoadUser(RoadModel model) { roadModel = Optional.of((CollisionGraphRoadModelImpl) model); Point p; do { p = model.getRandomPosition(rng); } while (roadModel.get().isOccupied(p)); roadModel.get().addObjectAt(this, p); }
void checkExists(RoadUser user) { checkArgument(containsObject(user), "RoadUser: %s does not exist.", user); }
@Override public void tick(TimeLapse timeLapse) { if (!destination.isPresent()) { nextDestination(); } roadModel.get().followPath(this, path, timeLapse); if (roadModel.get().getPosition(this).equals(destination.get())) { nextDestination(); } }
final MovingRoadUser agv1 = new TestRoadUser(); final MovingRoadUser agv2 = new TestRoadUser(); model.addObjectAt(agv1, NW); assertThat(model.isOccupied(NW)).isTrue(); assertThat(model.isOccupiedBy(NW, agv1)).isTrue(); assertThat(model.isOccupiedBy(new Point(-1, -1), agv1)).isFalse(); boolean fail = false; try { model.addObjectAt(agv2, NW); } catch (final IllegalArgumentException e) { fail = true; model.moveTo(agv1, SW, meter(.9997222222)); assertThat(model.isOccupiedBy(NW, agv1)).isTrue(); model.addObjectAt(agv2, NW); } catch (final IllegalArgumentException e) { fail = true; model.moveTo(agv1, SW, meter(0.0002777777778)); assertThat(model.isOccupiedBy(NW, agv1)).isFalse(); model.addObjectAt(agv2, NW); assertEquals(NW, model.getPosition(agv2)); assertThat(model.isOccupiedBy(NW, agv2)).isTrue();
/** * Tests that a unregistered object is removed. */ @Test public void testUnregisterObject() { final MovingRoadUser agv1 = new TestRoadUser(); model.addObjectAt(agv1, NW); assertTrue(model.isOccupied(NW)); model.unregister(agv1); assertFalse(model.containsObject(agv1)); assertFalse(model.isOccupied(NW)); }
/** * Test for checking that an AGV can not overtake another AGV on the same * connection. The AGV that is behind should be forced to stay behind. */ @Test public void testHeadTailCollisionAvoidance() { final MovingRoadUser agv1 = new TestRoadUser(); final MovingRoadUser agv2 = new TestRoadUser(); model.addObjectAt(agv1, NW); model.addObjectAt(agv2, SW); model.moveTo(agv1, NE, meter(3)); model.moveTo(agv2, NW, meter(1)); model.moveTo(agv2, NE, meter(20)); assertPointEquals(new Point(3, 0), model.getPosition(agv1), GraphRoadModelImpl.DELTA); assertPointEquals(new Point(2, 0), model.getPosition(agv2), GraphRoadModelImpl.DELTA); // moving is not allowed checkNoMovement(model.moveTo(agv2, NE, meter(20))); // when the object is removed, moving is allowed model.removeObject(agv1); model.moveTo(agv2, NE, meter(20)); assertPointEquals(NE, model.getPosition(agv2), GraphRoadModelImpl.DELTA); }
/** * Tests that a vehicle can move to the position of a parcel (i.e. a parcel * should be non blocking). */ @Test public void testMoveAndPickup() { final Parcel parcel1 = Parcel.builder(NW, NE).build(); final TestAgent agent1 = new TestAgent(VehicleDTO.builder() .startPosition(NE) .speed(1d) .build()); simulator.register(parcel1); simulator.register(agent1); assertEquals(NE, rm.getPosition(agent1)); assertEquals(NW, rm.getPosition(parcel1)); assertFalse(rm.isOccupied(NW)); for (int i = 0; i < 9; i++) { simulator.tick(); } assertEquals(new Point(1, 0), rm.getPosition(agent1)); simulator.tick(); assertEquals(NW, rm.getPosition(parcel1)); assertEquals(NW, rm.getPosition(agent1)); assertTrue(pm.getContents(agent1).isEmpty()); simulator.tick(); assertFalse(rm.containsObject(parcel1)); assertEquals(pm.getContents(agent1), newLinkedHashSet(asList(parcel1))); }
/** * Tests that a removed object no longer occupies its position. */ @Test public void testRemoveObject() { final MovingRoadUser agv1 = new TestRoadUser(); model.addObjectAt(agv1, NW); assertTrue(model.isOccupied(NW)); model.removeObject(agv1); assertFalse(model.isOccupied(NW)); }
/** * Test that <code>addObjectAtSamePosition</code> throws an unsupported * operation exception. */ @Test public void testAddObjectAtSamePosition() { final MovingRoadUser agv1 = new TestRoadUser(); final MovingRoadUser agv2 = new TestRoadUser(); model.addObjectAt(agv1, NW); boolean fail = false; try { model.addObjectAtSamePosition(agv2, agv1); } catch (final IllegalArgumentException e) { assertThat(e.getMessage()).contains( "can not be added on an already occupied position"); fail = true; } assertTrue(fail); final Parcel p = Parcel.builder(NW, SW).build(); model.addObjectAtSamePosition(p, agv1); assertThat(model.getPosition(agv1)).isEqualTo(model.getPosition(p)); }
@Override public boolean isOccupied(Point node) { return cgrm.isOccupied(node); }
/** * Test for detection of a dead lock situation between two AGVs. The AGVs * drive on the same connection from opposite ends. An * {@link IllegalArgumentException} should be thrown at the moment the second * AGV tries to enter the connection. */ @Test public void testDetectDeadLock() { final MovingRoadUser agv1 = new TestRoadUser(); final MovingRoadUser agv2 = new TestRoadUser(); model.addObjectAt(agv1, NW); model.addObjectAt(agv2, SW); model.moveTo(agv1, SW, meter(5)); boolean fail = false; try { model.moveTo(agv2, NW, meter(1)); } catch (final DeadlockException e) { assertEquals(SW, e.getConnection().from()); assertEquals(NW, e.getConnection().to()); fail = true; } assertTrue(fail); }
@Override public double getMinDistance() { return cgrm.getMinDistance(); }
@Override public boolean isOccupiedBy(Point node, MovingRoadUser user) { return cgrm.isOccupiedBy(node, user); }
/** * Test the addition of a connection that is too short. */ @Test public void testDetectAddInvalidConnLive() { final Point a = new Point(0, 0); final Point b = new Point(1, 0); model.getGraph().addConnection(a, b); assertTrue(model.getGraph().hasConnection(a, b)); boolean fail = false; try { model.getGraph().addConnection(new Point(0, 0), new Point(.99, 0)); } catch (final IllegalArgumentException e) { fail = true; } assertTrue(fail); }
@Override public CollisionGraphRoadModelImpl build( DependencyProvider dependencyProvider) { checkArgument(getDistanceUnit() == SI.METER, "Currently only %s is supported, found %s.", SI.METER, getDistanceUnit()); final double minConnectionLength = getVehicleLength(); checkArgument( getMinDistance() <= minConnectionLength, "Min distance must be smaller than 2 * vehicle length (%s), but is %s.", getVehicleLength(), getMinDistance()); final ListenableGraph<?> graph = getGraph(); for (final Connection<?> conn : graph.getConnections()) { CollisionGraphRoadModelImpl .checkConnectionLength(minConnectionLength, conn); } return new CollisionGraphRoadModelImpl(graph, minConnectionLength, this); }
model.addObjectAt(agv1, NW); assertTrue(model.isOccupied(NW)); assertFalse(model.isOccupied(SW)); assertFalse(model.isOccupied(SSW)); assertFalse(model.isOccupied(SSW2)); model.moveTo(agv1, SSW, meter(9)); assertFalse(model.isOccupied(NW)); assertFalse(model.isOccupied(SW)); assertFalse(model.isOccupied(SSW)); assertFalse(model.isOccupied(SSW2)); model.moveTo(agv1, SSW, meter(0.0002777777778)); assertFalse(model.isOccupied(NW)); assertTrue(model.isOccupied(SW)); assertFalse(model.isOccupied(SSW)); assertFalse(model.isOccupied(SSW2)); model.moveTo(agv1, SSW, meter(1)); assertFalse(model.isOccupied(NW)); assertTrue(model.isOccupied(SW)); assertTrue(model.isOccupied(SSW)); assertFalse(model.isOccupied(SSW2)); model.moveTo(agv1, SSW, meter(.5)); assertFalse(model.isOccupied(NW)); assertTrue(model.isOccupied(SW)); assertTrue(model.isOccupied(SSW)); assertFalse(model.isOccupied(SSW2));
@Override public void tick(TimeLapse timeLapse) { if (!destination.isPresent()) { nextDestination(); } roadModel.get().followPath(this, path, timeLapse); if (roadModel.get().getPosition(this).equals(destination.get())) { nextDestination(); } }
@Override public boolean isOccupied(Point node) { return cgrm.isOccupied(node); }
@Override public double getMinDistance() { return cgrm.getMinDistance(); }