ARGoS  3
A parallel, multi-engine simulator for swarm robotics
pointmass3d_engine.cpp
Go to the documentation of this file.
1 
7 #include "pointmass3d_engine.h"
8 #include "pointmass3d_model.h"
9 #include <argos3/core/utility/logging/argos_log.h>
10 #include <argos3/core/utility/configuration/argos_configuration.h>
11 
12 namespace argos {
13 
14  /****************************************/
15  /****************************************/
16 
18  m_fGravity(-9.81f) {
19  }
20 
21  /****************************************/
22  /****************************************/
23 
25  }
26 
27  /****************************************/
28  /****************************************/
29 
31  /* Init parent */
32  CPhysicsEngine::Init(t_tree);
33  /* Set gravity */
34  GetNodeAttributeOrDefault(t_tree, "gravity", m_fGravity, m_fGravity);
35  }
36 
37  /****************************************/
38  /****************************************/
39 
41  for(CPointMass3DModel::TMap::iterator it = m_tPhysicsModels.begin();
42  it != m_tPhysicsModels.end(); ++it) {
43  it->second->Reset();
44  }
45  }
46 
47  /****************************************/
48  /****************************************/
49 
51  /* Empty the physics entity map */
52  for(CPointMass3DModel::TMap::iterator it = m_tPhysicsModels.begin();
53  it != m_tPhysicsModels.end(); ++it) {
54  delete it->second;
55  }
56  m_tPhysicsModels.clear();
57  }
58 
59  /****************************************/
60  /****************************************/
61 
63  /* Update the physics state from the entities */
64  for(CPointMass3DModel::TMap::iterator it = m_tPhysicsModels.begin();
65  it != m_tPhysicsModels.end(); ++it) {
66  it->second->UpdateFromEntityStatus();
67  }
68  for(size_t i = 0; i < GetIterations(); ++i) {
69  /* Perform the step */
70  for(CPointMass3DModel::TMap::iterator it = m_tPhysicsModels.begin();
71  it != m_tPhysicsModels.end(); ++it) {
72  it->second->Step();
73  }
74  }
75  /* Update the simulated space */
76  for(CPointMass3DModel::TMap::iterator it = m_tPhysicsModels.begin();
77  it != m_tPhysicsModels.end(); ++it) {
78  it->second->UpdateEntityStatus();
79  }
80  }
81 
82  /****************************************/
83  /****************************************/
84 
86  return m_tPhysicsModels.size();
87  }
88 
89  /****************************************/
90  /****************************************/
91 
93  SOperationOutcome cOutcome =
94  CallEntityOperation<CPointMass3DOperationAddEntity, CPointMass3DEngine, SOperationOutcome>
95  (*this, c_entity);
96  return cOutcome.Value;
97  }
98 
99  /****************************************/
100  /****************************************/
101 
103  SOperationOutcome cOutcome =
104  CallEntityOperation<CPointMass3DOperationRemoveEntity, CPointMass3DEngine, SOperationOutcome>
105  (*this, c_entity);
106  return cOutcome.Value;
107  }
108 
109  /****************************************/
110  /****************************************/
111 
113  return true;
114  }
115 
116  /****************************************/
117  /****************************************/
118 
120  return false;
121  }
122 
123  /****************************************/
124  /****************************************/
125 
127  }
128 
129  /****************************************/
130  /****************************************/
131 
133  const CRay3& c_ray) const {
134  Real fTOnRay;
135  for(CPointMass3DModel::TMap::const_iterator it = m_tPhysicsModels.begin();
136  it != m_tPhysicsModels.end();
137  ++it) {
138  if(it->second->CheckIntersectionWithRay(fTOnRay, c_ray)) {
139  t_data.push_back(
141  &it->second->GetEmbodiedEntity(),
142  fTOnRay));
143  }
144  }
145  }
146 
147  /****************************************/
148  /****************************************/
149 
150  void CPointMass3DEngine::AddPhysicsModel(const std::string& str_id,
151  CPointMass3DModel& c_model) {
152  m_tPhysicsModels[str_id] = &c_model;
153  }
154 
155  /****************************************/
156  /****************************************/
157 
158  void CPointMass3DEngine::RemovePhysicsModel(const std::string& str_id) {
159  CPointMass3DModel::TMap::iterator it = m_tPhysicsModels.find(str_id);
160  if(it != m_tPhysicsModels.end()) {
161  delete it->second;
162  m_tPhysicsModels.erase(it);
163  }
164  else {
165  THROW_ARGOSEXCEPTION("PointMass3D model id \"" << str_id << "\" not found in point-mass 3D engine \"" << GetId() << "\"");
166  }
167  }
168 
169  /****************************************/
170  /****************************************/
171 
173  "pointmass3d",
174  "Carlo Pinciroli [ilpincy@gmail.com]",
175  "1.0",
176  "A 3D point-mass physics engine.",
177  "This physics engine is a 3D point-mass engine.\n\n"
178  "REQUIRED XML CONFIGURATION\n\n"
179  " <physics_engines>\n"
180  " ...\n"
181  " <pointmass3d id=\"pm3d\" />\n"
182  " ...\n"
183  " </physics_engines>\n\n"
184  "The 'id' attribute is necessary and must be unique among the physics engines.\n"
185  "If two engines share the same id, initialization aborts.\n\n"
186  "OPTIONAL XML CONFIGURATION\n\n"
187  "None for the time being.\n\n"
188  ,
189  "Under development"
190  );
191 
192 }
argos::CPhysicsEngine::GetId
const std::string & GetId() const
Returns the id of this physics engine.
Definition: physics_engine.h:284
argos::CPointMass3DEngine::IsPointContained
virtual bool IsPointContained(const CVector3 &c_point)
Returns true if the given point is contained in this physics engine.
Definition: pointmass3d_engine.cpp:112
argos::CPointMass3DEngine::GetNumPhysicsModels
virtual size_t GetNumPhysicsModels()
Definition: pointmass3d_engine.cpp:85
argos::CPointMass3DEngine::~CPointMass3DEngine
virtual ~CPointMass3DEngine()
Definition: pointmass3d_engine.cpp:24
argos
The namespace containing all the ARGoS related code.
Definition: ci_actuator.h:12
argos::CVector3
A 3D vector class.
Definition: vector3.h:29
argos::CPointMass3DEngine::IsEntityTransferNeeded
virtual bool IsEntityTransferNeeded() const
Definition: pointmass3d_engine.cpp:119
argos::CPhysicsEngine::GetIterations
UInt32 GetIterations() const
Returns the number of iterations per simulation clock tick.
Definition: physics_engine.h:266
argos::CRay3
Definition: ray3.h:19
argos::SEmbodiedEntityIntersectionItem
Definition: physics_engine.h:32
argos::CPointMass3DEngine::TransferEntities
virtual void TransferEntities()
Executes the transfer of entities to other engines.
Definition: pointmass3d_engine.cpp:126
argos::TConfigurationNode
ticpp::Element TConfigurationNode
The ARGoS configuration XML node.
Definition: argos_configuration.h:27
argos::CPointMass3DEngine::CheckIntersectionWithRay
virtual void CheckIntersectionWithRay(TEmbodiedEntityIntersectionData &t_data, const CRay3 &c_ray) const
Check which objects in this engine intersect the given ray.
Definition: pointmass3d_engine.cpp:132
argos::CPointMass3DModel
Definition: pointmass3d_model.h:21
pointmass3d_model.h
argos::CPointMass3DEngine::CPointMass3DEngine
CPointMass3DEngine()
Definition: pointmass3d_engine.cpp:17
argos::CPointMass3DEngine::Init
virtual void Init(TConfigurationNode &t_tree)
Initializes the resource.
Definition: pointmass3d_engine.cpp:30
THROW_ARGOSEXCEPTION
#define THROW_ARGOSEXCEPTION(message)
This macro throws an ARGoS exception with the passed message.
Definition: argos_exception.h:111
argos::CPointMass3DEngine::RemoveEntity
virtual bool RemoveEntity(CEntity &c_entity)
Removes an entity from the physics engine.
Definition: pointmass3d_engine.cpp:102
argos::CPointMass3DEngine::Update
virtual void Update()
Definition: pointmass3d_engine.cpp:62
argos::SOperationOutcome::Value
bool Value
Definition: entity.h:300
argos::CPointMass3DEngine::Destroy
virtual void Destroy()
Undoes whatever was done by Init().
Definition: pointmass3d_engine.cpp:50
argos::CEntity
The basic entity type.
Definition: entity.h:89
argos::GetNodeAttributeOrDefault
void GetNodeAttributeOrDefault(TConfigurationNode &t_node, const std::string &str_attribute, T &t_buffer, const T &t_default)
Returns the value of a node's attribute, or the passed default value.
Definition: argos_configuration.h:318
pointmass3d_engine.h
argos::CPhysicsEngine::Init
virtual void Init(TConfigurationNode &t_tree)
Initializes the resource.
Definition: physics_engine.cpp:185
argos::CPointMass3DEngine::AddEntity
virtual bool AddEntity(CEntity &c_entity)
Adds an entity to the physics engine.
Definition: pointmass3d_engine.cpp:92
argos::SOperationOutcome
Type to use as return value for operation outcome.
Definition: entity.h:299
argos::CPointMass3DEngine::RemovePhysicsModel
void RemovePhysicsModel(const std::string &str_id)
Definition: pointmass3d_engine.cpp:158
argos::REGISTER_PHYSICS_ENGINE
REGISTER_PHYSICS_ENGINE(CDynamics2DEngine, "dynamics2d", "Carlo Pinciroli [ilpincy@gmail.com]", "1.0", "A 2D dynamics physics engine.", "This physics engine is a 2D dynamics engine based on the Chipmunk library\n" "(http://code.google.com/p/chipmunk-physics).\n\n" "REQUIRED XML CONFIGURATION\n\n" " <physics_engines>\n" " ...\n" " <dynamics2d id=\"dyn2d\" />\n" " ...\n" " </physics_engines>\n\n" "The 'id' attribute is necessary and must be unique among the physics engines.\n" "It is used in the subsequent section <arena_physics> to assign entities to\n" "physics engines. If two engines share the same id, initialization aborts.\n\n" "OPTIONAL XML CONFIGURATION\n\n" "The plane of the physics engine can be translated on the Z axis, to simulate\n" "for example hovering objects, such as flying robots. To translate the plane\n" "2m up the Z axis, use the 'elevation' attribute as follows:\n\n" " <physics_engines>\n" " ...\n" " <dynamics2d id=\"dyn2d\"\n" " elevation=\"2.0\" />\n" " ...\n" " </physics_engines>\n\n" "When not specified, the elevation is zero, which means that the plane\n" "corresponds to the XY plane.\n", "Under development")
argos::TEmbodiedEntityIntersectionData
std::vector< SEmbodiedEntityIntersectionItem > TEmbodiedEntityIntersectionData
Definition: physics_engine.h:54
argos::CPointMass3DEngine
Definition: pointmass3d_engine.h:22
argos::CPointMass3DEngine::AddPhysicsModel
void AddPhysicsModel(const std::string &str_id, CPointMass3DModel &c_model)
Definition: pointmass3d_engine.cpp:150
argos::CPointMass3DEngine::Reset
virtual void Reset()
Resets the resource.
Definition: pointmass3d_engine.cpp:40
Real
float Real
Collects all ARGoS code.
Definition: datatypes.h:39