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,
27 BroadPhaseManagerPoolBase<BroadPhaseManagerDerived, Scalar, Options, JointCollectionTpl> & pool,
28 const Eigen::MatrixBase<ConfigVectorPool> & q,
29 const Eigen::MatrixBase<CollisionVectorResult> & res,
30 const bool stopAtFirstCollisionInConfiguration =
false,
31 const bool stopAtFirstCollisionInBatch =
false)
33 typedef BroadPhaseManagerPoolBase<BroadPhaseManagerDerived, Scalar, Options, JointCollectionTpl>
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(
108 std::vector<VectorXb> & res,
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();
125 PINOCCHIO_CHECK_INPUT_ARGUMENT(
num_threads <=
pool.size(),
"The pool is too small");
126 PINOCCHIO_CHECK_ARGUMENT_SIZE(
trajectories.size(), res.size());
130 PINOCCHIO_CHECK_ARGUMENT_SIZE(
trajectories[
k].cols(), res[
k].size());
143#pragma omp parallel for schedule(static)
146 size_t i =
static_cast<size_t>(
omp_i);
Main pinocchio namespace.
bool computeCollisions(BroadPhaseManagerBase< BroadPhaseManagerDerived > &broadphase_manager, CollisionCallBackBase *callback)
Calls computeCollision for every active pairs of GeometryData. This function assumes that updateGeome...