Add frame element to MJCF.
PiperOrigin-RevId: 585598244 Change-Id: I4c06be3dd586dab5a4458f05faaf1e7f2b615458
This commit is contained in:
committed by
Copybara-Service
parent
8010aad7be
commit
eb9568a48b
@@ -1398,5 +1398,79 @@ TEST_F(SpringrangeTest, InvalidRange) {
|
||||
EXPECT_THAT(error.data(), HasSubstr("invalid springlength in tendon"));
|
||||
}
|
||||
|
||||
// ------------- test frame ----------------------------------------------------
|
||||
TEST_F(MujocoTest, Frame) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
<worldbody>
|
||||
<frame euler="0 0 30">
|
||||
<geom size=".1" euler="0 0 20"/>
|
||||
</frame>
|
||||
|
||||
<frame axisangle="0 0 1 90">
|
||||
<frame axisangle="0 1 0 90">
|
||||
<geom size=".1"/>
|
||||
</frame>
|
||||
</frame>
|
||||
|
||||
<body>
|
||||
<frame pos="0 1 0">
|
||||
<geom size=".1" pos="0 1 0"/>
|
||||
<body pos="1 0 0">
|
||||
<geom size=".1" pos="0 0 1"/>
|
||||
</body>
|
||||
</frame>
|
||||
</body>
|
||||
|
||||
<body>
|
||||
<geom size=".1"/>
|
||||
<frame euler="90 0 0">
|
||||
<joint type="hinge" axis="0 0 1"/>
|
||||
</frame>
|
||||
</body>
|
||||
</worldbody>
|
||||
</mujoco>
|
||||
|
||||
)";
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = LoadModelFromString(xml, error.data(), error.size());
|
||||
EXPECT_THAT(m, testing::NotNull()) << error.data();
|
||||
EXPECT_EQ(m->nbody, 4);
|
||||
|
||||
// geom quat transformed to euler = 0 0 50
|
||||
EXPECT_NEAR(m->geom_quat[0], mju_cos(25. * mjPI / 180.), 1e-3);
|
||||
EXPECT_NEAR(m->geom_quat[1], 0, 0);
|
||||
EXPECT_NEAR(m->geom_quat[2], 0, 0);
|
||||
EXPECT_NEAR(m->geom_quat[3], mju_sin(25. * mjPI / 180.), 1e-3);
|
||||
|
||||
// geom transformed to frame 0 1 0, 0 0 1, 1 0 0
|
||||
EXPECT_NEAR(m->geom_quat[4], .5, 1e-6);
|
||||
EXPECT_NEAR(m->geom_quat[5], .5, 1e-6);
|
||||
EXPECT_NEAR(m->geom_quat[6], .5, 1e-6);
|
||||
EXPECT_NEAR(m->geom_quat[7], .5, 1e-6);
|
||||
|
||||
// geom pos transformed from 0 1 0 to 0 2 0
|
||||
EXPECT_EQ(m->geom_pos[6], 0);
|
||||
EXPECT_EQ(m->geom_pos[7], 2);
|
||||
EXPECT_EQ(m->geom_pos[8], 0);
|
||||
|
||||
// body pos transformed from 1 0 0 to 1 1 0
|
||||
EXPECT_EQ(m->body_pos[6], 1);
|
||||
EXPECT_EQ(m->body_pos[7], 1);
|
||||
EXPECT_EQ(m->body_pos[8], 0);
|
||||
|
||||
// nested geom pos not transformed
|
||||
EXPECT_EQ(m->geom_pos[ 9], 0);
|
||||
EXPECT_EQ(m->geom_pos[10], 0);
|
||||
EXPECT_EQ(m->geom_pos[11], 1);
|
||||
|
||||
// joint axis transformed to 0 -1 0
|
||||
EXPECT_NEAR(m->jnt_axis[0], 0, 1e-6);
|
||||
EXPECT_NEAR(m->jnt_axis[1], -1, 1e-6);
|
||||
EXPECT_NEAR(m->jnt_axis[2], 0, 1e-6);
|
||||
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace mujoco
|
||||
|
||||
Reference in New Issue
Block a user