5#ifndef __pinocchio_collision_parallel_broadphase_hpp__ 6#define __pinocchio_collision_parallel_broadphase_hpp__ 8#include "pinocchio/collision/pool/broadphase-manager.hpp" 9#include "pinocchio/collision/broadphase.hpp" 10#include "pinocchio/algorithm/geometry.hpp" 11#include "pinocchio/algorithm/parallel/omp.hpp" 19 typename BroadPhaseManagerDerived,
22 template<
typename,
int>
class JointCollectionTpl,
23 typename ConfigVectorPool,
24 typename CollisionVectorResult>
25 void computeCollisionsInParallel(
26 const size_t num_threads,
28 const Eigen::MatrixBase<ConfigVectorPool> & q,
29 const Eigen::MatrixBase<CollisionVectorResult> & res,
30 const bool stopAtFirstCollisionInConfiguration =
false,
31 const bool stopAtFirstCollisionInBatch =
false)
35 typedef typename Pool::Model Model;
36 typedef typename Pool::Data Data;
37 typedef typename Pool::ModelVector ModelVector;
38 typedef typename Pool::DataVector DataVector;
39 typedef typename Pool::BroadPhaseManager BroadPhaseManager;
40 typedef typename Pool::BroadPhaseManagerVector BroadPhaseManagerVector;
42 const ModelVector & models = pool.
getModels();
43 const Model & model_check = models[0];
44 DataVector & datas = pool.getDatas();
45 BroadPhaseManagerVector & broadphase_managers = pool.getBroadPhaseManagers();
46 CollisionVectorResult & res_ = res.const_cast_derived();
48 PINOCCHIO_CHECK_INPUT_ARGUMENT(num_threads <= pool.size(),
"The pool is too small");
49 PINOCCHIO_CHECK_ARGUMENT_SIZE(q.rows(), model_check.nq);
50 PINOCCHIO_CHECK_ARGUMENT_SIZE(q.cols(), res.size());
53 set_default_omp_options(num_threads);
54 const Eigen::DenseIndex batch_size = res.size();
56 if (stopAtFirstCollisionInBatch)
58 bool is_colliding =
false;
59 Eigen::DenseIndex i = 0;
60#pragma omp parallel for schedule(static) 61 for (i = 0; i < batch_size; i++)
66 const int thread_id = omp_get_thread_num();
67 const Model & model = models[(size_t)thread_id];
68 Data & data = datas[(size_t)thread_id];
69 BroadPhaseManager & manager = broadphase_managers[(size_t)thread_id];
71 computeCollisions(model, data, manager, q.col(i), stopAtFirstCollisionInConfiguration);
81 Eigen::DenseIndex i = 0;
82#pragma omp parallel for schedule(static) 83 for (i = 0; i < batch_size; i++)
85 const int thread_id = omp_get_thread_num();
86 const Model & model = models[(size_t)thread_id];
87 Data & data = datas[(size_t)thread_id];
88 BroadPhaseManager & manager = broadphase_managers[(size_t)thread_id];
90 computeCollisions(model, data, manager, q.col(i), stopAtFirstCollisionInConfiguration);
100 typename BroadPhaseManagerDerived,
103 template<
typename,
int>
class JointCollectionTpl>
104 void computeCollisionsInParallel(
105 const size_t num_threads,
107 const std::vector<Eigen::MatrixXd> & trajectories,
108 std::vector<VectorXb> & res,
109 const bool stopAtFirstCollisionInTrajectory =
false)
113 typedef typename Pool::Model Model;
114 typedef typename Pool::Data Data;
115 typedef typename Pool::ModelVector ModelVector;
116 typedef typename Pool::DataVector DataVector;
117 typedef typename Pool::BroadPhaseManager BroadPhaseManager;
118 typedef typename Pool::BroadPhaseManagerVector BroadPhaseManagerVector;
120 const ModelVector & models = pool.
getModels();
121 const Model & model_check = models[0];
122 DataVector & datas = pool.
getDatas();
125 PINOCCHIO_CHECK_INPUT_ARGUMENT(num_threads <= pool.
size(),
"The pool is too small");
126 PINOCCHIO_CHECK_ARGUMENT_SIZE(trajectories.size(), res.size());
128 for (
size_t k = 0; k < trajectories.size(); ++k)
130 PINOCCHIO_CHECK_ARGUMENT_SIZE(trajectories[k].cols(), res[k].size());
131 PINOCCHIO_CHECK_ARGUMENT_SIZE(trajectories[k].rows(), model_check.
nq);
134 set_default_omp_options(num_threads);
135 const int64_t batch_size =
static_cast<int64_t
>(trajectories.size());
143#pragma omp parallel for schedule(static) 144 for (omp_i = 0; omp_i < batch_size; omp_i++)
146 size_t i =
static_cast<size_t>(omp_i);
147 const int thread_id = omp_get_thread_num();
148 const Model & model = models[size_t(thread_id)];
149 Data & data = datas[(size_t)thread_id];
150 const Eigen::MatrixXd & current_traj = trajectories[i];
151 VectorXb & res_current_traj = res[i];
152 res_current_traj.fill(
false);
153 BroadPhaseManager & manager = broadphase_managers[size_t(thread_id)];
155 for (Eigen::DenseIndex col_id = 0; col_id < current_traj.cols(); ++col_id)
157 res_current_traj[col_id] =
159 if (res_current_traj[col_id] && stopAtFirstCollisionInTrajectory)
const BroadPhaseManagerVector & getBroadPhaseManagers() const
Access to the vector of broad phase managers.
size_t size() const
Returns the size of the pool.
const DataVector & getDatas() const
Returns the data vector.
const ModelVector & getModels() const
Returns the vector of models.
Main pinocchio namespace.
bool computeCollisions(BroadPhaseManagerBase< BroadPhaseManagerDerived > &broadphase_manager, CollisionCallBackBase *callback)
Calls computeCollision for every active pairs of GeometryData. This function assumes that updateGeome...
int nq
Dimension of the configuration vector representation.