Check keyframe size before appending it during attach.
Fixes #2365. PiperOrigin-RevId: 718455748 Change-Id: I20c56b7c6fbd868962d19682e72e6294edb6893e
This commit is contained in:
committed by
Copybara-Service
parent
aa505a7872
commit
21d97902ee
+24
-1
@@ -3473,7 +3473,30 @@ void mjCModel::StoreKeyframes(mjCModel* dest) {
|
|||||||
info.mpos = !key->spec_mpos_.empty();
|
info.mpos = !key->spec_mpos_.empty();
|
||||||
info.mquat = !key->spec_mquat_.empty();
|
info.mquat = !key->spec_mquat_.empty();
|
||||||
dest->key_pending_.push_back(info);
|
dest->key_pending_.push_back(info);
|
||||||
ResizeKeyframe(key, qpos0.data(), body_pos0.data(), body_quat0.data());
|
if (!key->spec_qpos_.empty() && key->spec_qpos_.size() != nq) {
|
||||||
|
throw mjCError(nullptr, "Keyframe '%s' has invalid qpos size, got %d, should be %d",
|
||||||
|
key->name.c_str(), key->spec_qpos_.size(), nq);
|
||||||
|
}
|
||||||
|
if (!key->spec_qvel_.empty() && key->spec_qvel_.size() != nv) {
|
||||||
|
throw mjCError(nullptr, "Keyframe %s has invalid qvel size, got %d, should be %d",
|
||||||
|
key->name.c_str(), key->spec_qvel_.size(), nv);
|
||||||
|
}
|
||||||
|
if (!key->spec_act_.empty() && key->spec_act_.size() != na) {
|
||||||
|
throw mjCError(nullptr, "Keyframe %s has invalid act size, got %d, should be %d",
|
||||||
|
key->name.c_str(), key->spec_act_.size(), na);
|
||||||
|
}
|
||||||
|
if (!key->spec_ctrl_.empty() && key->spec_ctrl_.size() != nu) {
|
||||||
|
throw mjCError(nullptr, "Keyframe %s has invalid ctrl size, got %d, should be %d",
|
||||||
|
key->name.c_str(), key->spec_ctrl_.size(), nu);
|
||||||
|
}
|
||||||
|
if (!key->spec_mpos_.empty() && key->spec_mpos_.size() != 3*nmocap) {
|
||||||
|
throw mjCError(nullptr, "Keyframe %s has invalid mpos size, got %d, should be %d",
|
||||||
|
key->name.c_str(), key->spec_mpos_.size(), 3*nmocap);
|
||||||
|
}
|
||||||
|
if (!key->spec_mquat_.empty() && key->spec_mquat_.size() != 4*nmocap) {
|
||||||
|
throw mjCError(nullptr, "Keyframe %s has invalid mquat size, got %d, should be %d",
|
||||||
|
key->name.c_str(), key->spec_mquat_.size(), 4*nmocap);
|
||||||
|
}
|
||||||
SaveState(info.name, key->spec_qpos_.data(), key->spec_qvel_.data(),
|
SaveState(info.name, key->spec_qpos_.data(), key->spec_qvel_.data(),
|
||||||
key->spec_act_.data(), key->spec_ctrl_.data(),
|
key->spec_act_.data(), key->spec_ctrl_.data(),
|
||||||
key->spec_mpos_.data(), key->spec_mquat_.data());
|
key->spec_mpos_.data(), key->spec_mquat_.data());
|
||||||
|
|||||||
@@ -2056,6 +2056,32 @@ TEST_F(MujocoTest, ResizeParentKeyframe) {
|
|||||||
mj_deleteModel(expected);
|
mj_deleteModel(expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(MujocoTest, KeyframeSizeError) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<worldbody>
|
||||||
|
<replicate count="2" offset="0 1 0">
|
||||||
|
<body name="ball" pos="0 0 1">
|
||||||
|
<geom type="sphere" size="0.1"/>
|
||||||
|
<joint/>
|
||||||
|
</body>
|
||||||
|
</replicate>
|
||||||
|
</worldbody>
|
||||||
|
|
||||||
|
<keyframe>
|
||||||
|
<key name="valid_qpos" qpos="0.5"/>
|
||||||
|
<key name="invalid_qpos" qpos="0.5 0.25"/>
|
||||||
|
</keyframe>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
|
||||||
|
std::array<char, 1000> er;
|
||||||
|
mjSpec* spec = mj_parseXMLString(xml, 0, er.data(), er.size());
|
||||||
|
EXPECT_THAT(spec, IsNull());
|
||||||
|
EXPECT_THAT(er.data(), HasSubstr(
|
||||||
|
"Keyframe 'invalid_qpos' has invalid qpos size, got 2, should be 1"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(MujocoTest, DifferentUnitsAllowed) {
|
TEST_F(MujocoTest, DifferentUnitsAllowed) {
|
||||||
static constexpr char gchild_xml[] = R"(
|
static constexpr char gchild_xml[] = R"(
|
||||||
<mujoco model="gchild">
|
<mujoco model="gchild">
|
||||||
|
|||||||
Reference in New Issue
Block a user