Cooperation.java

  1. package org.opentrafficsim.road.gtu.lane.tactical.util.lmrs;

  2. import org.djunits.unit.AccelerationUnit;
  3. import org.djunits.value.vdouble.scalar.Acceleration;
  4. import org.djunits.value.vdouble.scalar.Speed;
  5. import org.opentrafficsim.base.parameters.ParameterException;
  6. import org.opentrafficsim.base.parameters.ParameterTypes;
  7. import org.opentrafficsim.base.parameters.Parameters;
  8. import org.opentrafficsim.core.gtu.perception.EgoPerception;
  9. import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
  10. import org.opentrafficsim.core.network.LateralDirectionality;
  11. import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
  12. import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
  13. import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
  14. import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
  15. import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.NeighborsPerception;
  16. import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGTU;
  17. import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
  18. import org.opentrafficsim.road.network.speed.SpeedLimitInfo;

  19. /**
  20.  * Different forms of cooperation.
  21.  * <p>
  22.  * Copyright (c) 2013-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  23.  * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
  24.  * <p>
  25.  * @version $Revision$, $LastChangedDate$, by $Author$, initial version 2 mrt. 2018 <br>
  26.  * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
  27.  * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
  28.  * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
  29.  */
  30. public interface Cooperation extends LmrsParameters
  31. {

  32.     /** Simple passive cooperation. */
  33.     Cooperation PASSIVE = new Cooperation()
  34.     {
  35.         @Override
  36.         public Acceleration cooperate(final LanePerception perception, final Parameters params, final SpeedLimitInfo sli,
  37.                 final CarFollowingModel cfm, final LateralDirectionality lat, final Desire ownDesire)
  38.                 throws ParameterException, OperationalPlanException
  39.         {
  40.             if ((lat.isLeft() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.LEFT))
  41.                     || (lat.isRight() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.RIGHT)))
  42.             {
  43.                 return new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
  44.             }
  45.             Acceleration b = params.getParameter(ParameterTypes.B);
  46.             Acceleration a = new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
  47.             double dCoop = params.getParameter(DCOOP);
  48.             Speed ownSpeed = perception.getPerceptionCategory(EgoPerception.class).getSpeed();
  49.             RelativeLane relativeLane = new RelativeLane(lat, 1);
  50.             for (HeadwayGTU leader : Synchronization.removeAllUpstreamOfConflicts(Synchronization.removeAllUpstreamOfConflicts(
  51.                     perception.getPerceptionCategory(NeighborsPerception.class).getLeaders(relativeLane), perception,
  52.                     relativeLane), perception, RelativeLane.CURRENT))
  53.             {
  54.                 Parameters params2 = leader.getParameters();
  55.                 double desire = lat.equals(LateralDirectionality.LEFT) ? params2.getParameter(DRIGHT)
  56.                         : lat.equals(LateralDirectionality.RIGHT) ? params2.getParameter(DLEFT) : 0;
  57.                 if (desire >= dCoop && (leader.getSpeed().gt0() || leader.getDistance().gt0()))
  58.                 {
  59.                     Acceleration aSingle = LmrsUtil.singleAcceleration(leader.getDistance(), ownSpeed, leader.getSpeed(),
  60.                             desire, params, sli, cfm);
  61.                     a = Acceleration.min(a, aSingle);
  62.                 }
  63.             }
  64.             return Acceleration.max(a, b.neg());
  65.         }
  66.     };

  67.     /** Same as passive cooperation, except that cooperation is fully ignored if the potential lane changer brakes heavily. */
  68.     Cooperation PASSIVE_MOVING = new Cooperation()
  69.     {
  70.         @Override
  71.         public Acceleration cooperate(final LanePerception perception, final Parameters params, final SpeedLimitInfo sli,
  72.                 final CarFollowingModel cfm, final LateralDirectionality lat, final Desire ownDesire)
  73.                 throws ParameterException, OperationalPlanException
  74.         {
  75.             if ((lat.isLeft() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.LEFT))
  76.                     || (lat.isRight() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.RIGHT)))
  77.             {
  78.                 return new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
  79.             }
  80.             Acceleration bCrit = params.getParameter(ParameterTypes.BCRIT);
  81.             Acceleration b = params.getParameter(ParameterTypes.B);
  82.             Acceleration a = new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
  83.             double dCoop = params.getParameter(DCOOP);
  84.             Speed ownSpeed = perception.getPerceptionCategory(EgoPerception.class).getSpeed();
  85.             RelativeLane relativeLane = new RelativeLane(lat, 1);
  86.             NeighborsPerception neighbours = perception.getPerceptionCategory(NeighborsPerception.class);
  87.             PerceptionCollectable<HeadwayGTU, LaneBasedGTU> leaders = neighbours.getLeaders(RelativeLane.CURRENT);
  88.             Speed thresholdSpeed = Speed.instantiateSI(40.0 / 3.6);
  89.             boolean leaderInCongestion = leaders.isEmpty() ? false : leaders.first().getSpeed().lt(thresholdSpeed);
  90.             for (HeadwayGTU leader : Synchronization.removeAllUpstreamOfConflicts(
  91.                     Synchronization.removeAllUpstreamOfConflicts(neighbours.getLeaders(relativeLane), perception, relativeLane),
  92.                     perception, RelativeLane.CURRENT))
  93.             {
  94.                 Parameters params2 = leader.getParameters();
  95.                 double desire = lat.equals(LateralDirectionality.LEFT) ? params2.getParameter(DRIGHT)
  96.                         : lat.equals(LateralDirectionality.RIGHT) ? params2.getParameter(DLEFT) : 0;
  97.                 // TODO: only cooperate if merger still quite fast or there's congestion downstream anyway (which we can better
  98.                 // estimate than only considering the direct leader
  99.                 if (desire >= dCoop && (leader.getSpeed().gt0() || leader.getDistance().gt0())
  100.                         && (leader.getSpeed().ge(thresholdSpeed) || leaderInCongestion))
  101.                 {
  102.                     Acceleration aSingle = LmrsUtil.singleAcceleration(leader.getDistance(), ownSpeed, leader.getSpeed(),
  103.                             desire, params, sli, cfm);
  104.                     a = Acceleration.min(a, aSingle);
  105.                 }
  106.             }
  107.             return Acceleration.max(a, bCrit.neg());
  108.         }
  109.     };

  110.     /** Cooperation similar to the default, with nuanced differences of when to ignore. */
  111.     Cooperation ACTIVE = new Cooperation()
  112.     {
  113.         @Override
  114.         public Acceleration cooperate(final LanePerception perception, final Parameters params, final SpeedLimitInfo sli,
  115.                 final CarFollowingModel cfm, final LateralDirectionality lat, final Desire ownDesire)
  116.                 throws ParameterException, OperationalPlanException
  117.         {

  118.             if ((lat.isLeft() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.LEFT))
  119.                     || (lat.isRight() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.RIGHT)))
  120.             {
  121.                 return new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
  122.             }
  123.             Acceleration a = new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
  124.             double dCoop = params.getParameter(DCOOP);
  125.             Speed ownSpeed = perception.getPerceptionCategory(EgoPerception.class).getSpeed();
  126.             RelativeLane relativeLane = new RelativeLane(lat, 1);
  127.             for (HeadwayGTU leader : Synchronization.removeAllUpstreamOfConflicts(Synchronization.removeAllUpstreamOfConflicts(
  128.                     perception.getPerceptionCategory(NeighborsPerception.class).getLeaders(relativeLane), perception,
  129.                     relativeLane), perception, RelativeLane.CURRENT))
  130.             {
  131.                 Parameters params2 = leader.getParameters();
  132.                 double desire = lat.equals(LateralDirectionality.LEFT) ? params2.getParameter(DRIGHT)
  133.                         : lat.equals(LateralDirectionality.RIGHT) ? params2.getParameter(DLEFT) : 0;
  134.                 if (desire >= dCoop && leader.getDistance().gt0()
  135.                         && leader.getAcceleration().gt(params.getParameter(ParameterTypes.BCRIT).neg()))
  136.                 {
  137.                     Acceleration aSingle = LmrsUtil.singleAcceleration(leader.getDistance(), ownSpeed, leader.getSpeed(),
  138.                             desire, params, sli, cfm);
  139.                     a = Acceleration.min(a, Synchronization.gentleUrgency(aSingle, desire, params));
  140.                 }
  141.             }
  142.             return a;
  143.         }
  144.     };

  145.     /**
  146.      * Determine acceleration for cooperation.
  147.      * @param perception LanePerception; perception
  148.      * @param params Parameters; parameters
  149.      * @param sli SpeedLimitInfo; speed limit info
  150.      * @param cfm CarFollowingModel; car-following model
  151.      * @param lat LateralDirectionality; lateral direction for cooperation
  152.      * @param ownDesire Desire; own lane change desire
  153.      * @return acceleration for synchronization
  154.      * @throws ParameterException if a parameter is not defined
  155.      * @throws OperationalPlanException perception exception
  156.      */
  157.     Acceleration cooperate(LanePerception perception, Parameters params, SpeedLimitInfo sli, CarFollowingModel cfm,
  158.             LateralDirectionality lat, Desire ownDesire) throws ParameterException, OperationalPlanException;
  159. }