Skip to content

Commit 146aad2

Browse files
iche033mergify[bot]
authored andcommitted
Support setting max contacts in dart's bullet collision detector (#593)
Signed-off-by: Ian Chen <ichen@openrobotics.org> (cherry picked from commit a4eee2f) # Conflicts: # dartsim/src/GzCollisionDetector.cc
1 parent d4a335a commit 146aad2

5 files changed

+193
-39
lines changed

dartsim/src/EntityManagementFeatures.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#include <dart/collision/CollisionFilter.hpp>
2929
#include <dart/collision/CollisionObject.hpp>
3030

31-
#include "GzOdeCollisionDetector.hh"
31+
#include "GzCollisionDetector.hh"
3232

3333
namespace gz {
3434
namespace physics {

dartsim/src/GzOdeCollisionDetector.cc dartsim/src/GzCollisionDetector.cc

+96-5
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@
2222

2323
#include <dart/collision/CollisionObject.hpp>
2424

25-
#include "GzOdeCollisionDetector.hh"
25+
#include "GzCollisionDetector.hh"
2626

2727
using namespace dart;
2828
using namespace collision;
2929

3030
/////////////////////////////////////////////////
31-
GzOdeCollisionDetector::GzOdeCollisionDetector()
32-
: OdeCollisionDetector()
31+
GzCollisionDetector::GzCollisionDetector()
3332
{
3433
}
3534

3635
/////////////////////////////////////////////////
36+
<<<<<<< HEAD:dartsim/src/GzOdeCollisionDetector.cc
3737
GzOdeCollisionDetector::Registrar<GzOdeCollisionDetector>
3838
GzOdeCollisionDetector::mRegistrar{
3939
GzOdeCollisionDetector::getStaticType(),
@@ -79,19 +79,22 @@ bool GzOdeCollisionDetector::collide(
7979

8080
/////////////////////////////////////////////////
8181
void GzOdeCollisionDetector::SetCollisionPairMaxContacts(
82+
=======
83+
void GzCollisionDetector::SetCollisionPairMaxContacts(
84+
>>>>>>> a4eee2f (Support setting max contacts in dart's bullet collision detector (#593)):dartsim/src/GzCollisionDetector.cc
8285
std::size_t _maxContacts)
8386
{
8487
this->maxCollisionPairContacts = _maxContacts;
8588
}
8689
8790
/////////////////////////////////////////////////
88-
std::size_t GzOdeCollisionDetector::GetCollisionPairMaxContacts() const
91+
std::size_t GzCollisionDetector::GetCollisionPairMaxContacts() const
8992
{
9093
return this->maxCollisionPairContacts;
9194
}
9295
9396
/////////////////////////////////////////////////
94-
void GzOdeCollisionDetector::LimitCollisionPairMaxContacts(
97+
void GzCollisionDetector::LimitCollisionPairMaxContacts(
9598
CollisionResult *_result)
9699
{
97100
if (this->maxCollisionPairContacts ==
@@ -143,3 +146,91 @@ void GzOdeCollisionDetector::LimitCollisionPairMaxContacts(
143146
}
144147
}
145148
}
149+
150+
/////////////////////////////////////////////////
151+
GzOdeCollisionDetector::GzOdeCollisionDetector()
152+
: OdeCollisionDetector(), GzCollisionDetector()
153+
{
154+
}
155+
156+
/////////////////////////////////////////////////
157+
GzOdeCollisionDetector::Registrar<GzOdeCollisionDetector>
158+
GzOdeCollisionDetector::mRegistrar{
159+
GzOdeCollisionDetector::getStaticType(),
160+
[]() -> std::shared_ptr<GzOdeCollisionDetector> {
161+
return GzOdeCollisionDetector::create();
162+
}};
163+
164+
/////////////////////////////////////////////////
165+
std::shared_ptr<GzOdeCollisionDetector> GzOdeCollisionDetector::create()
166+
{
167+
return std::shared_ptr<GzOdeCollisionDetector>(new GzOdeCollisionDetector());
168+
}
169+
170+
/////////////////////////////////////////////////
171+
bool GzOdeCollisionDetector::collide(
172+
CollisionGroup *_group,
173+
const CollisionOption &_option,
174+
CollisionResult *_result)
175+
{
176+
bool ret = OdeCollisionDetector::collide(_group, _option, _result);
177+
this->LimitCollisionPairMaxContacts(_result);
178+
return ret;
179+
}
180+
181+
/////////////////////////////////////////////////
182+
bool GzOdeCollisionDetector::collide(
183+
CollisionGroup *_group1,
184+
CollisionGroup *_group2,
185+
const CollisionOption &_option,
186+
CollisionResult *_result)
187+
{
188+
bool ret = OdeCollisionDetector::collide(_group1, _group2, _option, _result);
189+
this->LimitCollisionPairMaxContacts(_result);
190+
return ret;
191+
}
192+
193+
/////////////////////////////////////////////////
194+
GzBulletCollisionDetector::GzBulletCollisionDetector()
195+
: BulletCollisionDetector(), GzCollisionDetector()
196+
{
197+
}
198+
199+
/////////////////////////////////////////////////
200+
GzBulletCollisionDetector::Registrar<GzBulletCollisionDetector>
201+
GzBulletCollisionDetector::mRegistrar{
202+
GzBulletCollisionDetector::getStaticType(),
203+
[]() -> std::shared_ptr<GzBulletCollisionDetector> {
204+
return GzBulletCollisionDetector::create();
205+
}};
206+
207+
/////////////////////////////////////////////////
208+
std::shared_ptr<GzBulletCollisionDetector> GzBulletCollisionDetector::create()
209+
{
210+
return std::shared_ptr<GzBulletCollisionDetector>(
211+
new GzBulletCollisionDetector());
212+
}
213+
214+
/////////////////////////////////////////////////
215+
bool GzBulletCollisionDetector::collide(
216+
CollisionGroup *_group,
217+
const CollisionOption &_option,
218+
CollisionResult *_result)
219+
{
220+
bool ret = BulletCollisionDetector::collide(_group, _option, _result);
221+
this->LimitCollisionPairMaxContacts(_result);
222+
return ret;
223+
}
224+
225+
/////////////////////////////////////////////////
226+
bool GzBulletCollisionDetector::collide(
227+
CollisionGroup *_group1,
228+
CollisionGroup *_group2,
229+
const CollisionOption &_option,
230+
CollisionResult *_result)
231+
{
232+
bool ret = BulletCollisionDetector::collide(
233+
_group1, _group2, _option, _result);
234+
this->LimitCollisionPairMaxContacts(_result);
235+
return ret;
236+
}

dartsim/src/GzOdeCollisionDetector.hh dartsim/src/GzCollisionDetector.hh

+64-22
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,51 @@
1515
*
1616
*/
1717

18+
#ifndef GZ_PHYSICS_DARTSIM_SRC_GZCOLLISIONDETECTOR_HH_
19+
#define GZ_PHYSICS_DARTSIM_SRC_GZCOLLISIONDETECTOR_HH_
20+
21+
#include <cstdio>
1822
#include <limits>
1923
#include <memory>
2024

25+
#include <dart/collision/CollisionResult.hpp>
26+
#include <dart/collision/bullet/BulletCollisionDetector.hpp>
2127
#include <dart/collision/ode/OdeCollisionDetector.hpp>
2228

2329
namespace dart {
2430
namespace collision {
2531

26-
class GzOdeCollisionDetector : public dart::collision::OdeCollisionDetector
32+
class GzCollisionDetector
33+
{
34+
/// \brief Set the maximum number of contacts between a pair of collision
35+
/// objects
36+
/// \param[in] _maxContacts Maximum number of contacts between a pair of
37+
/// collision objects.
38+
public: virtual void SetCollisionPairMaxContacts(std::size_t _maxContacts);
39+
40+
/// \brief Get the maximum number of contacts between a pair of collision
41+
/// objects
42+
/// \return Maximum number of contacts between a pair of collision objects.
43+
public: virtual std::size_t GetCollisionPairMaxContacts() const;
44+
45+
/// Constructor
46+
protected: GzCollisionDetector();
47+
48+
/// \brief Limit max number of contacts between a pair of collision objects.
49+
/// The function modifies the contacts vector inside the CollisionResult
50+
/// object to cap the number of contacts for each collision pair based on the
51+
/// maxCollisionPairContacts value
52+
protected: virtual void LimitCollisionPairMaxContacts(
53+
CollisionResult *_result);
54+
55+
/// \brief Maximum number of contacts between a pair of collision objects.
56+
protected: std::size_t maxCollisionPairContacts =
57+
std::numeric_limits<std::size_t>::max();
58+
};
59+
60+
class GzOdeCollisionDetector :
61+
public dart::collision::OdeCollisionDetector,
62+
public dart::collision::GzCollisionDetector
2763
{
2864
// Documentation inherited
2965
public: bool collide(
@@ -38,36 +74,42 @@ class GzOdeCollisionDetector : public dart::collision::OdeCollisionDetector
3874
const CollisionOption& option = CollisionOption(false, 1u, nullptr),
3975
CollisionResult* result = nullptr) override;
4076

41-
/// \brief Set the maximum number of contacts between a pair of collision
42-
/// objects
43-
/// \param[in] _maxContacts Maximum number of contacts between a pair of
44-
/// collision objects.
45-
public: void SetCollisionPairMaxContacts(std::size_t _maxContacts);
46-
47-
/// \brief Get the maximum number of contacts between a pair of collision
48-
/// objects
49-
/// \return Maximum number of contacts between a pair of collision objects.
50-
public: std::size_t GetCollisionPairMaxContacts() const;
51-
52-
5377
/// \brief Create the GzOdeCollisionDetector
5478
public: static std::shared_ptr<GzOdeCollisionDetector> create();
5579

5680
/// Constructor
5781
protected: GzOdeCollisionDetector();
5882

59-
/// \brief Limit max number of contacts between a pair of collision objects.
60-
/// The function modifies the contacts vector inside the CollisionResult
61-
/// object to cap the number of contacts for each collision pair based on the
62-
/// maxCollisionPairContacts value
63-
private: void LimitCollisionPairMaxContacts(CollisionResult *_result);
83+
private: static Registrar<GzOdeCollisionDetector> mRegistrar;
84+
};
6485

65-
/// \brief Maximum number of contacts between a pair of collision objects.
66-
private: std::size_t maxCollisionPairContacts =
67-
std::numeric_limits<std::size_t>::max();
86+
class GzBulletCollisionDetector :
87+
public dart::collision::BulletCollisionDetector,
88+
public dart::collision::GzCollisionDetector
89+
{
90+
// Documentation inherited
91+
public: bool collide(
92+
CollisionGroup* group,
93+
const CollisionOption& option = CollisionOption(false, 1u, nullptr),
94+
CollisionResult* result = nullptr) override;
6895

69-
private: static Registrar<GzOdeCollisionDetector> mRegistrar;
96+
// Documentation inherited
97+
public: bool collide(
98+
CollisionGroup* group1,
99+
CollisionGroup* group2,
100+
const CollisionOption& option = CollisionOption(false, 1u, nullptr),
101+
CollisionResult* result = nullptr) override;
102+
103+
/// \brief Create the GzBulletCollisionDetector
104+
public: static std::shared_ptr<GzBulletCollisionDetector> create();
105+
106+
/// Constructor
107+
protected: GzBulletCollisionDetector();
108+
109+
private: static Registrar<GzBulletCollisionDetector> mRegistrar;
70110
};
71111

72112
}
73113
}
114+
115+
#endif

dartsim/src/WorldFeatures.cc

+17-11
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
#include <gz/common/Console.hh>
3131

32-
#include "GzOdeCollisionDetector.hh"
32+
#include "GzCollisionDetector.hh"
3333
#include "WorldFeatures.hh"
3434

3535

@@ -46,7 +46,7 @@ void WorldFeatures::SetWorldCollisionDetector(
4646
world->getConstraintSolver()->getCollisionDetector();
4747
if (_collisionDetector == "bullet")
4848
{
49-
collisionDetector = dart::collision::BulletCollisionDetector::create();
49+
collisionDetector = dart::collision::GzBulletCollisionDetector::create();
5050
}
5151
else if (_collisionDetector == "fcl")
5252
{
@@ -105,17 +105,17 @@ void WorldFeatures::SetWorldCollisionPairMaxContacts(
105105
auto collisionDetector =
106106
world->getConstraintSolver()->getCollisionDetector();
107107

108-
auto odeCollisionDetector =
109-
std::dynamic_pointer_cast<dart::collision::GzOdeCollisionDetector>(
108+
auto gzCollisionDetector =
109+
std::dynamic_pointer_cast<dart::collision::GzCollisionDetector>(
110110
collisionDetector);
111-
if (odeCollisionDetector)
111+
if (gzCollisionDetector)
112112
{
113-
odeCollisionDetector->SetCollisionPairMaxContacts(_maxContacts);
113+
gzCollisionDetector->SetCollisionPairMaxContacts(_maxContacts);
114114
}
115115
else
116116
{
117117
gzwarn << "Currently max contacts feature is only supported by the "
118-
<< "ode collision detector in dartsim." << std::endl;
118+
<< "bullet and ode collision detector in dartsim." << std::endl;
119119
}
120120
}
121121

@@ -126,12 +126,18 @@ std::size_t WorldFeatures::GetWorldCollisionPairMaxContacts(
126126
auto world = this->ReferenceInterface<dart::simulation::World>(_id);
127127
auto collisionDetector =
128128
world->getConstraintSolver()->getCollisionDetector();
129-
auto odeCollisionDetector =
130-
std::dynamic_pointer_cast<dart::collision::GzOdeCollisionDetector>(
129+
130+
auto gzCollisionDetector =
131+
std::dynamic_pointer_cast<dart::collision::GzCollisionDetector>(
131132
collisionDetector);
132-
if (odeCollisionDetector)
133+
if (gzCollisionDetector)
133134
{
134-
return odeCollisionDetector->GetCollisionPairMaxContacts();
135+
return gzCollisionDetector->GetCollisionPairMaxContacts();
136+
}
137+
else
138+
{
139+
gzwarn << "Currently max contacts feature is only supported by the "
140+
<< "bullet and ode collision detector in dartsim." << std::endl;
135141
}
136142

137143
return 0u;

test/common_test/simulation_features.cc

+15
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ TYPED_TEST(SimulationFeaturesContactsTest, Contacts)
228228
// The features that an engine must have to be loaded by this loader.
229229
struct FeaturesCollisionPairMaxContacts : gz::physics::FeatureList<
230230
gz::physics::sdf::ConstructSdfWorld,
231+
gz::physics::CollisionDetector,
231232
gz::physics::CollisionPairMaxContacts,
232233
gz::physics::FindFreeGroupFeature,
233234
gz::physics::ForwardStep,
@@ -282,6 +283,20 @@ TYPED_TEST(SimulationFeaturesCollisionPairMaxContactsTest,
282283

283284
contacts = world->GetContactsFromLastStep();
284285
EXPECT_EQ(0u, contacts.size());
286+
287+
if (name == "gz::physics::dartsim::Plugin")
288+
{
289+
EXPECT_EQ("ode", world->GetCollisionDetector());
290+
world->SetCollisionDetector("bullet");
291+
EXPECT_EQ("bullet", world->GetCollisionDetector());
292+
world->SetCollisionPairMaxContacts(1u);
293+
EXPECT_EQ(1u, world->GetCollisionPairMaxContacts());
294+
checkedOutput = StepWorld<FeaturesCollisionPairMaxContacts>(
295+
world, true, 1).first;
296+
EXPECT_TRUE(checkedOutput);
297+
contacts = world->GetContactsFromLastStep();
298+
EXPECT_EQ(5u, contacts.size());
299+
}
285300
}
286301
}
287302

0 commit comments

Comments
 (0)