@@ -74,6 +74,8 @@ using ::testing::HasSubstr;
74
74
using ::testing::IsNull;
75
75
using ::testing::NotNull;
76
76
77
+ static constexpr mjtNum kMaxAbsErr = std::numeric_limits<float >::epsilon();
78
+
77
79
// ------------- test invalid filenames ----------------------------------------
78
80
79
81
TEST_F (MjCMeshTest, UnknownMeshFormat) {
@@ -556,13 +558,10 @@ TEST_F(MjCMeshTest, MissingFaceAllowedConvexInertia) {
556
558
char error[1024 ];
557
559
mjModel* model = mj_loadXML (xml_path.c_str (), 0 , error, sizeof (error));
558
560
ASSERT_THAT (model, NotNull ()) << error;
559
- EXPECT_THAT (model->nmeshface , 10 );
560
- EXPECT_NE (model->body_inertia [3 ], model->body_inertia [9 ]);
561
- EXPECT_NE (model->body_inertia [4 ], model->body_inertia [10 ]);
562
- EXPECT_NE (model->body_inertia [5 ], model->body_inertia [11 ]);
563
- EXPECT_NE (model->body_inertia [3 ], model->body_inertia [6 ]);
564
- EXPECT_NE (model->body_inertia [4 ], model->body_inertia [7 ]);
565
- EXPECT_NE (model->body_inertia [5 ], model->body_inertia [8 ]);
561
+ EXPECT_THAT (model->nmeshface , 7 );
562
+ EXPECT_NEAR (model->body_inertia [3 ], model->body_inertia [6 ], kMaxAbsErr );
563
+ EXPECT_NEAR (model->body_inertia [4 ], model->body_inertia [7 ], kMaxAbsErr );
564
+ EXPECT_NEAR (model->body_inertia [5 ], model->body_inertia [8 ], kMaxAbsErr );
566
565
mj_deleteModel (model);
567
566
}
568
567
@@ -860,18 +859,40 @@ TEST_F(MjCMeshTest, VolumeNegativeThrowsError) {
860
859
}
861
860
}
862
861
863
- // ------------- test concave and shell inertia --------------------------------
862
+ TEST_F (MjCMeshTest, MeshIgnoresDefaultDensity) {
863
+ static constexpr char xml[] = R"(
864
+ <mujoco>
865
+ <default>
866
+ <geom density="0" />
867
+ </default>
868
+ <asset>
869
+ <mesh name="a" vertex="0 0 0 1 0 0 0 1 0 0 0 1" scale="10 10 10" />
870
+ </asset>
871
+ <worldbody/>
872
+ </mujoco>)" ;
873
+ char error[1024 ];
874
+ mjSpec* spec = mj_parseXMLString (xml, 0 , error, sizeof (error));
875
+ EXPECT_THAT (spec, NotNull ()) << error;
876
+ mjModel* m1 = mj_compile (spec, nullptr );
877
+ EXPECT_THAT (m1, NotNull ());
878
+ mj_deleteModel (m1);
879
+ mjModel* m2 = mj_compile (spec, nullptr );
880
+ EXPECT_THAT (m2, NotNull ());
881
+ mj_deleteModel (m2);
882
+ mj_deleteSpec (spec);
883
+ }
864
884
865
- const mjtNum max_abs_err = std::numeric_limits< float >::epsilon();
885
+ // ------------- test concave and shell inertia --------------------------------
866
886
867
887
TEST_F (MjCMeshTest, ExactConcaveInertia) {
868
888
const std::string xml_path = GetTestDataFilePath (kConcaveInertiaPath );
869
889
std::array<char , 1024 > error;
870
890
mjModel* model = mj_loadXML (xml_path.c_str (), 0 , error.data (), error.size ());
871
891
// analytic computation of 1x1x1 cube with a .8x.8x.9 hole
872
892
// see https://en.wikipedia.org/wiki/List_of_moments_of_inertia
873
- mjtNum m_hole = .9 * .8 * .8 ;
874
- mjtNum m_cube = 1 .;
893
+ mjtNum density = 2 .;
894
+ mjtNum m_hole = .9 * .8 * .8 * density;
895
+ mjtNum m_cube = 1 . * density;
875
896
mjtNum m_concave_cube = m_cube - m_hole;
876
897
mjtNum I_cube = m_cube/6 .;
877
898
// due to the asymmetric hole, the com position has changed
@@ -881,14 +902,14 @@ TEST_F(MjCMeshTest, ExactConcaveInertia) {
881
902
mjtNum I1 = I_cube - m_hole*(.8 *.8 + .8 *.8 )/12 ;
882
903
mjtNum I2 = I_cube - m_hole*(.8 *.8 + .9 *.9 )/12
883
904
+ m_cube*d_cube*d_cube - m_hole*d_hole*d_hole;
884
- EXPECT_LE ( mju_abs ( model->body_mass [1 ] - m_concave_cube), max_abs_err );
885
- EXPECT_LE ( mju_abs ( model->body_mass [2 ] - m_concave_cube), max_abs_err );
886
- EXPECT_LE ( mju_abs ( model->body_mass [3 ] - m_concave_cube), max_abs_err );
887
- EXPECT_LE ( mju_abs ( model->body_mass [4 ] - m_concave_cube), max_abs_err );
905
+ EXPECT_NEAR ( model->body_mass [1 ], m_concave_cube, kMaxAbsErr );
906
+ EXPECT_NEAR ( model->body_mass [2 ], m_concave_cube, kMaxAbsErr );
907
+ EXPECT_NEAR ( model->body_mass [3 ], m_concave_cube, kMaxAbsErr );
908
+ EXPECT_NEAR ( model->body_mass [4 ], m_concave_cube, kMaxAbsErr );
888
909
for (int i = 3 ; i < 15 ; i += 3 ) {
889
- EXPECT_LE ( mju_abs ( model->body_inertia [i] - I1), max_abs_err );
890
- EXPECT_LE ( mju_abs ( model->body_inertia [i+1 ] - I2), max_abs_err );
891
- EXPECT_LE ( mju_abs ( model->body_inertia [i+2 ] - I2), max_abs_err );
910
+ EXPECT_NEAR ( model->body_inertia [i], I1, kMaxAbsErr );
911
+ EXPECT_NEAR ( model->body_inertia [i+1 ], I2, kMaxAbsErr );
912
+ EXPECT_NEAR ( model->body_inertia [i+2 ], I2, kMaxAbsErr );
892
913
}
893
914
mj_deleteModel (model);
894
915
}
@@ -900,10 +921,10 @@ TEST_F(MjCMeshTest, ExactConvexInertia) {
900
921
// https://en.wikipedia.org/wiki/List_of_moments_of_inertia
901
922
mjtNum m_solid_cube = 1 .;
902
923
mjtNum I_solid_cube = 1 ./6 . * m_solid_cube;
903
- EXPECT_LE (mju_abs (model->body_mass [1 ] - m_solid_cube), max_abs_err );
904
- EXPECT_LE (mju_abs (model->body_mass [2 ] - m_solid_cube), max_abs_err );
924
+ EXPECT_LE (mju_abs (model->body_mass [1 ] - m_solid_cube), kMaxAbsErr );
925
+ EXPECT_LE (mju_abs (model->body_mass [2 ] - m_solid_cube), kMaxAbsErr );
905
926
for (int i = 3 ; i < 9 ; i++) {
906
- EXPECT_LE (mju_abs (model->body_inertia [i] - I_solid_cube), max_abs_err );
927
+ EXPECT_LE (mju_abs (model->body_inertia [i] - I_solid_cube), kMaxAbsErr );
907
928
}
908
929
mj_deleteModel (model);
909
930
}
@@ -915,10 +936,10 @@ TEST_F(MjCMeshTest, ExactShellInertia) {
915
936
// see https://en.wikipedia.org/wiki/List_of_moments_of_inertia
916
937
mjtNum m_hollow_cube = 6 .;
917
938
mjtNum I_hollow_cube = 5 ./18 . * m_hollow_cube;
918
- EXPECT_LE (mju_abs (model->body_mass [1 ] - m_hollow_cube), max_abs_err );
919
- EXPECT_LE (mju_abs (model->body_inertia [3 ] - I_hollow_cube), max_abs_err );
920
- EXPECT_LE (mju_abs (model->body_inertia [4 ] - I_hollow_cube), max_abs_err );
921
- EXPECT_LE (mju_abs (model->body_inertia [5 ] - I_hollow_cube), max_abs_err );
939
+ EXPECT_LE (mju_abs (model->body_mass [1 ] - m_hollow_cube), kMaxAbsErr );
940
+ EXPECT_LE (mju_abs (model->body_inertia [3 ] - I_hollow_cube), kMaxAbsErr );
941
+ EXPECT_LE (mju_abs (model->body_inertia [4 ] - I_hollow_cube), kMaxAbsErr );
942
+ EXPECT_LE (mju_abs (model->body_inertia [5 ] - I_hollow_cube), kMaxAbsErr );
922
943
mj_deleteModel (model);
923
944
}
924
945
0 commit comments