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:
committed by
Copybara-Service
parent
1043633cc3
commit
159f23e6b4
+34
-14
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user