Write new Mujoco-specific JointAPI data to USD.
PiperOrigin-RevId: 778035661 Change-Id: I945aa38fc58973023d78ab0ab5fad7783d23e1ef
This commit is contained in:
committed by
Copybara-Service
parent
862436f9b3
commit
9dc67b50cd
@@ -557,13 +557,13 @@ class ModelWriter {
|
|||||||
MjcPhysicsTokens->mjcOptionMagnetic, magnetic);
|
MjcPhysicsTokens->mjcOptionMagnetic, magnetic);
|
||||||
|
|
||||||
pxr::VtArray<double> o_solref(spec_->option.o_solref,
|
pxr::VtArray<double> o_solref(spec_->option.o_solref,
|
||||||
spec_->option.o_solref + 2);
|
spec_->option.o_solref + mjNREF);
|
||||||
WriteUniformAttribute(physics_scene_path,
|
WriteUniformAttribute(physics_scene_path,
|
||||||
pxr::SdfValueTypeNames->DoubleArray,
|
pxr::SdfValueTypeNames->DoubleArray,
|
||||||
MjcPhysicsTokens->mjcOptionO_solref, o_solref);
|
MjcPhysicsTokens->mjcOptionO_solref, o_solref);
|
||||||
|
|
||||||
pxr::VtArray<double> o_solimp(spec_->option.o_solimp,
|
pxr::VtArray<double> o_solimp(spec_->option.o_solimp,
|
||||||
spec_->option.o_solimp + 5);
|
spec_->option.o_solimp + mjNIMP);
|
||||||
WriteUniformAttribute(physics_scene_path,
|
WriteUniformAttribute(physics_scene_path,
|
||||||
pxr::SdfValueTypeNames->DoubleArray,
|
pxr::SdfValueTypeNames->DoubleArray,
|
||||||
MjcPhysicsTokens->mjcOptionO_solimp, o_solimp);
|
MjcPhysicsTokens->mjcOptionO_solimp, o_solimp);
|
||||||
@@ -1716,6 +1716,80 @@ class ModelWriter {
|
|||||||
upper_limit);
|
upper_limit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finally write the mjcPhysicsJointAPI attributes.
|
||||||
|
ApplyApiSchema(data_, joint_path, MjcPhysicsTokens->PhysicsJointsAPI);
|
||||||
|
|
||||||
|
WriteUniformAttribute(
|
||||||
|
joint_path, pxr::SdfValueTypeNames->DoubleArray,
|
||||||
|
MjcPhysicsTokens->mjcSpringdamper,
|
||||||
|
pxr::VtArray<double>(joint->springdamper, joint->springdamper + 2));
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->DoubleArray,
|
||||||
|
MjcPhysicsTokens->mjcSolreflimit,
|
||||||
|
pxr::VtArray<double>(joint->solref_limit,
|
||||||
|
joint->solref_limit + mjNREF));
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->DoubleArray,
|
||||||
|
MjcPhysicsTokens->mjcSolimplimit,
|
||||||
|
pxr::VtArray<double>(joint->solimp_limit,
|
||||||
|
joint->solimp_limit + mjNIMP));
|
||||||
|
|
||||||
|
WriteUniformAttribute(
|
||||||
|
joint_path, pxr::SdfValueTypeNames->DoubleArray,
|
||||||
|
MjcPhysicsTokens->mjcSolreffriction,
|
||||||
|
pxr::VtArray<double>(joint->solref_friction,
|
||||||
|
joint->solref_friction + mjNREF));
|
||||||
|
|
||||||
|
WriteUniformAttribute(
|
||||||
|
joint_path, pxr::SdfValueTypeNames->DoubleArray,
|
||||||
|
MjcPhysicsTokens->mjcSolimpfriction,
|
||||||
|
pxr::VtArray<double>(joint->solimp_friction,
|
||||||
|
joint->solimp_friction + mjNIMP));
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcStiffness, joint->stiffness);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcActuatorfrcrangeMin,
|
||||||
|
joint->actfrcrange[0]);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcActuatorfrcrangeMax,
|
||||||
|
joint->actfrcrange[1]);
|
||||||
|
|
||||||
|
pxr::TfToken actuatorfrclimited_token = MjcPhysicsTokens->auto_;
|
||||||
|
if (joint->actfrclimited == mjLIMITED_TRUE) {
|
||||||
|
actuatorfrclimited_token = MjcPhysicsTokens->true_;
|
||||||
|
} else if (joint->actfrclimited == mjLIMITED_FALSE) {
|
||||||
|
actuatorfrclimited_token = MjcPhysicsTokens->false_;
|
||||||
|
}
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Token,
|
||||||
|
MjcPhysicsTokens->mjcActuatorfrclimited,
|
||||||
|
actuatorfrclimited_token);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Bool,
|
||||||
|
MjcPhysicsTokens->mjcActuatorgravcomp,
|
||||||
|
static_cast<bool>(joint->actgravcomp));
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcMargin, joint->margin);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcRef, joint->ref);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcSpringref, joint->springref);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcArmature, joint->armature);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcDamping, joint->damping);
|
||||||
|
|
||||||
|
WriteUniformAttribute(joint_path, pxr::SdfValueTypeNames->Double,
|
||||||
|
MjcPhysicsTokens->mjcFrictionloss,
|
||||||
|
joint->frictionloss);
|
||||||
}
|
}
|
||||||
if (joint_id >= 0) {
|
if (joint_id >= 0) {
|
||||||
joint_paths_[joint_id] = joint_path;
|
joint_paths_[joint_id] = joint_path;
|
||||||
@@ -1824,8 +1898,7 @@ class ModelWriter {
|
|||||||
// If the parent is not the world body, but is child of the world body
|
// If the parent is not the world body, but is child of the world body
|
||||||
// then we need to apply the articulation root API.
|
// then we need to apply the articulation root API.
|
||||||
if (parent_id != kWorldIndex) {
|
if (parent_id != kWorldIndex) {
|
||||||
int parent_parent_id =
|
int parent_parent_id = mjs_getId(mjs_getParent(parent->element)->element);
|
||||||
mjs_getId(mjs_getParent(parent->element)->element);
|
|
||||||
if (parent_parent_id == kWorldIndex) {
|
if (parent_parent_id == kWorldIndex) {
|
||||||
ApplyApiSchema(data_, parent_path,
|
ApplyApiSchema(data_, parent_path,
|
||||||
pxr::UsdPhysicsTokens->PhysicsArticulationRootAPI);
|
pxr::UsdPhysicsTokens->PhysicsArticulationRootAPI);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#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>
|
||||||
@@ -1169,13 +1170,13 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsRigidBody) {
|
|||||||
// test_body_3 is a child of the world but has no children so should not be
|
// test_body_3 is a child of the world but has no children so should not be
|
||||||
// an articulation root.
|
// an articulation root.
|
||||||
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test/test_body_3",
|
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test/test_body_3",
|
||||||
pxr::UsdPhysicsArticulationRootAPI);
|
pxr::UsdPhysicsArticulationRootAPI);
|
||||||
|
|
||||||
// Articulation root is not applied to other bodies or world body.
|
// Articulation root is not applied to other bodies or world body.
|
||||||
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test",
|
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test",
|
||||||
pxr::UsdPhysicsArticulationRootAPI);
|
pxr::UsdPhysicsArticulationRootAPI);
|
||||||
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test/test_body/test_body_2",
|
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test/test_body/test_body_2",
|
||||||
pxr::UsdPhysicsArticulationRootAPI);
|
pxr::UsdPhysicsArticulationRootAPI);
|
||||||
|
|
||||||
// Geoms should not have RigidBodyAPI applied either.
|
// Geoms should not have RigidBodyAPI applied either.
|
||||||
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test/test_body/test_geom",
|
EXPECT_PRIM_API_NOT_APPLIED(stage, "/physics_test/test_body/test_geom",
|
||||||
@@ -1589,6 +1590,69 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestMjcPhysicsSliderCrankActuator) {
|
|||||||
ExpectAttributeEqual(stage, "/test/body/crank.mjc:crankLength", 1.23);
|
ExpectAttributeEqual(stage, "/test/body/crank.mjc:crankLength", 1.23);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(MjcfSdfFileFormatPluginTest, TestMjcPhysicsJointAPI) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco model="test">
|
||||||
|
<worldbody>
|
||||||
|
<body name="parent">
|
||||||
|
<body name="child">
|
||||||
|
<joint name="my_joint" type="hinge"
|
||||||
|
springdamper="1 2"
|
||||||
|
solreflimit="0.1 0.2"
|
||||||
|
solimplimit="0.3 0.4 0.5 0.6 0.7"
|
||||||
|
solreffriction="0.8 0.9"
|
||||||
|
solimpfriction="1.0 1.1 1.2 1.3 1.4"
|
||||||
|
stiffness="1.5"
|
||||||
|
actuatorfrcrange="-1.6 1.7"
|
||||||
|
actuatorfrclimited="true"
|
||||||
|
actuatorgravcomp="true"
|
||||||
|
margin="1.8"
|
||||||
|
ref="1.9"
|
||||||
|
springref="2.0"
|
||||||
|
armature="2.1"
|
||||||
|
damping="2.2"
|
||||||
|
frictionloss="2.3"
|
||||||
|
/>
|
||||||
|
<geom type="sphere" size="1"/>
|
||||||
|
</body>
|
||||||
|
</body>
|
||||||
|
</worldbody>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
auto stage = OpenStageWithPhysics(xml);
|
||||||
|
|
||||||
|
const SdfPath joint_path("/test/parent/child/my_joint");
|
||||||
|
EXPECT_PRIM_API_APPLIED(stage, joint_path, pxr::MjcPhysicsJointAPI);
|
||||||
|
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:springdamper",
|
||||||
|
pxr::VtArray<double>({1, 2}));
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:solreflimit",
|
||||||
|
pxr::VtArray<double>({0.1, 0.2}));
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:solimplimit",
|
||||||
|
pxr::VtArray<double>({0.3, 0.4, 0.5, 0.6, 0.7}));
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:solreffriction",
|
||||||
|
pxr::VtArray<double>({0.8, 0.9}));
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:solimpfriction",
|
||||||
|
pxr::VtArray<double>({1.0, 1.1, 1.2, 1.3, 1.4}));
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:stiffness", 1.5);
|
||||||
|
ExpectAttributeEqual(
|
||||||
|
stage, "/test/parent/child/my_joint.mjc:actuatorfrcrange:min", -1.6);
|
||||||
|
ExpectAttributeEqual(
|
||||||
|
stage, "/test/parent/child/my_joint.mjc:actuatorfrcrange:max", 1.7);
|
||||||
|
ExpectAttributeEqual(stage,
|
||||||
|
"/test/parent/child/my_joint.mjc:actuatorfrclimited",
|
||||||
|
MjcPhysicsTokens->true_);
|
||||||
|
ExpectAttributeEqual(
|
||||||
|
stage, "/test/parent/child/my_joint.mjc:actuatorgravcomp", true);
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:margin", 1.8);
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:ref", 1.9);
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:springref", 2.0);
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:armature", 2.1);
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:damping", 2.2);
|
||||||
|
ExpectAttributeEqual(stage, "/test/parent/child/my_joint.mjc:frictionloss",
|
||||||
|
2.3);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsFloatingAndFixedBaseBody) {
|
TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsFloatingAndFixedBaseBody) {
|
||||||
static constexpr char kXml[] = R"(
|
static constexpr char kXml[] = R"(
|
||||||
<mujoco model="test">
|
<mujoco model="test">
|
||||||
|
|||||||
Reference in New Issue
Block a user