Add actuator and sensor delays. Fixes #1004
PiperOrigin-RevId: 866478839 Change-Id: Id21a6da0f98454c8fa39ea5af8a5e213d6eae497
This commit is contained in:
committed by
Copybara-Service
parent
84fa527723
commit
6419534bad
@@ -973,6 +973,48 @@ TEST_F(MujocoTest, ConvertSpringdamper) {
|
||||
EXPECT_THAT(str.data(), HasSubstr("damping"));
|
||||
EXPECT_THAT(str.data(), HasSubstr("stiffness"));
|
||||
mj_deleteModel(model);
|
||||
mj_deleteSpec(spec);
|
||||
}
|
||||
|
||||
// ------------- test history buffer computation -------------------------------
|
||||
|
||||
using DelayBufferTest = MujocoTest;
|
||||
|
||||
TEST_F(DelayBufferTest, ActuatorDelayBufferSizes) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
<option timestep="1"/>
|
||||
<worldbody>
|
||||
<body>
|
||||
<geom size="1"/>
|
||||
<joint name="jnt1"/>
|
||||
<joint name="jnt2"/>
|
||||
<joint name="jnt3"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
<actuator>
|
||||
<motor joint="jnt1"/>
|
||||
<motor joint="jnt2" delay="3" nsample="3"/>
|
||||
<motor joint="jnt3" delay="10" nsample="10"/>
|
||||
</actuator>
|
||||
</mujoco>
|
||||
)";
|
||||
mjModel* m = LoadModelFromString(xml);
|
||||
ASSERT_THAT(m, NotNull());
|
||||
ASSERT_EQ(m->nu, 3);
|
||||
|
||||
// nhistory = (2+2*3) + (2+2*10) = 8 + 22 = 30
|
||||
EXPECT_EQ(m->nhistory, 30);
|
||||
|
||||
// verify per-actuator delay and addresses
|
||||
EXPECT_EQ(m->actuator_history[0], 0);
|
||||
EXPECT_EQ(m->actuator_history[2], 3);
|
||||
EXPECT_EQ(m->actuator_history[4], 10);
|
||||
EXPECT_EQ(m->actuator_historyadr[0], -1);
|
||||
EXPECT_EQ(m->actuator_historyadr[1], 0);
|
||||
EXPECT_EQ(m->actuator_historyadr[2], 8);
|
||||
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -626,6 +626,66 @@ TEST_F(SensorTest, OjbtypeParsedButNotRequired) {
|
||||
mj_deleteModel(model);
|
||||
}
|
||||
|
||||
TEST_F(SensorTest, NegativeIntervalError) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
<worldbody>
|
||||
<body>
|
||||
<joint name="j"/>
|
||||
<geom size="1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
<sensor>
|
||||
<jointpos joint="j" interval="-1"/>
|
||||
</sensor>
|
||||
</mujoco>
|
||||
)";
|
||||
std::array<char, 1024> error;
|
||||
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||
EXPECT_THAT(model, IsNull());
|
||||
EXPECT_THAT(error.data(), HasSubstr("negative interval"));
|
||||
}
|
||||
|
||||
TEST_F(SensorTest, PositivePhaseError) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
<worldbody>
|
||||
<body>
|
||||
<joint name="j"/>
|
||||
<geom size="1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
<sensor>
|
||||
<jointpos joint="j" interval="0.1 0.05"/>
|
||||
</sensor>
|
||||
</mujoco>
|
||||
)";
|
||||
std::array<char, 1024> error;
|
||||
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||
EXPECT_THAT(model, IsNull());
|
||||
EXPECT_THAT(error.data(), HasSubstr("positive phase"));
|
||||
}
|
||||
|
||||
TEST_F(SensorTest, DelayWithoutHistoryError) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
<worldbody>
|
||||
<body>
|
||||
<joint name="j"/>
|
||||
<geom size="1"/>
|
||||
</body>
|
||||
</worldbody>
|
||||
<sensor>
|
||||
<jointpos joint="j" delay="0.1"/>
|
||||
</sensor>
|
||||
</mujoco>
|
||||
)";
|
||||
std::array<char, 1024> error;
|
||||
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||
EXPECT_THAT(model, IsNull());
|
||||
EXPECT_THAT(error.data(), HasSubstr("delay > 0 without a history buffer"));
|
||||
}
|
||||
|
||||
// ------------- test capsule inertias -----------------------------------------
|
||||
|
||||
static const char* const kCapsuleInertiaPath =
|
||||
|
||||
Reference in New Issue
Block a user