Add body/simple attribute to control simple body optimization.

PiperOrigin-RevId: 942164766
Change-Id: I1e83bb99b6a1955917eb9b2e9bed0dc7b8e6a161
This commit is contained in:
Yuval Tassa
2026-07-03 09:08:42 -07:00
committed by Copybara-Service
parent 4ecfe5c1f3
commit 5618666a7d
19 changed files with 205 additions and 10 deletions
+49
View File
@@ -1287,6 +1287,55 @@ TEST_F(MjCJointTest, AlignFree) {
mj_deleteSpec(s);
}
TEST_F(MjCJointTest, BodySimpleFalse) {
constexpr char xml[] = R"(
<mujoco>
<worldbody>
<body name="B1">
<joint type="slide"/>
<geom size=".1"/>
</body>
</worldbody>
</mujoco>
)";
constexpr char xml_nosimple[] = R"(
<mujoco>
<worldbody>
<body name="B1" simple="false">
<joint type="slide"/>
<geom size=".1"/>
</body>
</worldbody>
</mujoco>
)";
char error[1024];
// compile default model: body should be simple
MjModelPtr m = LoadModelFromString(xml, error, sizeof(error));
ASSERT_THAT(m.get(), NotNull()) << error;
int b = mj_name2id(m.get(), mjOBJ_BODY, "B1");
EXPECT_GT(m->body_simple[b], 0);
EXPECT_GT(m->dof_simplenum[0], 0);
// compile with simple="false": body should not be simple
MjModelPtr m_ns = LoadModelFromString(xml_nosimple, error, sizeof(error));
ASSERT_THAT(m_ns.get(), NotNull()) << error;
EXPECT_EQ(m_ns->body_simple[b], 0);
EXPECT_EQ(m_ns->dof_simplenum[0], 0);
// forward kinematics should produce identical results
MjDataPtr d = MakeData(m);
MjDataPtr d_ns = MakeData(m_ns);
d->qpos[0] = d_ns->qpos[0] = 0.5;
mj_forward(m.get(), d.get());
mj_forward(m_ns.get(), d_ns.get());
EXPECT_THAT(d_ns->xpos[3*b+0], MjNear(d->xpos[3*b+0], 1e-10, 1e-6));
EXPECT_THAT(d_ns->xpos[3*b+1], MjNear(d->xpos[3*b+1], 1e-10, 1e-6));
EXPECT_THAT(d_ns->xpos[3*b+2], MjNear(d->xpos[3*b+2], 1e-10, 1e-6));
}
// ------------- test height fields --------------------------------------------
using MjCHFieldTest = MujocoTest;