|
SUMO - Simulation of Urban MObility
|
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