Add support for querying of MjsTendon path from Python.
Fixes #2670 PiperOrigin-RevId: 822215254 Change-Id: Ice5a264e54f963776093511c6e4ac830aae6d4f8
This commit is contained in:
committed by
Copybara-Service
parent
2f65e23779
commit
ac2cd5dfd6
+79
-1
@@ -1304,16 +1304,94 @@ PYBIND11_MODULE(_specs, m) {
|
||||
},
|
||||
py::arg("gain"));
|
||||
|
||||
// ============================= MJSTENDON ===================================
|
||||
// ============================= MJSTENDONPATH ===============================
|
||||
// helper struct for tendon path indexing
|
||||
struct MjsTendonPath {
|
||||
raw::MjsTendon* tendon;
|
||||
};
|
||||
|
||||
py::class_<MjsTendonPath>(m, "MjsTendonPath")
|
||||
.def("__getitem__",
|
||||
[](MjsTendonPath& self, int i) -> const raw::MjsWrap* {
|
||||
int num_wrap = mjs_getWrapNum(self.tendon);
|
||||
if (i < 0 || i >= num_wrap) {
|
||||
throw py::index_error("Index out of range.");
|
||||
}
|
||||
return mjs_getWrap(self.tendon, i);
|
||||
},
|
||||
py::return_value_policy::reference_internal)
|
||||
.def("__len__", [](MjsTendonPath& self) {
|
||||
return mjs_getWrapNum(self.tendon);
|
||||
});
|
||||
|
||||
// ============================= MJSWRAP =====================================
|
||||
mjsWrap.def_property_readonly(
|
||||
"target",
|
||||
[](raw::MjsWrap& self) -> py::object {
|
||||
raw::MjsElement* target = mjs_getWrapTarget(&self);
|
||||
if (!target) {
|
||||
return py::none();
|
||||
}
|
||||
switch (target->elemtype) {
|
||||
case mjOBJ_SITE:
|
||||
return py::cast(mjs_asSite(target));
|
||||
case mjOBJ_GEOM:
|
||||
return py::cast(mjs_asGeom(target));
|
||||
case mjOBJ_JOINT:
|
||||
return py::cast(mjs_asJoint(target));
|
||||
default:
|
||||
throw pybind11::value_error("Unsupported wrap target type: " +
|
||||
std::to_string(target->elemtype));
|
||||
}
|
||||
return py::none();
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
|
||||
mjsWrap.def_property_readonly(
|
||||
"sidesite",
|
||||
[](raw::MjsWrap& self) -> raw::MjsSite* {
|
||||
return mjs_getWrapSideSite(&self);
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
|
||||
mjsWrap.def_property_readonly(
|
||||
"divisor",
|
||||
[](raw::MjsWrap& self) -> py::object {
|
||||
if (self.type != mjWRAP_PULLEY) {
|
||||
return py::none();
|
||||
}
|
||||
return py::cast(mjs_getWrapDivisor(&self));
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
|
||||
mjsWrap.def_property_readonly(
|
||||
"coef",
|
||||
[](raw::MjsWrap& self) -> py::object {
|
||||
if (self.type != mjWRAP_JOINT) {
|
||||
return py::none();
|
||||
}
|
||||
return py::cast(mjs_getWrapCoef(&self));
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
|
||||
|
||||
mjSpec.def("delete", [](MjSpec& self, raw::MjsTendon& obj) {
|
||||
mjs_delete(self.ptr, obj.element);
|
||||
});
|
||||
|
||||
// ============================= MJSTENDON ===================================
|
||||
mjsTendon.def(
|
||||
"default",
|
||||
[](raw::MjsTendon& self) -> raw::MjsDefault* {
|
||||
return mjs_getDefault(self.element);
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
mjsTendon.def_property_readonly(
|
||||
"path",
|
||||
[](raw::MjsTendon& self) {
|
||||
return MjsTendonPath{&self};
|
||||
},
|
||||
py::return_value_policy::reference_internal);
|
||||
mjsTendon.def(
|
||||
"wrap_site",
|
||||
[](raw::MjsTendon& self, std::string& name) {
|
||||
|
||||
Reference in New Issue
Block a user