LCOV - code coverage report
Current view: top level - src/microsim/devices - MSDevice_DriverState.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 155 158 98.1 %
Date: 2024-04-29 15:38:36 Functions: 17 17 100.0 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2013-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    MSDevice_DriverState.cpp
      15             : /// @author  Leonhard Luecken
      16             : /// @author  Daniel Krajzewicz
      17             : /// @author  Michael Behrisch
      18             : /// @author  Jakob Erdmann
      19             : /// @date    15.06.2018
      20             : ///
      21             : /// The Driver State Device mainly provides a configuration and interaction interface for the vehicle's driver state.
      22             : /// @see microsim/MSDriverState.h
      23             : ///
      24             : /****************************************************************************/
      25             : #include <config.h>
      26             : 
      27             : #include <utils/common/StringUtils.h>
      28             : #include <utils/options/OptionsCont.h>
      29             : #include <utils/vehicle/SUMOVehicle.h>
      30             : #include <utils/common/WrappingCommand.h>
      31             : #include <utils/common/RGBColor.h>
      32             : #include <microsim/MSNet.h>
      33             : #include <microsim/MSVehicle.h>
      34             : #include <microsim/MSRouteHandler.h>
      35             : #include <microsim/MSVehicleControl.h>
      36             : #include <microsim/MSEventControl.h>
      37             : #include <microsim/MSDriverState.h>
      38             : #include "MSDevice_DriverState.h"
      39             : 
      40             : 
      41             : // ===========================================================================
      42             : // debug constants
      43             : // ===========================================================================
      44             : //#define DEBUG_DSDEVICE
      45             : //#define DEBUG_COND (myHolder.isSelected())
      46             : 
      47             : 
      48             : // ===========================================================================
      49             : // parameter defaults
      50             : // ===========================================================================
      51             : 
      52             : // see DriverStateDefaults in MSDriverState
      53             : 
      54             : 
      55             : // ===========================================================================
      56             : // method definitions
      57             : // ===========================================================================
      58             : // ---------------------------------------------------------------------------
      59             : // static initialisation methods
      60             : // ---------------------------------------------------------------------------
      61             : void
      62       36320 : MSDevice_DriverState::insertOptions(OptionsCont& oc) {
      63       36320 :     oc.addOptionSubTopic("Driver State Device");
      64       72640 :     insertDefaultAssignmentOptions("driverstate", "Driver State Device", oc);
      65       36320 :     oc.doRegister("device.driverstate.initialAwareness", new Option_Float(DriverStateDefaults::initialAwareness));
      66      108960 :     oc.addDescription("device.driverstate.initialAwareness", "Driver State Device", TL("Initial value assigned to the driver's awareness."));
      67       36320 :     oc.doRegister("device.driverstate.errorTimeScaleCoefficient", new Option_Float(DriverStateDefaults::errorTimeScaleCoefficient));
      68      108960 :     oc.addDescription("device.driverstate.errorTimeScaleCoefficient", "Driver State Device", TL("Time scale for the error process."));
      69       36320 :     oc.doRegister("device.driverstate.errorNoiseIntensityCoefficient", new Option_Float(DriverStateDefaults::errorNoiseIntensityCoefficient));
      70      108960 :     oc.addDescription("device.driverstate.errorNoiseIntensityCoefficient", "Driver State Device", TL("Noise intensity driving the error process."));
      71       36320 :     oc.doRegister("device.driverstate.speedDifferenceErrorCoefficient", new Option_Float(DriverStateDefaults::speedDifferenceErrorCoefficient));
      72      108960 :     oc.addDescription("device.driverstate.speedDifferenceErrorCoefficient", "Driver State Device", TL("General scaling coefficient for applying the error to the perceived speed difference (error also scales with distance)."));
      73       36320 :     oc.doRegister("device.driverstate.headwayErrorCoefficient", new Option_Float(DriverStateDefaults::headwayErrorCoefficient));
      74      108960 :     oc.addDescription("device.driverstate.headwayErrorCoefficient", "Driver State Device", TL("General scaling coefficient for applying the error to the perceived distance (error also scales with distance)."));
      75       36320 :     oc.doRegister("device.driverstate.freeSpeedErrorCoefficient", new Option_Float(DriverStateDefaults::freeSpeedErrorCoefficient));
      76      108960 :     oc.addDescription("device.driverstate.freeSpeedErrorCoefficient", "Driver State Device", TL("General scaling coefficient for applying the error to the vehicle's own speed when driving without a leader (error also scales with own speed)."));
      77       36320 :     oc.doRegister("device.driverstate.speedDifferenceChangePerceptionThreshold", new Option_Float(DriverStateDefaults::speedDifferenceChangePerceptionThreshold));
      78      108960 :     oc.addDescription("device.driverstate.speedDifferenceChangePerceptionThreshold", "Driver State Device", TL("Base threshold for recognizing changes in the speed difference (threshold also scales with distance)."));
      79       36320 :     oc.doRegister("device.driverstate.headwayChangePerceptionThreshold", new Option_Float(DriverStateDefaults::headwayChangePerceptionThreshold));
      80      108960 :     oc.addDescription("device.driverstate.headwayChangePerceptionThreshold", "Driver State Device", TL("Base threshold for recognizing changes in the headway (threshold also scales with distance)."));
      81       36320 :     oc.doRegister("device.driverstate.minAwareness", new Option_Float(DriverStateDefaults::minAwareness));
      82      108960 :     oc.addDescription("device.driverstate.minAwareness", "Driver State Device", TL("Minimal admissible value for the driver's awareness."));
      83       36320 :     oc.doRegister("device.driverstate.maximalReactionTime", new Option_Float(-1.0));
      84      108960 :     oc.addDescription("device.driverstate.maximalReactionTime", "Driver State Device", TL("Maximal reaction time (~action step length) induced by decreased awareness level (reached for awareness=minAwareness)."));
      85       36320 : }
      86             : 
      87             : 
      88             : void
      89     4658938 : MSDevice_DriverState::buildVehicleDevices(SUMOVehicle& v, std::vector<MSVehicleDevice*>& into) {
      90     4658938 :     OptionsCont& oc = OptionsCont::getOptions();
      91             :     // ToC device implies driverstate
      92     9317799 :     if (equippedByDefaultAssignmentOptions(oc, "driverstate", v, false) || equippedByDefaultAssignmentOptions(oc, "toc", v, false)) {
      93         237 :         const double minAwareness = getMinAwareness(v, oc);
      94         237 :         const double initialAwareness = getInitialAwareness(v, oc);
      95         237 :         const double errorTimeScaleCoefficient = getErrorTimeScaleCoefficient(v, oc);
      96         237 :         const double errorNoiseIntensityCoefficient = getErrorNoiseIntensityCoefficient(v, oc);
      97         237 :         const double speedDifferenceErrorCoefficient = getSpeedDifferenceErrorCoefficient(v, oc);
      98         237 :         const double speedDifferenceChangePerceptionThreshold = getSpeedDifferenceChangePerceptionThreshold(v, oc);
      99         237 :         const double headwayChangePerceptionThreshold = getHeadwayChangePerceptionThreshold(v, oc);
     100         237 :         const double headwayErrorCoefficient = getHeadwayErrorCoefficient(v, oc);
     101         237 :         const double freeSpeedErrorCoefficient = getFreeSpeedErrorCoefficient(v, oc);
     102         237 :         const double maximalReactionTime = getMaximalReactionTime(v, oc);
     103             :         // build the device
     104         237 :         MSDevice_DriverState* device = new MSDevice_DriverState(v, "driverstate" + v.getID(),
     105             :                 minAwareness,
     106             :                 initialAwareness,
     107             :                 errorTimeScaleCoefficient,
     108             :                 errorNoiseIntensityCoefficient,
     109             :                 speedDifferenceErrorCoefficient,
     110             :                 speedDifferenceChangePerceptionThreshold,
     111             :                 headwayChangePerceptionThreshold,
     112             :                 headwayErrorCoefficient,
     113             :                 freeSpeedErrorCoefficient,
     114         237 :                 maximalReactionTime);
     115         237 :         into.push_back(device);
     116             :     }
     117     4658938 : }
     118             : 
     119             : 
     120             : double
     121         237 : MSDevice_DriverState::getMinAwareness(const SUMOVehicle& v, const OptionsCont& oc) {
     122         474 :     return getFloatParam(v, oc, "driverstate.minAwareness", DriverStateDefaults::minAwareness, false);
     123             : }
     124             : double
     125         237 : MSDevice_DriverState::getInitialAwareness(const SUMOVehicle& v, const OptionsCont& oc) {
     126         474 :     return getFloatParam(v, oc, "driverstate.initialAwareness", DriverStateDefaults::initialAwareness, false);
     127             : }
     128             : double
     129         237 : MSDevice_DriverState::getErrorTimeScaleCoefficient(const SUMOVehicle& v, const OptionsCont& oc) {
     130         474 :     return getFloatParam(v, oc, "driverstate.errorTimeScaleCoefficient", DriverStateDefaults::errorTimeScaleCoefficient, false);
     131             : }
     132             : double
     133         237 : MSDevice_DriverState::getErrorNoiseIntensityCoefficient(const SUMOVehicle& v, const OptionsCont& oc) {
     134         474 :     return getFloatParam(v, oc, "driverstate.errorNoiseIntensityCoefficient", DriverStateDefaults::errorNoiseIntensityCoefficient, false);
     135             : }
     136             : double
     137         237 : MSDevice_DriverState::getSpeedDifferenceErrorCoefficient(const SUMOVehicle& v, const OptionsCont& oc) {
     138         474 :     return getFloatParam(v, oc, "driverstate.speedDifferenceErrorCoefficient", DriverStateDefaults::speedDifferenceErrorCoefficient, false);
     139             : }
     140             : double
     141         237 : MSDevice_DriverState::getSpeedDifferenceChangePerceptionThreshold(const SUMOVehicle& v, const OptionsCont& oc) {
     142         474 :     return getFloatParam(v, oc, "driverstate.speedDifferenceChangePerceptionThreshold", DriverStateDefaults::speedDifferenceChangePerceptionThreshold, false);
     143             : }
     144             : double
     145         237 : MSDevice_DriverState::getHeadwayChangePerceptionThreshold(const SUMOVehicle& v, const OptionsCont& oc) {
     146         474 :     return getFloatParam(v, oc, "driverstate.headwayChangePerceptionThreshold", DriverStateDefaults::headwayChangePerceptionThreshold, false);
     147             : }
     148             : double
     149         237 : MSDevice_DriverState::getHeadwayErrorCoefficient(const SUMOVehicle& v, const OptionsCont& oc) {
     150         474 :     return getFloatParam(v, oc, "driverstate.headwayErrorCoefficient", DriverStateDefaults::headwayErrorCoefficient, false);
     151             : }
     152             : double
     153         237 : MSDevice_DriverState::getFreeSpeedErrorCoefficient(const SUMOVehicle& v, const OptionsCont& oc) {
     154         474 :     return getFloatParam(v, oc, "driverstate.freeSpeedErrorCoefficient", DriverStateDefaults::freeSpeedErrorCoefficient, false);
     155             : }
     156             : double
     157         237 : MSDevice_DriverState::getMaximalReactionTime(const SUMOVehicle& v, const OptionsCont& oc) {
     158         474 :     return getFloatParam(v, oc, "driverstate.maximalReactionTime", -1.0, false);
     159             : }
     160             : 
     161             : 
     162             : // ---------------------------------------------------------------------------
     163             : // MSDevice_DriverState-methods
     164             : // ---------------------------------------------------------------------------
     165         237 : MSDevice_DriverState::MSDevice_DriverState(SUMOVehicle& holder, const std::string& id,
     166             :         double minAwareness,
     167             :         double initialAwareness,
     168             :         double errorTimeScaleCoefficient,
     169             :         double errorNoiseIntensityCoefficient,
     170             :         double speedDifferenceErrorCoefficient,
     171             :         double speedDifferenceChangePerceptionThreshold,
     172             :         double headwayChangePerceptionThreshold,
     173             :         double headwayErrorCoefficient,
     174             :         double freeSpeedErrorCoefficient,
     175         237 :         double maximalReactionTime) :
     176             :     MSVehicleDevice(holder, id),
     177         237 :     myMinAwareness(minAwareness),
     178         237 :     myInitialAwareness(initialAwareness),
     179         237 :     myErrorTimeScaleCoefficient(errorTimeScaleCoefficient),
     180         237 :     myErrorNoiseIntensityCoefficient(errorNoiseIntensityCoefficient),
     181         237 :     mySpeedDifferenceErrorCoefficient(speedDifferenceErrorCoefficient),
     182         237 :     mySpeedDifferenceChangePerceptionThreshold(speedDifferenceChangePerceptionThreshold),
     183         237 :     myHeadwayChangePerceptionThreshold(headwayChangePerceptionThreshold),
     184         237 :     myHeadwayErrorCoefficient(headwayErrorCoefficient),
     185         237 :     myFreeSpeedErrorCoefficient(freeSpeedErrorCoefficient),
     186         237 :     myMaximalReactionTime(maximalReactionTime) {
     187             :     // Take care! Holder is currently being constructed. Cast occurs before completion.
     188         237 :     myHolderMS = static_cast<MSVehicle*>(&holder);
     189         237 :     initDriverState();
     190             : 
     191             : 
     192             : #ifdef DEBUG_DSDEVICE
     193             :     std::cout << "initialized device '" << id << "' with "
     194             :               << "myMinAwareness=" << myMinAwareness << ", "
     195             :               << "myInitialAwareness=" << myInitialAwareness << ", "
     196             :               << "myErrorTimeScaleCoefficient=" << myErrorTimeScaleCoefficient << ", "
     197             :               << "myErrorNoiseIntensityCoefficient=" << myErrorNoiseIntensityCoefficient << ", "
     198             :               << "mySpeedDifferenceErrorCoefficient=" << mySpeedDifferenceErrorCoefficient << ", "
     199             :               << "mySpeedDifferenceChangePerceptionThreshold=" << mySpeedDifferenceChangePerceptionThreshold << ", "
     200             :               << "myHeadwayChangePerceptionThreshold=" << myHeadwayChangePerceptionThreshold << ", "
     201             :               << "myHeadwayErrorCoefficient=" << myHeadwayErrorCoefficient << std::endl;
     202             :             << "myFreeSpeedErrorCoefficient=" << myFreeSpeedErrorCoefficient << std::endl;
     203             : #endif
     204             : 
     205         237 : }
     206             : 
     207             : void
     208         237 : MSDevice_DriverState::initDriverState() {
     209         474 :     myDriverState = std::make_shared<MSSimpleDriverState>(myHolderMS);
     210         237 :     myDriverState->setMinAwareness(myMinAwareness);
     211         237 :     myDriverState->setInitialAwareness(myInitialAwareness);
     212         237 :     myDriverState->setErrorTimeScaleCoefficient(myErrorTimeScaleCoefficient);
     213         237 :     myDriverState->setErrorNoiseIntensityCoefficient(myErrorNoiseIntensityCoefficient);
     214         237 :     myDriverState->setSpeedDifferenceErrorCoefficient(mySpeedDifferenceErrorCoefficient);
     215         237 :     myDriverState->setHeadwayErrorCoefficient(myHeadwayErrorCoefficient);
     216         237 :     myDriverState->setFreeSpeedErrorCoefficient(myFreeSpeedErrorCoefficient);
     217         237 :     myDriverState->setSpeedDifferenceChangePerceptionThreshold(mySpeedDifferenceChangePerceptionThreshold);
     218         237 :     myDriverState->setHeadwayChangePerceptionThreshold(myHeadwayChangePerceptionThreshold);
     219         237 :     myDriverState->setAwareness(myInitialAwareness);
     220         237 :     if (myMaximalReactionTime > 0) {
     221             :         myDriverState->setMaximalReactionTime(myMaximalReactionTime);
     222             :     }
     223         237 : }
     224             : 
     225             : void
     226      272458 : MSDevice_DriverState::update() {
     227      272458 :     myDriverState->update();
     228      272458 : }
     229             : 
     230             : std::string
     231         424 : MSDevice_DriverState::getParameter(const std::string& key) const {
     232             : #ifdef DEBUG_DSDEVICE
     233             :     std::cout << "MSDevice_DriverState::getParameter(key=" << key << ")" << std::endl;
     234             : #endif
     235         424 :     if (key == "awareness") {
     236         162 :         return toString(myDriverState->getAwareness());
     237         262 :     } else if (key == "errorState") {
     238         162 :         return toString(myDriverState->getErrorState());
     239         100 :     } else if (key == "errorTimeScale") {
     240           8 :         return toString(myDriverState->getErrorTimeScale());
     241          92 :     } else if (key == "errorNoiseIntensity") {
     242           8 :         return toString(myDriverState->getErrorNoiseIntensity());
     243          84 :     } else if (key == "minAwareness") {
     244           8 :         return toString(myDriverState->getMinAwareness());
     245          76 :     } else if (key == "initialAwareness") {
     246           8 :         return toString(myDriverState->getInitialAwareness());
     247          68 :     } else if (key == "errorTimeScaleCoefficient") {
     248           8 :         return toString(myDriverState->getErrorTimeScaleCoefficient());
     249          60 :     } else if (key == "errorNoiseIntensityCoefficient") {
     250           8 :         return toString(myDriverState->getErrorNoiseIntensityCoefficient());
     251          52 :     } else if (key == "speedDifferenceErrorCoefficient") {
     252           8 :         return toString(myDriverState->getSpeedDifferenceErrorCoefficient());
     253          44 :     } else if (key == "headwayErrorCoefficient") {
     254           8 :         return toString(myDriverState->getHeadwayErrorCoefficient());
     255          36 :     } else if (key == "speedDifferenceChangePerceptionThreshold") {
     256           8 :         return toString(myDriverState->getSpeedDifferenceChangePerceptionThreshold());
     257          28 :     } else if (key == "headwayChangePerceptionThreshold") {
     258           8 :         return toString(myDriverState->getHeadwayChangePerceptionThreshold());
     259          20 :     } else if (key == "maximalReactionTime") {
     260           6 :         return toString(myDriverState->getMaximalReactionTime());
     261          14 :     } else if (key == "originalReactionTime") {
     262           6 :         return toString(myDriverState->getOriginalReactionTime());
     263           8 :     } else if (key == "actionStepLength") {
     264           8 :         return toString(myDriverState->getActionStepLength());
     265             :     }
     266           0 :     throw InvalidArgument("Parameter '" + key + "' is not supported for device of type '" + deviceName() + "'");
     267             : }
     268             : 
     269             : 
     270             : void
     271          28 : MSDevice_DriverState::setParameter(const std::string& key, const std::string& value) {
     272             : #ifdef DEBUG_DSDEVICE
     273             :     std::cout << "MSDevice_DriverState::setParameter(key=" << key << ", value=" << value << ")" << std::endl;
     274             : #endif
     275          28 :     if (key == "awareness") {
     276           2 :         myDriverState->setAwareness(StringUtils::toDouble(value));
     277          26 :     } else if (key == "errorState") {
     278           2 :         myDriverState->setErrorState(StringUtils::toDouble(value));
     279          24 :     } else if (key == "errorTimeScale") {
     280           2 :         myDriverState->setErrorTimeScale(StringUtils::toDouble(value));
     281          22 :     } else if (key == "errorNoiseIntensity") {
     282           2 :         myDriverState->setErrorNoiseIntensity(StringUtils::toDouble(value));
     283          20 :     } else if (key == "minAwareness") {
     284           2 :         myDriverState->setMinAwareness(StringUtils::toDouble(value));
     285          18 :     } else if (key == "initialAwareness") {
     286           2 :         myDriverState->setInitialAwareness(StringUtils::toDouble(value));
     287          16 :     } else if (key == "errorTimeScaleCoefficient") {
     288           2 :         myDriverState->setErrorTimeScaleCoefficient(StringUtils::toDouble(value));
     289          14 :     } else if (key == "errorNoiseIntensityCoefficient") {
     290           2 :         myDriverState->setErrorNoiseIntensityCoefficient(StringUtils::toDouble(value));
     291          12 :     } else if (key == "speedDifferenceErrorCoefficient") {
     292           2 :         myDriverState->setSpeedDifferenceErrorCoefficient(StringUtils::toDouble(value));
     293          10 :     } else if (key == "headwayErrorCoefficient") {
     294           2 :         myDriverState->setHeadwayErrorCoefficient(StringUtils::toDouble(value));
     295           8 :     } else if (key == "freeSpeedErrorCoefficient") {
     296           0 :         myDriverState->setFreeSpeedErrorCoefficient(StringUtils::toDouble(value));
     297           8 :     } else if (key == "speedDifferenceChangePerceptionThreshold") {
     298           2 :         myDriverState->setSpeedDifferenceChangePerceptionThreshold(StringUtils::toDouble(value));
     299           6 :     } else if (key == "headwayChangePerceptionThreshold") {
     300           2 :         myDriverState->setHeadwayChangePerceptionThreshold(StringUtils::toDouble(value));
     301           4 :     } else if (key == "maximalReactionTime") {
     302           2 :         myDriverState->setMaximalReactionTime(StringUtils::toDouble(value));
     303           2 :     } else if (key == "originalReactionTime") {
     304           2 :         myDriverState->setOriginalReactionTime(StringUtils::toDouble(value));
     305             :     } else {
     306           0 :         throw InvalidArgument("Parameter '" + key + "' is not supported for device of type '" + deviceName() + "'");
     307             :     }
     308          28 : }
     309             : 
     310             : 
     311             : /****************************************************************************/

Generated by: LCOV version 1.14