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
+71
View File
@@ -1720,5 +1720,76 @@ TEST_F(XMLWriterTest, WritesCameraOutputDefault) {
mj_deleteModel(model);
}
TEST_F(XMLWriterTest, WritesSensorDelayIntervalHistory) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
<body>
<joint name="slide" type="slide"/>
<geom size="0.1"/>
</body>
</worldbody>
<sensor>
<jointpos joint="slide" delay="0.05" interval="0.1 -0.02" nsample="20" interp="linear"/>
</sensor>
</mujoco>
)";
mjModel* model = LoadModelFromString(xml);
ASSERT_THAT(model, NotNull());
std::string saved_xml = SaveAndReadXml(model);
EXPECT_THAT(saved_xml, HasSubstr("delay=\"0.05\""));
EXPECT_THAT(saved_xml, HasSubstr("interval=\"0.1 -0.02\""));
EXPECT_THAT(saved_xml, HasSubstr("nsample=\"20\""));
EXPECT_THAT(saved_xml, HasSubstr("interp=\"linear\""));
mj_deleteModel(model);
}
TEST_F(XMLWriterTest, DoesNotWriteDefaultSensorAttributes) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
<body>
<joint name="slide" type="slide"/>
<geom size="0.1"/>
</body>
</worldbody>
<sensor>
<jointpos joint="slide"/>
</sensor>
</mujoco>
)";
mjModel* model = LoadModelFromString(xml);
ASSERT_THAT(model, NotNull());
std::string saved_xml = SaveAndReadXml(model);
EXPECT_THAT(saved_xml, Not(HasSubstr("delay=")));
EXPECT_THAT(saved_xml, Not(HasSubstr("interval=")));
EXPECT_THAT(saved_xml, Not(HasSubstr("nsample=")));
EXPECT_THAT(saved_xml, Not(HasSubstr("interp=")));
mj_deleteModel(model);
}
TEST_F(XMLWriterTest, WritesActuatorDelayHistory) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
<body>
<joint name="slide" type="slide"/>
<geom size="0.1"/>
</body>
</worldbody>
<actuator>
<motor joint="slide" delay="0.03" nsample="15" interp="cubic"/>
</actuator>
</mujoco>
)";
mjModel* model = LoadModelFromString(xml);
ASSERT_THAT(model, NotNull());
std::string saved_xml = SaveAndReadXml(model);
EXPECT_THAT(saved_xml, HasSubstr("delay=\"0.03\""));
EXPECT_THAT(saved_xml, HasSubstr("nsample=\"15\""));
EXPECT_THAT(saved_xml, HasSubstr("interp=\"cubic\""));
mj_deleteModel(model);
}
} // namespace
} // namespace mujoco