Skip to content

Commit 6144a50

Browse files
havesscopybara-github
authored andcommitted
In Mujoco USD interop, only consider dynamic friction when writing to and parsing from USD.
PiperOrigin-RevId: 783741987 Change-Id: I23c47a6e95c160c5c7d5c513e268c79e4236e2e4
1 parent b99d9e8 commit 6144a50

File tree

3 files changed

+11
-23
lines changed

3 files changed

+11
-23
lines changed

src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -831,9 +831,8 @@ class ModelWriter {
831831

832832
mjsGeom *geom_default = mjs_getDefault(geom->element)->geom;
833833
if (geom->friction[0] != geom_default->friction[0]) {
834-
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
835-
pxr::UsdPhysicsTokens->physicsStaticFriction,
836-
(float)geom->friction[0]);
834+
// Since MuJoCo has no concept of static friction, only write dynamic
835+
// friction to remain truthful to how MuJoCo perceives the data.
837836
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
838837
pxr::UsdPhysicsTokens->physicsDynamicFriction,
839838
(float)geom->friction[0]);

src/experimental/usd/usd_to_mjspec.cc

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
#include <pxr/usd/usdPhysics/revoluteJoint.h>
6767
#include <pxr/usd/usdPhysics/rigidBodyAPI.h>
6868
#include <pxr/usd/usdPhysics/scene.h>
69+
#include <pxr/usd/usdShade/material.h>
6970
#include <pxr/usd/usdShade/materialBindingAPI.h>
7071
namespace {
7172

@@ -1136,19 +1137,8 @@ void ParseMjcPhysicsJointAPI(mjsJoint* mj_joint,
11361137

11371138
void ParseUsdPhysicsMaterialAPI(
11381139
mjsGeom* geom, const pxr::UsdPhysicsMaterialAPI& material_api) {
1139-
auto static_friction_attr = material_api.GetStaticFrictionAttr();
11401140
auto dynamic_friction_attr = material_api.GetDynamicFrictionAttr();
1141-
if (static_friction_attr.HasAuthoredValue()) {
1142-
if (dynamic_friction_attr.HasAuthoredValue()) {
1143-
mju_warning(
1144-
"Material %s has both static and dynamic friction authored, taking "
1145-
"the static value.",
1146-
material_api.GetPath().GetString().c_str());
1147-
}
1148-
float static_friction;
1149-
static_friction_attr.Get(&static_friction);
1150-
geom->friction[0] = static_friction;
1151-
} else if (dynamic_friction_attr.HasAuthoredValue()) {
1141+
if (dynamic_friction_attr.HasAuthoredValue()) {
11521142
float dynamic_friction;
11531143
dynamic_friction_attr.Get(&dynamic_friction);
11541144
geom->friction[0] = dynamic_friction;
@@ -1205,10 +1195,6 @@ void ParseUsdPhysicsCollider(mjSpec* spec,
12051195
geom->contype = 1;
12061196
geom->conaffinity = 1;
12071197

1208-
if (prim.HasAPI<pxr::UsdPhysicsMassAPI>()) {
1209-
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
1210-
}
1211-
12121198
if (prim.HasAPI<pxr::MjcPhysicsCollisionAPI>()) {
12131199
ParseMjcPhysicsCollisionAPI(geom, pxr::MjcPhysicsCollisionAPI(prim));
12141200
}
@@ -1225,6 +1211,13 @@ void ParseUsdPhysicsCollider(mjSpec* spec,
12251211
}
12261212
}
12271213

1214+
// Parse the Mass API after the physics material APIs since the density attribute
1215+
// from the Mass API is supposed to override the Material API density attribute.
1216+
// See https://openusd.org/dev/api/usd_physics_page_front.html
1217+
if (prim.HasAPI<pxr::UsdPhysicsMassAPI>()) {
1218+
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
1219+
}
1220+
12281221
// Convert displayColor and displayOpacity to rgba.
12291222
// We want to support primvar inheritance, hence FindPrimvarWithInheritance.
12301223
pxr::UsdGeomPrimvarsAPI primvarsAPI(prim);

test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,6 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsMaterials) {
155155
stage,
156156
"/physics_materials_test/test_body/geom_with_friction.material:binding",
157157
"/physics_materials_test/PhysicsMaterials/geom_with_friction");
158-
ExpectAttributeEqual(stage,
159-
"/physics_materials_test/PhysicsMaterials/"
160-
"geom_with_friction.physics:staticFriction",
161-
4.0f);
162158
ExpectAttributeEqual(stage,
163159
"/physics_materials_test/PhysicsMaterials/"
164160
"geom_with_friction.physics:dynamicFriction",

0 commit comments

Comments
 (0)