SUMO - Simulation of Urban MObility

SUMOVehicleClass.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // Definitions of SUMO vehicle classes and helper functions
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors
00011 /****************************************************************************/
00012 //
00013 //   This program is free software; you can redistribute it and/or modify
00014 //   it under the terms of the GNU General Public License as published by
00015 //   the Free Software Foundation; either version 2 of the License, or
00016 //   (at your option) any later version.
00017 //
00018 /****************************************************************************/
00019 
00020 
00021 // ===========================================================================
00022 // included modules
00023 // ===========================================================================
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029 
00030 #include <string>
00031 #include <map>
00032 #include "SUMOVehicleClass.h"
00033 #include <utils/common/TplConvert.h>
00034 #include <utils/common/ToString.h>
00035 #include <utils/common/MsgHandler.h>
00036 #include <utils/common/StringTokenizer.h>
00037 
00038 
00039 #ifdef CHECK_MEMORY_LEAKS
00040 #include <foreign/nvwa/debug_new.h>
00041 #endif // CHECK_MEMORY_LEAKS
00042 
00043 
00044 // ===========================================================================
00045 // static members
00046 // ===========================================================================
00047 StringBijection<SUMOVehicleClass>::Entry sumoVehicleClassStringInitializer[] = {
00048     {"unknown",           SVC_UNKNOWN},
00049     {"private",           SVC_PRIVATE},
00050     {"public_transport",  SVC_PUBLIC_TRANSPORT},
00051     {"public_emergency",  SVC_PUBLIC_EMERGENCY},
00052     {"public_authority",  SVC_PUBLIC_AUTHORITY},
00053     {"public_army",       SVC_PUBLIC_ARMY},
00054     {"vip",               SVC_VIP},
00055     {"ignoring",          SVC_IGNORING},
00056     {"passenger",         SVC_PASSENGER},
00057     {"hov",               SVC_HOV},
00058     {"taxi",              SVC_TAXI},
00059     {"bus",               SVC_BUS},
00060     {"delivery",          SVC_DELIVERY},
00061     {"transport",         SVC_TRANSPORT},
00062     {"lightrail",         SVC_LIGHTRAIL},
00063     {"cityrail",          SVC_CITYRAIL},
00064     {"rail_slow",         SVC_RAIL_SLOW},
00065     {"rail_fast",         SVC_RAIL_FAST},
00066     {"motorcycle",        SVC_MOTORCYCLE},
00067     {"bicycle",           SVC_BICYCLE},
00068     {"pedestrian",        SVC_PEDESTRIAN}
00069 };
00070 
00071 StringBijection<SUMOVehicleClass> SumoVehicleClassStrings(
00072     sumoVehicleClassStringInitializer, SVC_PEDESTRIAN);
00073 
00074 
00075 StringBijection<SUMOVehicleShape>::Entry sumoVehicleShapeStringInitializer[] = {
00076     {"pedestrian",            SVS_PEDESTRIAN},
00077     {"bicycle",               SVS_BICYCLE},
00078     {"motorcycle",            SVS_MOTORCYCLE},
00079     {"passenger",             SVS_PASSENGER},
00080     {"passenger/sedan",       SVS_PASSENGER_SEDAN},
00081     {"passenger/hatchback",   SVS_PASSENGER_HATCHBACK},
00082     {"passenger/wagon",       SVS_PASSENGER_WAGON},
00083     {"passenger/van",         SVS_PASSENGER_VAN},
00084     {"delivery",              SVS_DELIVERY},
00085     {"transport",             SVS_TRANSPORT},
00086     {"transport/semitrailer", SVS_TRANSPORT_SEMITRAILER},
00087     {"transport/trailer",     SVS_TRANSPORT_1TRAILER},
00088     {"bus",                   SVS_BUS},
00089     {"bus/city",              SVS_BUS_CITY},
00090     {"bus/flexible",          SVS_BUS_CITY_FLEXIBLE},
00091     {"bus/overland",          SVS_BUS_OVERLAND},
00092     {"bus/trolley",           SVS_BUS_TROLLEY},
00093     {"rail",                  SVS_RAIL},
00094     {"rail/light",            SVS_RAIL_LIGHT},
00095     {"rail/city",             SVS_RAIL_CITY},
00096     {"rail/slow",             SVS_RAIL_SLOW},
00097     {"rail/fast",             SVS_RAIL_FAST},
00098     {"rail/cargo",            SVS_RAIL_CARGO},
00099     {"evehicle",              SVS_E_VEHICLE},
00100     {"ant",                   SVS_ANT},
00101     {"",                      SVS_UNKNOWN}
00102 };
00103 
00104 
00105 StringBijection<SUMOVehicleShape> SumoVehicleShapeStrings(
00106     sumoVehicleShapeStringInitializer, SVS_UNKNOWN);
00107 
00108 
00109 // ===========================================================================
00110 // method definitions
00111 // ===========================================================================
00112 // ------------ Conversion of SUMOVehicleClass
00113 
00114 std::string
00115 getVehicleClassCompoundName(int id) {
00116     std::string ret;
00117     const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
00118     for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
00119         if ((id & SumoVehicleClassStrings.get(*it))) {
00120             ret += ("|" + *it);
00121         }
00122     }
00123     if (ret.length()>0) {
00124         return ret.substr(1);
00125     } else {
00126         return ret;
00127     }
00128 }
00129 
00130 
00131 std::string
00132 getVehicleClassNames(const SUMOVehicleClasses& ids) {
00133     std::ostringstream oss;
00134     bool hadOne = false;
00135     for (SUMOVehicleClasses::const_iterator i=ids.begin(); i!=ids.end(); ++i) {
00136         if (hadOne) {
00137             oss << ' ';
00138         }
00139         oss << toString(*i);
00140         hadOne = true;
00141     }
00142     return oss.str();
00143 }
00144 
00145 
00146 SUMOVehicleClass
00147 getVehicleClassID(const std::string& name) {
00148     if (SumoVehicleClassStrings.hasString(name)) {
00149         return SumoVehicleClassStrings.get(name);
00150     }
00151     throw ProcessError("Unknown vehicle class '" + name + "'.");
00152 }
00153 
00154 
00155 int
00156 getVehicleClassCompoundID(const std::string& name) {
00157     int ret = SVC_UNKNOWN;
00158     const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
00159     for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
00160         if (name.find(*it) != std::string::npos) {
00161             ret = ret | (int) SumoVehicleClassStrings.get(*it);
00162         }
00163     }
00164     return ret;
00165 }
00166 
00167 
00168 void
00169 parseVehicleClasses(
00170     const std::string& classNames,
00171     SUMOVehicleClasses& container) {
00172     StringTokenizer sta(classNames, " ");
00173     while (sta.hasNext()) {
00174         container.insert(getVehicleClassID(sta.next()));
00175     }
00176 }
00177 
00178 
00179 void
00180 parseVehicleClasses(const std::string& allowedS,
00181                     const std::string& disallowedS,
00182                     SUMOVehicleClasses& allowed,
00183                     SUMOVehicleClasses& disallowed) {
00184     parseVehicleClasses(allowedS, allowed);
00185     parseVehicleClasses(disallowedS, disallowed);
00186 }
00187 
00188 
00189 void
00190 parseVehicleClasses(const std::vector<std::string> &classesS,
00191                     SUMOVehicleClasses& classes) {
00192     for (std::vector<std::string>::const_iterator i=classesS.begin(); i!=classesS.end(); ++i) {
00193         classes.insert(getVehicleClassID(*i));
00194     }
00195 }
00196 
00197 
00198 SUMOVehicleShape
00199 getVehicleShapeID(const std::string& name) {
00200     if (SumoVehicleShapeStrings.hasString(name)) {
00201         return SumoVehicleShapeStrings.get(name);
00202     } else {
00203         throw ProcessError("Unknown vehicle shape '" + name + "'.");
00204     }
00205 }
00206 
00207 
00208 std::string
00209 getVehicleShapeName(SUMOVehicleShape id) {
00210     return SumoVehicleShapeStrings.getString(id);
00211 }
00212 
00213 
00214 // ------------ Conversion of SUMOEmissionClass
00215 SUMOEmissionClass
00216 getVehicleEmissionTypeID(const std::string& name) throw(ProcessError) {
00217     try {
00218         if (name=="") {
00219             return SVE_UNKNOWN;
00220         } else if (name=="zero") {
00221             return SVE_ZERO_EMISSIONS;
00222         } else if (name.find("HDV_3_")==0) {
00223             return (SUMOEmissionClass)(SVE_HDV_3_1 - 1 + TplConvert<char>::_2int(name.substr(name.rfind("_")+1).c_str()));
00224         } else if (name.find("HDV_6_")==0) {
00225             return (SUMOEmissionClass)(SVE_HDV_6_1 - 1 + TplConvert<char>::_2int(name.substr(name.rfind("_")+1).c_str()));
00226         } else if (name.find("HDV_12_")==0) {
00227             return (SUMOEmissionClass)(SVE_HDV_12_1 - 1 + TplConvert<char>::_2int(name.substr(name.rfind("_")+1).c_str()));
00228         } else if (name.find("P_7_")==0) {
00229             return (SUMOEmissionClass)(SVE_P_LDV_7_1 - 1 + TplConvert<char>::_2int(name.substr(name.rfind("_")+1).c_str()));
00230         } else if (name.find("P_14_")==0) {
00231             return (SUMOEmissionClass)(SVE_P_LDV_14_1 - 1 + TplConvert<char>::_2int(name.substr(name.rfind("_")+1).c_str()));
00232         }
00233     } catch (NumberFormatException&) {
00234     }
00235     throw ProcessError("Unknown emission type '" + name + "'.");
00236 }
00237 
00238 
00239 std::string
00240 getVehicleEmissionTypeName(SUMOEmissionClass id) {
00241     if (id==SVE_ZERO_EMISSIONS) {
00242         return "zero";
00243     }
00244     if (id<0) {
00245         return "";
00246     } else if (id<3) {
00247         return "HDV_3_" + toString(int(id));
00248     } else if (id<3+6) {
00249         return "HDV_6_" + toString(int(id-3));
00250     } else if (id<3+6+12) {
00251         return "HDV_12_" + toString(int(id-3-6));
00252     } else if (id<3+6+12+7) {
00253         return "P_7_" + toString(int(id-3-6-12));
00254     } else if (id<3+6+12+7+14) {
00255         return "P_14_" + toString(int(id-3-6-12-7));
00256     }
00257     return "";
00258 }
00259 
00260 const std::string DEFAULT_VTYPE_ID("DEFAULT_VEHTYPE");
00261 const SUMOReal DEFAULT_VEH_MAXSPEED(70.0);
00262 const SUMOReal DEFAULT_VEH_ACCEL(2.6);
00263 const SUMOReal DEFAULT_VEH_DECEL(4.5);
00264 const SUMOReal DEFAULT_VEH_SIGMA(0.5);
00265 const SUMOReal DEFAULT_VEH_LENGTH(5.);
00266 const SUMOReal DEFAULT_VEH_MINGAP(2.5);
00267 const SUMOReal DEFAULT_VEH_TAU(1.);
00268 const SUMOVehicleClass DEFAULT_VEH_CLASS(SVC_UNKNOWN);
00269 const SUMOReal DEFAULT_VEH_PROB(1.);
00270 const SUMOReal DEFAULT_VEH_SPEEDFACTOR(1.);
00271 const SUMOReal DEFAULT_VEH_SPEEDDEV(0.);
00272 const SUMOReal DEFAULT_VEH_GUIWIDTH(2.);
00273 const SumoXMLTag DEFAULT_VEH_FOLLOW_MODEL(SUMO_TAG_CF_KRAUSS);
00274 const std::string DEFAULT_VEH_LANE_CHANGE_MODEL("dkrajzew2008");
00275 const SUMOVehicleShape DEFAULT_VEH_SHAPE(SVS_UNKNOWN);
00276 
00277 /****************************************************************************/
00278 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines