ARGoS  3
A parallel, multi-engine simulator for swarm robotics
dynamics2d_engine.h
Go to the documentation of this file.
1 
7 #ifndef DYNAMICS2D_ENGINE_H
8 #define DYNAMICS2D_ENGINE_H
9 
10 namespace argos {
11  class CDynamics2DEngine;
12  class CDynamics2DModel;
13  class CGripperEquippedEntity;
14  class CEmbodiedEntity;
15 }
16 
17 #include <argos3/core/simulator/entity/controllable_entity.h>
18 #include <argos3/core/simulator/physics_engine/physics_engine.h>
19 #include <argos3/plugins/simulator/physics_engines/dynamics2d/chipmunk-physics/include/chipmunk.h>
20 
21 namespace argos {
22 
23  /****************************************/
24  /****************************************/
25 
29  cpVect GripperAnchor;
30  cpConstraint* GripConstraint;
31 
33  CGripperEquippedEntity& c_entity,
34  cpVect t_anchor);
36  void ClearConstraints();
37  };
38 
39  /****************************************/
40  /****************************************/
41 
43 
44  public:
45 
46  enum EShapeType {
50  };
51 
52  enum ELayerType {
54  LAYER_NORMAL = CP_ALL_LAYERS
55  };
56 
58 
59  virtual ~CDynamics2DEngine() {}
60 
61  virtual void Init(TConfigurationNode& t_tree);
62  virtual void Reset();
63  virtual void Update();
64  virtual void Destroy();
65 
66  virtual size_t GetNumPhysicsModels();
67  virtual bool AddEntity(CEntity& c_entity);
68  virtual bool RemoveEntity(CEntity& c_entity);
69 
71  const CRay3& c_ray) const;
72 
73  inline cpSpace* GetPhysicsSpace() {
74  return m_ptSpace;
75  }
76 
77  inline const cpSpace* GetPhysicsSpace() const {
78  return m_ptSpace;
79  }
80 
81  inline cpBody* GetGroundBody() {
82  return m_ptGroundBody;
83  }
84 
85  inline Real GetElevation() const {
86  return m_fElevation;
87  }
88 
89  inline Real GetDamping() const {
90  return cpSpaceGetDamping(m_ptSpace);
91  }
92 
93  inline void SetDamping(Real f_damping) {
94  cpSpaceSetDamping(m_ptSpace, f_damping);
95  }
96 
97  inline CVector2 GetGravity() const {
98  return CVector2(m_ptSpace->gravity.x, m_ptSpace->gravity.y);
99  }
100 
101  inline void SetGravity(const CVector2& c_gravity) {
102  m_ptSpace->gravity = cpv(c_gravity.GetX(), c_gravity.GetY());
103  }
104 
105  void PositionPhysicsToSpace(CVector3& c_new_pos,
106  const CVector3& c_original_pos,
107  const cpBody* pt_body);
108 
109  void OrientationPhysicsToSpace(CQuaternion& c_new_orient,
110  cpBody* pt_body);
111 
112  void AddPhysicsModel(const std::string& str_id,
113  CDynamics2DModel& c_model);
114  void RemovePhysicsModel(const std::string& str_id);
115 
116  private:
117 
118  cpFloat m_fStaticHashCellSize;
119  cpFloat m_fActiveHashCellSize;
120  SInt32 m_nStaticHashCells;
121  SInt32 m_nActiveHashCells;
122  cpSpace* m_ptSpace;
123  cpBody* m_ptGroundBody;
124  Real m_fElevation;
125 
126  CControllableEntity::TMap m_tControllableEntities;
127  std::map<std::string, CDynamics2DModel*> m_tPhysicsModels;
128 
129  };
130 
131  /****************************************/
132  /****************************************/
133 
134  template <typename ACTION>
135  class CDynamics2DOperation : public CEntityOperation<ACTION, CDynamics2DEngine, SOperationOutcome> {
136  public:
138  };
139 
140  class CDynamics2DOperationAddEntity : public CDynamics2DOperation<CDynamics2DOperationAddEntity> {
141  public:
143  };
144 
145  class CDynamics2DOperationRemoveEntity : public CDynamics2DOperation<CDynamics2DOperationRemoveEntity> {
146  public:
148  };
149 
150 #define REGISTER_DYNAMICS2D_OPERATION(ACTION, OPERATION, ENTITY) \
151  REGISTER_ENTITY_OPERATION(ACTION, CDynamics2DEngine, OPERATION, SOperationOutcome, ENTITY);
152 
153 #define REGISTER_STANDARD_DYNAMICS2D_OPERATION_ADD_ENTITY(SPACE_ENTITY, DYN2D_MODEL) \
154  class CDynamics2DOperationAdd ## SPACE_ENTITY : public CDynamics2DOperationAddEntity { \
155  public: \
156  CDynamics2DOperationAdd ## SPACE_ENTITY() {} \
157  virtual ~CDynamics2DOperationAdd ## SPACE_ENTITY() {} \
158  SOperationOutcome ApplyTo(CDynamics2DEngine& c_engine, \
159  SPACE_ENTITY& c_entity) { \
160  DYN2D_MODEL* pcPhysModel = new DYN2D_MODEL(c_engine, \
161  c_entity); \
162  c_engine.AddPhysicsModel(c_entity.GetId(), \
163  *pcPhysModel); \
164  c_entity. \
165  GetComponent<CEmbodiedEntity>("body"). \
166  AddPhysicsModel(c_engine.GetId(), *pcPhysModel); \
167  return SOperationOutcome(true); \
168  } \
169  }; \
170  REGISTER_DYNAMICS2D_OPERATION(CDynamics2DOperationAddEntity, \
171  CDynamics2DOperationAdd ## SPACE_ENTITY, \
172  SPACE_ENTITY);
173 
174 #define REGISTER_STANDARD_DYNAMICS2D_OPERATION_REMOVE_ENTITY(SPACE_ENTITY) \
175  class CDynamics2DOperationRemove ## SPACE_ENTITY : public CDynamics2DOperationRemoveEntity { \
176  public: \
177  CDynamics2DOperationRemove ## SPACE_ENTITY() {} \
178  virtual ~CDynamics2DOperationRemove ## SPACE_ENTITY() {} \
179  SOperationOutcome ApplyTo(CDynamics2DEngine& c_engine, \
180  SPACE_ENTITY& c_entity) { \
181  c_engine.RemovePhysicsModel(c_entity.GetId()); \
182  c_entity. \
183  GetComponent<CEmbodiedEntity>("body"). \
184  RemovePhysicsModel(c_engine.GetId()); \
185  return SOperationOutcome(true); \
186  } \
187  }; \
188  REGISTER_DYNAMICS2D_OPERATION(CDynamics2DOperationRemoveEntity, \
189  CDynamics2DOperationRemove ## SPACE_ENTITY, \
190  SPACE_ENTITY);
191 
192 #define REGISTER_STANDARD_DYNAMICS2D_OPERATIONS_ON_ENTITY(SPACE_ENTITY, DYN2D_ENTITY) \
193  REGISTER_STANDARD_DYNAMICS2D_OPERATION_ADD_ENTITY(SPACE_ENTITY, DYN2D_ENTITY) \
194  REGISTER_STANDARD_DYNAMICS2D_OPERATION_REMOVE_ENTITY(SPACE_ENTITY)
195 
196  /****************************************/
197  /****************************************/
198 
199 }
200 
201 #endif
argos::SDynamics2DEngineGripperData::Engine
CDynamics2DEngine & Engine
Definition: dynamics2d_engine.h:27
argos::SDynamics2DEngineGripperData::SDynamics2DEngineGripperData
SDynamics2DEngineGripperData(CDynamics2DEngine &c_engine, CGripperEquippedEntity &c_entity, cpVect t_anchor)
argos::CEntityOperation
The basic operation to be stored in the vtable.
Definition: entity.h:278
argos::CDynamics2DEngine::SHAPE_GRIPPER
@ SHAPE_GRIPPER
Definition: dynamics2d_engine.h:49
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::CDynamics2DEngine::Init
virtual void Init(TConfigurationNode &t_tree)
Initializes the resource.
Definition: dynamics2d_engine.cpp:34
argos::CDynamics2DOperationAddEntity
Definition: dynamics2d_engine.h:140
argos::SDynamics2DEngineGripperData::~SDynamics2DEngineGripperData
~SDynamics2DEngineGripperData()
argos::CDynamics2DEngine::GetElevation
Real GetElevation() const
Definition: dynamics2d_engine.h:85
argos::CRay3
Definition: ray3.h:19
argos::CDynamics2DEngine::GetNumPhysicsModels
virtual size_t GetNumPhysicsModels()
Definition: dynamics2d_engine.cpp:131
argos::CDynamics2DEngine::EShapeType
EShapeType
Definition: dynamics2d_engine.h:46
argos::CDynamics2DEngine::Update
virtual void Update()
Definition: dynamics2d_engine.cpp:96
argos::CDynamics2DEngine::SHAPE_NORMAL
@ SHAPE_NORMAL
Definition: dynamics2d_engine.h:47
argos::CDynamics2DEngine
Definition: dynamics2d_engine.h:42
argos::TConfigurationNode
ticpp::Element TConfigurationNode
The ARGoS configuration XML node.
Definition: argos_configuration.h:27
argos::CVector2::GetY
Real GetY() const
Returns the y coordinate of this vector.
Definition: vector2.h:94
argos::CGripperEquippedEntity
An entity that stores the state of a robot gripper.
Definition: gripper_equipped_entity.h:37
argos::CDynamics2DEngine::AddPhysicsModel
void AddPhysicsModel(const std::string &str_id, CDynamics2DModel &c_model)
Definition: dynamics2d_engine.cpp:222
argos::SDynamics2DEngineGripperData
Definition: dynamics2d_engine.h:26
argos::SDynamics2DEngineGripperData::GripperAnchor
cpVect GripperAnchor
Definition: dynamics2d_engine.h:29
argos::CDynamics2DOperationAddEntity::~CDynamics2DOperationAddEntity
virtual ~CDynamics2DOperationAddEntity()
Definition: dynamics2d_engine.h:142
argos::CDynamics2DEngine::SetGravity
void SetGravity(const CVector2 &c_gravity)
Definition: dynamics2d_engine.h:101
argos::CDynamics2DEngine::OrientationPhysicsToSpace
void OrientationPhysicsToSpace(CQuaternion &c_new_orient, cpBody *pt_body)
Definition: dynamics2d_engine.cpp:214
argos::CQuaternion
Definition: quaternion.h:14
argos::CDynamics2DEngine::CDynamics2DEngine
CDynamics2DEngine()
Definition: dynamics2d_engine.cpp:21
argos::CDynamics2DEngine::LAYER_NORMAL
@ LAYER_NORMAL
Definition: dynamics2d_engine.h:54
argos::CDynamics2DEngine::AddEntity
virtual bool AddEntity(CEntity &c_entity)
Adds an entity to the physics engine.
Definition: dynamics2d_engine.cpp:138
argos::CDynamics2DEngine::GetPhysicsSpace
cpSpace * GetPhysicsSpace()
Definition: dynamics2d_engine.h:73
argos::CVector2::GetX
Real GetX() const
Returns the x coordinate of this vector.
Definition: vector2.h:78
argos::CDynamics2DEngine::RemovePhysicsModel
void RemovePhysicsModel(const std::string &str_id)
Definition: dynamics2d_engine.cpp:230
SInt32
signed int SInt32
32-bit signed integer.
Definition: datatypes.h:93
argos::CVector2
A 2D vector class.
Definition: vector2.h:25
argos::CDynamics2DEngine::GetDamping
Real GetDamping() const
Definition: dynamics2d_engine.h:89
argos::CPhysicsEngine
Definition: physics_engine.h:90
argos::CEntity
The basic entity type.
Definition: entity.h:89
argos::CDynamics2DModel
The base class for models in the dynamics 2D engine.
Definition: dynamics2d_model.h:27
argos::CDynamics2DEngine::CheckIntersectionWithRay
virtual void CheckIntersectionWithRay(TEmbodiedEntityIntersectionData &t_data, const CRay3 &c_ray) const
Check which objects in this engine intersect the given ray.
Definition: dynamics2d_engine.cpp:186
argos::CDynamics2DEngine::PositionPhysicsToSpace
void PositionPhysicsToSpace(CVector3 &c_new_pos, const CVector3 &c_original_pos, const cpBody *pt_body)
Definition: dynamics2d_engine.cpp:203
argos::CDynamics2DOperationRemoveEntity::~CDynamics2DOperationRemoveEntity
virtual ~CDynamics2DOperationRemoveEntity()
Definition: dynamics2d_engine.h:147
argos::SDynamics2DEngineGripperData::GripperEntity
CGripperEquippedEntity & GripperEntity
Definition: dynamics2d_engine.h:28
argos::CDynamics2DEngine::~CDynamics2DEngine
virtual ~CDynamics2DEngine()
Definition: dynamics2d_engine.h:59
argos::CDynamics2DEngine::Destroy
virtual void Destroy()
Undoes whatever was done by Init().
Definition: dynamics2d_engine.cpp:116
argos::CDynamics2DOperation::~CDynamics2DOperation
virtual ~CDynamics2DOperation()
Definition: dynamics2d_engine.h:137
argos::CDynamics2DEngine::SetDamping
void SetDamping(Real f_damping)
Definition: dynamics2d_engine.h:93
argos::CDynamics2DOperation
Definition: dynamics2d_engine.h:135
argos::CDynamics2DEngine::ELayerType
ELayerType
Definition: dynamics2d_engine.h:52
argos::CDynamics2DEngine::GetPhysicsSpace
const cpSpace * GetPhysicsSpace() const
Definition: dynamics2d_engine.h:77
argos::CDynamics2DEngine::GetGroundBody
cpBody * GetGroundBody()
Definition: dynamics2d_engine.h:81
argos::CDynamics2DEngine::LAYER_FROZEN
@ LAYER_FROZEN
Definition: dynamics2d_engine.h:53
argos::SDynamics2DEngineGripperData::ClearConstraints
void ClearConstraints()
argos::TEmbodiedEntityIntersectionData
std::vector< SEmbodiedEntityIntersectionItem > TEmbodiedEntityIntersectionData
Definition: physics_engine.h:54
argos::SDynamics2DEngineGripperData::GripConstraint
cpConstraint * GripConstraint
Definition: dynamics2d_engine.h:30
argos::CDynamics2DOperationRemoveEntity
Definition: dynamics2d_engine.h:145
argos::CDynamics2DEngine::Reset
virtual void Reset()
Resets the resource.
Definition: dynamics2d_engine.cpp:85
Real
float Real
Collects all ARGoS code.
Definition: datatypes.h:39
argos::CDynamics2DEngine::SHAPE_GRIPPABLE
@ SHAPE_GRIPPABLE
Definition: dynamics2d_engine.h:48
argos::CControllableEntity::TMap
std::map< std::string, CControllableEntity * > TMap
A map of controllable entities, indexed by id.
Definition: controllable_entity.h:36
argos::CDynamics2DEngine::RemoveEntity
virtual bool RemoveEntity(CEntity &c_entity)
Removes an entity from the physics engine.
Definition: dynamics2d_engine.cpp:149
argos::CDynamics2DEngine::GetGravity
CVector2 GetGravity() const
Definition: dynamics2d_engine.h:97