Do not skip mjSpec's with repeated model names when attaching a new mjSpec.
PiperOrigin-RevId: 744705838 Change-Id: Ie47a3c029f443910629619b7f9ff43ab07646725
This commit is contained in:
committed by
Copybara-Service
parent
58234b2217
commit
d7027fb1c0
+30
-15
@@ -2552,31 +2552,46 @@ TEST_F(MujocoTest, DifferentOptionsInAttachedFrame) {
|
||||
// load specs and compile child
|
||||
mjSpec* parent = mj_parseXMLString(xml_parent, 0, nullptr, 0);
|
||||
EXPECT_THAT(parent, NotNull());
|
||||
mjSpec* child = mj_parseXMLString(xml_child, 0, nullptr, 0);
|
||||
EXPECT_THAT(child, NotNull());
|
||||
mjModel* m_child = mj_compile(child, 0);
|
||||
EXPECT_THAT(m_child, NotNull());
|
||||
mjSpec* child1 = mj_parseXMLString(xml_child, 0, nullptr, 0);
|
||||
EXPECT_THAT(child1, NotNull());
|
||||
mjModel* m_child1 = mj_compile(child1, 0);
|
||||
EXPECT_THAT(m_child1, NotNull());
|
||||
mjSpec* child2 = mj_parseXMLString(xml_child, 0, nullptr, 0);
|
||||
EXPECT_THAT(child2, NotNull());
|
||||
mjModel* m_child2 = mj_compile(child1, 0);
|
||||
EXPECT_THAT(m_child2, NotNull());
|
||||
|
||||
// attach child frame to parent worldbody
|
||||
mjsBody* world = mjs_findBody(parent, "world");
|
||||
EXPECT_THAT(world, NotNull());
|
||||
mjsFrame* child_frame = mjs_findFrame(child, "child");
|
||||
EXPECT_THAT(child_frame, NotNull());
|
||||
mjsElement* attached_frame =
|
||||
mjs_attach(world->element, child_frame->element, "child-", "");
|
||||
EXPECT_THAT(attached_frame, NotNull());
|
||||
mjsFrame* child1_frame = mjs_findFrame(child1, "child");
|
||||
EXPECT_THAT(child1_frame, NotNull());
|
||||
mjsFrame* child2_frame = mjs_findFrame(child2, "child");
|
||||
EXPECT_THAT(child2_frame, NotNull());
|
||||
mjsElement* attached_frame1 =
|
||||
mjs_attach(world->element, child1_frame->element, "child-", "-1");
|
||||
EXPECT_THAT(attached_frame1, NotNull());
|
||||
mjsElement* attached_frame2 =
|
||||
mjs_attach(world->element, child2_frame->element, "child-", "-2");
|
||||
EXPECT_THAT(attached_frame2, NotNull());
|
||||
|
||||
// wrap the child frame in the parent frame and compile
|
||||
mjModel* m_attached = mj_compile(parent, 0);
|
||||
EXPECT_THAT(m_attached, NotNull());
|
||||
EXPECT_NEAR(m_attached->site_quat[0], m_child->site_quat[0], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[1], m_child->site_quat[1], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[2], m_child->site_quat[2], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[3], m_child->site_quat[3], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[0], m_child1->site_quat[0], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[1], m_child1->site_quat[1], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[2], m_child1->site_quat[2], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[3], m_child1->site_quat[3], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[4], m_child2->site_quat[0], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[5], m_child2->site_quat[1], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[6], m_child2->site_quat[2], 1e-6);
|
||||
EXPECT_NEAR(m_attached->site_quat[7], m_child2->site_quat[3], 1e-6);
|
||||
|
||||
mj_deleteSpec(parent);
|
||||
mj_deleteSpec(child);
|
||||
mj_deleteModel(m_child);
|
||||
mj_deleteSpec(child1);
|
||||
mj_deleteModel(m_child1);
|
||||
mj_deleteSpec(child2);
|
||||
mj_deleteModel(m_child2);
|
||||
mj_deleteModel(m_attached);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user