Read new Mujoco-specific JointAPI when converting USD.
PiperOrigin-RevId: 778037519 Change-Id: Idd81dc5dc14e2dfb40ba7db4404fd09f9ff50a9f
This commit is contained in:
committed by
Copybara-Service
parent
9dc67b50cd
commit
50de1b3c2c
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <mujoco/experimental/usd/mjcPhysics/actuatorAPI.h>
|
#include <mujoco/experimental/usd/mjcPhysics/actuatorAPI.h>
|
||||||
#include <mujoco/experimental/usd/mjcPhysics/collisionAPI.h>
|
#include <mujoco/experimental/usd/mjcPhysics/collisionAPI.h>
|
||||||
|
#include <mujoco/experimental/usd/mjcPhysics/jointAPI.h>
|
||||||
#include <mujoco/experimental/usd/mjcPhysics/meshCollisionAPI.h>
|
#include <mujoco/experimental/usd/mjcPhysics/meshCollisionAPI.h>
|
||||||
#include <mujoco/experimental/usd/mjcPhysics/sceneAPI.h>
|
#include <mujoco/experimental/usd/mjcPhysics/sceneAPI.h>
|
||||||
#include <mujoco/experimental/usd/mjcPhysics/siteAPI.h>
|
#include <mujoco/experimental/usd/mjcPhysics/siteAPI.h>
|
||||||
@@ -717,6 +718,170 @@ void ParseMjcPhysicsGeneralActuatorAPI(mjSpec* spec,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParseMjcPhysicsJointAPI(mjsJoint* mj_joint,
|
||||||
|
const pxr::MjcPhysicsJointAPI& joint_api) {
|
||||||
|
auto springdamper_attr = joint_api.GetMjcSpringdamperAttr();
|
||||||
|
if (springdamper_attr.HasAuthoredValue()) {
|
||||||
|
pxr::VtDoubleArray springdamper;
|
||||||
|
springdamper_attr.Get(&springdamper);
|
||||||
|
if (springdamper.size() == 2) {
|
||||||
|
mj_joint->springdamper[0] = springdamper[0];
|
||||||
|
mj_joint->springdamper[1] = springdamper[1];
|
||||||
|
} else {
|
||||||
|
mju_warning(
|
||||||
|
"springdamper attribute for joint %s has incorrect size %zu, "
|
||||||
|
"expected 2.",
|
||||||
|
mj_joint->name->c_str(), springdamper.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto solreflimit_attr = joint_api.GetMjcSolreflimitAttr();
|
||||||
|
if (solreflimit_attr.HasAuthoredValue()) {
|
||||||
|
pxr::VtDoubleArray solreflimit;
|
||||||
|
solreflimit_attr.Get(&solreflimit);
|
||||||
|
if (solreflimit.size() == mjNREF) {
|
||||||
|
for (int i = 0; i < mjNREF; ++i) {
|
||||||
|
mj_joint->solref_limit[i] = solreflimit[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mju_warning(
|
||||||
|
"solreflimit attribute for joint %s has incorrect size %zu, "
|
||||||
|
"expected %d.",
|
||||||
|
mj_joint->name->c_str(), solreflimit.size(), mjNREF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto solimplimit_attr = joint_api.GetMjcSolimplimitAttr();
|
||||||
|
if (solimplimit_attr.HasAuthoredValue()) {
|
||||||
|
pxr::VtDoubleArray solimplimit;
|
||||||
|
solimplimit_attr.Get(&solimplimit);
|
||||||
|
if (solimplimit.size() == mjNIMP) {
|
||||||
|
for (int i = 0; i < mjNIMP; ++i) {
|
||||||
|
mj_joint->solimp_limit[i] = solimplimit[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mju_warning(
|
||||||
|
"solimplimit attribute for joint %s has incorrect size %zu, "
|
||||||
|
"expected %d.",
|
||||||
|
mj_joint->name->c_str(), solimplimit.size(), mjNIMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto solreffriction_attr = joint_api.GetMjcSolreffrictionAttr();
|
||||||
|
if (solreffriction_attr.HasAuthoredValue()) {
|
||||||
|
pxr::VtDoubleArray solreffriction;
|
||||||
|
solreffriction_attr.Get(&solreffriction);
|
||||||
|
if (solreffriction.size() == mjNREF) {
|
||||||
|
for (int i = 0; i < mjNREF; ++i) {
|
||||||
|
mj_joint->solref_friction[i] = solreffriction[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mju_warning(
|
||||||
|
"solreffriction attribute for joint %s has incorrect size %zu, "
|
||||||
|
"expected %d.",
|
||||||
|
mj_joint->name->c_str(), solreffriction.size(), mjNREF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto solimpfriction_attr = joint_api.GetMjcSolimpfrictionAttr();
|
||||||
|
if (solimpfriction_attr.HasAuthoredValue()) {
|
||||||
|
pxr::VtDoubleArray solimpfriction;
|
||||||
|
solimpfriction_attr.Get(&solimpfriction);
|
||||||
|
if (solimpfriction.size() == mjNIMP) {
|
||||||
|
for (int i = 0; i < mjNIMP; ++i) {
|
||||||
|
mj_joint->solimp_friction[i] = solimpfriction[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mju_warning(
|
||||||
|
"solimpfriction attribute for joint %s has incorrect size %zu, "
|
||||||
|
"expected %d.",
|
||||||
|
mj_joint->name->c_str(), solimpfriction.size(), mjNIMP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto stiffness_attr = joint_api.GetMjcStiffnessAttr();
|
||||||
|
if (stiffness_attr.HasAuthoredValue()) {
|
||||||
|
double stiffness;
|
||||||
|
stiffness_attr.Get(&stiffness);
|
||||||
|
mj_joint->stiffness = stiffness;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto actuatorfrcrange_min_attr = joint_api.GetMjcActuatorfrcrangeMinAttr();
|
||||||
|
if (actuatorfrcrange_min_attr.HasAuthoredValue()) {
|
||||||
|
double min_val;
|
||||||
|
actuatorfrcrange_min_attr.Get(&min_val);
|
||||||
|
mj_joint->actfrcrange[0] = min_val;
|
||||||
|
}
|
||||||
|
auto actuatorfrcrange_max_attr = joint_api.GetMjcActuatorfrcrangeMaxAttr();
|
||||||
|
if (actuatorfrcrange_max_attr.HasAuthoredValue()) {
|
||||||
|
double max_val;
|
||||||
|
actuatorfrcrange_max_attr.Get(&max_val);
|
||||||
|
mj_joint->actfrcrange[1] = max_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto actuatorfrclimited_attr = joint_api.GetMjcActuatorfrclimitedAttr();
|
||||||
|
if (actuatorfrclimited_attr.HasAuthoredValue()) {
|
||||||
|
pxr::TfToken limited;
|
||||||
|
actuatorfrclimited_attr.Get(&limited);
|
||||||
|
if (limited == MjcPhysicsTokens->true_) {
|
||||||
|
mj_joint->actfrclimited = mjLIMITED_TRUE;
|
||||||
|
} else if (limited == MjcPhysicsTokens->false_) {
|
||||||
|
mj_joint->actfrclimited = mjLIMITED_FALSE;
|
||||||
|
} else if (limited == MjcPhysicsTokens->auto_) {
|
||||||
|
mj_joint->actfrclimited = mjLIMITED_AUTO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto actuatorgravcomp_attr = joint_api.GetMjcActuatorgravcompAttr();
|
||||||
|
if (actuatorgravcomp_attr.HasAuthoredValue()) {
|
||||||
|
bool gravcomp;
|
||||||
|
actuatorgravcomp_attr.Get(&gravcomp);
|
||||||
|
mj_joint->actgravcomp = gravcomp;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto margin_attr = joint_api.GetMjcMarginAttr();
|
||||||
|
if (margin_attr.HasAuthoredValue()) {
|
||||||
|
double margin;
|
||||||
|
margin_attr.Get(&margin);
|
||||||
|
mj_joint->margin = margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto ref_attr = joint_api.GetMjcRefAttr();
|
||||||
|
if (ref_attr.HasAuthoredValue()) {
|
||||||
|
double ref;
|
||||||
|
ref_attr.Get(&ref);
|
||||||
|
mj_joint->ref = ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto springref_attr = joint_api.GetMjcSpringrefAttr();
|
||||||
|
if (springref_attr.HasAuthoredValue()) {
|
||||||
|
double springref;
|
||||||
|
springref_attr.Get(&springref);
|
||||||
|
mj_joint->springref = springref;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto armature_attr = joint_api.GetMjcArmatureAttr();
|
||||||
|
if (armature_attr.HasAuthoredValue()) {
|
||||||
|
double armature;
|
||||||
|
armature_attr.Get(&armature);
|
||||||
|
mj_joint->armature = armature;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto damping_attr = joint_api.GetMjcDampingAttr();
|
||||||
|
if (damping_attr.HasAuthoredValue()) {
|
||||||
|
double damping;
|
||||||
|
damping_attr.Get(&damping);
|
||||||
|
mj_joint->damping = damping;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto frictionloss_attr = joint_api.GetMjcFrictionlossAttr();
|
||||||
|
if (frictionloss_attr.HasAuthoredValue()) {
|
||||||
|
double frictionloss;
|
||||||
|
frictionloss_attr.Get(&frictionloss);
|
||||||
|
mj_joint->frictionloss = frictionloss;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ParseUsdPhysicsCollider(mjSpec* spec,
|
void ParseUsdPhysicsCollider(mjSpec* spec,
|
||||||
const pxr::UsdPhysicsCollisionAPI& collision_api,
|
const pxr::UsdPhysicsCollisionAPI& collision_api,
|
||||||
const pxr::UsdPrim& parent_prim, mjsBody* parent,
|
const pxr::UsdPrim& parent_prim, mjsBody* parent,
|
||||||
@@ -959,6 +1124,10 @@ void ParseUsdPhysicsJoint(mjSpec* spec, const pxr::UsdPrim& prim, mjsBody* body,
|
|||||||
ParseMjcPhysicsGeneralActuatorAPI(spec, pxr::MjcPhysicsActuatorAPI(prim),
|
ParseMjcPhysicsGeneralActuatorAPI(spec, pxr::MjcPhysicsActuatorAPI(prim),
|
||||||
mjtTrn::mjTRN_JOINT, mj_joint->name);
|
mjtTrn::mjTRN_JOINT, mj_joint->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prim.HasAPI<pxr::MjcPhysicsJointAPI>()) {
|
||||||
|
ParseMjcPhysicsJointAPI(mj_joint, pxr::MjcPhysicsJointAPI(prim));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseMjcPhysicsSite(mjSpec* spec, const pxr::MjcPhysicsSiteAPI& site_api,
|
void ParseMjcPhysicsSite(mjSpec* spec, const pxr::MjcPhysicsSiteAPI& site_api,
|
||||||
|
|||||||
Reference in New Issue
Block a user