Make BVH generation robust to very small perturbations.

PiperOrigin-RevId: 629070367
Change-Id: I62b91a572cd59a51ed85e4e97aea53fdb2da1986
This commit is contained in:
Alessio Quaglino
2024-04-29 08:05:22 -07:00
committed by Copybara-Service
parent d6553ed192
commit 618d879904
3 changed files with 55 additions and 4 deletions
+48
View File
@@ -1714,5 +1714,53 @@ TEST_F(MujocoTest, Frame) {
mj_deleteData(d);
}
// ------------- test bvh ------------------------------------------------------
TEST_F(MujocoTest, RobustBVH) {
static constexpr char xml1[] = R"(
<mujoco>
<worldbody>
<body>
<geom size=".1" pos="0 0 0"/>
<geom size=".1" pos="0 1 0"/>
<geom size=".1" pos="1 0 0"/>
<geom size=".1" pos="1 1 0"/>
<geom size=".1" pos="2 0 0"/>
<geom size=".1" pos="2 1 0"/>
</body>
</worldbody>
</mujoco>
)";
static constexpr char xml2[] = R"(
<mujoco>
<worldbody>
<body>
<geom size=".1" pos="0 0 0"/>
<geom size=".1" pos="0 1 0"/>
<geom size=".1" pos="1.00000000000001 0 0"/>
<geom size=".1" pos="1 1.00000000000001 0"/>
<geom size=".1" pos="2 0 0"/>
<geom size=".1" pos="2 1 0"/>
</body>
</worldbody>
</mujoco>
)";
std::array<char, 1024> error;
mjModel* m1 = LoadModelFromString(xml1, error.data(), error.size());
EXPECT_THAT(m1, testing::NotNull()) << error.data();
mjModel* m2 = LoadModelFromString(xml2, error.data(), error.size());
EXPECT_THAT(m2, testing::NotNull()) << error.data();
EXPECT_EQ(m1->nbvh, m2->nbvh);
for (int i = 0; i < m1->nbvh; i++) {
EXPECT_EQ(m1->bvh_nodeid[i], m2->bvh_nodeid[i]);
}
mj_deleteModel(m1);
mj_deleteModel(m2);
}
} // namespace
} // namespace mujoco