ARGoS  3
A parallel, multi-engine simulator for swarm robotics
core/simulator/simulator.h
Go to the documentation of this file.
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