dart
CollisionDetector.hpp
1 /*
2  * Copyright (c) 2011-2021, The DART development contributors
3  * All rights reserved.
4  *
5  * The list of contributors can be found at:
6  * https://github.com/dartsim/dart/blob/master/LICENSE
7  *
8  * This file is provided under the following "BSD-style" License:
9  * Redistribution and use in source and binary forms, with or
10  * without modification, are permitted provided that the following
11  * conditions are met:
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef DART_COLLISION_COLLISIONDETECTOR_HPP_
34 #define DART_COLLISION_COLLISIONDETECTOR_HPP_
35 
36 #include <map>
37 #include <vector>
38 
39 #include <Eigen/Dense>
40 
41 #include "dart/common/Factory.hpp"
42 #include "dart/dynamics/CollisionOption.hpp"
43 #include "dart/dynamics/CollisionResult.hpp"
44 #include "dart/dynamics/Contact.hpp"
45 #include "dart/dynamics/DistanceOption.hpp"
46 #include "dart/dynamics/DistanceResult.hpp"
47 #include "dart/dynamics/RaycastOption.hpp"
48 #include "dart/dynamics/RaycastResult.hpp"
49 #include "dart/dynamics/SmartPointer.hpp"
50 
51 namespace dart {
52 namespace collision {
53 
54 class CollisionObject;
55 
56 class CollisionDetector : public std::enable_shared_from_this<CollisionDetector>
57 {
58 public:
59  friend class CollisionObject;
60  friend class CollisionGroup;
61 
62  using Factory = common::Factory<
63  std::string,
65  std::shared_ptr<CollisionDetector>>;
66 
68 
69  template <typename Derived>
71  std::string,
73  Derived,
74  std::shared_ptr<CollisionDetector>>;
75 
77  static Factory* getFactory();
78 
80  virtual ~CollisionDetector() = default;
81 
84  virtual std::shared_ptr<CollisionDetector> cloneWithoutCollisionObjects()
85  const = 0;
86 
88  virtual const std::string& getType() const = 0;
89 
91  virtual std::unique_ptr<CollisionGroup> createCollisionGroup() = 0;
92 
98  std::shared_ptr<CollisionGroup> createCollisionGroupAsSharedPtr();
99 
109  template <typename... Args>
110  std::unique_ptr<CollisionGroup> createCollisionGroup(const Args&... args);
111 
113  template <typename... Args>
114  std::shared_ptr<CollisionGroup> createCollisionGroupAsSharedPtr(
115  const Args&... args);
116 
120  virtual bool collide(
121  CollisionGroup* group,
122  const CollisionOption& option = CollisionOption(false, 1u, nullptr),
123  CollisionResult* result = nullptr)
124  = 0;
125 
129  virtual bool collide(
130  CollisionGroup* group1,
131  CollisionGroup* group2,
132  const CollisionOption& option = CollisionOption(false, 1u, nullptr),
133  CollisionResult* result = nullptr)
134  = 0;
135 
144  virtual double distance(
145  CollisionGroup* group,
146  const DistanceOption& option = DistanceOption(false, 0.0, nullptr),
147  DistanceResult* result = nullptr)
148  = 0;
149 
162  virtual double distance(
163  CollisionGroup* group1,
164  CollisionGroup* group2,
165  const DistanceOption& option = DistanceOption(false, 0.0, nullptr),
166  DistanceResult* result = nullptr)
167  = 0;
168 
177  virtual bool raycast(
178  CollisionGroup* group,
179  const Eigen::Vector3d& from,
180  const Eigen::Vector3d& to,
181  const RaycastOption& option = RaycastOption(),
182  RaycastResult* result = nullptr);
183 
184 protected:
188 
190  CollisionDetector() = default;
191 
194  std::shared_ptr<CollisionObject> claimCollisionObject(
195  const dynamics::ShapeFrame* shapeFrame);
196 
198  virtual std::unique_ptr<CollisionObject> createCollisionObject(
199  const dynamics::ShapeFrame* shapeFrame)
200  = 0;
201 
203  virtual void refreshCollisionObject(CollisionObject* object) = 0;
204 
206  virtual void notifyCollisionObjectDestroying(CollisionObject* object);
207 
208 protected:
209  std::unique_ptr<CollisionObjectManager> mCollisionObjectManager;
210 };
211 
212 //==============================================================================
214 {
215 public:
218 
221  virtual std::shared_ptr<CollisionObject> claimCollisionObject(
222  const dynamics::ShapeFrame* shapeFrame)
223  = 0;
224 
226  CollisionDetector* getCollisionDetector();
227 
229  virtual ~CollisionObjectManager() = default;
230 
231 protected:
232  CollisionDetector* mCollisionDetector;
233 };
234 
235 //==============================================================================
238 {
239 public:
242 
243  // Documentation inherited
244  std::shared_ptr<CollisionObject> claimCollisionObject(
245  const dynamics::ShapeFrame* shapeFrame);
246 
247 private:
250  struct CollisionObjectDeleter final
251  {
252  ManagerForUnsharableCollisionObjects* mCollisionObjectManager;
253 
254  CollisionObjectDeleter(ManagerForUnsharableCollisionObjects* mgr);
255 
256  void operator()(CollisionObject* object) const;
257  };
258 
259  const CollisionObjectDeleter mCollisionObjectDeleter;
260 };
261 
262 //==============================================================================
265 {
266 public:
269 
272 
273  // Documentation inherited
274  std::shared_ptr<CollisionObject> claimCollisionObject(
275  const dynamics::ShapeFrame* shapeFrame);
276 
277 private:
280  struct CollisionObjectDeleter final
281  {
282  ManagerForSharableCollisionObjects* mCollisionObjectManager;
283 
284  CollisionObjectDeleter(ManagerForSharableCollisionObjects* mgr);
285 
286  void operator()(CollisionObject* object) const;
287  };
288 
289  const CollisionObjectDeleter mCollisionObjectDeleter;
290 
291  using CollisionObjectMap
292  = std::map<const dynamics::ShapeFrame*, std::weak_ptr<CollisionObject>>;
293 
294  CollisionObjectMap mCollisionObjectMap;
295 };
296 
297 } // namespace collision
298 } // namespace dart
299 
300 #include "dart/dynamics/detail/CollisionDetector.hpp"
301 
302 #endif // DART_COLLISION_COLLISIONDETECTOR_HPP_
Helper class to register a object creator function to the Singleton.
Definition: Factory.hpp:124
virtual void refreshCollisionObject(CollisionObject *object)=0
Update the collision geometry of a ShapeFrame.
virtual bool collide(CollisionGroup *group, const CollisionOption &option=CollisionOption(false, 1u, nullptr), CollisionResult *result=nullptr)=0
Perform collision check for a single group.
Definition: DistanceResult.hpp:46
Definition: Aspect.cpp:40
virtual void notifyCollisionObjectDestroying(CollisionObject *object)
Notify that a CollisionObject is destroying. Do nothing by default.
Definition: CollisionDetector.cpp:84
Definition: CollisionOption.hpp:44
CollisionDetector()=default
Constructor.
virtual std::unique_ptr< CollisionObject > createCollisionObject(const dynamics::ShapeFrame *shapeFrame)=0
Create CollisionObject.
Definition: CollisionResult.hpp:51
Definition: DistanceOption.hpp:44
virtual const std::string & getType() const =0
Return collision detection engine type as a std::string.
Definition: CollisionObject.hpp:43
static Factory * getFactory()
Returns the singleton factory.
Definition: CollisionDetector.cpp:47
Definition: CollisionGroup.hpp:51
virtual ~CollisionDetector()=default
Destructor.
Definition: RaycastResult.hpp:62
Singleton template class.
Definition: Singleton.hpp:50
virtual bool raycast(CollisionGroup *group, const Eigen::Vector3d &from, const Eigen::Vector3d &to, const RaycastOption &option=RaycastOption(), RaycastResult *result=nullptr)
Performs raycast to a collision group.
Definition: CollisionDetector.cpp:60
Definition: ShapeFrame.hpp:189
Definition: RaycastOption.hpp:42
std::shared_ptr< CollisionGroup > createCollisionGroupAsSharedPtr()
Helper function that creates and returns CollisionGroup as a shared_ptr.
Definition: CollisionDetector.cpp:54
Definition: CollisionDetector.hpp:56
Implementation of the Abstract Factory Pattern.
Definition: Factory.hpp:62
virtual std::shared_ptr< CollisionDetector > cloneWithoutCollisionObjects() const =0
Create a clone of this CollisionDetector.
std::shared_ptr< CollisionObject > claimCollisionObject(const dynamics::ShapeFrame *shapeFrame)
Claim CollisionObject associated with shapeFrame.
Definition: CollisionDetector.cpp:73
virtual std::unique_ptr< CollisionGroup > createCollisionGroup()=0
Create a collision group.
virtual double distance(CollisionGroup *group, const DistanceOption &option=DistanceOption(false, 0.0, nullptr), DistanceResult *result=nullptr)=0
Get the minimum signed distance between the Shape pairs in the given CollisionGroup.