Skip to content

Commit

Permalink
Update BVH during fusestatic. Fixes #1069 and #1577.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 631748750
Change-Id: I4e1ae01207568c90fc49bcd7d9f760f5187f1afa
  • Loading branch information
quagla authored and Copybara-Service committed May 8, 2024
1 parent 4eca3b0 commit 96844db
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 9 deletions.
9 changes: 9 additions & 0 deletions doc/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@
Changelog
=========

Upcoming version (not yet released)
-----------------------------------

Bug fixes
^^^^^^^^^

1. Fixed a bug the could cause collisions to be missed when :ref:`fusestatic<compiler-fusestatic>` is enabled, as is
often the case for URDF imports.

Version 3.1.5 (May 7, 2024)
---------------------------

Expand Down
8 changes: 7 additions & 1 deletion src/user/user_model.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2969,12 +2969,18 @@ void mjCModel::FuseStatic(void) {
// recompute parent contype, conaffinity, and margin
par->contype = par->conaffinity = 0;
par->margin = 0;
for (const auto& geom : geoms) {
for (const auto& geom : par->geoms) {
par->contype |= geom->contype;
par->conaffinity |= geom->conaffinity;
par->margin = mju_max(par->margin, geom->margin);
}

// recompute BVH
int nbvhfuse = body->tree.nbvh + par->tree.nbvh;
par->ComputeBVH();
nbvhstatic += par->tree.nbvh - nbvhfuse;
nbvh += par->tree.nbvh - nbvhfuse;

//------------- delete body (without deleting children)

// delete allocation
Expand Down
27 changes: 19 additions & 8 deletions src/user/user_objects.cc
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ void mjCBoundingVolumeHierarchy::Set(mjtNum ipos_element[3], mjtNum iquat_elemen

void mjCBoundingVolumeHierarchy::AllocateBoundingVolumes(int nleaf) {
nbvh = 0;
bvh.clear();
child.clear();
nodeid.clear();
level.clear();
Expand Down Expand Up @@ -1333,6 +1334,23 @@ void mjCBody::MakeInertialExplicit() {
}



// compute bounding volume hierarchy
void mjCBody::ComputeBVH() {
if (geoms.empty()) {
return;
}

tree.Set(ipos, iquat);
tree.AllocateBoundingVolumes(geoms.size());
for (int i=0; i<geoms.size(); i++) {
geoms[i]->SetBoundingVolume(tree.GetBoundingVolume(i));
}
tree.CreateBVH();
}



// compiler
void mjCBody::Compile(void) {
CopyFromSpec();
Expand Down Expand Up @@ -1447,14 +1465,7 @@ void mjCBody::Compile(void) {
}

// compute bounding volume hierarchy
if (!geoms.empty()) {
tree.Set(ipos, iquat);
tree.AllocateBoundingVolumes(geoms.size());
for (int i=0; i<geoms.size(); i++) {
geoms[i]->SetBoundingVolume(tree.GetBoundingVolume(i));
}
tree.CreateBVH();
}
ComputeBVH();

// compile all joints, count dofs
dofnum = 0;
Expand Down
3 changes: 3 additions & 0 deletions src/user/user_objects.h
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,9 @@ class mjCBody : public mjCBody_, private mjsBody {
// set explicitinertial to true
void MakeInertialExplicit();

// compute the bounding volume hierarchy of the body.
void ComputeBVH();

// variables set by user
mjsBody spec;

Expand Down
4 changes: 4 additions & 0 deletions test/user/user_model_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ TEST_F(FuseStaticTest, FuseStaticEquivalent) {
<geom size="0.5" pos="1 0 0" contype="0" conaffinity="0"/>
<body>
<geom size="0.5" pos="0 1 0" contype="1" conaffinity="1"/>
<geom size="0.5" pos="0 -2 0" contype="1" conaffinity="1"/>
</body>
</body>
</worldbody>
Expand All @@ -273,6 +274,9 @@ TEST_F(FuseStaticTest, FuseStaticEquivalent) {
EXPECT_EQ(m_fuse->body_contype[1], 1);
EXPECT_EQ(m_fuse->body_conaffinity[1], 1);

EXPECT_EQ(m_no_fuse->body_bvhnum[2], 3);
EXPECT_EQ(m_fuse->body_bvhnum[1], 3);

mjData* d_fuse = mj_makeData(m_fuse);
mjData* d_no_fuse = mj_makeData(m_no_fuse);

Expand Down

0 comments on commit 96844db

Please sign in to comment.