Add actuator and sensor delays. Fixes #1004

PiperOrigin-RevId: 866478839
Change-Id: Id21a6da0f98454c8fa39ea5af8a5e213d6eae497
This commit is contained in:
Yuval Tassa
2026-02-06 08:46:45 -08:00
committed by Copybara-Service
parent 84fa527723
commit 6419534bad
48 changed files with 6282 additions and 219 deletions
+60
View File
@@ -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 =