9#ifndef CROCODDYL_MULTIBODY_RESIDUALS_PAIR_COLLISION_HPP_ 
   10#define CROCODDYL_MULTIBODY_RESIDUALS_PAIR_COLLISION_HPP_ 
   12#ifdef PINOCCHIO_WITH_HPP_FCL 
   14#include <pinocchio/multibody/geometry.hpp> 
   16#include "crocoddyl/core/residual-base.hpp" 
   17#include "crocoddyl/multibody/data/multibody.hpp" 
   18#include "crocoddyl/multibody/states/multibody.hpp" 
   40template <
typename _Scalar>
 
   41class ResidualModelPairCollisionTpl : 
public ResidualModelAbstractTpl<_Scalar> {
 
   43  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
   45  typedef _Scalar Scalar;
 
   46  typedef MathBaseTpl<Scalar> MathBase;
 
   47  typedef ResidualModelAbstractTpl<Scalar> Base;
 
   48  typedef ResidualDataPairCollisionTpl<Scalar> Data;
 
   49  typedef ResidualDataAbstractTpl<Scalar> ResidualDataAbstract;
 
   50  typedef StateMultibodyTpl<Scalar> StateMultibody;
 
   51  typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
 
   52  typedef pinocchio::GeometryModel GeometryModel;
 
   54  typedef typename MathBase::VectorXs VectorXs;
 
   55  typedef typename MathBase::MatrixXs MatrixXs;
 
   68  ResidualModelPairCollisionTpl(std::shared_ptr<StateMultibody> state,
 
   70                                std::shared_ptr<GeometryModel> geom_model,
 
   71                                const pinocchio::PairIndex pair_id,
 
   72                                const pinocchio::JointIndex joint_id);
 
   74  virtual ~ResidualModelPairCollisionTpl();
 
   83  virtual void calc(
const std::shared_ptr<ResidualDataAbstract> &data,
 
   84                    const Eigen::Ref<const VectorXs> &x,
 
   85                    const Eigen::Ref<const VectorXs> &u);
 
   94  virtual void calcDiff(
const std::shared_ptr<ResidualDataAbstract> &data,
 
   95                        const Eigen::Ref<const VectorXs> &x,
 
   96                        const Eigen::Ref<const VectorXs> &u);
 
   98  virtual std::shared_ptr<ResidualDataAbstract> createData(
 
   99      DataCollectorAbstract *
const data);
 
  104  const pinocchio::GeometryModel &get_geometry() 
const;
 
  109  pinocchio::PairIndex get_pair_id() 
const;
 
  114  void set_pair_id(
const pinocchio::PairIndex pair_id);
 
  119  using Base::v_dependent_;
 
  122  typename StateMultibody::PinocchioModel
 
  124  std::shared_ptr<pinocchio::GeometryModel>
 
  128  pinocchio::JointIndex joint_id_;  
 
  132template <
typename _Scalar>
 
  133struct ResidualDataPairCollisionTpl : 
public ResidualDataAbstractTpl<_Scalar> {
 
  134  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  136  typedef _Scalar Scalar;
 
  137  typedef MathBaseTpl<Scalar> MathBase;
 
  138  typedef ResidualDataAbstractTpl<Scalar> Base;
 
  139  typedef StateMultibodyTpl<Scalar> StateMultibody;
 
  140  typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
 
  142  typedef typename MathBase::Matrix6xs Matrix6xs;
 
  143  typedef typename MathBase::Vector3s Vector3s;
 
  145  template <
template <
typename Scalar> 
class Model>
 
  146  ResidualDataPairCollisionTpl(Model<Scalar> *
const model,
 
  147                               DataCollectorAbstract *
const data)
 
  149        geometry(pinocchio::GeometryData(model->get_geometry())),
 
  150        J(6, model->get_state()->get_nv()) {
 
  154    DataCollectorMultibodyTpl<Scalar> *d =
 
  155        dynamic_cast<DataCollectorMultibodyTpl<Scalar> *
>(shared);
 
  158          "Invalid argument: the shared data should be derived from " 
  159          "DataCollectorActMultibodyTpl");
 
  162    pinocchio = d->pinocchio;
 
  164  pinocchio::GeometryData geometry;       
 
  165  pinocchio::DataTpl<Scalar> *pinocchio;  
 
  179#include "crocoddyl/multibody/residuals/pair-collision.hxx"