@@ -2033,52 +2033,71 @@ TEST_F(MujocoTest, ResizeParentKeyframe) {
2033
2033
}
2034
2034
2035
2035
TEST_F (MujocoTest, DifferentUnitsAllowed) {
2036
- mjSpec* child = mj_makeSpec ();
2037
- child->compiler .degree = 0 ;
2038
- mjsBody* body = mjs_addBody (mjs_findBody (child, " world" ), 0 );
2039
- body->alt .type = mjORIENTATION_EULER;
2040
- body->alt .euler [0 ] = -mjPI / 2 ;
2041
- mjsGeom* geom = mjs_addGeom (body, 0 );
2042
- geom->size [0 ] = 1 ;
2043
- mjsJoint* joint = mjs_addJoint (body, 0 );
2044
- joint->type = mjJNT_HINGE;
2045
- joint->range [0 ] = -mjPI / 4 ;
2046
- joint->range [1 ] = mjPI / 4 ;
2036
+ static constexpr char child_xml[] = R"(
2037
+ <mujoco>
2038
+ <compiler angle="radian"/>
2047
2039
2048
- mjSpec* parent = mj_makeSpec ();
2049
- parent->compiler .degree = 1 ;
2050
- mjsFrame* frame = mjs_addFrame (mjs_findBody (parent, " world" ), 0 );
2051
- frame->alt .type = mjORIENTATION_EULER;
2052
- frame->alt .euler [0 ] = 90 ;
2040
+ <worldbody>
2041
+ <body name="child" euler="-1.5707963 0 0">
2042
+ <geom type="box" size="1 1 1"/>
2043
+ <joint name="child_joint" range="-3.1415926 3.1415926"/>
2044
+ </body>
2045
+ </worldbody>
2046
+ </mujoco>
2047
+ )" ;
2053
2048
2054
- EXPECT_THAT (mjs_attachBody (frame, body, " child-" , " " ), NotNull ());
2055
- mjModel* model = mj_compile (parent, 0 );
2049
+ static constexpr char parent_xml[] = R"(
2050
+ <mujoco>
2051
+ <worldbody>
2052
+ <body name="parent">
2053
+ <geom type="box" size="1 1 1"/>
2054
+ <joint name="parent_joint" range="-180 180"/>
2055
+ <frame name="frame" euler="90 0 0"/>
2056
+ </body>
2057
+ </worldbody>
2058
+ </mujoco>
2059
+ )" ;
2060
+
2061
+ std::array<char , 1024 > error;
2062
+ mjSpec* child = mj_parseXMLString (child_xml, 0 , error.data (), error.size ());
2063
+ mjSpec* spec = mj_parseXMLString (parent_xml, 0 , error.data (), error.size ());
2064
+ ASSERT_THAT (spec, NotNull ()) << error.data ();
2065
+ mjs_attachBody (mjs_findFrame (spec, " frame" ), mjs_findBody (child, " child" ),
2066
+ " child_" , " " );
2067
+
2068
+ mjModel* model = mj_compile (spec, 0 );
2056
2069
EXPECT_THAT (model, NotNull ());
2070
+ EXPECT_THAT (model->njnt , 2 );
2071
+ EXPECT_NEAR (model->jnt_range [0 ], -mjPI, 1e-6 );
2072
+ EXPECT_NEAR (model->jnt_range [1 ], mjPI, 1e-6 );
2073
+ EXPECT_NEAR (model->jnt_range [2 ], -mjPI, 1e-6 );
2074
+ EXPECT_NEAR (model->jnt_range [3 ], mjPI, 1e-6 );
2057
2075
EXPECT_NEAR (model->body_quat [4 ], 1 , 1e-12 );
2058
2076
EXPECT_NEAR (model->body_quat [5 ], 0 , 1e-12 );
2059
2077
EXPECT_NEAR (model->body_quat [6 ], 0 , 1e-12 );
2060
2078
EXPECT_NEAR (model->body_quat [7 ], 0 , 1e-12 );
2061
- EXPECT_NEAR (model->jnt_range [0 ], -mjPI / 4 , 1e-7 );
2062
- EXPECT_NEAR (model->jnt_range [1 ], mjPI / 4 , 1e-7 );
2063
2079
2064
- mjSpec* copy = mj_copySpec (parent);
2065
- EXPECT_THAT (copy, NotNull ());
2066
- mj_deleteModel (model);
2080
+ mjSpec* copied_spec = mj_copySpec (spec);
2081
+ ASSERT_THAT (copied_spec, NotNull ());
2067
2082
mj_deleteSpec (child);
2068
- mj_deleteSpec (parent);
2083
+ mj_deleteSpec (spec);
2084
+ mj_deleteModel (model);
2069
2085
2070
2086
// check that deleting `parent` or `child` does not invalidate the copy
2071
- mjModel* copy_model = mj_compile (copy, 0 );
2072
- EXPECT_THAT (copy_model, NotNull ());
2073
- EXPECT_NEAR (copy_model->body_quat [0 ], 1 , 1e-12 );
2074
- EXPECT_NEAR (copy_model->body_quat [1 ], 0 , 1e-12 );
2075
- EXPECT_NEAR (copy_model->body_quat [2 ], 0 , 1e-12 );
2076
- EXPECT_NEAR (copy_model->body_quat [3 ], 0 , 1e-12 );
2077
- EXPECT_NEAR (copy_model->jnt_range [0 ], -mjPI / 4 , 1e-7 );
2078
- EXPECT_NEAR (copy_model->jnt_range [1 ], mjPI / 4 , 1e-7 );
2079
-
2080
- mj_deleteModel (copy_model);
2081
- mj_deleteSpec (copy);
2087
+ mjModel* copied_model = mj_compile (copied_spec, 0 );
2088
+ EXPECT_THAT (copied_model, NotNull ());
2089
+ EXPECT_THAT (copied_model->njnt , 2 );
2090
+ EXPECT_NEAR (copied_model->jnt_range [0 ], -mjPI, 1e-6 );
2091
+ EXPECT_NEAR (copied_model->jnt_range [1 ], mjPI, 1e-6 );
2092
+ EXPECT_NEAR (copied_model->jnt_range [2 ], -mjPI, 1e-6 );
2093
+ EXPECT_NEAR (copied_model->jnt_range [3 ], mjPI, 1e-6 );
2094
+ EXPECT_NEAR (copied_model->body_quat [4 ], 1 , 1e-12 );
2095
+ EXPECT_NEAR (copied_model->body_quat [5 ], 0 , 1e-12 );
2096
+ EXPECT_NEAR (copied_model->body_quat [6 ], 0 , 1e-12 );
2097
+ EXPECT_NEAR (copied_model->body_quat [7 ], 0 , 1e-12 );
2098
+
2099
+ mj_deleteSpec (copied_spec);
2100
+ mj_deleteModel (copied_model);
2082
2101
}
2083
2102
2084
2103
TEST_F (MujocoTest, CopyAttachedSpec) {
0 commit comments