ARGoS
3
A parallel, multi-engine simulator for swarm robotics
|
00001 00023 #ifndef SIMULATOR_H 00024 #define SIMULATOR_H 00025 00026 namespace argos { 00027 class CSimulator; 00028 class CLoopFunctions; 00029 class CVisualization; 00030 class CPhysicsEngine; 00031 class CMedium; 00032 class CSpace; 00033 class CProfiler; 00034 } 00035 00036 #include <argos3/core/config.h> 00037 #include <argos3/core/utility/math/rng.h> 00038 #include <argos3/core/utility/configuration/argos_configuration.h> 00039 #include <argos3/core/utility/datatypes/datatypes.h> 00040 #include <argos3/core/simulator/physics_engine/physics_engine.h> 00041 #include <argos3/core/simulator/medium/medium.h> 00042 #include <string> 00043 #include <map> 00044 00050 namespace argos { 00051 00062 class CSimulator { 00063 00064 private: 00065 00069 CSimulator(); 00070 00075 CSimulator(const CSimulator&) {} 00076 00081 CSimulator& operator=(const CSimulator&) { 00082 return *this; 00083 } 00084 00085 public: 00086 00090 ~CSimulator(); 00091 00098 static CSimulator& GetInstance(); 00099 00104 inline CSpace& GetSpace() const { 00105 return *m_pcSpace; 00106 } 00107 00113 CPhysicsEngine& GetPhysicsEngine(const std::string& str_id) const; 00114 00119 inline CPhysicsEngine::TVector& GetPhysicsEngines() { 00120 return m_vecPhysicsEngines; 00121 } 00122 00128 template <typename T> 00129 T& GetMedium(const std::string& str_id) { 00130 CMedium::TMap::const_iterator it = m_mapMedia.find(str_id); 00131 if(it != m_mapMedia.end()) { 00132 T* pcMedium = dynamic_cast<T*>(it->second); 00133 if(pcMedium != NULL) { 00134 return *pcMedium; 00135 } 00136 else { 00137 THROW_ARGOSEXCEPTION("Medium \"" << str_id << "\" can't be converted to the wanted type"); 00138 } 00139 } 00140 else { 00141 THROW_ARGOSEXCEPTION("Medium \"" << str_id << "\" not found."); 00142 } 00143 } 00144 00149 inline CMedium::TVector& GetMedia() { 00150 return m_vecMedia; 00151 } 00152 00157 inline CVisualization& GetVisualization() { 00158 ARGOS_ASSERT(m_pcVisualization != NULL, "No visualization specified in the XML file."); 00159 return *m_pcVisualization; 00160 } 00161 00166 inline TConfigurationNode& GetConfigurationRoot() { 00167 return m_tConfigurationRoot; 00168 } 00169 00174 inline CProfiler& GetProfiler() { 00175 return *m_pcProfiler; 00176 } 00177 00182 inline bool IsProfiling() const { 00183 return m_pcProfiler != NULL; 00184 } 00185 00191 inline UInt32 GetRandomSeed() const { 00192 return m_unRandomSeed; 00193 } 00194 00200 inline void SetRandomSeed(UInt32 un_random_seed) { 00201 m_unRandomSeed = un_random_seed; 00202 m_bWasRandomSeedSet = true; 00203 } 00204 00210 inline CRandom::CRNG* GetRNG() { 00211 return m_pcRNG; 00212 } 00213 00219 inline const std::string& GetExperimentFileName() const { 00220 return m_strExperimentConfigFileName; 00221 } 00222 00228 inline void SetExperimentFileName(const std::string& str_file_name) { 00229 m_strExperimentConfigFileName = str_file_name; 00230 } 00231 00236 inline CLoopFunctions& GetLoopFunctions() { 00237 return *m_pcLoopFunctions; 00238 } 00239 00244 inline void SetLoopFunctions(CLoopFunctions& c_loop_functions) { 00245 m_pcLoopFunctions = &c_loop_functions; 00246 } 00247 00252 inline UInt32 GetMaxSimulationClock() const { 00253 return m_unMaxSimulationClock; 00254 } 00255 00260 inline UInt32 GetNumThreads() const { 00261 return m_unThreads; 00262 } 00263 00269 inline std::string GetInstallationDirectory() const { 00270 return ARGOS_INSTALL_PREFIX; 00271 } 00272 00276 TConfigurationNode& GetConfigForController(const std::string& str_id); 00277 00283 void LoadExperiment(); 00284 00289 void Init(); 00290 00295 void Reset(); 00296 00306 inline void Reset(UInt32 un_new_random_seed) { 00307 SetRandomSeed(un_new_random_seed); 00308 Reset(); 00309 } 00310 00314 void Destroy(); 00315 00319 void Execute(); 00320 00324 void UpdateSpace(); 00325 00335 bool IsExperimentFinished() const; 00336 00337 private: 00338 00339 void InitFramework(TConfigurationNode& t_tree); 00340 void InitLoopFunctions(TConfigurationNode& t_tree); 00341 void InitControllers(TConfigurationNode& t_tree); 00342 void InitSpace(TConfigurationNode& t_tree); 00343 void InitPhysics(TConfigurationNode& t_tree); 00344 void InitMedia(TConfigurationNode& t_tree); 00345 void InitMedia2(); 00346 void InitVisualization(TConfigurationNode& t_tree); 00347 00348 private: 00349 00350 typedef std::map<std::string, TConfigurationNode*> TControllerConfigurationMap; 00351 00352 private: 00353 00357 TControllerConfigurationMap m_mapControllerConfig; 00358 00362 CVisualization* m_pcVisualization; 00363 00367 CPhysicsEngine::TMap m_mapPhysicsEngines; 00368 00372 CPhysicsEngine::TVector m_vecPhysicsEngines; 00373 00377 CMedium::TMap m_mapMedia; 00378 00382 CMedium::TVector m_vecMedia; 00383 00387 CSpace* m_pcSpace; 00388 00392 CLoopFunctions* m_pcLoopFunctions; 00393 00397 std::string m_strExperimentConfigFileName; 00398 00402 UInt32 m_unMaxSimulationClock; 00403 00407 UInt32 m_unRandomSeed; 00408 00412 CRandom::CRNG* m_pcRNG; 00413 00419 bool m_bWasRandomSeedSet; 00420 00424 ticpp::Document m_tConfiguration; 00425 00429 TConfigurationNode m_tConfigurationRoot; 00430 00434 UInt32 m_unThreads; 00435 00439 CProfiler* m_pcProfiler; 00440 00444 bool m_bHumanReadableProfile; 00445 00446 }; 00447 00448 } 00449 00450 #endif