ARGoS 3
A parallel, multi-engine simulator for swarm robotics
pointmass3d_engine.cpp
Go to the documentation of this file.
1
8#include "pointmass3d_model.h"
9#include <argos3/core/utility/logging/argos_log.h>
10#include <argos3/core/utility/configuration/argos_configuration.h>
11
12namespace argos {
13
14 /****************************************/
15 /****************************************/
16
18 m_fGravity(-9.81f) {
19 }
20
21 /****************************************/
22 /****************************************/
23
26
27 /****************************************/
28 /****************************************/
29
31 /* Init parent */
33 /* Set gravity */
34 GetNodeAttributeOrDefault(t_tree, "gravity", m_fGravity, m_fGravity);
35 }
36
37 /****************************************/
38 /****************************************/
39
41 for(auto 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(auto 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(auto 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(auto it = m_tPhysicsModels.begin();
71 it != m_tPhysicsModels.end(); ++it) {
72 it->second->UpdatePhysics();
73 }
74 }
75 for(auto it = m_tPhysicsModels.begin();
76 it != m_tPhysicsModels.end(); ++it) {
77 it->second->Step();
78 }
79 /* Update the simulated space */
80 for(auto it = m_tPhysicsModels.begin();
81 it != m_tPhysicsModels.end(); ++it) {
82 it->second->UpdateEntityStatus();
83 }
84 }
85
86 /****************************************/
87 /****************************************/
88
90 return m_tPhysicsModels.size();
91 }
92
93 /****************************************/
94 /****************************************/
95
102
103 /****************************************/
104 /****************************************/
105
112
113 /****************************************/
114 /****************************************/
115
117 return true;
118 }
119
120 /****************************************/
121 /****************************************/
122
124 return false;
125 }
126
127 /****************************************/
128 /****************************************/
129
132
133 /****************************************/
134 /****************************************/
135
137 const CRay3& c_ray) const {
138 Real fTOnRay;
139 for(auto it = m_tPhysicsModels.begin();
140 it != m_tPhysicsModels.end();
141 ++it) {
142 if(it->second->CheckIntersectionWithRay(fTOnRay, c_ray)) {
143 t_data.push_back(
145 &it->second->GetEmbodiedEntity(),
146 fTOnRay));
147 }
148 }
149 }
150
151 /****************************************/
152 /****************************************/
153
154 void CPointMass3DEngine::AddPhysicsModel(const std::string& str_id,
155 CPointMass3DModel& c_model) {
156 m_tPhysicsModels[str_id] = &c_model;
157 }
158
159 /****************************************/
160 /****************************************/
161
162 void CPointMass3DEngine::RemovePhysicsModel(const std::string& str_id) {
163 auto it = m_tPhysicsModels.find(str_id);
164 if(it != m_tPhysicsModels.end()) {
165 delete it->second;
166 m_tPhysicsModels.erase(it);
167 }
168 else {
169 THROW_ARGOSEXCEPTION("PointMass3D model id \"" << str_id << "\" not found in point-mass 3D engine \"" << GetId() << "\"");
170 }
171 }
172
173 /****************************************/
174 /****************************************/
175
177 "pointmass3d",
178 "Carlo Pinciroli [ilpincy@gmail.com]",
179 "1.0",
180 "A 3D point-mass physics engine.",
181
182 "This physics engine is a 3D point-mass engine.\n\n"
183
184 "REQUIRED XML CONFIGURATION\n\n"
185 " <physics_engines>\n"
186 " ...\n"
187 " <pointmass3d id=\"pm3d\" />\n"
188 " ...\n"
189 " </physics_engines>\n\n"
190
191 "The 'id' attribute is necessary and must be unique among the physics engines.\n"
192 "If two engines share the same id, initialization aborts.\n\n"
193
194 "OPTIONAL XML CONFIGURATION\n\n"
195
196 "By default, there will -9.81 m/s gravity in the simulation. This can be\n"
197 "changed by specifying the 'gravity' attribute:\n\n"
198
199 " <physics_engines>\n"
200 " ...\n"
201 " <pointmass3d id=\"pm3d\" gravity=\"-9.81\"/>\n"
202 " ...\n"
203 " </physics_engines>\n\n"
204
205 "Multiple physics engines can also be used. If multiple physics engines are used,\n"
206 "the disjoint union of the 3D volumes within the arena assigned to each engine must cover\n"
207 "the entire arena without overlapping. If the entire arena is not covered, robots can\n"
208 "\"escape\" the configured physics engines and cause a fatal exception (this is not an\n"
209 "issue when a single physics engine is used, because the engine covers the entire arena\n"
210 "by default). To use multiple physics engines, use the following syntax (all attributes\n"
211 "are mandatory):\n\n"
212
213 " <physics_engines>\n"
214 " ...\n"
215 " <pointmass3d id=\"pm0\">\n"
216 " <boundaries>\n"
217 " <top height=\"1.0\"/>\n"
218 " <botton height=\"0.0\"/>\n"
219 " <sides>\n"
220 " <vertex point=\"0.0, 0.0\"/>\n"
221 " <vertex point=\"4.0, 0.0\"/>\n"
222 " <vertex point=\"4.0, 4.0\"/>\n"
223 " <vertex point=\"0.0, 4.0\"/>\n"
224 " </sides>\n"
225 " </boundaries>\n"
226 " </pointmass3d>\n"
227 " <pointmass3d id=\"pm1\">\n"
228 " ...\n"
229 " </pointmass3d>\n"
230 " ...\n"
231 " </physics_engines>\n\n"
232
233 "A physics engine can be defined having any number of sides >= 3, as long as the\n"
234 "sides from a closed polygon in the 2D plane (vertices must be declared in the\n"
235 "XML file in counter-clockwise order). In the above example, the physics engine\n"
236 "'pm0' is assigned to the area within the arena with lower left coordinates (0,0)\n"
237 "and upper right coordinates (4,4) and vertices are specified in counter\n"
238 "clockwise order: LL, LR, UR, UL.\n\n"
239
240 "OPTIMIZATION HINTS\n\n"
241
242 "1. A single physics engine is generally sufficient for small swarms (say <= 50\n"
243 " robots) within a reasonably small arena to obtain faster than real-time\n"
244 " performance with optimized code. For larger swarms and/or large arenas multiple\n"
245 " engines should be used for maximum performance.\n\n"
246
247 "2. In general, using the same number of ARGoS threads as physics engines gives\n"
248 " maximum performance (1-thread per engine per CPU core).\n\n"
249
250 "3. Using multiple engines in simulations with any of the following characteristics\n"
251 " generally incurs more overhead due to thread context switching than the\n"
252 " performance benefits from multiple engines:\n\n"
253
254 " - Small swarms\n"
255 " - Small arenas\n"
256 " - Less available ARGoS threads than assigned physics engines\n"
257 " - Less available CPU cores than assigned ARGoS threads\n\n"
258
259
260 "4. A good starting strategy for physics engine boundary assignment is to assign\n"
261 " each physics engine the same amount of area within the arena. This will be\n"
262 " sufficient for most cases. Depending on the nature of the simulation, using\n"
263 " non-homogeneous physics engine sizes may yield increased performance. An example\n"
264 " would be a narrow hallway between larger open areas in the arena--the hallway\n"
265 " will likely experience increased robot density and assigning more physics\n"
266 " engines to that area than the relatively unpopulated open areas may increase\n"
267 " performance.\n\n",
268
269 "Usable"
270 );
271
272}
float Real
Collects all ARGoS code.
Definition datatypes.h:39
#define THROW_ARGOSEXCEPTION(message)
This macro throws an ARGoS exception with the passed message.
#define REGISTER_PHYSICS_ENGINE(CLASSNAME, LABEL, AUTHOR, VERSION, BRIEF_DESCRIPTION, LONG_DESCRIPTION, STATUS)
The namespace containing all the ARGoS related code.
Definition ci_actuator.h:12
RETURN_VALUE CallEntityOperation(PLUGIN &t_plugin, CEntity &c_entity)
Calls the operation corresponding to the given context and operand Skips the function call if the ope...
Definition entity.h:418
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.
ticpp::Element TConfigurationNode
The ARGoS configuration XML node.
std::vector< SEmbodiedEntityIntersectionItem > TEmbodiedEntityIntersectionData
The basic entity type.
Definition entity.h:90
Type to use as return value for operation outcome.
Definition entity.h:352
virtual void Init(TConfigurationNode &t_tree)
Initializes the resource.
const std::string & GetId() const
Returns the id of this physics engine.
UInt32 GetIterations() const
Returns the number of iterations per simulation clock tick.
A 3D vector class.
Definition vector3.h:31
virtual void CheckIntersectionWithRay(TEmbodiedEntityIntersectionData &t_data, const CRay3 &c_ray) const
Check which objects in this engine intersect the given ray.
virtual bool AddEntity(CEntity &c_entity)
Adds an entity to the physics engine.
virtual bool RemoveEntity(CEntity &c_entity)
Removes an entity from the physics engine.
virtual void Destroy()
Undoes whatever was done by Init().
virtual bool IsPointContained(const CVector3 &c_point)
Returns true if the given point is contained in this physics engine.
virtual bool IsEntityTransferNeeded() const
void AddPhysicsModel(const std::string &str_id, CPointMass3DModel &c_model)
virtual void TransferEntities()
Executes the transfer of entities to other engines.
virtual void Reset()
Resets the resource.
virtual void Init(TConfigurationNode &t_tree)
Initializes the resource.
void RemovePhysicsModel(const std::string &str_id)