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) {
+2 -2
View File
@@ -480,8 +480,8 @@ TEST_F(LengthRangeTest, LengthRangeThreading) {
DoubleNear(std::sqrt(5.0), 1e-3));
// recompile without threads
ASSERT_EQ(spec->usethread, 1);
spec->usethread = 0;
ASSERT_EQ(spec->compiler.usethread, 1);
spec->compiler.usethread = 0;
mjModel* model2 = mj_compile(spec, 0);
EXPECT_THAT(model2, NotNull()) << error;
+2 -2
View File
@@ -1176,7 +1176,7 @@ TEST_F(MjCJointTest, AlignFree) {
std::array<char, 1024> err;
mjSpec* s = mj_parseXML(xml_path.c_str(), nullptr, err.data(), err.size());
ASSERT_THAT(s, NotNull()) << err.data();
s->alignfree = 1; // auto-aligned free joint
s->compiler.alignfree = 1; // auto-aligned free joint
mjModel* m = mj_compile(s, nullptr);
ASSERT_THAT(m, NotNull());
@@ -1186,7 +1186,7 @@ TEST_F(MjCJointTest, AlignFree) {
EXPECT_EQ(m->dof_simplenum[0], 6);
// make unaligned model
s->alignfree = 0; // unaligned free joint
s->compiler.alignfree = 0; // unaligned free joint
mjModel* m_u = mj_compile(s, nullptr);
ASSERT_THAT(m_u, NotNull());