Remember compiler options during attach.

Note:
- Move compiler options into `mjsCompiler` struct.
- The compiler options from the attached model are not written by mj_SaveXML.
PiperOrigin-RevId: 689391440
Change-Id: I1d63c146a32f87c737b7a55b64a54b0ffe3aecc9
This commit is contained in:
Alessio Quaglino
2024-10-24 08:29:03 -07:00
committed by Copybara-Service
parent 1043633cc3
commit 159f23e6b4
24 changed files with 302 additions and 204 deletions
+34 -14
View File
@@ -1839,23 +1839,43 @@ TEST_F(MujocoTest, RepeatedAttachKeyframe) {
mj_deleteModel(model_2);
}
TEST_F(MujocoTest, DifferentUnitsNotAllowed) {
mjSpec* spec_1 = mj_makeSpec();
mjSpec* spec_2 = mj_makeSpec();
spec_1->degree = 1;
spec_2->degree = 0;
TEST_F(MujocoTest, DifferentUnitsAllowed) {
mjSpec* child = mj_makeSpec();
child->compiler.degree = 1;
mjsBody* body = mjs_addBody(mjs_findBody(child, "world"), 0);
body->alt.type = mjORIENTATION_EULER;
body->alt.euler[0] = 90;
mjsBody* body = mjs_addBody(mjs_findBody(spec_1, "world"), 0);
mjsFrame* frame = mjs_addFrame(mjs_findBody(spec_2, "world"), 0);
mjSpec* parent = mj_makeSpec();
parent->compiler.degree = 0;
mjsFrame* frame = mjs_addFrame(mjs_findBody(parent, "world"), 0);
frame->alt.type = mjORIENTATION_EULER;
frame->alt.euler[0] = -mjPI / 2;
constexpr char msg[] = "mjSpecs with incompatible compiler/angle";
EXPECT_THAT(mjs_attachBody(frame, body, "child-", ""), IsNull());
EXPECT_THAT(mjs_attachFrame(body, frame, "child-", ""), IsNull());
EXPECT_THAT(mjs_getError(spec_1), HasSubstr(msg));
EXPECT_THAT(mjs_getError(spec_2), HasSubstr(msg));
EXPECT_THAT(mjs_attachBody(frame, body, "child-", ""), NotNull());
mjModel* model = mj_compile(parent, 0);
EXPECT_THAT(model, NotNull());
EXPECT_NEAR(model->body_quat[4], 1, 1e-12);
EXPECT_NEAR(model->body_quat[5], 0, 1e-12);
EXPECT_NEAR(model->body_quat[6], 0, 1e-12);
EXPECT_NEAR(model->body_quat[7], 0, 1e-12);
mj_deleteSpec(spec_1);
mj_deleteSpec(spec_2);
mjSpec* copy = mj_copySpec(parent);
EXPECT_THAT(copy, NotNull());
mj_deleteModel(model);
mj_deleteSpec(child);
mj_deleteSpec(parent);
// check that deleting `parent` or `child` does not invalidate the copy
mjModel* copy_model = mj_compile(copy, 0);
EXPECT_THAT(copy_model, NotNull());
EXPECT_NEAR(copy_model->body_quat[0], 1, 1e-12);
EXPECT_NEAR(copy_model->body_quat[1], 0, 1e-12);
EXPECT_NEAR(copy_model->body_quat[2], 0, 1e-12);
EXPECT_NEAR(copy_model->body_quat[3], 0, 1e-12);
mj_deleteModel(copy_model);
mj_deleteSpec(copy);
}
TEST_F(MujocoTest, CopyAttachedSpec) {