Revision: 8456 http://playerstage.svn.sourceforge.net/playerstage/?rev=8456&view=rev Author: natepak Date: 2009-12-14 17:20:51 +0000 (Mon, 14 Dec 2009)
Log Message: ----------- Added in functions to get the center of mass pose Modified Paths: -------------- code/gazebo/trunk/server/Entity.cc code/gazebo/trunk/server/Entity.hh code/gazebo/trunk/server/Model.cc code/gazebo/trunk/server/physics/Body.cc code/gazebo/trunk/server/physics/ode/ODEBody.cc code/gazebo/trunk/server/physics/ode/ODEGeom.cc Modified: code/gazebo/trunk/server/Entity.cc =================================================================== --- code/gazebo/trunk/server/Entity.cc 2009-12-13 11:51:05 UTC (rev 8455) +++ code/gazebo/trunk/server/Entity.cc 2009-12-14 17:20:51 UTC (rev 8456) @@ -269,6 +269,16 @@ } //////////////////////////////////////////////////////////////////////////////// +/// Get the absolute pose of the entity +Pose3d Entity::GetCoMAbsPose() const +{ + if (this->parent) + return this->GetCoMRelativePose() + this->parent->GetCoMAbsPose(); + else + return this->GetCoMRelativePose(); +} + +//////////////////////////////////////////////////////////////////////////////// // Get the pose of the entity relative to its parent Pose3d Entity::GetRelativePose() const { @@ -276,6 +286,16 @@ } //////////////////////////////////////////////////////////////////////////////// +// Get the pose of the entity relative to its parent +Pose3d Entity::GetCoMRelativePose() const +{ + Vector3 rotateCOM = this->relativePose.rot.RotateVector(this->comOffset); + + return Pose3d(this->relativePose.pos + rotateCOM, + this->relativePose.rot); +} + +//////////////////////////////////////////////////////////////////////////////// /// Get the pose relative to the model this entity belongs to Pose3d Entity::GetModelRelativePose() const { @@ -328,9 +348,9 @@ { if (Simulator::Instance()->GetState() == Simulator::RUN && !this->IsStatic()) - this->visualNode->SetDirty(true, this->relativePose); + this->visualNode->SetDirty(true, this->GetCoMRelativePose()); else - this->visualNode->SetPose(this->relativePose); + this->visualNode->SetPose(this->GetCoMRelativePose()); } if (notify) Modified: code/gazebo/trunk/server/Entity.hh =================================================================== --- code/gazebo/trunk/server/Entity.hh 2009-12-13 11:51:05 UTC (rev 8455) +++ code/gazebo/trunk/server/Entity.hh 2009-12-14 17:20:51 UTC (rev 8456) @@ -105,9 +105,17 @@ /// \brief Get the absolute pose of the entity public: virtual Pose3d GetAbsPose() const; + /// \brief Get the absolute pose of the entity. The result + /// is based on the center of mass of the bodies + public: virtual Pose3d GetCoMAbsPose() const; + /// \brief Get the pose of the entity relative to its parent public: Pose3d GetRelativePose() const; + /// \brief Get the pose of the entity relative to its parent. The result + /// is based on the center of mass of the bodies + public: Pose3d GetCoMRelativePose() const; + /// \brief Get the pose relative to the model this entity belongs to public: Pose3d GetModelRelativePose() const; @@ -169,6 +177,9 @@ private: bool selected; private: Pose3d relativePose; + + // Center of Mass offset + protected: Vector3 comOffset; }; /// \} Modified: code/gazebo/trunk/server/Model.cc =================================================================== --- code/gazebo/trunk/server/Model.cc 2009-12-13 11:51:05 UTC (rev 8455) +++ code/gazebo/trunk/server/Model.cc 2009-12-14 17:20:51 UTC (rev 8456) @@ -984,7 +984,7 @@ gzthrow("Parent has no canonical body"); this->joint->Attach(myBody, pBody); - this->joint->SetAnchor(0, myBody->GetAbsPose().pos ); + this->joint->SetAnchor(0, myBody->GetCoMAbsPose().pos ); this->joint->SetAxis(0, Vector3(0,1,0) ); this->joint->SetHighStop(0,Angle(0)); this->joint->SetLowStop(0,Angle(0)); Modified: code/gazebo/trunk/server/physics/Body.cc =================================================================== --- code/gazebo/trunk/server/physics/Body.cc 2009-12-13 11:51:05 UTC (rev 8455) +++ code/gazebo/trunk/server/physics/Body.cc 2009-12-14 17:20:51 UTC (rev 8456) @@ -475,6 +475,8 @@ bodyPose = this->GetRelativePose(); + this->comOffset = this->mass.GetCoG(); + // Translate all the geoms so that the CoG is at (0,0,0) in the body frame for (iter = this->geoms.begin(); iter != this->geoms.end(); iter++) { @@ -487,9 +489,7 @@ iter->second->SetRelativePose(newPose, true); } - // Apply the CoG offset to the body Pose3d p = this->GetRelativePose(); - p.pos += this->mass.GetCoG(); this->SetRelativePose( p, true ); } Modified: code/gazebo/trunk/server/physics/ode/ODEBody.cc =================================================================== --- code/gazebo/trunk/server/physics/ode/ODEBody.cc 2009-12-13 11:51:05 UTC (rev 8455) +++ code/gazebo/trunk/server/physics/ode/ODEBody.cc 2009-12-14 17:20:51 UTC (rev 8456) @@ -108,6 +108,9 @@ pose.pos.Set(p[0], p[1], p[2]); pose.rot.Set(r[0], r[1], r[2], r[3] ); + Vector3 rotateCOM = pose.rot.RotateVector(self->comOffset); + pose.pos -= rotateCOM; + self->SetAbsPose(pose, false); self->physicsEngine->UnlockMutex(); } @@ -173,7 +176,7 @@ if (this->bodyId == NULL) return; - Pose3d pose = this->GetAbsPose(); + Pose3d pose = this->GetCoMAbsPose(); this->physicsEngine->LockMutex(); dBodySetPosition(this->bodyId, pose.pos.x, pose.pos.y, pose.pos.z); @@ -189,6 +192,7 @@ this->physicsEngine->UnlockMutex(); } +//////////////////////////////////////////////////////////////////////////////// // Return the position of the body. in global CS Vector3 ODEBody::GetPositionRate() const { Modified: code/gazebo/trunk/server/physics/ode/ODEGeom.cc =================================================================== --- code/gazebo/trunk/server/physics/ode/ODEGeom.cc 2009-12-13 11:51:05 UTC (rev 8455) +++ code/gazebo/trunk/server/physics/ode/ODEGeom.cc 2009-12-14 17:20:51 UTC (rev 8456) @@ -74,7 +74,7 @@ // Transform into CoM relative Pose //localPose = newPose - this->body->GetCoMPose(); - localPose = this->GetRelativePose(); + localPose = this->GetCoMRelativePose(); q[0] = localPose.rot.u; q[1] = localPose.rot.x; @@ -101,7 +101,7 @@ { // Transform into global pose since a static geom does not have a body - localPose = this->GetAbsPose(); + localPose = this->GetCoMAbsPose(); q[0] = localPose.rot.u; q[1] = localPose.rot.x; @@ -109,14 +109,14 @@ q[3] = localPose.rot.z; dGeomSetPosition(this->geomId, localPose.pos.x, localPose.pos.y, - localPose.pos.z); + localPose.pos.z); dGeomSetQuaternion(this->geomId, q); } else if (this->geomId && this->placeable) { // Transform into CoM relative Pose //localPose = newPose - this->body->GetCoMPose(); - localPose = this->GetRelativePose(); + localPose = this->GetCoMRelativePose(); q[0] = localPose.rot.u; q[1] = localPose.rot.x; @@ -311,7 +311,7 @@ products = this->mass.GetProductsofInertia(); this->physicsEngine->LockMutex(); - pose = this->GetAbsPose(); // get pose of the geometry + pose = this->GetCoMAbsPose(); // get pose of the geometry q[0] = pose.rot.u; q[1] = pose.rot.x; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Return on Information: Google Enterprise Search pays you back Get the facts. http://p.sf.net/sfu/google-dev2dev _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit