Catch errors in attach during replicate.
PiperOrigin-RevId: 651041336 Change-Id: I59986e157b4e22c74f8b8493899cdd4a3d5df839
This commit is contained in:
committed by
Copybara-Service
parent
b483ce608e
commit
7f9f8b5429
+10
-2
@@ -98,7 +98,11 @@ int mjs_attachBody(mjsFrame* parent, const mjsBody* child,
|
|||||||
const char* prefix, const char* suffix) {
|
const char* prefix, const char* suffix) {
|
||||||
mjCFrame* frame_parent = static_cast<mjCFrame*>(parent->element);
|
mjCFrame* frame_parent = static_cast<mjCFrame*>(parent->element);
|
||||||
mjCBody* child_body = static_cast<mjCBody*>(child->element);
|
mjCBody* child_body = static_cast<mjCBody*>(child->element);
|
||||||
*frame_parent += std::string(prefix) + *child_body + std::string(suffix);
|
try {
|
||||||
|
*frame_parent += std::string(prefix) + *child_body + std::string(suffix);
|
||||||
|
} catch (mjCError& e) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +113,11 @@ int mjs_attachFrame(mjsBody* parent, const mjsFrame* child,
|
|||||||
const char* prefix, const char* suffix) {
|
const char* prefix, const char* suffix) {
|
||||||
mjCBody* body_parent = static_cast<mjCBody*>(parent->element);
|
mjCBody* body_parent = static_cast<mjCBody*>(parent->element);
|
||||||
mjCFrame* child_frame = static_cast<mjCFrame*>(child->element);
|
mjCFrame* child_frame = static_cast<mjCFrame*>(child->element);
|
||||||
*body_parent += std::string(prefix) + *child_frame + std::string(suffix);
|
try {
|
||||||
|
*body_parent += std::string(prefix) + *child_frame + std::string(suffix);
|
||||||
|
} catch (mjCError& e) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3437,7 +3437,9 @@ void mjXReader::Body(XMLElement* section, mjsBody* pbody, mjsFrame* frame) {
|
|||||||
Body(elem, subtree, pframe);
|
Body(elem, subtree, pframe);
|
||||||
|
|
||||||
// attach to parent
|
// attach to parent
|
||||||
mjs_attachFrame(pbody, pframe, /*prefix=*/"", suffix.c_str());
|
if (mjs_attachFrame(pbody, pframe, /*prefix=*/"", suffix.c_str()) < 0) {
|
||||||
|
throw mjXError(elem, "failed to attach frame");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete subtree
|
// delete subtree
|
||||||
|
|||||||
@@ -1217,6 +1217,45 @@ TEST_F(XMLReaderTest, ParseReplicateDefaultPropagate) {
|
|||||||
mj_deleteSpec(spec);
|
mj_deleteSpec(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(XMLReaderTest, ParseReplicateRepeatedName) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<compiler>
|
||||||
|
<lengthrange mode="all"/>
|
||||||
|
</compiler>
|
||||||
|
|
||||||
|
<worldbody>
|
||||||
|
<light pos="0 0 10"/>
|
||||||
|
|
||||||
|
<replicate offset="0 .1 0" count="2">
|
||||||
|
<site name="a" size=".02"/>
|
||||||
|
<body pos="1 0 1">
|
||||||
|
<joint axis="0 -1 0" range="0 90"/>
|
||||||
|
<geom type="capsule" size=".02" fromto="0 0 0 0 0 -1"/>
|
||||||
|
<site name="b" pos="0 0 -1"/>
|
||||||
|
</body>
|
||||||
|
</replicate>
|
||||||
|
</worldbody>
|
||||||
|
|
||||||
|
<tendon>
|
||||||
|
<spatial name="b">
|
||||||
|
<site site="a"/>
|
||||||
|
<site site="b"/>
|
||||||
|
</spatial>
|
||||||
|
</tendon>
|
||||||
|
|
||||||
|
<actuator>
|
||||||
|
<position name="b" tendon="b0" ctrlrange="0 3" kp="100" dampratio="1"/>
|
||||||
|
<position name="b" tendon="b1" ctrlrange="0 3" kp="100" dampratio="1"/>
|
||||||
|
</actuator>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
std::array<char, 1024> error;
|
||||||
|
mjSpec* spec = mj_parseXMLString(xml, 0, error.data(), error.size());
|
||||||
|
EXPECT_THAT(spec, IsNull()) << error.data();
|
||||||
|
EXPECT_THAT(error.data(), HasSubstr("failed to attach frame"));
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------- test camera parsing ---------------------------------
|
// ----------------------- test camera parsing ---------------------------------
|
||||||
|
|
||||||
TEST_F(XMLReaderTest, CameraInvalidFovyAndSensorsize) {
|
TEST_F(XMLReaderTest, CameraInvalidFovyAndSensorsize) {
|
||||||
|
|||||||
Reference in New Issue
Block a user