diff --git a/src/engine/engine_setconst.c b/src/engine/engine_setconst.c index 6dd01a94..6473601f 100644 --- a/src/engine/engine_setconst.c +++ b/src/engine/engine_setconst.c @@ -737,18 +737,8 @@ static void set0(mjModel* m, mjData* d) { } // average diagonal and assign - mjtNum tran = (A[0] + A[7] + A[14])/3; - mjtNum rot = (A[21] + A[28] + A[35])/3; - - // if one is zero, use the other to prevent degenerate constraints - if (tran < mjMINVAL && rot > mjMINVAL) { - tran = rot; // use rotation as fallback for translation - } else if (rot < mjMINVAL && tran > mjMINVAL) { - rot = tran; // use translation as fallback for rotation - } - - m->body_invweight0[2*i] = tran; - m->body_invweight0[2*i+1] = rot; + m->body_invweight0[2*i] = (A[0] + A[7] + A[14])/3; + m->body_invweight0[2*i+1] = (A[21] + A[28] + A[35])/3; } } diff --git a/test/engine/engine_forward_test.cc b/test/engine/engine_forward_test.cc index 79df5022..4e2f974e 100644 --- a/test/engine/engine_forward_test.cc +++ b/test/engine/engine_forward_test.cc @@ -811,43 +811,6 @@ TEST_F(ForwardTest, MocapQuats) { mj_deleteModel(model); } -// model with degenerate translational inertia -TEST_F(ForwardTest, DegenerateInertia) { - static constexpr char xml[] = R"( - - - - - - - - - - - - - - )"; - char error[1024]; - mjModel* model = LoadModelFromString(xml, error, sizeof(error)); - ASSERT_THAT(model, NotNull()) << error; - mjData* data = mj_makeData(model); - - for (int i = 0; i < 1000; i++) { - mj_step(model, data); - EXPECT_EQ(data->warning[mjWARN_BADQACC].number, 0) - << "divergence at timestep " << i; - if (data->warning[mjWARN_BADQACC].number != 0) { - break; - } - } - - mj_deleteData(data); - mj_deleteModel(model); -} - // user defined 2nd-order activation dynamics: frequency-controlled oscillator // note that scalar mjcb_act_dyn callbacks are expected to return act_dot, but // since we have a vector output we write into act_dot directly