View Javadoc
1   package org.opentrafficsim.road.gtu.lane.tactical.cacc;
2   
3   import org.djunits.value.vdouble.scalar.Acceleration;
4   import org.djunits.value.vdouble.scalar.Duration;
5   import org.djutils.exceptions.Throw;
6   import org.opentrafficsim.base.parameters.ParameterException;
7   import org.opentrafficsim.base.parameters.ParameterSet;
8   import org.opentrafficsim.base.parameters.ParameterTypes;
9   import org.opentrafficsim.base.parameters.Parameters;
10  import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
11  import org.opentrafficsim.core.gtu.GTUException;
12  import org.opentrafficsim.core.gtu.GTUType;
13  import org.opentrafficsim.core.gtu.perception.DirectEgoPerception;
14  import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
15  import org.opentrafficsim.road.gtu.lane.perception.CategoricalLanePerception;
16  import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
17  import org.opentrafficsim.road.gtu.lane.perception.PerceptionFactory;
18  import org.opentrafficsim.road.gtu.lane.perception.categories.DirectInfrastructurePerception;
19  import org.opentrafficsim.road.gtu.lane.tactical.AbstractLaneBasedTacticalPlannerFactory;
20  import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
21  import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModelFactory;
22  import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.LmrsParameters;
23  
24  import nl.tudelft.simulation.jstats.streams.StreamInterface;
25  
26  /**
27   * This class generates CACC tactical planners for its user.
28   * <p>
29   * Copyright (c) 2013-2017 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
30   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
31   * <p>
32   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 17 okt. 2018 <br>
33   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
34   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
35   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
36   */
37  public class CaccTacticalPlannerFactory extends AbstractLaneBasedTacticalPlannerFactory<CaccTacticalPlanner>
38  {
39  
40      /** Car-following model factory. */
41      private CarFollowingModelFactory<? extends CarFollowingModel> carFollowingModelFactory;
42  
43      /** Longitudinal controller. */
44      private final LongitudinalControllerFactory<? extends CaccController> longitudinalControllerFactory;
45  
46      /** Stream for random numbers. */
47      private final StreamInterface randomStream;
48      
49      /** The GTU type that has CACC. */
50      private final GTUType caccGTUType;
51  
52      /**
53       * Constructor.
54       * @param carFollowingModelFactory CarFollowingModelFactory&;t;? extends CarFollowingModel&gt;; car-following model factory
55       * @param longitudinalControllerFactory LongitudinalControllerFactory&lt;CACC&gt;; longitudinal controller factory
56       * @param simulator OTSSimulatorInterface; simulator
57       * @param caccGTUType GTUType; the GTU type that implements CACC
58       */
59      public CaccTacticalPlannerFactory(final CarFollowingModelFactory<? extends CarFollowingModel> carFollowingModelFactory,
60              final LongitudinalControllerFactory<? extends CaccController> longitudinalControllerFactory,
61              final OTSSimulatorInterface simulator, final GTUType caccGTUType)
62      {
63          super(carFollowingModelFactory, new PerceptionFactory()
64          {
65              /** {@inheritDoc} */
66              @Override
67              public Parameters getParameters() throws ParameterException
68              {
69                  return null;
70              }
71  
72              /** {@inheritDoc} */
73              @Override
74              public LanePerception generatePerception(final LaneBasedGTU gtu)
75              {
76                  CategoricalLanePerceptionn/CategoricalLanePerception.html#CategoricalLanePerception">CategoricalLanePerception perception = new CategoricalLanePerception(gtu);
77                  perception.addPerceptionCategory(
78                          new CaccPerceptionCategory(perception, simulator.getReplication().getStream("default"), simulator));
79                  perception.addPerceptionCategory(new DirectInfrastructurePerception(perception));
80                  perception.addPerceptionCategory(new DirectEgoPerception<>(perception));
81                  return perception;
82              }
83  
84          });
85          this.carFollowingModelFactory = carFollowingModelFactory;
86          this.longitudinalControllerFactory = longitudinalControllerFactory;
87          this.randomStream = simulator.getReplication().getStream("default");
88          Throw.whenNull(caccGTUType, "caccGTUType may not be null");
89          this.caccGTUType = caccGTUType;
90      }
91  
92      /** {@inheritDoc} */
93      @Override
94      public CaccTacticalPlanner create(final LaneBasedGTU gtu) throws GTUException
95      {
96          CaccController lcf = this.longitudinalControllerFactory.create();
97          lcf.setCACCGTUType(this.caccGTUType);
98          return new CaccTacticalPlanner(this.carFollowingModelFactory.generateCarFollowingModel(), gtu,
99                  getPerceptionFactory().generatePerception(gtu), lcf);
100     }
101 
102     /** {@inheritDoc} */
103     @Override
104     public Parameters getParameters() throws ParameterException
105     {
106         ParameterSet parameters = new ParameterSet();
107         this.carFollowingModelFactory.getParameters().setAllIn(parameters);
108         parameters.setDefaultParameter(LongitudinalController.SENSOR_RANGE);
109         parameters.setDefaultParameter(ParameterTypes.PERCEPTION);
110         parameters.setDefaultParameter(ParameterTypes.LOOKBACK);
111         parameters.setDefaultParameter(ParameterTypes.LOOKAHEAD);
112         // parameters.setDefaultParameter(ParameterTypes.DT);
113         parameters.setParameter(ParameterTypes.DT, Duration.instantiateSI(0.5)); // Time step of model
114         parameters.setDefaultParameter(ParameterTypes.T0); // Look-ahead time for mandatory lane changes
115         parameters.setParameter(ParameterTypes.BCRIT, Acceleration.instantiateSI(2.5)); // Critical deceleration, when other
116                                                                                    // deceleration kicks in!
117         // parameters.setDefaultParameter(ParameterTypes.LCDUR); // Lane-change duration
118 
119         parameters.setDefaultParameters(CaccController.class);
120 
121         // Parameters the LMRS needs to interact with surrounding traffic
122         parameters.setParameter(LmrsParameters.DLEFT, 0.0);
123         parameters.setParameter(LmrsParameters.DRIGHT, 0.0);
124         // TODO find a way to let regular vehicles trigger relaxation, without platooning trucks over reacting
125         parameters.setParameter(ParameterTypes.TMIN, Duration.instantiateSI(0.56)); // 0.49
126         parameters.setParameter(ParameterTypes.TMAX, Duration.instantiateSI(1.2)); // 0.5
127         parameters.setParameter(ParameterTypes.T, Duration.instantiateSI(1.2));
128         parameters.setDefaultParameter(CaccParameters.T_GAP);
129         parameters.setDefaultParameter(CaccParameters.A_REDUCED);
130 
131         // TODO add default values for CACC specific parameters to 'parameters' here
132         return parameters;
133     }
134 
135 }