// Copyright 2022 DeepMind Technologies Limited // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Tests for plugin-related functionalities. #include #include #include #include #include #include #include "test/fixture.h" namespace mujoco { namespace { using ElasticityTest = MujocoTest; // -------------------------------- cable ----------------------------------- TEST_F(ElasticityTest, CantileverIntoCircle) { #ifdef mjUSESINGLE GTEST_SKIP() << "Cable simulation with extreme stiffness diverges in float32"; #endif static constexpr char cantilever_xml[] = R"( )"; char error[1024] = {0}; mjModel* m = LoadModelFromString(cantilever_xml, error, sizeof(error)); ASSERT_THAT(m, testing::NotNull()) << error; mjData* d = mj_makeData(m); // see Oliver Weeger, Sai-Kit Yeung, Martin L. Dunn, "Isogeometric collocation methods for Cosserat rods and rod // structures", section 7.1 (DOI: j.cma.2016.05.009), the torque for achieving an angle phi is phi * E * Iy. mjtNum Iy = mjPI * pow(0.005, 4) / 4; mjtNum torque = 2 * mjPI * 1e9 * Iy; for (int i=0; i < 1300; i++) { if (i < 300) { d->ctrl[0] += torque / 300; } mj_step(m, d); } EXPECT_NEAR(d->sensordata[0], 0, std::numeric_limits::epsilon()); EXPECT_NEAR(d->sensordata[1], 0, std::numeric_limits::epsilon()); EXPECT_NEAR(d->sensordata[2], 1, std::numeric_limits::epsilon()); mj_deleteData(d); mj_deleteModel(m); } TEST_F(ElasticityTest, InvalidTxtAttribute) { static constexpr char cantilever_xml[] = R"( )"; char error[1024] = {0}; mjModel* m = LoadModelFromString(cantilever_xml, error, sizeof(error)); ASSERT_THAT(m, testing::IsNull()); } TEST_F(ElasticityTest, InvalidMixedAttribute) { static constexpr char cantilever_xml[] = R"( )"; char error[1024] = {0}; mjModel* m = LoadModelFromString(cantilever_xml, error, sizeof(error)); ASSERT_THAT(m, testing::IsNull()); } TEST_F(ElasticityTest, ValidAttributes) { static constexpr char cantilever_xml[] = R"( )"; char error[1024] = {0}; mjModel* m = LoadModelFromString(cantilever_xml, error, sizeof(error)); ASSERT_THAT(m, testing::NotNull()) << error; mj_deleteModel(m); } } // namespace } // namespace mujoco