Add mjs_attachToSite for attaching a body to a site.
PiperOrigin-RevId: 684432183 Change-Id: I7100bebfb6521f9dbfbb07f31490b2b9298bf18c
This commit is contained in:
committed by
Copybara-Service
parent
694bdebc19
commit
cdb167f275
+19
-4
@@ -426,7 +426,7 @@ PYBIND11_MODULE(_specs, m) {
|
||||
[](raw::MjsBody& self, mjtObj objtype) -> py::list {
|
||||
py::list list;
|
||||
raw::MjsElement* el = mjs_firstChild(&self, objtype, true);
|
||||
std::string error = mjs_getError(mjs_getSpec(&self));
|
||||
std::string error = mjs_getError(mjs_getSpec(self.element));
|
||||
if (!el && !error.empty()) {
|
||||
throw pybind11::value_error(error);
|
||||
}
|
||||
@@ -557,7 +557,9 @@ PYBIND11_MODULE(_specs, m) {
|
||||
py::return_value_policy::reference_internal);
|
||||
mjsBody.def(
|
||||
"spec",
|
||||
[](raw::MjsBody& self) -> raw::MjSpec* { return mjs_getSpec(&self); },
|
||||
[](raw::MjsBody& self) -> raw::MjSpec* {
|
||||
return mjs_getSpec(self.element);
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
mjsBody.def(
|
||||
"attach_frame",
|
||||
@@ -566,7 +568,7 @@ PYBIND11_MODULE(_specs, m) {
|
||||
auto new_frame =
|
||||
mjs_attachFrame(&self, &frame, prefix.c_str(), suffix.c_str());
|
||||
if (!new_frame) {
|
||||
throw pybind11::value_error(mjs_getError(mjs_getSpec(&self)));
|
||||
throw pybind11::value_error(mjs_getError(mjs_getSpec(self.element)));
|
||||
}
|
||||
return new_frame;
|
||||
},
|
||||
@@ -587,7 +589,7 @@ PYBIND11_MODULE(_specs, m) {
|
||||
mjs_attachBody(&self, &body, prefix.c_str(), suffix.c_str());
|
||||
if (!new_body) {
|
||||
throw pybind11::value_error(
|
||||
mjs_getError(mjs_getSpecFromFrame(&self)));
|
||||
mjs_getError(mjs_getSpec(self.element)));
|
||||
}
|
||||
return new_body;
|
||||
},
|
||||
@@ -643,6 +645,19 @@ PYBIND11_MODULE(_specs, m) {
|
||||
return mjs_getDefault(self.element);
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
mjsSite.def(
|
||||
"attach",
|
||||
[](raw::MjsSite& self, raw::MjsBody& body, std::string& prefix,
|
||||
std::string& suffix) -> raw::MjsBody* {
|
||||
auto new_body =
|
||||
mjs_attachToSite(&self, &body, prefix.c_str(), suffix.c_str());
|
||||
if (!new_body) {
|
||||
throw pybind11::value_error(
|
||||
mjs_getError(mjs_getSpec(self.element)));
|
||||
}
|
||||
return new_body;
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
|
||||
// ============================= MJSCAMERA ===================================
|
||||
mjsCamera.def_property_readonly("id", [](raw::MjsCamera& self) -> int {
|
||||
|
||||
@@ -857,6 +857,15 @@ class SpecsTest(absltest.TestCase):
|
||||
' attribute',
|
||||
)
|
||||
|
||||
def test_attach_body_to_site(self):
|
||||
child = mujoco.MjSpec()
|
||||
parent = mujoco.MjSpec()
|
||||
site = parent.worldbody.add_site(pos=[1, 2, 3])
|
||||
body = child.worldbody.add_body()
|
||||
self.assertIsNotNone(site.attach(body, '', ''))
|
||||
model = parent.compile()
|
||||
np.testing.assert_array_equal(model.body_pos[1], [1, 2, 3])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
absltest.main()
|
||||
|
||||
Reference in New Issue
Block a user