ODEPhysics.hh
00001 /* 00002 * Copyright 2011 Nate Koenig & Andrew Howard 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 * 00016 */ 00017 /* Desc: The ODE physics engine wrapper 00018 * Author: Nate Koenig 00019 * Date: 11 June 2007 00020 */ 00021 00022 #ifndef ODEPHYSICS_HH 00023 #define ODEPHYSICS_HH 00024 00025 #include "physics/ode/ode_inc.h" 00026 00027 #include <tbb/spin_mutex.h> 00028 #include <tbb/concurrent_vector.h> 00029 00030 #include <boost/thread/thread.hpp> 00031 00032 #include "physics/ode/ODETypes.hh" 00033 00034 #include "physics/PhysicsEngine.hh" 00035 #include "physics/Contact.hh" 00036 #include "physics/Shape.hh" 00037 #include "gazebo_config.h" 00038 00039 namespace gazebo 00040 { 00041 namespace physics 00042 { 00043 class ContactFeedback 00044 { 00045 public: Contact contact; 00046 public: dJointFeedback feedbacks[MAX_CONTACT_JOINTS]; 00047 public: int feedbackCount; 00048 }; 00049 00052 00055 00056 00058 class ODEPhysics : public PhysicsEngine 00059 { 00061 public: ODEPhysics(WorldPtr world); 00062 00064 public: virtual ~ODEPhysics(); 00065 00067 public: virtual void Load( sdf::ElementPtr _sdf ); 00068 00070 public: virtual void Init(); 00071 00072 public: void Reset(); 00073 00075 public: virtual void InitForThread(); 00076 00078 public: virtual void UpdateCollision(); 00079 00081 public: virtual void UpdatePhysics(); 00082 00084 public: virtual void Fini(); 00085 00087 public: void SetUpdateRate(double _value); 00088 00090 public: virtual double GetUpdateRate(); 00091 public: virtual double GetUpdatePeriod(); 00092 00094 public: void SetStepTime(double _value); 00095 00097 public: virtual double GetStepTime(); 00098 00100 public: virtual LinkPtr CreateLink(ModelPtr _parent); 00101 00103 public: virtual CollisionPtr CreateCollision( 00104 const std::string &_shapeType, LinkPtr _parent); 00105 00106 public: virtual ShapePtr CreateShape( 00107 const std::string &_shapeType, 00108 CollisionPtr _collision); 00109 00111 public: virtual JointPtr CreateJoint(const std::string &type); 00112 00114 public: dSpaceID GetSpaceId() const; 00115 00117 public: dWorldID GetWorldId(); 00118 00120 public: static void ConvertMass(InertialPtr &_interial, void *odeMass); 00121 00123 public: static void ConvertMass(void *odeMass, const InertialPtr &_inertial); 00124 00126 public: virtual std::string GetStepType() const; 00127 00129 public: virtual void SetStepType(const std::string type); 00130 00132 public: virtual void SetGravity(const gazebo::math::Vector3 &gravity); 00133 00135 public: math::Vector3 GetGravity() const; 00136 00138 public: void SetWorldCFM(double cfm); 00140 public: void SetWorldERP(double erp); 00142 public: void SetSORPGSIters(unsigned int iters); 00144 public: void SetSORPGSW(double w); 00146 public: void SetContactMaxCorrectingVel(double vel); 00148 public: void SetContactSurfaceLayer(double layer_depth); 00150 public: void SetMaxContacts(unsigned int max_contacts); 00151 00153 public: double GetWorldCFM(); 00155 public: double GetWorldERP(); 00157 public: int GetSORPGSIters(); 00159 public: double GetSORPGSW(); 00161 public: double GetContactMaxCorrectingVel(); 00163 public: double GetContactSurfaceLayer(); 00165 public: int GetMaxContacts(); 00166 00167 public: void CreateContact(ODECollision *collision1, ODECollision *collision2); 00168 00170 private: static void CollisionCallback( void *data, dGeomID o1, dGeomID o2); 00171 00173 public: void Collide(ODECollision *collision1, ODECollision *collision2, 00174 dContactGeom *contactCollisions); 00175 00176 public: void ProcessContactFeedback(ContactFeedback* feedback); 00177 00178 protected: virtual void OnRequest( 00179 ConstRequestPtr &/*_msg*/ ); 00180 00181 protected: virtual void OnPhysicsMsg( 00182 ConstPhysicsPtr &/*_msg*/ ); 00183 00184 private: void AddTrimeshCollider( ODECollision *_collision1, 00185 ODECollision *_collision2 ); 00186 00187 00188 private: void AddCollider( ODECollision *_collision1, 00189 ODECollision *_collision2 ); 00190 00192 private: dWorldID worldId; 00193 00195 private: dSpaceID spaceId; 00196 00198 private: dJointGroupID contactGroup; 00199 00202 private: double updateRateDouble; 00203 00206 private: double stepTimeDouble; 00207 private: std::string stepType; 00208 00209 private: std::vector<ContactFeedback*> contactFeedbacks; 00210 00211 private: std::map<std::string, dSpaceID> spaces; 00212 00213 private: std::vector< std::pair<ODECollision*, ODECollision*> > colliders; 00214 private: std::vector< std::pair<ODECollision*, ODECollision*> > trimeshColliders; 00215 private: unsigned int collidersCount, trimeshCollidersCount; 00216 00217 private: tbb::spin_mutex collideMutex; 00218 00219 private: dContactGeom contactCollisions[MAX_DCOLLIDE_RETURNS]; 00220 private: int (*physicsStepFunc)(dxWorld*, dReal); 00221 00222 private: int indices[MAX_CONTACT_JOINTS]; 00223 }; 00224 typedef boost::shared_ptr<ODEPhysics> ODEPhysicsPtr; 00225 00228 } 00229 } 00230 #endif

1.7.5.1