From 1a7824b258a07189ce23dfc29e1d0b8df2c0db39 Mon Sep 17 00:00:00 2001 From: Florent Lamiraux <florent@laas.fr> Date: Fri, 23 Oct 2015 18:59:50 +0200 Subject: [PATCH] Use Explicit relative transformation in Handle::createGrasp. --- src/handle.cc | 157 ++------------------------------------------------ 1 file changed, 6 insertions(+), 151 deletions(-) diff --git a/src/handle.cc b/src/handle.cc index ad7eea7..e0f33d0 100644 --- a/src/handle.cc +++ b/src/handle.cc @@ -33,6 +33,7 @@ #include <hpp/constraints/relative-transformation.hh> #include <hpp/core/numerical-constraint.hh> +#include <hpp/core/explicit-relative-transformation.hh> namespace hpp { namespace manipulation { @@ -52,163 +53,17 @@ namespace hpp { return false; } - HPP_PREDEF_CLASS (ObjectPositionWrtRobot); - typedef boost::shared_ptr <ObjectPositionWrtRobot> - ObjectPositionWrtRobotPtr_t; - class ObjectPositionWrtRobot : public DifferentiableFunction - { - public: - typedef Eigen::Matrix <value_type, 3, Eigen::Dynamic> HalfJacobian_t; - virtual ~ObjectPositionWrtRobot () - { - } - - static ObjectPositionWrtRobotPtr_t create (const GripperPtr_t& gripper, - const Handle& handle, - const std::string& name) - { - return ObjectPositionWrtRobotPtr_t (new ObjectPositionWrtRobot - (gripper, handle, name)); - } - protected: - ObjectPositionWrtRobot (const GripperPtr_t& gripper, - const Handle& handle, - const std::string& name) : - DifferentiableFunction (gripper->joint ()->robot ()->configSize () - 7, - gripper->joint ()->robot ()->numberDof () - 6, - 7, 6, name), - robot_ (gripper->joint ()->robot ()), - objectJoint_ (handle.joint ()->parentJoint ()), - gripperJoint_ (gripper->joint ()), - robotConfigVar_ (), - robotDofVar_ (), objectInGripperJoint_ (), configuration_ () - { - configuration_.resize (robot_->configSize ()); - // Extract configuration parameters relative to robot without object - if (objectJoint_->rankInConfiguration () != 0) { - robotConfigVar_.push_back (SizeInterval_t - (0, objectJoint_->rankInConfiguration ())); - } - if (robot_->configSize () != objectJoint_->rankInConfiguration () + 7) { - robotConfigVar_.push_back (SizeInterval_t - (objectJoint_->rankInConfiguration () + 7, - robot_->configSize () - - objectJoint_->rankInConfiguration () - - 7)); - } - if (objectJoint_->rankInVelocity () != 0) { - robotDofVar_.push_back (SizeInterval_t - (0, objectJoint_->rankInVelocity ())); - } - if (robot_->numberDof () != objectJoint_->rankInVelocity () + 6) { - robotDofVar_.push_back (SizeInterval_t - (objectJoint_->rankInVelocity () + 6, - robot_->numberDof () - - objectJoint_->rankInVelocity () - 6)); - } - // Compute position of object in gripper joint frame - objectInGripperJoint_ = gripper->objectPositionInJoint () * - inverse (handle.localPosition ()); - - GOcross_.setZero (); - Jgj_v_.resize (3, robot_->numberDof () - 6); Jgj_v_.setZero (); - Jgj_omega_.resize (3, robot_->numberDof () - 6); Jgj_omega_.setZero (); - } - - void computeRobotForwardKinematics (vectorIn_t argument) const - { - // Be sure to initialize all configuration variables - configuration_ = robot_->neutralConfiguration (); - size_type index = 0; - for (SizeIntervals_t::const_iterator it = robotConfigVar_.begin (); - it != robotConfigVar_.end (); ++it) { - configuration_.segment (it->first, it->second) = - argument.segment (index, it->second); - index += it->second; - } - robot_->currentConfiguration (configuration_); - robot_->computeForwardKinematics (); - } - - virtual void impl_compute (vectorOut_t result, vectorIn_t argument) const - { - computeRobotForwardKinematics (argument); - objectPosition_ = gripperJoint_->currentTransformation () * - objectInGripperJoint_; - result [0] = objectPosition_.getTranslation () [0]; - result [1] = objectPosition_.getTranslation () [1]; - result [2] = objectPosition_.getTranslation () [2]; - result [3] = objectPosition_.getQuatRotation ().getW (); - result [4] = objectPosition_.getQuatRotation ().getX (); - result [5] = objectPosition_.getQuatRotation ().getY (); - result [6] = objectPosition_.getQuatRotation ().getZ (); - } - - virtual void impl_jacobian (matrixOut_t jacobian, vectorIn_t arg) const - { - computeRobotForwardKinematics (arg); - vector3_t GO (gripperJoint_->currentTransformation ().transform - (objectInGripperJoint_.getTranslation ())); - GOcross_ (0,1) = -GO [2]; GOcross_ (1,0) = GO [2]; - GOcross_ (0,2) = GO [1]; GOcross_ (2,0) = -GO [1]; - GOcross_ (1,2) = -GO [0]; GOcross_ (2,1) = GO [0]; - // Fill Jacobian without columns relative to object position - size_type index = 0; - for (SizeIntervals_t::const_iterator it = robotDofVar_.begin (); - it != robotDofVar_.end (); ++it) { - Jgj_v_.block (0, index, 3, it->second) = - gripperJoint_->jacobian (). block (0, it->first, 3, it->second); - Jgj_omega_.block (0, index, 3, it->second) = - gripperJoint_->jacobian (). block (3, it->first, 3, it->second); - index += it->second; - } - jacobian.topRows <3> () = Jgj_v_ - GOcross_ * Jgj_omega_; - jacobian.bottomRows <3> () = Jgj_omega_; - } - - private: - model::DevicePtr_t robot_; - // First joint of the freeflying object, should be a TranslationJoint <3> - JointPtr_t objectJoint_; - // Joint that holds the gripper - JointPtr_t gripperJoint_; - // Set of configuration variables corresponding to composite robot minus - // object. - SizeIntervals_t robotConfigVar_; - // Set of degrees of freedom corresponding to composite robot minus - // object. - SizeIntervals_t robotDofVar_; - // Position of object in gripper joint frame - Transform3f objectInGripperJoint_; - // Configuration of the composite robot - mutable Configuration_t configuration_; - // Object position - mutable Transform3f objectPosition_; - // Jacobian of gripper joint without columns relative to object - mutable HalfJacobian_t Jgj_v_; - mutable HalfJacobian_t Jgj_omega_; - mutable Eigen::Matrix<value_type, 3, 3> GOcross_; - }; // class ObjectPositionWrtRobot - NumericalConstraintPtr_t Handle::createGrasp (const GripperPtr_t& gripper) const { using boost::assign::list_of; + using core::ExplicitRelativeTransformation; // If handle is on a freeflying object, create an explicit constraint if (isHandleOnR3SO3 (*this)) { - JointPtr_t objectJoint (joint ()->parentJoint ()); - SizeIntervals_t outputConf, outputVelocity; - outputConf.push_back (SizeInterval_t - (objectJoint->rankInConfiguration (), 7)); - outputVelocity.push_back (SizeInterval_t - (objectJoint->rankInVelocity (), 6)); - DifferentiableFunctionPtr_t objectPositionWrtRobotConf - (ObjectPositionWrtRobot::create (gripper, *this, - "Explicit transformation_" + name () - + "_" + gripper->name ())); - return core::ExplicitNumericalConstraint::create - (joint ()->robot (), objectPositionWrtRobotConf, outputConf, - outputVelocity); + return ExplicitRelativeTransformation::create + ("Explicit_relative_transform_" + name () + "_" + gripper->name (), + gripper->joint ()->robot (), gripper->joint (), joint (), + gripper->objectPositionInJoint (), localPosition()); } std::vector <bool> mask = list_of (true)(true)(true)(true)(true)(true); return NumericalConstraintPtr_t -- GitLab