// Copyright (c) 2012 CNRS
// Author: Florent Lamiraux, Joseph Mirabel
//
// This file is part of hpp-manipulation-corba.
// hpp-manipulation-corba is free software: you can redistribute it
// and/or modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation, either version
// 3 of the License, or (at your option) any later version.
//
// hpp-manipulation-corba is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Lesser Public License for more details. You should have
// received a copy of the GNU Lesser General Public License along with
// hpp-manipulation-corba. If not, see
// .
//#include
#include
#include
#include "rbprmbuilder.impl.hh"
#include "hpp/rbprm/rbprm-device.hh"
#include "hpp/rbprm/rbprm-validation.hh"
#include "hpp/rbprm/interpolation/rbprm-path-interpolation.hh"
#include "hpp/rbprm/interpolation/limb-rrt.hh"
#include "hpp/rbprm/interpolation/com-rrt.hh"
#include "hpp/rbprm/interpolation/com-trajectory.hh"
#include "hpp/rbprm/interpolation/spline/effector-rrt.hh"
#include "hpp/rbprm/projection/projection.hh"
#include "hpp/rbprm/contact_generation/contact_generation.hh"
#include "hpp/rbprm/contact_generation/algorithm.hh"
#include "hpp/rbprm/stability/stability.hh"
#include "hpp/rbprm/sampling/sample-db.hh"
#include "hpp/model/urdf/util.hh"
#include "hpp/core/straight-path.hh"
#include "hpp/model/joint.hh"
#include "hpp/core/config-validations.hh"
#include "hpp/core/collision-validation-report.hh"
#include
#include
#include
#include
#include
#include
#include
#include // std::random_shuffle
#include
#include "spline/bezier_curve.h"
#include "hpp/rbprm/interpolation/polynom-trajectory.hh"
#include
#include
#include
#include
#ifdef PROFILE
#include "hpp/rbprm/rbprm-profiler.hh"
#endif
namespace hpp {
namespace rbprm {
typedef spline::bezier_curve<> bezier;
namespace impl {
RbprmBuilder::RbprmBuilder ()
: POA_hpp::corbaserver::rbprm::RbprmBuilder()
, romLoaded_(false)
, fullBodyLoaded_(false)
, bindShooter_()
, analysisFactory_(0)
{
// NOTHING
}
hpp::floatSeq vectorToFloatseq (const hpp::core::vector_t& input)
{
CORBA::ULong size = (CORBA::ULong) input.size ();
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
for (std::size_t i=0; irobot (device);
problemSolver()->robot ()->controlComputation
(model::Device::JOINT_POSITION);
}
catch (const std::exception& exc)
{
hppDout (error, exc.what ());
throw hpp::Error (exc.what ());
}
}
void RbprmBuilder::loadFullBodyRobot(const char* robotName,
const char* rootJointType,
const char* packageName,
const char* modelName,
const char* urdfSuffix,
const char* srdfSuffix,
const char* selectedProblem) throw (hpp::Error)
{
try
{
model::DevicePtr_t device = model::Device::create (robotName);
hpp::model::urdf::loadRobotModel (device,
std::string (rootJointType),
std::string (packageName),
std::string (modelName),
std::string (urdfSuffix),
std::string (srdfSuffix));
std::string name(selectedProblem);
fullBodyLoaded_ = true;
fullBodyMap_.map_[name] = rbprm::RbPrmFullBody::create(device);
fullBodyMap_.selected_ = name;
if(problemSolver()){
if(problemSolver()->problem()){
try {
boost::any value = problemSolver()->problem()->get (std::string("friction"));
fullBody()->setFriction(boost::any_cast(value));
hppDout(notice,"fullbody : mu define in python : "<getFriction());
} catch (const std::exception& e) {
hppDout(notice,"fullbody : mu not defined, take : "<getFriction()<<" as default.");
}
}else{
hppDout(warning,"No instance of problem while initializing fullBody");
}
}else{
hppDout(warning,"No instance of problemSolver while initializing fullBody");
}
problemSolver()->pathValidationType ("Discretized",0.05); // reset to avoid conflict with rbprm path
problemSolver()->robot (fullBody()->device_);
problemSolver()->resetProblem();
problemSolver()->robot ()->controlComputation
(model::Device::JOINT_POSITION);
refPose_ = fullBody()->device_->currentConfiguration();
}
catch (const std::exception& exc)
{
fullBodyLoaded_ = false;
hppDout (error, exc.what ());
throw hpp::Error (exc.what ());
}
analysisFactory_ = new sampling::AnalysisFactory(fullBody());
}
void RbprmBuilder::loadFullBodyRobotFromExistingRobot() throw (hpp::Error)
{
try
{
fullBody() = rbprm::RbPrmFullBody::create(problemSolver()->problem()->robot());
problemSolver()->pathValidationType ("Discretized",0.05); // reset to avoid conflict with rbprm path
problemSolver()->robot (fullBody()->device_);
problemSolver()->resetProblem();
problemSolver()->robot ()->controlComputation
(model::Device::JOINT_POSITION);
}
catch (const std::exception& exc)
{
hppDout (error, exc.what ());
throw hpp::Error (exc.what ());
}
fullBodyLoaded_ = true;
analysisFactory_ = new sampling::AnalysisFactory(fullBody());
}
hpp::floatSeq* RbprmBuilder::getSampleConfig(const char* limb, unsigned short sampleId) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limb));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limb) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const RbPrmLimbPtr_t& limbPtr = lit->second;
hpp::floatSeq *dofArray;
Eigen::VectorXd config = fullBody()->device_->currentConfiguration ();
if(sampleId > limbPtr->sampleContainer_.samples_.size())
{
std::string err("Limb " + std::string(limb) + "does not have samples.");
throw Error (err.c_str());
}
const sampling::Sample& sample = limbPtr->sampleContainer_.samples_[sampleId];
config.segment(sample.startRank_, sample.length_) = sample.configuration_;
dofArray = new hpp::floatSeq();
dofArray->length(_CORBA_ULong(config.rows()));
for(std::size_t i=0; i< _CORBA_ULong(config.rows()); i++)
(*dofArray)[(_CORBA_ULong)i] = config [i];
return dofArray;
}
hpp::floatSeq* RbprmBuilder::getSamplePosition(const char* limb, unsigned short sampleId) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limb));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limb) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const RbPrmLimbPtr_t& limbPtr = lit->second;
hpp::floatSeq *dofArray;
if(sampleId > limbPtr->sampleContainer_.samples_.size())
{
std::string err("Limb " + std::string(limb) + "does not have samples.");
throw Error (err.c_str());
}
const sampling::Sample& sample = limbPtr->sampleContainer_.samples_[sampleId];
const fcl::Vec3f& position = sample.effectorPosition_;
dofArray = new hpp::floatSeq();
dofArray->length(_CORBA_ULong(3));
for(std::size_t i=0; i< 3; i++)
(*dofArray)[(_CORBA_ULong)i] = position [i];
return dofArray;
}
typedef Eigen::Matrix Matrix43;
typedef Eigen::Matrix Rotation;
typedef Eigen::Ref Ref_matrix43;
std::vector computeRectangleContact(const rbprm::RbPrmFullBodyPtr_t device,
const rbprm::State& state, const std::vector limbSelected = std::vector())
{
device->device_->currentConfiguration(state.configuration_);
device->device_->computeForwardKinematics();
std::vector res;
const rbprm::T_Limb& limbs = device->GetLimbs();
rbprm::RbPrmLimbPtr_t limb;
Matrix43 p; Eigen::Matrix3d R;
for(std::map::const_iterator cit = state.contactPositions_.begin();
cit != state.contactPositions_.end(); ++cit)
{
const std::string& name = cit->first;
if(limbSelected.empty() || std::find(limbSelected.begin(), limbSelected.end(), name) != limbSelected.end())
{
const fcl::Vec3f& position = cit->second;
limb = limbs.at(name);
const fcl::Vec3f& normal = state.contactNormals_.at(name);
const fcl::Vec3f z = limb->effector_->currentTransformation().getRotation() * limb->normal_;
const fcl::Matrix3f alignRotation = tools::GetRotationMatrix(z,normal);
const fcl::Matrix3f rotation = alignRotation * limb->effector_->currentTransformation().getRotation();
const fcl::Vec3f offset = rotation * limb->offset_;
const double& lx = limb->x_, ly = limb->y_;
p << lx, ly, 0,
lx, -ly, 0,
-lx, -ly, 0,
-lx, ly, 0;
if(limb->contactType_ == _3_DOF)
{
//create rotation matrix from normal
fcl::Vec3f z_fcl = state.contactNormals_.at(name);
Eigen::Vector3d z,x,y;
for(int i =0; i<3; ++i) z[i] = z_fcl[i];
x = z.cross(Eigen::Vector3d(0,-1,0));
if(x.norm() < 10e-6)
{
y = z.cross(fcl::Vec3f(1,0,0));
y.normalize();
x = y.cross(z);
}
else
{
x.normalize();
y = z.cross(x);
}
R.block<3,1>(0,0) = x;
R.block<3,1>(0,1) = y;
R.block<3,1>(0,2) = z;
/*for(std::size_t i =0; i<4; ++i)
{
res.push_back(position + (R*(p.row(i).transpose())) + offset);
res.push_back(state.contactNormals_.at(name));
}*/
res.push_back(position + (R*(offset)));
res.push_back(state.contactNormals_.at(name));
}
else
{
const fcl::Matrix3f& fclRotation = state.contactRotation_.at(name);
for(int i =0; i< 3; ++i)
for(int j =0; j<3;++j)
R(i,j) = fclRotation(i,j);
fcl::Vec3f z_axis(0,0,1);
fcl::Matrix3f rotationLocal = tools::GetRotationMatrix(z_axis, limb->normal_);
for(std::size_t i =0; i<4; ++i)
{
res.push_back(position + (R*(rotationLocal*(p.row(i).transpose() + limb->offset_))));
res.push_back(state.contactNormals_.at(name));
}
}
}
}
return res;
}
std::vector computeRectangleContactLocalTr(const rbprm::RbPrmFullBodyPtr_t device,
const rbprm::State& state,
const std::string& limbName)
{
device->device_->currentConfiguration(state.configuration_);
device->device_->computeForwardKinematics();
std::vector res;
const rbprm::T_Limb& limbs = device->GetLimbs();
rbprm::RbPrmLimbPtr_t limb;
Matrix43 p; Eigen::Matrix3d R = Eigen::Matrix3d::Identity(); Eigen::Matrix3d cFrame = Eigen::Matrix3d::Identity();
for(std::map::const_iterator cit = state.contactPositions_.begin();
cit != state.contactPositions_.end(); ++cit)
{
const std::string& name = cit->first;
if(limbName == name)
{
const fcl::Vec3f& position = cit->second;
limb = limbs.at(name);
const fcl::Vec3f& normal = state.contactNormals_.at(name);
const fcl::Vec3f z = limb->effector_->currentTransformation().getRotation() * limb->normal_;
const fcl::Matrix3f alignRotation = tools::GetRotationMatrix(z,normal);
const fcl::Matrix3f rotation = alignRotation * limb->effector_->currentTransformation().getRotation();
const fcl::Vec3f offset = rotation * limb->offset_;
const double& lx = limb->x_, ly = limb->y_;
p << lx, ly, 0,
lx, -ly, 0,
-lx, -ly, 0,
-lx, ly, 0;
if(limb->contactType_ == _3_DOF)
{
//create rotation matrix from normal
Eigen::Vector3d z,x,y;
for(int i =0; i<3; ++i) z[i] = normal[i];
x = z.cross(Eigen::Vector3d(0,-1,0));
if(x.norm() < 10e-6)
{
y = z.cross(fcl::Vec3f(1,0,0));
y.normalize();
x = y.cross(z);
}
else
{
x.normalize();
y = z.cross(x);
}
cFrame.block<3,1>(0,0) = x;
cFrame.block<3,1>(0,1) = y;
cFrame.block<3,1>(0,2) = z;
}
fcl::Transform3f roWorld, roEffector;
roWorld.setRotation(state.contactRotation_.at(name));
roWorld.setTranslation(position);
roEffector = roWorld; roEffector.inverse();
fcl::Vec3f z_axis(0,0,1);
fcl::Matrix3f rotationLocal = tools::GetRotationMatrix(z_axis, limb->normal_);
if(limb->contactType_ == _3_DOF)
{
fcl::Vec3f pworld = position + offset;
res.push_back((roEffector * pworld).getTranslation());
res.push_back(roEffector.getRotation() * state.contactNormals_.at(name));
}
else
{
for(std::size_t i =0; i<4; ++i)
{
/*if(limb->contactType_ == _3_DOF)
{
fcl::Vec3f pworld = position + (cFrame*(p.row(i).transpose())) + offset;
res.push_back((roEffector * pworld).getTranslation());
res.push_back(roEffector.getRotation() * state.contactNormals_.at(name));
}
else*/
{
res.push_back(rotationLocal*(p.row(i).transpose()) + limb->offset_);
//res.push_back(roEffector.getRotation() * state.contactNormals_.at(name));
res.push_back( limb->normal_);
}
}
}
return res;
}
}
return res;
}
model::Configuration_t dofArrayToConfig (const std::size_t& deviceDim,
const hpp::floatSeq& dofArray)
{
std::size_t configDim = (std::size_t)dofArray.length();
// Fill dof vector with dof array.
model::Configuration_t config; config.resize (configDim);
for (std::size_t iDof = 0; iDof < configDim; iDof++) {
config [iDof] = (double)dofArray[(_CORBA_ULong)iDof];
}
// fill the vector by zero
hppDout (info, "config dimension: " <configSize(), dofArray);
}
T_Configuration doubleDofArrayToConfig (const std::size_t& deviceDim,
const hpp::floatSeqSeq& doubleDofArray)
{
std::size_t configsDim = (std::size_t)doubleDofArray.length();
T_Configuration res;
for (_CORBA_ULong iConfig = 0; iConfig < configsDim; iConfig++)
{
res.push_back(dofArrayToConfig(deviceDim, doubleDofArray[iConfig]));
}
return res;
}
T_Configuration doubleDofArrayToConfig (const model::DevicePtr_t& robot,
const hpp::floatSeqSeq& doubleDofArray)
{
return doubleDofArrayToConfig(robot->configSize(), doubleDofArray);
}
hpp::floatSeqSeq* RbprmBuilder::getEffectorPosition(const char* lb, const hpp::floatSeq& configuration) throw (hpp::Error)
{
try
{
const std::string limbName(lb);
const RbPrmLimbPtr_t limb = fullBody()->GetLimbs().at(limbName);
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
fullBody()->device_->currentConfiguration(config);
fullBody()->device_->computeForwardKinematics();
State state;
state.configuration_ = config;
state.contacts_[limbName] = true;
const fcl::Vec3f position = limb->effector_->currentTransformation().getTranslation();
state.contactPositions_[limbName] = position;
state.contactNormals_[limbName] = fcl::Vec3f(0,0,1);
state.contactRotation_[limbName] = limb->effector_->currentTransformation().getRotation();
std::vector poss = (computeRectangleContact(fullBody(), state));
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
res->length ((_CORBA_ULong)poss.size ());
for(std::size_t i = 0; i < poss.size(); ++i)
{
_CORBA_ULong size = (_CORBA_ULong) (3);
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for(std::size_t j=0; j<3; j++)
{
dofArray[j] = poss[i][j];
}
(*res) [(_CORBA_ULong)i] = floats;
}
return res;
}
catch (const std::exception& exc)
{
throw hpp::Error (exc.what ());
}
}
CORBA::UShort RbprmBuilder::getNumSamples(const char* limb) throw (hpp::Error)
{
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limb));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limb) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
return (CORBA::UShort)(lit->second->sampleContainer_.samples_.size());
}
floatSeq *RbprmBuilder::getOctreeNodeIds(const char* limb) throw (hpp::Error)
{
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limb));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limb) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const sampling::T_VoxelSampleId& ids = lit->second->sampleContainer_.samplesInVoxels_;
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length((_CORBA_ULong)ids.size());
sampling::T_VoxelSampleId::const_iterator it = ids.begin();
for(std::size_t i=0; i< _CORBA_ULong(ids.size()); ++i, ++it)
{
(*dofArray)[(_CORBA_ULong)i] = (double)it->first;
}
return dofArray;
}
double RbprmBuilder::getSampleValue(const char* limb, const char* valueName, unsigned short sampleId) throw (hpp::Error)
{
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limb));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limb) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const sampling::SampleDB& database = lit->second->sampleContainer_;
if (database.samples_.size() <= sampleId)
{
std::string err("unexisting sample id " + sampleId);
throw Error (err.c_str());
}
sampling::T_Values::const_iterator cit = database.values_.find(std::string(valueName));
if(cit == database.values_.end())
{
std::string err("value not existing in database " + std::string(valueName));
throw Error (err.c_str());
}
return cit->second[sampleId];
}
double RbprmBuilder::getEffectorDistance(unsigned short state1, unsigned short state2) throw (hpp::Error)
{
try
{
std::size_t s1((std::size_t)state1), s2((std::size_t)state2);
if(lastStatesComputed_.size () < s1 || lastStatesComputed_.size () < s2 )
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s1) + ", " + std::string(""+s2));
}
return rbprm::effectorDistance(lastStatesComputed_[s1], lastStatesComputed_[s2]);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
std::vector stringConversion(const hpp::Names_t& dofArray)
{
std::vector res;
std::size_t dim = (std::size_t)dofArray.length();
for (_CORBA_ULong iDof = 0; iDof < dim; iDof++)
{
res.push_back(std::string(dofArray[iDof]));
}
return res;
}
std::vector doubleConversion(const hpp::floatSeq& dofArray)
{
std::vector res;
std::size_t dim = (std::size_t)dofArray.length();
for (_CORBA_ULong iDof = 0; iDof < dim; iDof++)
{
res.push_back(dofArray[iDof]);
}
return res;
}
void RbprmBuilder::setStaticStability(const bool staticStability) throw (hpp::Error){
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
fullBody()->staticStability(staticStability);
}
void RbprmBuilder::setReferenceConfig(const hpp::floatSeq& referenceConfig) throw (hpp::Error){
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
Configuration_t config(dofArrayToConfig (fullBody()->device_, referenceConfig));
refPose_ = config;
fullBody()->referenceConfig(config);
}
void RbprmBuilder::setFilter(const hpp::Names_t& roms) throw (hpp::Error)
{
bindShooter_.romFilter_ = stringConversion(roms);
}
void RbprmBuilder::setAffordanceFilter(const char* romName, const hpp::Names_t& affordances) throw (hpp::Error)
{
std::string name (romName);
std::vector affNames = stringConversion(affordances);
bindShooter_.affFilter_.erase(name);
bindShooter_.affFilter_.insert(std::make_pair(name,affNames));
}
void RbprmBuilder::boundSO3(const hpp::floatSeq& limitszyx) throw (hpp::Error)
{
std::vector limits = doubleConversion(limitszyx);
if(limits.size() !=6)
{
throw Error ("Can not bound SO3, array of 6 double required");
}
bindShooter_.so3Bounds_ = limits;
}
rbprm::T_Limb GetFreeLimbs(const RbPrmFullBodyPtr_t fullBody, const hpp::rbprm::State &from, const hpp::rbprm::State &to)
{
rbprm::T_Limb res;
std::vector fixedContacts = to.fixedContacts(from);
std::vector variations = to.contactVariations(from);
for(rbprm::CIT_Limb cit = fullBody->GetLimbs().begin();
cit != fullBody->GetLimbs().end(); ++cit)
{
if(std::find(fixedContacts.begin(), fixedContacts.end(), cit->first) == fixedContacts.end())
{
if(std::find(variations.begin(), variations.end(), cit->first) != variations.end())
{
res.insert(*cit);
}
}
}
return res;
}
rbprm::T_Limb GetFreeLimbs(const RbPrmFullBodyPtr_t fullBody, const hpp::rbprm::State &state)
{
rbprm::T_Limb res;
std::vector fixedContacts = state.fixedContacts(state);
for(rbprm::CIT_Limb cit = fullBody->GetLimbs().begin();
cit != fullBody->GetLimbs().end(); ++cit)
{
if(std::find(fixedContacts.begin(), fixedContacts.end(), cit->first) == fixedContacts.end())
{
res.insert(*cit);
}
}
return res;
}
double RbprmBuilder::projectStateToCOMEigen(unsigned short stateId, const model::Configuration_t& com_target, unsigned short maxNumeSamples) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size() <= stateId)
{
throw std::runtime_error ("Unexisting state " + std::string(""+(stateId)));
}
State s = lastStatesComputed_[stateId];
// /hpp::model::Configuration_t c = rbprm::interpolation::projectOnCom(fullBody(), problemSolver()->problem(),s,com_target,succes);
rbprm::projection::ProjectionReport rep = rbprm::projection::projectToComPosition(fullBody(),com_target,s);
hpp::model::Configuration_t& c = rep.result_.configuration_;
ValidationReportPtr_t rport (ValidationReportPtr_t(new CollisionValidationReport));
CollisionValidationPtr_t val = fullBody()->GetCollisionValidation();
if(!rep.success_){
hppDout(notice,"Projection failed for state "<validate(rep.result_.configuration_,rport);
if(!rep.success_){
hppDout(notice,"Projection failed after collision check for state "<0)
{
hppDout(notice,"Projection for state "<();
BasicConfigurationShooterPtr_t shooter = BasicConfigurationShooter::create(fullBody()->device_);
for(std::size_t i =0; !rep.success_ && i< maxNumeSamples; ++i)
{
s.configuration_ = *shooter->shoot();
s.configuration_.head<7>() = head;
//c = rbprm::interpolation::projectOnCom(fullBody(), problemSolver()->problem(),s,com_target,succes);
rep = rbprm::projection::projectToComPosition(fullBody(),com_target,s);
if(!rep.success_){
hppDout(notice,"Projection failed on iter "<validate(rep.result_.configuration_,rport);
if(!rep.success_){
hppDout(notice,"Projection failed on iter "<second;
const sampling::Sample& sample = limb->sampleContainer_.samples_[0];
s.configuration_.segment(sample.startRank_, sample.length_) = refPose_.segment(sample.startRank_, sample.length_) ;
rep = rbprm::projection::projectToComPosition(fullBody(),com_target,s);
rep.success_ = rep.success_ && val->validate(rep.result_.configuration_,rport);
if(rep.success_)
{
std::cout << "yay " << std::endl;
trySave = rep.result_.configuration_;
}
else
{
std::cout << "ow" << std::endl;
}
}
lastStatesComputed_[stateId].configuration_ = trySave;
lastStatesComputedTime_[stateId].second.configuration_ = trySave;
return 1.;
}
return 0;
}
catch(std::runtime_error& e)
{
std::cout << "ERREUR " << std::endl;
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::createState(const hpp::floatSeq& configuration, const hpp::Names_t& contactLimbs) throw (hpp::Error)
{
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
fullBody()->device_->currentConfiguration(config);
fullBody()->device_->computeForwardKinematics();
State state;
state.configuration_ = config;
std::vector names = stringConversion(contactLimbs);
for(std::vector::const_iterator cit = names.begin(); cit != names.end(); ++cit)
{
rbprm::RbPrmLimbPtr_t limb = fullBody()->GetLimbs().at(*cit);
const std::string& limbName = *cit;
state.contacts_[limbName] = true;
const fcl::Vec3f position = limb->effector_->currentTransformation().getTranslation();
state.contactPositions_[limbName] = position;
state.contactNormals_[limbName] = limb->effector_->currentTransformation().getRotation() * limb->normal_;
state.contactRotation_[limbName] = limb->effector_->currentTransformation().getRotation();
}
lastStatesComputed_.push_back(state);
lastStatesComputedTime_.push_back(std::make_pair(-1., state));
return lastStatesComputed_.size()-1;
}
double RbprmBuilder::projectStateToCOM(unsigned short stateId, const hpp::floatSeq& com, unsigned short max_num_sample) throw (hpp::Error)
{
model::Configuration_t com_target = dofArrayToConfig (3, com);
return projectStateToCOMEigen(stateId, com_target, max_num_sample);
}
hpp::floatSeq* RbprmBuilder::generateContacts(const hpp::floatSeq& configuration,
const hpp::floatSeq& direction,const hpp::floatSeq& acceleration, const double robustnessThreshold ) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
fcl::Vec3f dir,acc;
for(std::size_t i =0; i <3; ++i)
{
dir[i] = direction[(_CORBA_ULong)i];
acc[i] = acceleration[(_CORBA_ULong)i];
}
dir = dir.normalize();
const affMap_t &affMap = problemSolver()->map > > ();
if (affMap.empty ()) {
throw hpp::Error ("No affordances found. Unable to generate Contacts.");
}
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
rbprm::State state = rbprm::contact::ComputeContacts(fullBody(),config,
affMap, bindShooter_.affFilter_, dir,robustnessThreshold,acc);
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(_CORBA_ULong(state.configuration_.rows()));
for(std::size_t i=0; i< _CORBA_ULong(config.rows()); i++)
(*dofArray)[(_CORBA_ULong)i] = state.configuration_ [i];
return dofArray;
} catch (const std::exception& exc) {
throw hpp::Error (exc.what ());
}
}
hpp::floatSeq* RbprmBuilder::generateGroundContact(const hpp::Names_t& contactLimbs) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
fcl::Vec3f z(0,0,1);
ValidationReportPtr_t report = ValidationReportPtr_t(new CollisionValidationReport);
core::BasicConfigurationShooterPtr_t shooter = core::BasicConfigurationShooter::create(fullBody()->device_);
for(int i =0; i< 1000; ++i)
{
core::DevicePtr_t device = fullBody()->device_->clone();
std::vector names = stringConversion(contactLimbs);
core::ConfigProjectorPtr_t proj = core::ConfigProjector::create(device,"proj", 1e-4, 40);
//hpp::tools::LockJointRec(limb->limb_->name(), body->device_->rootJoint(), proj);
for(std::vector::const_iterator cit = names.begin(); cit !=names.end(); ++cit)
{
rbprm::RbPrmLimbPtr_t limb = fullBody()->GetLimbs().at(*cit);
fcl::Transform3f localFrame, globalFrame;
localFrame.setTranslation(-limb->offset_);
std::vector posConstraints;
std::vector rotConstraints;
posConstraints.push_back(false);posConstraints.push_back(false);posConstraints.push_back(true);
rotConstraints.push_back(true);rotConstraints.push_back(true);rotConstraints.push_back(true);
proj->add(core::NumericalConstraint::create (constraints::Position::create("",fullBody()->device_,
limb->effector_,
globalFrame,
localFrame,
posConstraints)));
if(limb->contactType_ == hpp::rbprm::_6_DOF)
{
// rotation matrix around z
value_type theta = 2*(value_type(rand()) / value_type(RAND_MAX) - 0.5) * M_PI;
fcl::Matrix3f r = tools::GetZRotMatrix(theta);
fcl::Matrix3f rotation = r * limb->effector_->initialPosition ().getRotation();
proj->add(core::NumericalConstraint::create (constraints::Orientation::create("",fullBody()->device_,
limb->effector_,
fcl::Transform3f(rotation),
rotConstraints)));
}
}
ConfigurationPtr_t configptr = shooter->shoot();
Configuration_t config = *configptr;
if(proj->apply(config) && config[2]> 0.3)
{
if(problemSolver()->problem()->configValidations()->validate(config,report))
{
State tmp;
for(std::vector::const_iterator cit = names.begin(); cit !=names.end(); ++cit)
{
std::string limbId = *cit;
rbprm::RbPrmLimbPtr_t limb = fullBody()->GetLimbs().at(*cit);
tmp.contacts_[limbId] = true;
tmp.contactPositions_[limbId] = limb->effector_->currentTransformation().getTranslation();
tmp.contactRotation_[limbId] = limb->effector_->currentTransformation().getRotation();
tmp.contactNormals_[limbId] = z;
tmp.configuration_ = config;
++tmp.nbContacts;
}
if(stability::IsStable(fullBody(),tmp)>=0)
{
config[0]=0;
config[1]=0;
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(_CORBA_ULong(config.rows()));
for(std::size_t j=0; j< config.rows(); j++)
{
(*dofArray)[(_CORBA_ULong)j] = config [j];
}
return dofArray;
}
}
}
}
throw (std::runtime_error("could not generate contact configuration after 1000 trials"));
} catch (const std::exception& exc) {
throw hpp::Error (exc.what ());
}
}
hpp::floatSeq* RbprmBuilder::getContactSamplesIds(const char* limbname,
const hpp::floatSeq& configuration,
const hpp::floatSeq& direction) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
fcl::Vec3f dir;
for(std::size_t i =0; i <3; ++i)
{
dir[i] = direction[(_CORBA_ULong)i];
}
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
model::Configuration_t save = fullBody()->device_->currentConfiguration();
fullBody()->device_->currentConfiguration(config);
sampling::T_OctreeReport finalSet;
rbprm::T_Limb::const_iterator lit = fullBody()->GetLimbs().find(std::string(limbname));
if(lit == fullBody()->GetLimbs().end())
{
throw std::runtime_error ("Impossible to find limb for joint "
+ std::string(limbname) + " to robot; limb not defined.");
}
const RbPrmLimbPtr_t& limb = lit->second;
fcl::Transform3f transform = limb->limb_->robot()->rootJoint()->childJoint(0)->currentTransformation (); // get root transform from configuration
// TODO fix as in rbprm-fullbody.cc!!
std::vector reports(problemSolver()->collisionObstacles().size());
std::size_t i (0);
//#pragma omp parallel for
for(model::ObjectVector_t::const_iterator oit = problemSolver()->collisionObstacles().begin();
oit != problemSolver()->collisionObstacles().end(); ++oit, ++i)
{
sampling::GetCandidates(limb->sampleContainer_, transform, *oit, dir, reports[i], sampling::HeuristicParam());
}
for(std::vector::const_iterator cit = reports.begin();
cit != reports.end(); ++cit)
{
finalSet.insert(cit->begin(), cit->end());
}
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length((_CORBA_ULong)finalSet.size());
sampling::T_OctreeReport::const_iterator candCit = finalSet.begin();
for(std::size_t i=0; i< _CORBA_ULong(finalSet.size()); ++i, ++candCit)
{
(*dofArray)[(_CORBA_ULong)i] = (double)candCit->sample_->id_;
}
fullBody()->device_->currentConfiguration(save);
return dofArray;
} catch (const std::exception& exc) {
throw hpp::Error (exc.what ());
}
}
hpp::floatSeqSeq* RbprmBuilder::getContactSamplesProjected(const char* limbname,
const hpp::floatSeq& configuration,
const hpp::floatSeq& direction,
unsigned short numSamples) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
fcl::Vec3f dir;
for(std::size_t i =0; i <3; ++i)
{
dir[i] = direction[(_CORBA_ULong)i];
}
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
fullBody()->device_->currentConfiguration(config);
sampling::T_OctreeReport finalSet;
rbprm::T_Limb::const_iterator lit = fullBody()->GetLimbs().find(std::string(limbname));
if(lit == fullBody()->GetLimbs().end())
{
throw std::runtime_error ("Impossible to find limb for joint "
+ std::string(limbname) + " to robot; limb not defined.");
}
const RbPrmLimbPtr_t& limb = lit->second;
fcl::Transform3f transform = limb->octreeRoot(); // get root transform from configuration
// TODO fix as in rbprm-fullbody.cc!!
const affMap_t &affMap = problemSolver()->map
> > ();
if (affMap.empty ())
{
throw hpp::Error ("No affordances found. Unable to interpolate.");
}
const model::ObjectVector_t objects = contact::getAffObjectsForLimb(std::string(limbname), affMap,
bindShooter_.affFilter_);
std::vector reports(objects.size());
std::size_t i (0);
//#pragma omp parallel for
for(model::ObjectVector_t::const_iterator oit = objects.begin();
oit != objects.end(); ++oit, ++i)
{
sampling::GetCandidates(limb->sampleContainer_, transform, *oit, dir, reports[i], sampling::HeuristicParam());
}
for(std::vector::const_iterator cit = reports.begin();
cit != reports.end(); ++cit)
{
finalSet.insert(cit->begin(), cit->end());
}
// randomize samples
std::random_shuffle(reports.begin(), reports.end());
unsigned short num_samples_ok (0);
bool success(false);
model::Configuration_t sampleConfig = config;
std::vector results;
sampling::T_OctreeReport::const_iterator candCit = finalSet.begin();
for(std::size_t i=0; i< _CORBA_ULong(finalSet.size()) && num_samples_ok < numSamples; ++i, ++candCit)
{
const sampling::OctreeReport& report = *candCit;
success = false;
State state;
state.configuration_ = config;
hpp::rbprm::projection::ProjectionReport rep =
hpp::rbprm::projection::projectSampleToObstacle(fullBody(),std::string(limbname), limb, report, fullBody()->GetCollisionValidation(), sampleConfig, state);
if(rep.success_)
{
results.push_back(sampleConfig);
++num_samples_ok;
}
}
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
res->length ((_CORBA_ULong)results.size ());
i=0;
std::size_t id = 0;
for(std::vector::const_iterator cit = results.begin();
cit != results.end(); ++cit, ++id)
{
/*std::cout << "ID " << id;
cit->print();*/
const core::Configuration_t& config = *cit;
_CORBA_ULong size = (_CORBA_ULong) config.size ();
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for (model::size_type j=0 ; j < config.size() ; ++j) {
dofArray[j] = config [j];
}
(*res) [(_CORBA_ULong)i] = floats;
++i;
}
return res;
} catch (const std::exception& exc) {
throw hpp::Error (exc.what ());
}
}
hpp::floatSeq* RbprmBuilder::getSamplesIdsInOctreeNode(const char* limb,
double octreeNodeId) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
long ocId ((long)octreeNodeId);
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limb));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limb) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const sampling::T_VoxelSampleId& sampleIds = lit->second->sampleContainer_.samplesInVoxels_;
sampling::T_VoxelSampleId::const_iterator cit = sampleIds.find(ocId);
if(cit == sampleIds.end())
{
std::stringstream ss; ss << ocId;
std::string err("No octree node with id " + ss.str() + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const sampling::VoxelSampleId& ids = cit->second;
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length((_CORBA_ULong)ids.second);
std::size_t sampleId = ids.first;
for(std::size_t i=0; i< _CORBA_ULong(ids.second); ++i, ++sampleId)
{
(*dofArray)[(_CORBA_ULong)i] = (double)sampleId;
}
return dofArray;
} catch (const std::exception& exc) {
throw hpp::Error (exc.what ());
}
}
void RbprmBuilder::addLimb(const char* id, const char* limb, const char* effector, const hpp::floatSeq& offset, const hpp::floatSeq& normal, double x, double y,
unsigned int samples, const char* heuristicName, double resolution, const char *contactType, double disableEffectorCollision, double grasp, const hpp::floatSeq &limbOffset) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
fcl::Vec3f off, norm,limbOff;
for(std::size_t i =0; i <3; ++i)
{
off[i] = offset[(_CORBA_ULong)i];
norm[i] = normal[(_CORBA_ULong)i];
limbOff[i] = limbOffset[(_CORBA_ULong)i];
}
ContactType cType = hpp::rbprm::_6_DOF;
if(std::string(contactType) == "_3_DOF")
{
cType = hpp::rbprm::_3_DOF;
}
fullBody()->AddLimb(std::string(id), std::string(limb), std::string(effector), off,limbOff, norm, x, y,
problemSolver()->collisionObstacles(), samples,heuristicName,resolution,cType,disableEffectorCollision > 0.5, grasp > 0.5);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
void RbprmBuilder::addNonContactingLimb(const char* id, const char* limb, const char* effector, unsigned int samples) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
fullBody()->AddNonContactingLimb(std::string(id), std::string(limb), std::string(effector), problemSolver()->collisionObstacles(), samples);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
void RbprmBuilder::addLimbDatabase(const char* databasePath, const char* id, const char* heuristicName, double loadValues, double disableEffectorCollision, double grasp) throw (hpp::Error)
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
try
{
std::string fileName(databasePath);
fullBody()->AddLimb(fileName, std::string(id), problemSolver()->collisionObstacles(), heuristicName, loadValues > 0.5,
disableEffectorCollision > 0.5, grasp > 0.5);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
void SetPositionAndNormal(rbprm::State& state,
hpp::rbprm::RbPrmFullBodyPtr_t fullBody, const hpp::floatSeq& configuration,
std::vector& names)
{
core::Configuration_t old = fullBody->device_->currentConfiguration();
model::Configuration_t config = dofArrayToConfig (fullBody->device_, configuration);
fullBody->device_->currentConfiguration(config);
fullBody->device_->computeForwardKinematics();
for(std::vector::const_iterator cit = names.begin(); cit != names.end();++cit)
{
rbprm::T_Limb::const_iterator lit = fullBody->GetLimbs().find(*cit);
if(lit == fullBody->GetLimbs().end())
{
throw std::runtime_error ("Impossible to find limb for joint "
+ (*cit) + " to robot; limb not defined");
}
const core::JointPtr_t joint = fullBody->device_->getJointByName(lit->second->effector_->name());
const fcl::Transform3f& transform = joint->currentTransformation ();
const fcl::Matrix3f& rot = transform.getRotation();
state.contactPositions_[*cit] = transform.getTranslation();
state.contactRotation_[*cit] = rot;
const fcl::Vec3f z = transform.getRotation() * lit->second->normal_;
state.contactNormals_[*cit] = z;
state.contacts_[*cit] = true;
state.contactOrder_.push(*cit);
}
state.nbContacts = state.contactNormals_.size() ;
state.configuration_ = config;
state.robustness = stability::IsStable(fullBody,state);
state.stable = state.robustness >= 0;
fullBody->device_->currentConfiguration(old);
}
void RbprmBuilder::setStartState(const hpp::floatSeq& configuration, const hpp::Names_t& contactLimbs) throw (hpp::Error)
{
try
{
std::vector names = stringConversion(contactLimbs);
SetPositionAndNormal(startState_,fullBody(), configuration, names);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::computeContactForConfig(const hpp::floatSeq& configuration, const char *limbNam) throw (hpp::Error)
{
State state;
std::string limb(limbNam);
try
{
std::vector limbs; limbs.push_back(limbNam);
SetPositionAndNormal(state,fullBody(), configuration, limbs);
const std::vector& positions = computeRectangleContactLocalTr(fullBody(),state,limb);
_CORBA_ULong size = (_CORBA_ULong) (positions.size () * 3);
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(size);
for(std::size_t h = 0; h names = stringConversion(contactLimbs);
SetPositionAndNormal(endState_,fullBody(), configuration, names);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
double RbprmBuilder::getTimeAtState(unsigned short stateId)throw (hpp::Error){
try
{
if(lastStatesComputed_.size() == 0)
{
throw std::runtime_error ("states not yet computed, call interpolate() first.");
}
if(lastStatesComputedTime_.size() <= stateId){
throw std::runtime_error ("invalid state id : "+std::string(""+stateId)+" number of state = "+std::string(""+lastStatesComputedTime_.size()));
}
return lastStatesComputedTime_[stateId].first;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
Names_t* RbprmBuilder::getContactsVariations(unsigned short stateIdFrom,unsigned short stateIdTo )throw (hpp::Error){
try
{
if(lastStatesComputed_.size() == 0)
{
throw std::runtime_error ("states not yet computed, call interpolate() first.");
}
if(lastStatesComputedTime_.size() <= stateIdFrom){
throw std::runtime_error ("invalid state id : "+std::string(""+stateIdFrom)+" number of state = "+std::string(""+lastStatesComputedTime_.size()));
}
if(lastStatesComputedTime_.size() <= stateIdTo){
throw std::runtime_error ("invalid state id : "+std::string(""+stateIdTo)+" number of state = "+std::string(""+lastStatesComputedTime_.size()));
}
State stateFrom = lastStatesComputed_[stateIdFrom];
State stateTo = lastStatesComputed_[stateIdTo];
std::vector variations_s = stateTo.allVariations(stateFrom,rbprm::interpolation::extractEffectorsName(fullBody()->GetLimbs()));
CORBA::ULong size = (CORBA::ULong) variations_s.size ();
char** nameList = Names_t::allocbuf(size);
Names_t *variations = new Names_t (size,size,nameList);
for (std::size_t i = 0 ; i < variations_s.size() ; ++i){
nameList[i] = (char*) malloc (sizeof(char)*(variations_s[i].length ()+1));
strcpy (nameList [i], variations_s[i].c_str ());
}
return variations;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
std::vector TimeStatesToStates(const T_StateFrame& ref)
{
std::vector res;
for(CIT_StateFrame cit = ref.begin(); cit != ref.end(); ++cit)
{
res.push_back(cit->second);
}
return res;
}
floatSeqSeq* RbprmBuilder::interpolateConfigs(const hpp::floatSeqSeq& configs, double robustnessTreshold, unsigned short filterStates) throw (hpp::Error)
{
try
{
if(startState_.configuration_.rows() == 0)
{
throw std::runtime_error ("Start state not initialized, can not interpolate ");
}
if(endState_.configuration_.rows() == 0)
{
throw std::runtime_error ("End state not initialized, can not interpolate ");
}
T_Configuration configurations = doubleDofArrayToConfig(fullBody()->device_, configs);
const affMap_t &affMap = problemSolver()->map
> > ();
if (affMap.empty ())
{
throw hpp::Error ("No affordances found. Unable to interpolate.");
}
hpp::rbprm::interpolation::RbPrmInterpolationPtr_t interpolator = rbprm::interpolation::RbPrmInterpolation::create(fullBody(),startState_,endState_);
lastStatesComputedTime_ = interpolator->Interpolate(affMap, bindShooter_.affFilter_,configurations,robustnessTreshold, filterStates != 0);
lastStatesComputed_ = TimeStatesToStates(lastStatesComputedTime_);
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
res->length ((_CORBA_ULong)lastStatesComputed_.size ());
std::size_t i=0;
std::size_t id = 0;
for(std::vector::const_iterator cit = lastStatesComputed_.begin(); cit != lastStatesComputed_.end(); ++cit, ++id)
{
std::cout << "ID " << id;
cit->print();
const core::Configuration_t config = cit->configuration_;
_CORBA_ULong size = (_CORBA_ULong) config.size ();
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for (model::size_type j=0 ; j < config.size() ; ++j) {
dofArray[j] = config [j];
}
(*res) [(_CORBA_ULong)i] = floats;
++i;
}
return res;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeqSeq* contactCone(RbPrmFullBodyPtr_t fullBody, State& state, const double friction)
{
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
std::pair cone = stability::ComputeCentroidalCone(fullBody, state, friction);
res->length ((_CORBA_ULong)cone.first.rows());
_CORBA_ULong size = (_CORBA_ULong) cone.first.cols()+1;
for(int i=0; i < cone.first.rows(); ++i)
{
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the row in dofseq
for (int j=0 ; j < cone.first.cols() ; ++j)
{
dofArray[j] = cone.first(i,j);
}
dofArray[size-1] =cone.second[i];
(*res) [(_CORBA_ULong)i] = floats;
}
return res;
}
hpp::floatSeqSeq* RbprmBuilder::getContactCone(unsigned short stateId, double friction) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size() <= stateId)
{
throw std::runtime_error ("Unexisting state " + std::string(""+(stateId)));
}
return contactCone(fullBody(), lastStatesComputed_[stateId],friction);
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
State intermediary(const State& firstState, const State& thirdState, unsigned short& cId, bool& success)
{
success = false;
std::vector breaks;
thirdState.contactBreaks(firstState, breaks);
if(breaks.size() > 1)
{
throw std::runtime_error ("too many contact breaks between states" + std::string(""+cId) + "and " + std::string(""+(cId + 1)));
}
if(breaks.size() == 1)
{
State intermediary(firstState);
intermediary.RemoveContact(*breaks.begin());
success = true;
return intermediary;
}
std::cout << "no contact break during intermediary phase " << std::endl;
return firstState;
}
hpp::floatSeqSeq* RbprmBuilder::getContactIntermediateCone(unsigned short stateId, double friction) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size() <= stateId+1)
{
throw std::runtime_error ("Unexisting state " + std::string(""+(stateId+1)));
}
bool success;
State intermediaryState = intermediary(lastStatesComputed_[stateId], lastStatesComputed_[stateId+1],stateId,success);
if(!success)
{
throw std::runtime_error ("No contact breaks, hence no intermediate state from state " + std::string(""+(stateId)));
}
return contactCone(fullBody(),intermediaryState, friction);
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
Names_t* RbprmBuilder::getEffectorsTrajectoriesNames(unsigned short pathId)throw (hpp::Error){
try{
if(!fullBodyLoaded_)
throw std::runtime_error ("No Fullbody loaded");
EffectorTrajectoriesMap_t map;
if(! fullBody()->getEffectorsTrajectories(pathId,map))
//throw std::runtime_error ("Error while retrieving the End effector map for pathId = "+ std::string(""+pathId));
return new Names_t(); // Return an empty list or throw an error ??
std::vector names;
for(EffectorTrajectoriesMap_t::const_iterator it = map.begin() ; it != map.end() ; ++it){
names.push_back(it->first);
}
// convert names (vector of string) to corba Names_t
CORBA::ULong size = (CORBA::ULong) names.size ();
char** nameList = Names_t::allocbuf(size);
Names_t *limbsNames = new Names_t (size,size,nameList);
for (std::size_t i = 0 ; i < names.size() ; ++i){
nameList[i] = (char*) malloc (sizeof(char)*(names[i].length ()+1));
strcpy (nameList [i], names[i].c_str ());
}
return limbsNames;
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
hpp::floatSeqSeqSeq* RbprmBuilder::getEffectorTrajectoryWaypoints(unsigned short pathId,const char* effectorName)throw (hpp::Error){
try{
if(!fullBodyLoaded_)
throw std::runtime_error ("No Fullbody loaded");
std::vector curvesVector;
if(! fullBody()->getEffectorTrajectory(pathId,effectorName,curvesVector))
throw std::runtime_error ("There is no trajectory stored for path Id = "+ boost::lexical_cast(pathId) +" and end effector name = "+std::string(effectorName));
// 3 dimensionnal array : first index is the curve, second index is the wp of the curve, third index is the coordinate of each wp
hpp::floatSeqSeqSeq *res;
res = new hpp::floatSeqSeqSeq();
res->length((_CORBA_ULong) curvesVector.size());
size_t curveId = 0;
for(std::vector::const_iterator cit=curvesVector.begin() ; cit != curvesVector.end();++cit,curveId++){
const bezier_t::t_point_t waypoints = (*cit)->waypoints();
// build a floatSeqSeq from the waypoints :
hpp::floatSeqSeq *curveWp;
curveWp = new hpp::floatSeqSeq ();
_CORBA_ULong size = (_CORBA_ULong)waypoints.size()+1;
curveWp->length (size); // +1 because the first value is the length (time)
{ // add the time at the first index :
double* dofArray = hpp::floatSeq::allocbuf(1);
hpp::floatSeq floats (1, 1, dofArray, true);
dofArray[0] = (*cit)->max();
(*curveWp) [(_CORBA_ULong)0] = floats; // Always assume the curve start at 0. There isn't any ways to create it otherwise in python
}
// now add the waypoints :
std::size_t i=1;
for(bezier_t::t_point_t::const_iterator wit = waypoints.begin(); wit != waypoints.end(); ++wit,++i)
{
const bezier_t::point_t position = *wit;
(*curveWp) [(_CORBA_ULong)i] = vectorToFloatseq(position);
}
(*res)[(_CORBA_ULong)curveId] = (*curveWp);
}
return res;
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
core::PathPtr_t makePath(DevicePtr_t device,
const ProblemPtr_t& problem,
model::ConfigurationIn_t q1,
model::ConfigurationIn_t q2)
{
// TODO DT
return problem->steeringMethod()->operator ()(q1,q2);
}
model::Configuration_t addRotation(CIT_Configuration& pit, const model::value_type& u,
model::ConfigurationIn_t q1, model::ConfigurationIn_t q2,
model::ConfigurationIn_t ref)
{
model::Configuration_t res = ref;
res.head(3) = *pit;
res.segment<4>(3) = tools::interpolate(q1, q2, u);
return res;
}
core::PathVectorPtr_t addRotations(const T_Configuration& positions,
model::ConfigurationIn_t q1, model::ConfigurationIn_t q2,
model::ConfigurationIn_t ref, DevicePtr_t device,
const ProblemPtr_t& problem)
{
core::PathVectorPtr_t res = core::PathVector::create(device->configSize(), device->numberDof());
model::value_type size_step = 1 /(model::value_type)(positions.size());
model::value_type u = 0.;
CIT_Configuration pit = positions.begin();
model::Configuration_t previous = addRotation(pit, 0., q1, q2, ref), current;
++pit;
for(;pit != positions.end()-1; ++pit, u+=size_step)
{
current = addRotation(pit, u, q1, q2, ref);
res->appendPath(makePath(device,problem, previous, current));
previous = current;
}
// last configuration is exactly q2
current = addRotation(pit, 1., q1, q2, ref);
res->appendPath(makePath(device,problem, previous, current));
return res;
}
core::PathVectorPtr_t generateTrunkPath(RbPrmFullBodyPtr_t fullBody, core::ProblemSolverPtr_t problemSolver, const hpp::floatSeqSeq& rootPositions,
const model::Configuration_t q1, const model::Configuration_t q2) throw (hpp::Error)
{
try
{
T_Configuration positions = doubleDofArrayToConfig(3, rootPositions);
if(positions.size() <2)
{
throw std::runtime_error("generateTrunkPath requires at least 2 configurations to generate path");
}
return addRotations(positions,q1,q2,fullBody->device_->currentConfiguration(),
fullBody->device_,problemSolver->problem());
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::generateRootPath(const hpp::floatSeqSeq& rootPositions,
const hpp::floatSeq& q1Seq, const hpp::floatSeq& q2Seq) throw (hpp::Error)
{
try
{
model::Configuration_t q1 = dofArrayToConfig(4, q1Seq), q2 = dofArrayToConfig(4, q2Seq);
return problemSolver()->addPath(generateTrunkPath(fullBody(), problemSolver(), rootPositions, q1, q2));
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::straightPath(const hpp::floatSeqSeq& positions) throw (hpp::Error)
{
try
{
T_Configuration c = doubleDofArrayToConfig(3, positions);
if(c.size() <2)
{
throw std::runtime_error("straightPath requires at least 2 configurations to generate path");
}
core::PathVectorPtr_t res = core::PathVector::create(3, 3);
CIT_Configuration cit = c.begin(); ++cit;
int i = 0;
model::vector3_t zero (0.,0.,0.);
for(;cit != c.end(); ++cit, ++i)
{
model::vector3_t speed = (*cit) - *(cit-1);
res->appendPath(interpolation::ComTrajectory::create(*(cit-1),*cit,speed,zero,1.));
}
return problemSolver()->addPath(res);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::generateCurveTraj(const hpp::floatSeqSeq& positions) throw (hpp::Error)
{
try
{
T_Configuration c = doubleDofArrayToConfig(3, positions);
bezier* curve = new bezier(c.begin(), c.end());
hpp::rbprm::interpolation::PolynomPtr_t curvePtr (curve);
hpp::rbprm::interpolation::PolynomTrajectoryPtr_t path = hpp::rbprm::interpolation::PolynomTrajectory::create(curvePtr);
core::PathVectorPtr_t res = core::PathVector::create(3, 3);
res->appendPath(path);
return problemSolver()->addPath(res);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::generateCurveTrajParts(const hpp::floatSeqSeq& positions, const hpp::floatSeq& partitions) throw (hpp::Error)
{
try
{
model::Configuration_t config = dofArrayToConfig ((std::size_t)partitions.length(), partitions);
T_Configuration c = doubleDofArrayToConfig(3, positions);
bezier* curve = new bezier(c.begin(), c.end());
hpp::rbprm::interpolation::PolynomPtr_t curvePtr (curve);
hpp::rbprm::interpolation::PolynomTrajectoryPtr_t path = hpp::rbprm::interpolation::PolynomTrajectory::create(curvePtr);
core::PathVectorPtr_t res = core::PathVector::create(3, 3);
res->appendPath(path);
std::size_t returned_pathId =problemSolver()->addPath(res);
for (int i = 1; i < config.rows(); ++i)
{
core::PathPtr_t cutPath = path->extract(interval_t (config(i-1), config(i)));
res = core::PathVector::create(3, 3);
res->appendPath(cutPath);
problemSolver()->addPath(res);
}
return returned_pathId;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::generateComTraj(const hpp::floatSeqSeq& positions, const hpp::floatSeqSeq& velocities,
const hpp::floatSeqSeq& accelerations,
const double dt) throw (hpp::Error)
{
try
{
T_Configuration c = doubleDofArrayToConfig(3, positions);
T_Configuration cd = doubleDofArrayToConfig(3, velocities);
T_Configuration cdd = doubleDofArrayToConfig(3, accelerations);
if(c.size() <2)
{
throw std::runtime_error("generateComTraj requires at least 2 configurations to generate path");
}
core::PathVectorPtr_t res = core::PathVector::create(3, 3);
if(cdd.size() != c.size()-1 || cdd.size() != cd.size())
{
std::cout << c.size() << " " << cd.size() << " " << cdd.size() << std::endl;
throw std::runtime_error("in generateComTraj, positions and accelerations vector should have the same size");
}
CIT_Configuration cit = c.begin(); ++cit;
CIT_Configuration cdit = cd.begin();
CIT_Configuration cddit = cdd.begin();
int i = 0;
for(;cit != c.end(); ++cit, ++cdit, ++cddit, ++i)
{
res->appendPath(interpolation::ComTrajectory::create(*(cit-1),*cit,*cdit,*cddit,dt));
}
return problemSolver()->addPath(res);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
floatSeqSeq* RbprmBuilder::computeContactPoints(unsigned short cId) throw (hpp::Error)
{
if(lastStatesComputed_.size() <= cId + 1)
{
throw std::runtime_error ("Unexisting state " + std::string(""+(cId+1)));
}
const State& firstState = lastStatesComputed_[cId], thirdState = lastStatesComputed_[cId+1];
std::vector > allStates;
allStates.push_back(computeRectangleContact(fullBody(), firstState));
std::vector creations;
bool success(false);
State intermediaryState = intermediary(firstState, thirdState, cId, success);
if(success)
{
allStates.push_back(computeRectangleContact(fullBody(), intermediaryState));
}
thirdState.contactCreations(firstState, creations);
if(creations.size() == 1)
{
allStates.push_back(computeRectangleContact(fullBody(), thirdState));
}
if(creations.size() > 1)
{
throw std::runtime_error ("too many contact creations between states" + std::string(""+cId) + "and " + std::string(""+(cId + 1)));
}
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
// compute array of contact positions
res->length ((_CORBA_ULong)allStates.size());
std::size_t i=0;
for(std::vector >::const_iterator cit = allStates.begin();
cit != allStates.end(); ++cit, ++i)
{
const std::vector& positions = *cit;
_CORBA_ULong size = (_CORBA_ULong) positions.size () * 3;
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for(std::size_t h = 0; h 0)
{
const State& thirdState = lastStatesComputed_[cId+1];
bool success(false);
State interm = intermediary(state, thirdState, cId, success);
if(success)
state = interm;
}
std::vector > allStates;
allStates.push_back(computeRectangleContact(fullBody(), state));
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
// compute array of contact positions
res->length ((_CORBA_ULong)allStates.size());
std::size_t i=0;
for(std::vector >::const_iterator cit = allStates.begin();
cit != allStates.end(); ++cit, ++i)
{
const std::vector& positions = *cit;
_CORBA_ULong size = (_CORBA_ULong) positions.size () * 3;
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for(std::size_t h = 0; h > allStates;
allStates.push_back(computeRectangleContactLocalTr(fullBody(), firstState, limb));
std::vector creations;
bool success(false);
State intermediaryState = intermediary(firstState, thirdState, cId, success);
if(success)
{
allStates.push_back(computeRectangleContactLocalTr(fullBody(), intermediaryState, limb));
}
thirdState.contactCreations(firstState, creations);
if(creations.size() == 1)
{
allStates.push_back(computeRectangleContactLocalTr(fullBody(), thirdState, limb));
}
if(creations.size() > 1)
{
throw std::runtime_error ("too many contact creations between states" + std::string(""+cId) + "and " + std::string(""+(cId + 1)));
}
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
// compute array of contact positions
res->length ((_CORBA_ULong)allStates.size());
std::size_t i=0;
for(std::vector >::const_iterator cit = allStates.begin();
cit != allStates.end(); ++cit, ++i)
{
const std::vector& positions = *cit;
_CORBA_ULong size = (_CORBA_ULong) positions.size () * 3;
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for(std::size_t h = 0; h 0)
{
const State& thirdState = lastStatesComputed_[cId+1];
bool success(false);
State interm = intermediary(state, thirdState, cId, success);
if(success)
state = interm;
}
std::vector > allStates;
std::vector limbs ; limbs.push_back(limb);
allStates.push_back(computeRectangleContact(fullBody(), state,limbs));
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
// compute array of contact positions
res->length ((_CORBA_ULong)allStates.size());
std::size_t i=0;
for(std::vector >::const_iterator cit = allStates.begin();
cit != allStates.end(); ++cit, ++i)
{
const std::vector& positions = *cit;
_CORBA_ULong size = (_CORBA_ULong) positions.size () * 3;
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for(std::size_t h = 0; hpaths().size() <= pathId)
{
throw std::runtime_error ("No path computed, cannot interpolate ");
}
const affMap_t &affMap = problemSolver()->map
> > ();
if (affMap.empty ())
{
throw hpp::Error ("No affordances found. Unable to interpolate.");
}
hpp::rbprm::interpolation::RbPrmInterpolationPtr_t interpolator =
rbprm::interpolation::RbPrmInterpolation::create(fullBody(),startState_,endState_,problemSolver()->paths()[pathId]);
lastStatesComputedTime_ = interpolator->Interpolate(affMap, bindShooter_.affFilter_,
timestep,robustnessTreshold, filterStates != 0);
lastStatesComputed_ = TimeStatesToStates(lastStatesComputedTime_);
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
res->length ((_CORBA_ULong)lastStatesComputed_.size ());
std::size_t i=0;
std::size_t id = 0;
for(std::vector::const_iterator cit = lastStatesComputed_.begin();
cit != lastStatesComputed_.end(); ++cit, ++id)
{
/*std::cout << "ID " << id;
cit->print();*/
const core::Configuration_t config = cit->configuration_;
_CORBA_ULong size = (_CORBA_ULong) config.size ();
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for (model::size_type j=0 ; j < config.size() ; ++j) {
dofArray[j] = config [j];
}
(*res) [(_CORBA_ULong)i] = floats;
++i;
}
return res;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short AddPath(core::PathPtr_t path, core::ProblemSolverPtr_t ps)
{
core::PathVectorPtr_t resPath = core::PathVector::create(path->outputSize(), path->outputDerivativeSize());
resPath->appendPath(path);
return ps->addPath(resPath);
}
CORBA::Short RbprmBuilder::limbRRT(double state1, double state2, unsigned short numOptimizations) throw (hpp::Error)
{
try
{
std::size_t s1((std::size_t)state1), s2((std::size_t)state2);
if(lastStatesComputed_.size () < s1 || lastStatesComputed_.size () < s2 )
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s1) + ", " + std::string(""+s2));
}
//create helper
// /interpolation::TimeConstraintHelper helper(fullBody(), problemSolver()->problem());
core::PathPtr_t path = interpolation::limbRRT(fullBody(),problemSolver()->problem(),
lastStatesComputed_.begin()+s1,lastStatesComputed_.begin()+s2, numOptimizations);
return AddPath(path,problemSolver());
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::limbRRTFromRootPath(double state1, double state2, unsigned short path, unsigned short numOptimizations) throw (hpp::Error)
{
try
{
std::size_t s1((std::size_t)state1), s2((std::size_t)state2);
if(lastStatesComputed_.size () < s1 || lastStatesComputed_.size () < s2 )
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s1) + ", " + std::string(""+s2));
}
unsigned int pathId = (unsigned int)(path);
if(problemSolver()->paths().size() <= pathId)
{
throw std::runtime_error ("No path computed, cannot interpolate ");
}
core::PathPtr_t path = interpolation::limbRRTFromPath(fullBody(),problemSolver()->problem(), problemSolver()->paths()[pathId],
lastStatesComputedTime_.begin()+s1,lastStatesComputedTime_.begin()+s2, numOptimizations);
return AddPath(path,problemSolver());
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::configToPath(const hpp::floatSeqSeq& configs) throw (hpp::Error)
{
T_Configuration positions = doubleDofArrayToConfig(fullBody()->device_, configs);
core::PathVectorPtr_t res = core::PathVector::create(fullBody()->device_->configSize(),
fullBody()->device_->numberDof());
//for(CIT_Configuration pit = positions.begin();pit != positions.end()-1; ++pit)
for(CIT_Configuration pit = positions.begin();pit != positions.end()-200; ++pit)
{
res->appendPath(makePath(fullBody()->device_,problemSolver()->problem(), *pit,*(pit+1)));
}
return problemSolver()->addPath(res);
}
CORBA::Short RbprmBuilder::comRRT(double state1, double state2, unsigned short path, unsigned short numOptimizations) throw (hpp::Error)
{
try
{
std::size_t s1((std::size_t)state1), s2((std::size_t)state2);
// temp
assert(s2 == s1 +1);
if(lastStatesComputed_.size () < s1 || lastStatesComputed_.size () < s2 )
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s1) + ", " + std::string(""+s2));
}
unsigned int pathId = (unsigned int)(path);
if(problemSolver()->paths().size() <= pathId)
{
throw std::runtime_error ("No path computed, cannot interpolate ");
}
core::PathPtr_t path = interpolation::comRRT(fullBody(),problemSolver()->problem(), problemSolver()->paths()[pathId],
*(lastStatesComputed_.begin()+s1),*(lastStatesComputed_.begin()+s2), numOptimizations);
return AddPath(path,problemSolver());
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
core::Configuration_t project_or_throw(rbprm::RbPrmFullBodyPtr_t fulllBody, const State& state, const fcl::Vec3f& targetCom, const bool checkCollision = false)
{
rbprm::projection::ProjectionReport rep;
if(checkCollision)
rep =rbprm::projection::projectToColFreeComPosition(fulllBody, targetCom, state);
else
rep= rbprm::projection::projectToComPosition(fulllBody, targetCom, state);
core::Configuration_t res = rep.result_.configuration_;
if(!rep.success_)
{
std::cout << "projection failed in project or throw " << std::endl;
throw std::runtime_error("could not project state on COM constraint");
}
return res;
}
hpp::floatSeq* RbprmBuilder::rrt(t_rrt functor, double state1, double state2,
unsigned short cT1, unsigned short cT2, unsigned short cT3,
unsigned short numOptimizations) throw (hpp::Error)
{
hppDout(notice,"########## begin rrt for state "<paths();
if(paths.size() -1 < std::max(cT1, std::max(cT2, cT3)))
{
throw std::runtime_error("in comRRTFromPos, at least one com trajectory is not present in problem solver");
}
State& state1=lastStatesComputed_[s1], state2=lastStatesComputed_[s2];
hppDout(notice,"start comRRTFromPos");
State s1Bis(state1);
hppDout(notice,"state1 = "<end().head<3>());
s1Bis.configuration_ = project_or_throw(fullBody(),s1Bis,paths[cT1]->end().head<3>(),true);
hppDout(notice,"state1 after projection= "<::const_iterator cit = s1Bis.contacts_.begin();cit!=s1Bis.contacts_.end(); ++ cit)
{
hppDout(notice,"contact : "<first<<" = "<second);
}
State s2Bis(state2);
hppDout(notice,"state2 = "<end().head<3>());
s2Bis.configuration_ = project_or_throw(fullBody(), s2Bis,paths[cT2]->end().head<3>(), true);
hppDout(notice,"state2 after projection= "<::const_iterator cit = s2Bis.contacts_.begin();cit!=s2Bis.contacts_.end(); ++ cit)
{
hppDout(notice,"contact : "<first<<" = "<second);
}
ValidationReportPtr_t rport (ValidationReportPtr_t(new CollisionValidationReport));
BasicConfigurationShooterPtr_t shooter = BasicConfigurationShooter::create(fullBody()->device_);
bool found = false;
for (int i = 0; i< 100 && !found; ++i)
{
fullBody()->device_->currentConfiguration(s1Bis.configuration_);
found =problemSolver()->problem()->configValidations()->validate(s1Bis.configuration_, rport);
if(!found)
{
std::cout << "could not project s1Bis without collision at state " << s1 << std::endl;
std::cout << "collission " << *rport << std::endl;
s1Bis.configuration_ = *shooter->shoot();
s1Bis.configuration_ = project_or_throw(fullBody(), s1Bis,paths[cT1]->end().head<3>());
std::cout << "projection succeedded " << paths[cT1]->end().head<3>() << std::endl;
}
}
if(found)
std::cout << "got out ! " << std::endl;
bool found2 = false;
for (int i = 0; i< 100 && found && !found2; ++i)
{
fullBody()->device_->currentConfiguration(s2Bis.configuration_);
found2 =problemSolver()->problem()->configValidations()->validate(s2Bis.configuration_, rport);
if(!found2)
{
std::cout << "could not project s2Bis without collision at state " << s1 << std::endl;
std::cout << "collission " << *rport << std::endl;
s2Bis.configuration_ = *shooter->shoot();
s2Bis.configuration_ = project_or_throw(fullBody(), s2Bis,paths[cT2]->end().head<3>());
std::cout << "projection succeedded " << paths[cT2]->end().head<3>() << std::endl;
}
}
if(!found || !found2)
{
std::cout << "could not project without collision at state " << s1 << std::endl;
throw std::runtime_error ("could not project without collision at state " + s1 );
}
core::PathVectorPtr_t resPath = core::PathVector::create(fullBody()->device_->configSize(), fullBody()->device_->numberDof());
hppDout(notice,"ComRRT : projections done. begin rrt");
try{
hppDout(notice,"begin comRRT states 1 and 1bis");
core::PathPtr_t p1 = interpolation::comRRT(fullBody(),problemSolver()->problem(), paths[cT1],
state1,s1Bis, numOptimizations,true);
hppDout(notice,"end comRRT");
// reduce path to remove extradof
core::SizeInterval_t interval(0, p1->initial().rows()-1);
core::SizeIntervals_t intervals;
intervals.push_back(interval);
PathPtr_t reducedPath = core::SubchainPath::create(p1,intervals);
resPath->appendPath(reducedPath);
pathsIds.push_back(AddPath(p1,problemSolver()));
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
try{
hppDout(notice,"begin comRRT between statebis 1 and 2");
core::PathPtr_t p2 =(*functor)(fullBody(),problemSolver(), paths[cT2],
s1Bis,s2Bis, numOptimizations,true);
if(!p2)
throw std::runtime_error("effectorRRT did not converge, no valid path found" );
hppDout(notice,"end comRRT");
pathsIds.push_back(AddPath(p2,problemSolver()));
// reduce path to remove extradof
core::SizeInterval_t interval(0, p2->initial().rows()-1);
core::SizeIntervals_t intervals;
intervals.push_back(interval);
PathPtr_t reducedPath = core::SubchainPath::create(p2,intervals);
resPath->appendPath(reducedPath);
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
//if(s2Bis.configuration_ != state2.configuration_)
try{
hppDout(notice,"begin comRRT states 2bis and 2");
core::PathPtr_t p3= interpolation::comRRT(fullBody(),problemSolver()->problem(), paths[cT3],
s2Bis,state2, numOptimizations,true);
hppDout(notice,"end comRRT");
// reduce path to remove extradof
core::SizeInterval_t interval(0, p3->initial().rows()-1);
core::SizeIntervals_t intervals;
intervals.push_back(interval);
PathPtr_t reducedPath = core::SubchainPath::create(p3,intervals);
resPath->appendPath(reducedPath);
pathsIds.push_back(AddPath(p3,problemSolver()));
std::cout << "PATH 3 OK " << std::endl;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
pathsIds.push_back(AddPath(resPath,problemSolver()));
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(pathsIds.size());
for(std::size_t i=0; i< pathsIds.size(); ++i)
{
(*dofArray)[(_CORBA_ULong)i] = pathsIds[i];
}
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::comRRTFromPos(double state1,
unsigned short cT1,
unsigned short cT2,
unsigned short cT3,
unsigned short numOptimizations) throw (hpp::Error)
{
return rrt(&interpolation::comRRT, state1,state1+1, cT1, cT2, cT3, numOptimizations);
}
hpp::floatSeq* RbprmBuilder::comRRTFromPosBetweenState(double state1, double state2,
unsigned short cT1,
unsigned short cT2,
unsigned short cT3,
unsigned short numOptimizations) throw (hpp::Error)
{
return rrt(&interpolation::comRRT, state1,state2, cT1, cT2, cT3, numOptimizations);
}
hpp::floatSeq* RbprmBuilder::effectorRRTFromPosBetweenState(double state1, double state2,
unsigned short cT1,
unsigned short cT2,
unsigned short cT3,
unsigned short numOptimizations) throw (hpp::Error)
{
return rrt(&interpolation::effectorRRT, state1,state2, cT1, cT2, cT3, numOptimizations);
}
hpp::floatSeq* RbprmBuilder::effectorRRT(double state1,
unsigned short cT1,
unsigned short cT2,
unsigned short cT3,
unsigned short numOptimizations) throw (hpp::Error)
{
return rrt(&interpolation::effectorRRT, state1, state1+1, cT1, cT2, cT3, numOptimizations);
}
hpp::floatSeq* RbprmBuilder::effectorRRTFromPath(double state1,
unsigned short refpath, double path_from, double path_to,
unsigned short cT1,
unsigned short cT2,
unsigned short cT3,
unsigned short numOptimizations,
const Names_t &trackedEffector) throw (hpp::Error)
{
try
{
std::vector pathsIds;
std::size_t s1((std::size_t)state1), s2((std::size_t)state1+1);
if(lastStatesComputed_.size () < s1 || lastStatesComputed_.size () < s2 )
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s1) + ", " + std::string(""+s2));
}
const core::PathVectors_t& paths = problemSolver()->paths();
if(paths.size() -1 < std::max(cT1, std::max(cT2, cT3)))
{
throw std::runtime_error("in comRRTFromPos, at least one com trajectory is not present in problem solver");
}
const State& state1=lastStatesComputed_[s1], state2=lastStatesComputed_[s2];
core::PathVectorPtr_t comPath = core::PathVector::create(3,3);
comPath->appendPath(paths[cT1]);
comPath->appendPath(paths[cT2]);
comPath->appendPath(paths[cT3]);
std::vector trackedEffectorNames = stringConversion(trackedEffector);
core::PathPtr_t refFullBody = problemSolver()->paths()[refpath]->extract(std::make_pair(path_from, path_to));
core::PathPtr_t p2 =interpolation::effectorRRTFromPath(fullBody(),problemSolver(), comPath,
state1,state2, numOptimizations,true, refFullBody, trackedEffectorNames);
if(!p2)
throw std::runtime_error("effectorRRT did not converge, no valid path found between states "+std::string(""+s1) + ", " + std::string(""+s2));
pathsIds.push_back(AddPath(p2,problemSolver()));
// reduce path to remove extradof
core::SizeInterval_t interval(0, p2->initial().rows()-1);
core::SizeIntervals_t intervals;
intervals.push_back(interval);
PathPtr_t reducedPath = core::SubchainPath::create(p2,intervals);
core::PathVectorPtr_t resPath = core::PathVector::create(fullBody()->device_->configSize(), fullBody()->device_->numberDof());
resPath->appendPath(reducedPath);
pathsIds.push_back(AddPath(resPath,problemSolver()));
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(pathsIds.size());
for(std::size_t i=0; i< pathsIds.size(); ++i)
{
(*dofArray)[(_CORBA_ULong)i] = pathsIds[i];
}
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::projectToCom(double state, const hpp::floatSeq& targetCom, unsigned short max_num_sample) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size () < state)
{
throw std::runtime_error ("did not find a states at indicated index: " + std::string(""+(std::size_t)(state)));
}
model::Configuration_t config = dofArrayToConfig (std::size_t(3), targetCom);
fcl::Vec3f comTarget; for(int i =0; i<3; ++i) comTarget[i] = config[i];
model::Configuration_t res = project_or_throw(fullBody(), lastStatesComputed_[state],comTarget);
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(res.rows());
for(std::size_t i=0; i< res.rows(); ++i)
{
(*dofArray)[(_CORBA_ULong)i] = res[i];
}
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
double RbprmBuilder::setConfigAtState(unsigned short state, const hpp::floatSeq& q) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size () < state)
{
throw std::runtime_error ("did not find a states at indicated index: " + std::string(""+(std::size_t)(state)));
}
model::Configuration_t res = dofArrayToConfig (fullBody()->device_, q);
if(lastStatesComputed_.size() <= state)
{
throw std::runtime_error ("Unexisting state in setConfigAtstate");
}
else
{
lastStatesComputed_[state].configuration_ = res;
lastStatesComputedTime_[state].second.configuration_ = res;
return 1.;
}
return 0.;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::getConfigAtState(unsigned short state) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size () < state)
{
throw std::runtime_error ("did not find a state at indicated index: " + std::string(""+(std::size_t)(state)));
}
model::Configuration_t res = lastStatesComputed_[state].configuration_;
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(res.rows());
for(std::size_t i=0; i< res.rows(); ++i)
{
(*dofArray)[(_CORBA_ULong)i] = res[i];
}
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
void RbprmBuilder::saveComputedStates(const char* outfilename) throw (hpp::Error)
{
std::stringstream ss;
ss << lastStatesComputed_.size()-2 << "\n";
std::vector::iterator cit = lastStatesComputed_.begin()+1;
int i = 0;
ss << i++ << " ";
cit->print(ss);
for(std::vector::iterator cit2 = lastStatesComputed_.begin()+2;
cit2 != lastStatesComputed_.end()-1; ++cit2, ++cit, ++i)
{
cit2->robustness = stability::IsStable(this->fullBody(), *cit2);
ss << i<< " ";
cit2->print(ss,*cit);
}
std::ofstream outfile;
outfile.open(outfilename);
if (outfile.is_open())
{
outfile << ss.rdbuf();
outfile.close();
}
else
{
std::string error("Cannot open outfile " + std::string(outfilename));
throw Error(error.c_str());
}
}
void RbprmBuilder::saveLimbDatabase(const char* limbname,const char* filepath) throw (hpp::Error)
{
try
{
std::string limbName(limbname);
std::ofstream fout;
fout.open(filepath, std::fstream::out | std::fstream::app);
rbprm::saveLimbInfoAndDatabase(fullBody()->GetLimbs().at(limbName),fout);
//sampling::saveLimbDatabase(fullBody()->GetLimbs().at(limbName)->sampleContainer_,fout);
fout.close();
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeqSeq* RbprmBuilder::getOctreeBoxes(const char* limbName, const hpp::floatSeq& configuration) throw (hpp::Error)
{
try
{
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
model::Configuration_t save = fullBody()->device_->currentConfiguration();
fullBody()->device_->currentConfiguration(config);
fullBody()->device_->computeForwardKinematics();
const std::map& boxes =
fullBody()->GetLimbs().at(std::string(limbName))->sampleContainer_.boxes_;
const double resolution = fullBody()->GetLimbs().at(std::string(limbName))->sampleContainer_.resolution_;
std::size_t i =0;
hpp::floatSeqSeq *res;
res = new hpp::floatSeqSeq ();
res->length ((_CORBA_ULong)boxes.size ());
for(std::map::const_iterator cit = boxes.begin();
cit != boxes.end();++cit,++i)
{
fcl::Vec3f position = (*cit->second).getTranslation();
_CORBA_ULong size = (_CORBA_ULong) 4;
double* dofArray = hpp::floatSeq::allocbuf(size);
hpp::floatSeq floats (size, size, dofArray, true);
//convert the config in dofseq
for (model::size_type j=0 ; j < 3 ; ++j) {
dofArray[j] = position[j];
}
dofArray[3] = resolution;
(*res) [(_CORBA_ULong)i] = floats;
}
fullBody()->device_->currentConfiguration(save);
fullBody()->device_->computeForwardKinematics();
return res;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::getOctreeBox(const char* limbName, double octreeNodeId) throw (hpp::Error)
{
try
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
long ocId ((long)octreeNodeId);
const T_Limb& limbs = fullBody()->GetLimbs();
T_Limb::const_iterator lit = limbs.find(std::string(limbName));
if(lit == limbs.end())
{
std::string err("No limb " + std::string(limbName) + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const std::map& boxes =
fullBody()->GetLimbs().at(std::string(limbName))->sampleContainer_.boxes_;
std::map::const_iterator cit = boxes.find(ocId);
if(cit == boxes.end())
{
std::stringstream ss; ss << ocId;
std::string err("No octree node with id " + ss.str() + "was defined for robot" + fullBody()->device_->name());
throw Error (err.c_str());
}
const fcl::CollisionObject* box = cit->second;
const fcl::Vec3f& pos = box->getTransform().getTranslation();
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(4);
for(std::size_t i=0; i< 3; ++i)
{
(*dofArray)[(_CORBA_ULong)i] = pos[i];
}
(*dofArray)[(_CORBA_ULong)3] = fullBody()->GetLimbs().at(std::string(limbName))->sampleContainer_.resolution_;
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::isLimbInContact(const char* limbName, double state1) throw (hpp::Error)
{
try
{
std::size_t s((std::size_t)state1);
if(lastStatesComputed_.size () < s)
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s));
}
const std::map & contacts = lastStatesComputed_[s].contactPositions_;
if(contacts.find(std::string(limbName))!= contacts.end())
return 1;
return 0;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::isLimbInContactIntermediary(const char* limbName, double state1) throw (hpp::Error)
{
try
{
std::size_t s((std::size_t)state1);
if(lastStatesComputed_.size () < s+1)
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s));
}
const State& state1 = lastStatesComputed_[s];
const State& state2 = lastStatesComputed_[s+1];
bool unused;
short unsigned cId = s;
const State state = intermediary(state1, state2,cId,unused);
const std::map & contacts = state.contactPositions_;
if(contacts.find(std::string(limbName))!= contacts.end())
return 1;
return 0;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::computeIntermediary(unsigned short stateFrom, unsigned short stateTo) throw (hpp::Error)
try
{
std::size_t s((std::size_t)stateFrom);
std::size_t s2((std::size_t)stateTo);
if(lastStatesComputed_.size () < s+1 || lastStatesComputed_.size () < s2+1)
{
throw std::runtime_error ("did not find a states at indicated indices: " + std::string(""+s));
}
const State& state1 = lastStatesComputed_[s];
const State& state2 = lastStatesComputed_[s2];
bool unused;
short unsigned cId = s;
const State state = intermediary(state1, state2,cId,unused);
lastStatesComputed_.push_back(state);
lastStatesComputedTime_.push_back(std::make_pair(-1., state));
return lastStatesComputed_.size() -1;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
hpp::floatSeq* RbprmBuilder::getOctreeTransform(const char* limbName, const hpp::floatSeq& configuration) throw (hpp::Error)
{
try{
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
model::Configuration_t save = fullBody()->device_->currentConfiguration();
fullBody()->device_->currentConfiguration(config);
fullBody()->device_->computeForwardKinematics();
const hpp::rbprm::RbPrmLimbPtr_t limb =fullBody()->GetLimbs().at(std::string(limbName));
const fcl::Transform3f transform = limb->octreeRoot();
const fcl::Quaternion3f& quat = transform.getQuatRotation();
const fcl::Vec3f& position = transform.getTranslation();
hpp::floatSeq *dofArray;
dofArray = new hpp::floatSeq();
dofArray->length(_CORBA_ULong(7));
for(std::size_t i=0; i< 3; i++)
(*dofArray)[(_CORBA_ULong)i] = position [i];
for(std::size_t i=0; i< 4; i++)
(*dofArray)[(_CORBA_ULong)i+3] = quat [i];
fullBody()->device_->currentConfiguration(save);
fullBody()->device_->computeForwardKinematics();
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::computeTargetTransform(const char* limbName, const hpp::floatSeq& configuration,
const hpp::floatSeq& p_a, const hpp::floatSeq& n_a) throw (hpp::Error)
{
try{
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
model::Configuration_t vec_conf = dofArrayToConfig (std::size_t(3), p_a);
fcl::Vec3f p; for(int i =0; i<3; ++i) p[i] = vec_conf[i];
vec_conf = dofArrayToConfig (std::size_t(3), n_a);
fcl::Vec3f n; for(int i =0; i<3; ++i) n[i] = vec_conf[i];
const hpp::rbprm::RbPrmLimbPtr_t limb =fullBody()->GetLimbs().at(std::string(limbName));
const fcl::Transform3f transform = projection::computeProjectionMatrix(fullBody(), limb, config, n,p);
const fcl::Quaternion3f& quat = transform.getQuatRotation();
const fcl::Vec3f& position = transform.getTranslation();
hpp::floatSeq *dofArray;
dofArray = new hpp::floatSeq();
dofArray->length(_CORBA_ULong(7));
for(std::size_t i=0; i< 3; i++)
(*dofArray)[(_CORBA_ULong)i] = position [i];
for(std::size_t i=0; i< 4; i++)
(*dofArray)[(_CORBA_ULong)i+3] = quat [i];
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::isConfigBalanced(const hpp::floatSeq& configuration, const hpp::Names_t& contactLimbs, double robustnessTreshold) throw (hpp::Error)
{
try{
rbprm::State testedState;
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
model::Configuration_t save = fullBody()->device_->currentConfiguration();
std::vector names = stringConversion(contactLimbs);
fullBody()->device_->currentConfiguration(config);
fullBody()->device_->computeForwardKinematics();
for(std::vector::const_iterator cit = names.begin(); cit != names.end();++cit)
{
const hpp::rbprm::RbPrmLimbPtr_t limb =fullBody()->GetLimbs().at(std::string(*cit));
testedState.contacts_[*cit] = true;
testedState.contactPositions_[*cit] = limb->effector_->currentTransformation().getTranslation();
testedState.contactRotation_[*cit] = limb->effector_->currentTransformation().getRotation();
// normal given by effector normal
const fcl::Vec3f normal = limb->effector_->currentTransformation().getRotation() * limb->normal_;
testedState.contactNormals_[*cit] = normal;
testedState.configuration_ = config;
++testedState.nbContacts;
}
fullBody()->device_->currentConfiguration(save);
fullBody()->device_->computeForwardKinematics();
if (stability::IsStable(fullBody(), testedState) >= robustnessTreshold)
{
return (CORBA::Short)(1);
}
else
{
return (CORBA::Short)(0);
}
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
double RbprmBuilder::isStateBalanced(unsigned short stateId) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size() <= stateId)
{
throw std::runtime_error ("Unexisting state " + std::string(""+(stateId)));
}
return stability::IsStable(fullBody(),lastStatesComputed_[stateId]);
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
void RbprmBuilder::runSampleAnalysis(const char* analysis, double isstatic) throw (hpp::Error)
{
try
{
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
std::string eval(analysis);
if (eval == "all")
{
for(sampling::T_evaluate::const_iterator analysisit = analysisFactory_->evaluate_.begin();
analysisit != analysisFactory_->evaluate_.end(); ++ analysisit)
{
for(T_Limb::const_iterator cit = fullBody()->GetLimbs().begin(); cit !=fullBody()->GetLimbs().end();++cit)
{
sampling::SampleDB & sampleDB =const_cast (cit->second->sampleContainer_);
sampling::addValue(sampleDB, analysisit->first, analysisit->second, isstatic > 0.5, isstatic > 0.5);
}
}
}
else
{
sampling::T_evaluate::const_iterator analysisit = analysisFactory_->evaluate_.find(std::string(eval));
if(analysisit == analysisFactory_->evaluate_.end())
{
std::string err("No analysis named " + eval + "was defined for analyzing database sample");
throw Error (err.c_str());
}
for(T_Limb::const_iterator cit = fullBody()->GetLimbs().begin(); cit !=fullBody()->GetLimbs().end();++cit)
{
sampling::SampleDB & sampleDB =const_cast (cit->second->sampleContainer_);
sampling::addValue(sampleDB, analysisit->first, analysisit->second, isstatic > 0.5, isstatic > 0.5);
}
}
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::runLimbSampleAnalysis(const char* limbname, const char* analysis, double isstatic) throw (hpp::Error)
{
try
{
rbprm::sampling::ValueBound bounds;
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
rbprm::RbPrmLimbPtr_t limb = fullBody()->GetLimb(limbname);
std::string eval(analysis);
if (eval == "all")
{
for(sampling::T_evaluate::const_iterator analysisit = analysisFactory_->evaluate_.begin();
analysisit != analysisFactory_->evaluate_.end(); ++ analysisit)
{
sampling::SampleDB & sampleDB =const_cast (limb->sampleContainer_);
sampling::addValue(sampleDB, analysisit->first, analysisit->second, isstatic > 0.5, isstatic > 0.5);
bounds = sampleDB.valueBounds_[analysisit->first];
}
}
else
{
sampling::T_evaluate::const_iterator analysisit = analysisFactory_->evaluate_.find(std::string(eval));
if(analysisit == analysisFactory_->evaluate_.end())
{
std::string err("No analysis named " + eval + "was defined for analyzing database sample");
throw Error (err.c_str());
}
sampling::SampleDB & sampleDB =const_cast (limb->sampleContainer_);
sampling::addValue(sampleDB, analysisit->first, analysisit->second, isstatic > 0.5, isstatic > 0.5);
bounds = sampleDB.valueBounds_[analysisit->first];
}
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(2);
(*dofArray)[0] = bounds.first;
(*dofArray)[1] = bounds.second;
return dofArray;
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
hpp::floatSeq* RbprmBuilder::evaluateConfig(const hpp::floatSeq& configuration,const hpp::floatSeq& direction) throw (hpp::Error){
if(!fullBodyLoaded_)
throw Error ("No full body robot was loaded");
if(fullBody()->GetLimbs().size()<= 0)
throw Error ("No Limbs defined for this robot");
fcl::Vec3f dir;
for(std::size_t i =0; i <3; ++i)
{
dir[i] = direction[(_CORBA_ULong)i];
}
dir = dir.normalize();
hpp::floatSeq* dofArray = new hpp::floatSeq();
dofArray->length(fullBody()->GetLimbs().size());
size_t id = 0;
model::Configuration_t config = dofArrayToConfig (fullBody()->device_, configuration);
for(T_Limb::const_iterator lit = fullBody()->GetLimbs().begin() ; lit != fullBody()->GetLimbs().end() ; ++lit){
sampling::Sample sample(lit->second->limb_, lit->second->effector_, config, lit->second->offset_,lit->second->limbOffset_, 0);
(*dofArray)[(_CORBA_ULong)id] = lit->second->evaluate_(sample,dir,lit->second->normal_,sampling::HeuristicParam());
hppDout(notice,"Evaluate for limb : "<second->effector_->name()<<" = "<<(*dofArray)[(_CORBA_ULong)id]);
hppDout(notice,"eff position = "<GetLimbs().at(limb), ns, n,p);
ValidationReportPtr_t rport (ValidationReportPtr_t(new CollisionValidationReport));
CollisionValidationPtr_t val = fullBody()->GetCollisionValidation();
rep.success_ = rep.success_ && val->validate(rep.result_.configuration_,rport);
if (!rep.success_ && max_num_sample > 0)
{
BasicConfigurationShooterPtr_t shooter = BasicConfigurationShooter::create(fullBody()->device_);
Configuration_t head = ns.configuration_.head<7>();
for(std::size_t i =0; !rep.success_ && i< max_num_sample; ++i)
{
ns.configuration_ = *shooter->shoot();
ns.configuration_.head<7>() = head;
rep = projection::projectStateToObstacle(fullBody(),limb, fullBody()->GetLimbs().at(limb), ns, n,p);
rep.success_ = rep.success_ && val->validate(rep.result_.configuration_,rport);
}
}
if(rep.success_)
{
lastStatesComputed_.push_back(rep.result_);
lastStatesComputedTime_.push_back(std::make_pair(-1., rep.result_));
return lastStatesComputed_.size() -1;
}
else
return -1;
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
CORBA::Short RbprmBuilder::removeContact(unsigned short stateId, const char* limbName) throw (hpp::Error)
{
try
{
if(lastStatesComputed_.size() <= stateId)
throw std::runtime_error ("Unexisting state " + std::string(""+(stateId)));
State ns = lastStatesComputed_[stateId];
const std::string limb(limbName);
ns.RemoveContact(limb);
lastStatesComputed_.push_back(ns);
lastStatesComputedTime_.push_back(std::make_pair(-1., ns));
return lastStatesComputed_.size() -1;
}
catch(std::runtime_error& e)
{
std::cout << "ERROR " << e.what() << std::endl;
throw Error(e.what());
}
}
void RbprmBuilder::dumpProfile(const char* logFile) throw (hpp::Error)
{
try
{
#ifdef PROFILE
RbPrmProfiler& watch = getRbPrmProfiler();
std::ofstream fout;
fout.open(logFile, std::fstream::out | std::fstream::app);
std::ostream* fp = &fout;
watch.report_all_and_count(2,*fp);
fout.close();
#else
throw(std::runtime_error("PROFILE PREPOC variable undefined, cannot dump profile"));
#endif
}
catch(std::runtime_error& e)
{
throw Error(e.what());
}
}
void RbprmBuilder::SetProblemSolverMap (hpp::corbaServer::ProblemSolverMapPtr_t psMap)
{
psMap_ = psMap;
//bind shooter creator to hide problem as a parameter and respect signature
//initNewProblemSolver();
}
void RbprmBuilder::initNewProblemSolver()
{
//bind shooter creator to hide problem as a parameter and respect signature
// add rbprmshooter
bindShooter_.problemSolver_ = problemSolver();
problemSolver()->add("RbprmShooter",
boost::bind(&BindShooter::create, boost::ref(bindShooter_), _1));
problemSolver()->add("RbprmPathValidation",
boost::bind(&BindShooter::createPathValidation, boost::ref(bindShooter_), _1, _2));
problemSolver()->add("RbprmDynamicPathValidation",
boost::bind(&BindShooter::createDynamicPathValidation, boost::ref(bindShooter_), _1, _2));
problemSolver()->add("DynamicPlanner",DynamicPlanner::createWithRoadmap);
problemSolver()->add ("RBPRMKinodynamic", SteeringMethodKinodynamic::create);
problemSolver()->add ("RandomShortcutDynamic", RandomShortcutDynamic::create);
problemSolver()->add ("OrientedPathOptimizer", OrientedPathOptimizer::create);
}
Names_t* RbprmBuilder::getAllLimbsNames()throw (hpp::Error)
{
if(!fullBodyLoaded_){
throw std::runtime_error ("fullBody not loaded");
}
std::vector names = rbprm::interpolation::extractEffectorsName(fullBody()->GetLimbs());
CORBA::ULong size = (CORBA::ULong) names.size ();
char** nameList = Names_t::allocbuf(size);
Names_t *limbsNames = new Names_t (size,size,nameList);
for (std::size_t i = 0 ; i < names.size() ; ++i){
nameList[i] = (char*) malloc (sizeof(char)*(names[i].length ()+1));
strcpy (nameList [i], names[i].c_str ());
}
return limbsNames;
}
bool RbprmBuilder::isKinematicsConstraintsVerified(const hpp::floatSeq &point)throw (hpp::Error){
if(!fullBodyLoaded_){
throw std::runtime_error ("fullBody not loaded");
}
Configuration_t pt_config = dofArrayToConfig(3,point);
fcl::Vec3f pt(pt_config[0],pt_config[1],pt_config[2]);
bool success(true);
bool successLimb;
hppDout(notice,"Test kinematic constraint for point : "<GetLimbs().begin() ; lit != fullBody()->GetLimbs().end() ; ++lit){
hppDout(notice,"for limb : "<first);
if(lit->second->kinematicConstraints_.first.size()==0){
hppDout(notice,"Kinematics constraints not initialized");
}else{
successLimb = verifyKinematicConstraints(lit->second->kinematicConstraints_,lit->second->effector_->currentTransformation(),pt);
hppDout(notice,"kinematic constraints verified : "<