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