Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file MSCFModel_ACC.h
15 : /// @author Kallirroi Porfyri
16 : /// @date Feb 2018
17 : ///
18 : // ACC car-following model based on [1], [2].
19 : // [1] Milanes, V., and S. E. Shladover. Handling Cut-In Vehicles in Strings
20 : // of Cooperative Adaptive Cruise Control Vehicles. Journal of Intelligent
21 : // Transportation Systems, Vol. 20, No. 2, 2015, pp. 178-191.
22 : // [2] Xiao, L., M. Wang and B. van Arem. Realistic Car-Following Models for
23 : // Microscopic Simulation of Adaptive and Cooperative Adaptive Cruise
24 : // Control Vehicles. Transportation Research Record: Journal of the
25 : // Transportation Research Board, No. 2623, 2017. (DOI: 10.3141/2623-01).
26 : /****************************************************************************/
27 : #pragma once
28 : #include <config.h>
29 :
30 : #include "MSCFModel.h"
31 : #include <utils/xml/SUMOXMLDefinitions.h>
32 :
33 : // ===========================================================================
34 : // class declarations
35 : // ===========================================================================
36 : class MSVehicle;
37 : class MSVehicleType;
38 : class MSCFModel_CACC;
39 :
40 : // ===========================================================================
41 : // class definitions
42 : // ===========================================================================
43 : /** @class MSCFModel_ACC
44 : * @brief The ACC car-following model
45 : * @see MSCFModel
46 : */
47 : class MSCFModel_ACC : public MSCFModel {
48 : public:
49 : /** @brief Constructor
50 : * @param[in] vtype the type for which this model is built and also the parameter object to configure this model
51 : */
52 : MSCFModel_ACC(const MSVehicleType* vtype);
53 :
54 : /// @brief Destructor
55 : ~MSCFModel_ACC();
56 :
57 :
58 : /// @name Implementations of the MSCFModel interface
59 : /// @{
60 :
61 : /** @brief Computes the vehicle's safe speed (no dawdling)
62 : * @param[in] veh The vehicle (EGO)
63 : * @param[in] speed The vehicle's speed
64 : * @param[in] gap2pred The (net) distance to the LEADER
65 : * @param[in] predSpeed The speed of LEADER
66 : * @return EGO's safe speed
67 : * @see MSCFModel::ffeV
68 : */
69 : double followSpeed(const MSVehicle* const veh, double speed, double gap2pred, double predSpeed,
70 : double predMaxDecel, const MSVehicle* const pred = 0, const CalcReason usage = CalcReason::CURRENT) const;
71 :
72 :
73 : /** @brief Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
74 : * @param[in] veh The vehicle (EGO)
75 : * @param[in] gap2pred The (net) distance to the obstacle
76 : * @return EGO's safe speed for approaching a non-moving obstacle
77 : * @see MSCFModel::ffeS
78 : * @todo generic Interface, models can call for the values they need
79 : */
80 : double stopSpeed(const MSVehicle* const veh, const double speed, double gap2pred, double decel, const CalcReason usage = CalcReason::CURRENT) const;
81 :
82 : /** @brief Returns the a gap such that the gap mode acceleration of the follower is zero
83 : * @param[in] veh The vehicle itself, for obtaining other values
84 : * @param[in] speed EGO's speed
85 : * @param[in] leaderSpeed LEADER's speed
86 : * @param[in] leaderMaxDecel LEADER's max. deceleration rate
87 : */
88 : double getSecureGap(const MSVehicle* const veh, const MSVehicle* const pred, const double speed, const double leaderSpeed, const double leaderMaxDecel) const;
89 :
90 : /** @brief Computes the vehicle's acceptable speed at insertion
91 : * @param[in] veh The vehicle (EGO)
92 : * @param[in] pred The leader vehicle, for obtaining other values
93 : * @param[in] speed The vehicle's speed
94 : * @param[in] gap2pred The (net) distance to the LEADER
95 : * @param[in] predSpeed The speed of LEADER
96 : * @return EGO's safe speed
97 : */
98 : double insertionFollowSpeed(const MSVehicle* const v, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle* const pred = 0) const;
99 :
100 :
101 : /** @brief Returns the maximum gap at which an interaction between both vehicles occurs
102 : *
103 : * "interaction" means that the LEADER influences EGO's speed.
104 : * @param[in] veh The EGO vehicle
105 : * @param[in] vL LEADER's speed
106 : * @return The interaction gap
107 : * @todo evaluate signature
108 : * @see MSCFModel::interactionGap
109 : */
110 : double interactionGap(const MSVehicle* const, double vL) const;
111 :
112 :
113 : /** @brief Returns the model's name
114 : * @return The model's name
115 : * @see MSCFModel::getModelName
116 : */
117 7442 : int getModelID() const {
118 7442 : return SUMO_TAG_CF_ACC;
119 : }
120 : /// @}
121 :
122 :
123 :
124 : /** @brief Duplicates the car-following model
125 : * @param[in] vtype The vehicle type this model belongs to (1:1)
126 : * @return A duplicate of this car-following model
127 : */
128 : MSCFModel* duplicate(const MSVehicleType* vtype) const;
129 :
130 6994 : VehicleVariables* createVehicleVariables() const {
131 6994 : ACCVehicleVariables* ret = new ACCVehicleVariables();
132 : ret->ACC_ControlMode = 0;
133 6994 : ret->lastUpdateTime = 0;
134 6994 : return ret;
135 : }
136 :
137 : friend class MSCFModel_CACC;
138 :
139 : private:
140 : class ACCVehicleVariables : public MSCFModel::VehicleVariables {
141 : public:
142 14113 : ACCVehicleVariables() : ACC_ControlMode(0) {}
143 : /// @brief The vehicle's ACC control mode. 0 for speed control and 1 for gap control
144 : int ACC_ControlMode;
145 : SUMOTime lastUpdateTime;
146 : };
147 :
148 :
149 : private:
150 : double _v(const MSVehicle* const veh, const double gap2pred, const double mySpeed,
151 : const double predSpeed, const double desSpeed, const bool respectMinGap = true) const;
152 :
153 : double accelSpeedControl(double vErr) const;
154 : double accelGapControl(const MSVehicle* const veh, const double gap2pred, const double speed, const double predSpeed, double vErr) const;
155 :
156 :
157 : private:
158 : double mySpeedControlGain;
159 : double myGapClosingControlGainSpeed;
160 : double myGapClosingControlGainSpace;
161 : double myGapControlGainSpeed;
162 : double myGapControlGainSpace;
163 : double myCollisionAvoidanceGainSpeed;
164 : double myCollisionAvoidanceGainSpace;
165 : double myEmergencyThreshold;
166 :
167 : private:
168 : /// @brief Invalidated assignment operator
169 : MSCFModel_ACC& operator=(const MSCFModel_ACC& s);
170 : };
|