In Mujoco USD interop, only consider dynamic friction when writing to and parsing from USD.

PiperOrigin-RevId: 783741987
Change-Id: I23c47a6e95c160c5c7d5c513e268c79e4236e2e4
This commit is contained in:
Sam Haves
2025-07-16 06:59:11 -07:00
committed by Copybara-Service
parent b99d9e8f12
commit 6144a508b5
3 changed files with 11 additions and 23 deletions
@@ -831,9 +831,8 @@ class ModelWriter {
mjsGeom *geom_default = mjs_getDefault(geom->element)->geom;
if (geom->friction[0] != geom_default->friction[0]) {
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
pxr::UsdPhysicsTokens->physicsStaticFriction,
(float)geom->friction[0]);
// Since MuJoCo has no concept of static friction, only write dynamic
// friction to remain truthful to how MuJoCo perceives the data.
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
pxr::UsdPhysicsTokens->physicsDynamicFriction,
(float)geom->friction[0]);
+9 -16
View File
@@ -66,6 +66,7 @@
#include <pxr/usd/usdPhysics/revoluteJoint.h>
#include <pxr/usd/usdPhysics/rigidBodyAPI.h>
#include <pxr/usd/usdPhysics/scene.h>
#include <pxr/usd/usdShade/material.h>
#include <pxr/usd/usdShade/materialBindingAPI.h>
namespace {
@@ -1136,19 +1137,8 @@ void ParseMjcPhysicsJointAPI(mjsJoint* mj_joint,
void ParseUsdPhysicsMaterialAPI(
mjsGeom* geom, const pxr::UsdPhysicsMaterialAPI& material_api) {
auto static_friction_attr = material_api.GetStaticFrictionAttr();
auto dynamic_friction_attr = material_api.GetDynamicFrictionAttr();
if (static_friction_attr.HasAuthoredValue()) {
if (dynamic_friction_attr.HasAuthoredValue()) {
mju_warning(
"Material %s has both static and dynamic friction authored, taking "
"the static value.",
material_api.GetPath().GetString().c_str());
}
float static_friction;
static_friction_attr.Get(&static_friction);
geom->friction[0] = static_friction;
} else if (dynamic_friction_attr.HasAuthoredValue()) {
if (dynamic_friction_attr.HasAuthoredValue()) {
float dynamic_friction;
dynamic_friction_attr.Get(&dynamic_friction);
geom->friction[0] = dynamic_friction;
@@ -1205,10 +1195,6 @@ void ParseUsdPhysicsCollider(mjSpec* spec,
geom->contype = 1;
geom->conaffinity = 1;
if (prim.HasAPI<pxr::UsdPhysicsMassAPI>()) {
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
}
if (prim.HasAPI<pxr::MjcPhysicsCollisionAPI>()) {
ParseMjcPhysicsCollisionAPI(geom, pxr::MjcPhysicsCollisionAPI(prim));
}
@@ -1225,6 +1211,13 @@ void ParseUsdPhysicsCollider(mjSpec* spec,
}
}
// Parse the Mass API after the physics material APIs since the density attribute
// from the Mass API is supposed to override the Material API density attribute.
// See https://openusd.org/dev/api/usd_physics_page_front.html
if (prim.HasAPI<pxr::UsdPhysicsMassAPI>()) {
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
}
// Convert displayColor and displayOpacity to rgba.
// We want to support primvar inheritance, hence FindPrimvarWithInheritance.
pxr::UsdGeomPrimvarsAPI primvarsAPI(prim);
@@ -155,10 +155,6 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsMaterials) {
stage,
"/physics_materials_test/test_body/geom_with_friction.material:binding",
"/physics_materials_test/PhysicsMaterials/geom_with_friction");
ExpectAttributeEqual(stage,
"/physics_materials_test/PhysicsMaterials/"
"geom_with_friction.physics:staticFriction",
4.0f);
ExpectAttributeEqual(stage,
"/physics_materials_test/PhysicsMaterials/"
"geom_with_friction.physics:dynamicFriction",