ODEPhysics.hh
Go to the documentation of this file.
1/*
2 * Copyright (C) 2012 Open Source Robotics Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16*/
17#ifndef _ODEPHYSICS_HH_
18#define _ODEPHYSICS_HH_
19
20#include <tbb/spin_mutex.h>
21#include <tbb/concurrent_vector.h>
22#include <string>
23#include <utility>
24
25#include <boost/thread/thread.hpp>
26
32#include "gazebo/gazebo_config.h"
33#include "gazebo/util/system.hh"
34
35namespace gazebo
36{
37 namespace physics
38 {
39 class ODEJointFeedback;
40 class ODEPhysicsPrivate;
41
46
48 class GZ_PHYSICS_VISIBLE ODEPhysics : public PhysicsEngine
49 {
94
97 public: explicit ODEPhysics(WorldPtr _world);
98
100 public: virtual ~ODEPhysics();
101
102 // Documentation inherited
103 public: virtual void Load(sdf::ElementPtr _sdf);
104
105 // Documentation inherited
106 public: virtual void Init();
107
108 // Documentation inherited
109 public: virtual void Reset();
110
111 // Documentation inherited
112 public: virtual void InitForThread();
113
114 // Documentation inherited
115 public: virtual void UpdateCollision();
116
117 // Documentation inherited
118 public: virtual void UpdatePhysics();
119
120 // Documentation inherited
121 public: virtual void Fini();
122
123 // Documentation inherited
124 public: virtual std::string GetType() const
125 { return "ode"; }
126
127 // Documentation inherited
128 public: virtual LinkPtr CreateLink(ModelPtr _parent);
129
130 // Documentation inherited
132 const std::string &_shapeType, LinkPtr _parent);
133
134 // Documentation inherited
135 public: virtual ShapePtr CreateShape(const std::string &_shapeType,
136 CollisionPtr _collision);
137
138 // Documentation inherited
139 public: virtual JointPtr CreateJoint(const std::string &_type,
140 ModelPtr _parent);
141
142 // Documentation inherited
143 public: virtual void SetGravity(const ignition::math::Vector3d &_gravity);
144
145 // Documentation inherited
146 public: virtual void SetWorldCFM(double cfm);
147
148 // Documentation inherited
149 public: virtual void SetWorldERP(double erp);
150
151 // Documentation inherited
152 public: virtual void SetSORPGSPreconIters(unsigned int iters);
153
154 // Documentation inherited
155 public: virtual void SetSORPGSIters(unsigned int iters);
156
157 // Documentation inherited
158 public: virtual void SetSORPGSW(double w);
159
160 // Documentation inherited
161 public: virtual void SetContactMaxCorrectingVel(double vel);
162
163 // Documentation inherited
164 public: virtual void SetContactSurfaceLayer(double layer_depth);
165
168 public: virtual void SetFrictionModel(const std::string &_fricModel);
169
172 public: virtual void
173 SetWorldStepSolverType(const std::string &_worldSolverType);
174
175 // Documentation inherited
176 public: virtual void SetMaxContacts(unsigned int max_contacts);
177
178 // Documentation inherited
179 public: virtual double GetWorldCFM();
180
181 // Documentation inherited
182 public: virtual double GetWorldERP();
183
184 // Documentation inherited
185 public: virtual int GetSORPGSPreconIters();
186
187 // Documentation inherited
188 public: virtual int GetSORPGSIters();
189
190 // Documentation inherited
191 public: virtual double GetSORPGSW();
192
193 // Documentation inherited
194 public: virtual double GetContactMaxCorrectingVel();
195
198 public: virtual std::string GetFrictionModel() const;
199
202 public: virtual std::string GetWorldStepSolverType() const;
203
204 // Documentation inherited
205 public: virtual double GetContactSurfaceLayer();
206
207 // Documentation inherited
208 public: virtual unsigned int GetMaxContacts();
209
210 // Documentation inherited
211 public: virtual void DebugPrint() const;
212
213 // Documentation inherited
214 public: virtual void SetSeed(uint32_t _seed);
215
217 public: virtual bool SetParam(const std::string &_key,
218 const boost::any &_value);
219
221 public: virtual boost::any GetParam(const std::string &_key) const;
222
224 public: virtual bool GetParam(const std::string &_key,
225 boost::any &_value) const;
226
229 public: dSpaceID GetSpaceId() const;
230
233 public: dWorldID GetWorldId();
234
238 public: static void ConvertMass(InertialPtr _interial, void *_odeMass);
239
244 public: static void ConvertMass(void *_odeMass, InertialPtr _inertial);
245
250 public: static Friction_Model
251 ConvertFrictionModel(const std::string &_fricModel);
252
257 public: static std::string
258 ConvertFrictionModel(const Friction_Model _fricModel);
259
264 public: static std::string
265 ConvertWorldStepSolverType(const World_Solver_Type _solverType);
266
271 public: static World_Solver_Type
272 ConvertWorldStepSolverType(const std::string &_solverType);
273
276 public: virtual std::string GetStepType() const;
277
280 public: virtual void SetStepType(const std::string &_type);
281
282
287 public: void Collide(ODECollision *_collision1, ODECollision *_collision2,
288 dContactGeom *_contactCollisions);
289
292 public: void ProcessJointFeedback(ODEJointFeedback *_feedback);
293
294 protected: virtual void OnRequest(ConstRequestPtr &_msg);
295
296 protected: virtual void OnPhysicsMsg(ConstPhysicsPtr &_msg);
297
302 private: static void CollisionCallback(void *_data, dGeomID _o1,
303 dGeomID _o2);
304
305
309 private: void AddTrimeshCollider(ODECollision *_collision1,
310 ODECollision *_collision2);
311
315 private: void AddCollider(ODECollision *_collision1,
316 ODECollision *_collision2);
317
320 private: ODEPhysicsPrivate *dataPtr;
321 };
323 }
324}
325#endif
ODE wrapper forward declarations and typedefs.
Base class for all ODE collisions.
Definition ODECollision.hh:41
ODE physics engine.
Definition ODEPhysics.hh:49
void ProcessJointFeedback(ODEJointFeedback *_feedback)
process joint feedbacks.
virtual bool GetParam(const std::string &_key, boost::any &_value) const
Documentation inherited.
virtual LinkPtr CreateLink(ModelPtr _parent)
Create a new body.
static World_Solver_Type ConvertWorldStepSolverType(const std::string &_solverType)
Convert a string to a World_Solver_Type enum.
virtual double GetSORPGSW()
virtual void SetWorldCFM(double cfm)
virtual void SetContactMaxCorrectingVel(double vel)
ODEParam
ODE Physics parameter types.
Definition ODEPhysics.hh:53
@ GLOBAL_CFM
Constraint force mixing.
Definition ODEPhysics.hh:58
@ INERTIA_RATIO_REDUCTION
Limit ratios of inertias of adjacent links (note that the corresponding SDF tag is "use_dynamic_moi_r...
Definition ODEPhysics.hh:86
@ GLOBAL_ERP
Error reduction parameter.
Definition ODEPhysics.hh:61
@ CONTACT_SURFACE_LAYER
Surface layer depth.
Definition ODEPhysics.hh:76
@ CONTACT_MAX_CORRECTING_VEL
Max correcting velocity.
Definition ODEPhysics.hh:73
@ PGS_ITERS
Number of iterations.
Definition ODEPhysics.hh:67
@ SOLVER_TYPE
Solve type.
Definition ODEPhysics.hh:55
@ MIN_STEP_SIZE
Minimum step size.
Definition ODEPhysics.hh:82
@ FRICTION_MODEL
friction model
Definition ODEPhysics.hh:89
@ WORLD_SOLVER_TYPE
LCP Solver.
Definition ODEPhysics.hh:92
@ MAX_CONTACTS
Maximum number of contacts.
Definition ODEPhysics.hh:79
@ SOR
SOR over-relaxation parameter.
Definition ODEPhysics.hh:70
@ SOR_PRECON_ITERS
Number of iterations.
Definition ODEPhysics.hh:64
static void ConvertMass(void *_odeMass, InertialPtr _inertial)
Convert an Inertial to ODE mass.
virtual void Fini()
Finilize the physics engine.
void Collide(ODECollision *_collision1, ODECollision *_collision2, dContactGeom *_contactCollisions)
Collide two collision objects.
dWorldID GetWorldId()
Get the world id.
virtual void Init()
Initialize the physics engine.
ODEPhysics(WorldPtr _world)
Constructor.
virtual void Reset()
Rest the physics engine.
virtual ~ODEPhysics()
Destructor.
virtual void UpdateCollision()
Update the physics engine collision.
static std::string ConvertWorldStepSolverType(const World_Solver_Type _solverType)
Convert a World_Solver_Type enum to a string.
virtual void UpdatePhysics()
Update the physics engine.
virtual void OnRequest(ConstRequestPtr &_msg)
virtual callback for gztopic "~/request".
virtual void SetWorldERP(double erp)
virtual void SetMaxContacts(unsigned int max_contacts)
\TODO: Remove this function, and replace it with a more generic property map
virtual std::string GetWorldStepSolverType() const
Get solver type for world step.
virtual double GetWorldERP()
virtual void SetWorldStepSolverType(const std::string &_worldSolverType)
Set world step solver type.
virtual void SetSORPGSW(double w)
virtual ShapePtr CreateShape(const std::string &_shapeType, CollisionPtr _collision)
Create a physics::Shape object.
virtual void InitForThread()
Init the engine for threads.
virtual void SetSORPGSPreconIters(unsigned int iters)
static Friction_Model ConvertFrictionModel(const std::string &_fricModel)
Convert a string to a Friction_Model enum.
virtual std::string GetType() const
Return the physics engine type (ode|bullet|dart|simbody).
Definition ODEPhysics.hh:124
virtual void SetSORPGSIters(unsigned int iters)
virtual void OnPhysicsMsg(ConstPhysicsPtr &_msg)
virtual callback for gztopic "~/physics".
virtual void SetStepType(const std::string &_type)
Set the step type (quick, world).
virtual boost::any GetParam(const std::string &_key) const
Documentation inherited.
virtual void SetGravity(const ignition::math::Vector3d &_gravity)
Set the gravity vector.
static std::string ConvertFrictionModel(const Friction_Model _fricModel)
Convert a Friction_Model enum to a string.
virtual void DebugPrint() const
Debug print out of the physic engine state.
virtual void Load(sdf::ElementPtr _sdf)
Load the physics engine.
virtual double GetWorldCFM()
virtual bool SetParam(const std::string &_key, const boost::any &_value)
Documentation inherited.
virtual void SetSeed(uint32_t _seed)
Set the random number seed for the physics engine.
virtual void SetContactSurfaceLayer(double layer_depth)
virtual CollisionPtr CreateCollision(const std::string &_shapeType, LinkPtr _parent)
Create a collision.
virtual unsigned int GetMaxContacts()
virtual void SetFrictionModel(const std::string &_fricModel)
Set friction model type.
dSpaceID GetSpaceId() const
Return the world space id.
virtual double GetContactSurfaceLayer()
virtual JointPtr CreateJoint(const std::string &_type, ModelPtr _parent)
Create a new joint.
virtual double GetContactMaxCorrectingVel()
virtual std::string GetStepType() const
Get the step type (quick, world).
virtual int GetSORPGSPreconIters()
virtual std::string GetFrictionModel() const
Get friction model.
static void ConvertMass(InertialPtr _interial, void *_odeMass)
Convert an ODE mass to Inertial.
Base class for a physics engine.
Definition PhysicsEngine.hh:43
boost::shared_ptr< Link > LinkPtr
Definition PhysicsTypes.hh:110
boost::shared_ptr< Inertial > InertialPtr
Definition PhysicsTypes.hh:158
boost::shared_ptr< Collision > CollisionPtr
Definition PhysicsTypes.hh:114
boost::shared_ptr< Shape > ShapePtr
Definition PhysicsTypes.hh:142
boost::shared_ptr< World > WorldPtr
Definition PhysicsTypes.hh:90
boost::shared_ptr< Model > ModelPtr
Definition PhysicsTypes.hh:94
boost::shared_ptr< Joint > JointPtr
Definition PhysicsTypes.hh:118
Forward declarations for the common classes.
Definition Animation.hh:27