Developer/How To/Car-Following Model

This short document describes how a new car-following model can be added to SUMO. We'll do this by implementing a test model named "smartSK". When implementing your own model, you should also grep (look for) occurences of the name we use, here.

The car-following model's class
The best thing is to start with an already existing model. Models are located in /src/microsim/cfmodels and new added models should reside here, too. Copy both MSCFModel_KraussOrig1.h and MSCFModel_KraussOrig1.cpp and rename them. The name should be "MSCFModel_", in our case "MSCFModel_SmartSK"

Now, open both files and rename all occurences of MSCFModel_KraussOrig1 into your class' name.

Add the files to the makefile which is in this folder and to the MSVC10 project located in /build/msvc10/y_libmicrosim.

Loading into simulation
We now add the XML-elements which allow us to define and parse the model's parameter. Extend the list of known elements "SUMOXMLDefinitions::tags" located in /src/utils/xml/SUMOXMLDefinitions. In SUMOXMLDefinitions.h: SUMO_TAG_CF_SMART_SK, In SUMOXMLDefinitions.cpp: { "carFollowing-SmartSK",    SUMO_TAG_CF_SMART_SK },

Car-following models are instantiated in MSVehicleType::build(...) located in /src/microsim/MSVehicleType.cpp. You'll find a switch, here where you have to put the call to your model's constructor into. case SUMO_TAG_CF_SMART_SK: model = new MSCFModel_SmartSK(vtype,                                from.get(SUMO_ATTR_ACCEL, DEFAULT_VEH_ACCEL),                                 from.get(SUMO_ATTR_DECEL, DEFAULT_VEH_DECEL),                                 from.get(SUMO_ATTR_SIGMA, DEFAULT_VEH_SIGMA),                                 from.get(SUMO_ATTR_TAU, DEFAULT_VEH_TAU),                                 from.get(SUMO_ATTR_TMP1, DEFAULT_VEH_TMP1),                                 from.get(SUMO_ATTR_TMP1, DEFAULT_VEH_TMP2),                                 from.get(SUMO_ATTR_TMP1, DEFAULT_VEH_TMP3),                                 from.get(SUMO_ATTR_TMP1, DEFAULT_VEH_TMP4),                                 from.get(SUMO_ATTR_TMP1, DEFAULT_VEH_TMP5));

You may note that the constructor is read with values from "from". The first parameter, starting with SUMO_ATTR_ denotes the XML-attribute which names the parameter. These attributes, if new, have to be added to /src/utils/xml/SUMOXMLDefinitions. In SUMOXMLDefinitions.h: SUMO_ATTR_TMP1, SUMO_ATTR_TMP2, SUMO_ATTR_TMP3, SUMO_ATTR_TMP4, SUMO_ATTR_TMP5, In SUMOXMLDefinitions.cpp: { "tmp1",          SUMO_ATTR_TMP1 }, { "tmp2",          SUMO_ATTR_TMP2 }, { "tmp3",          SUMO_ATTR_TMP3 }, { "tmp4",          SUMO_ATTR_TMP4 }, { "tmp5",          SUMO_ATTR_TMP5 },

You also have to define which parameter must be read in /src/utils/xml/SUMOVehicleParserHelper, method getAllowedCFModelAttrs: std::set smartSKParams; smartSKParams.insert(SUMO_ATTR_ACCEL); smartSKParams.insert(SUMO_ATTR_DECEL); smartSKParams.insert(SUMO_ATTR_SIGMA); smartSKParams.insert(SUMO_ATTR_TAU); smartSKParams.insert(SUMO_ATTR_TMP1); smartSKParams.insert(SUMO_ATTR_TMP2); smartSKParams.insert(SUMO_ATTR_TMP3); smartSKParams.insert(SUMO_ATTR_TMP4); smartSKParams.insert(SUMO_ATTR_TMP5); allowedCFModelAttrs[SUMO_TAG_CF_SMART_SK] = smartSKParams;

The second parameter, starting with DEFAULT_VEH_ is a constant default value. It has to be defined in /src/utils/common/SUMOVehicleClass, if new. In SUMOVehicleClass.h: extern const SUMOReal DEFAULT_VEH_TMP1; extern const SUMOReal DEFAULT_VEH_TMP2; extern const SUMOReal DEFAULT_VEH_TMP3; extern const SUMOReal DEFAULT_VEH_TMP4; extern const SUMOReal DEFAULT_VEH_TMP5; and in SUMOVehicleClass.cpp: const SUMOReal DEFAULT_VEH_TMP1(1.); const SUMOReal DEFAULT_VEH_TMP2(1.); const SUMOReal DEFAULT_VEH_TMP3(1.); const SUMOReal DEFAULT_VEH_TMP4(1.); const SUMOReal DEFAULT_VEH_TMP5(1.);

Note, that we have to adapt the constructor to retrieve the additional parameter (tmp1-tmp5). We have also to adapt the copy constructor located in our class in MSCFModel_SmartSK::duplicate(...).

For further interaction, you also have to adapt the "id" of the model in the model's .h class: virtual int getModelID const { return SUMO_TAG_CF_SMART_SK; }