Reference added to scene with duplicate scale AND unitsResolve, resulting in teeny object

Isaac Sim Version

5.1.0
5.0.0
4.5.0
4.2.0
4.1.0
4.0.0
4.5.0
2023.1.1
2023.1.0-hotfix.1
Other (please specify):

Operating System

Ubuntu 24.04
Ubuntu 22.04
Ubuntu 20.04
Windows 11
Windows 10
Other (please specify):

GPU Information

  • Model: 5070 Ti laptop
  • Driver Version: 573.24

Reference added to scene with duplicate scaling

Detailed Description

I am trying to use python standalone to build a scene, but the reference USD gets added with BOTH xFormOp:scale = 0.0254 AND xFormOp:scale:unitsResolve = 0.0254

Obviously, this results in the referenced USD being super small.

The source reference usd file is indeed in inches, and when drag-and-drop into a new, empty, scene it seems to load fine and have correct scale with xFormOp:scale:unitsResolve = 0.0254 and xFormOp:scale=1. I still see the “mismatched units” info dialog, but it works fine when drag-and-drop using the GUI; unitsResolve = 0.0254 seems to be correct considering source USD is inches.

Additionally, pre-built scenes using this same file reference load correctly.

However, when I use python and add the suspect reference to the scene, it is added to the scene with BOTH xFormOp:scale = 0.0254 AND xFormOp:scale:unitsResolve = 0.0254

After the scene opens via the python script, I can manually change either xFormOp:scale OR xFormOp:scale:unitsResolve to 1, and the scaling appears correct.

Steps to Reproduce

  1. run my python script or otherwise add usd to the scene: add_reference_to_stage(f"DM-1_4_2025_2.usd",machine_prim_path)

  2. observe teeny tiny machine and duplicate scales:

  3. editing either scale after the scene is loaded to 1 corrects things:

Error Messages

None; its just wrong. LOL

Additional Information

What I’ve Tried

  • opening a pre-built scene that references this usd works fine, scaling as expected

  • adding reference to empty stage using GUI works fine; scaling is correct regardless of ‘mismatched units’ notification. units resolve 0.0254 makes sense since source reference is in inches:

Additional Context
suspect usd file and python script can be found here : LINKY

python script also here for convenience, you might need to adjust path to the reference:

from isaacsim.simulation_app import SimulationApp
# Launch Isaac Sim in GUI mode
simulation_app = SimulationApp({"headless": False,}, experience="apps/isaacsim.exp.full.kit")

from isaacsim.core.api import SimulationContext
from isaacsim.core.api.world import World
from isaacsim.core.api.robots.robot import Robot
from isaacsim.core.api.objects.cuboid import DynamicCuboid
from isaacsim.core.prims.impl.xform_prim import XFormPrim
from isaacsim.core.utils.extensions import enable_extension
from isaacsim.core.utils.stage import add_reference_to_stage, is_stage_loading
from omni import usd
import numpy as np
from pxr import Sdf

# enable ROS2 bridge extension
enable_extension("isaacsim.ros2.bridge")

world = World()
world.initialize_physics()
cube = DynamicCuboid(
				prim_path="/World/cube",
				name="cube",
				position=np.array([-3.0, -.2, 1.0]),
				scale=np.array([.15, .15, .15]),
				color=np.array([.2,.3,0.])
			)

world.scene.add_default_ground_plane()
world.scene.add(cube)
# world.reset()
machine_prim_path = f"/World/mxi_m001"
add_reference_to_stage(f"workspace/mxi-isaacsim/assets/dm-1_solid_models_04_2025/DM-1_4_2025_2.usd",machine_prim_path)
machine = Robot(prim_path=machine_prim_path, name='mxi_m001')
stage = usd.get_context().get_stage()
machine_prim_stage = stage.GetPrimAtPath(machine_prim_path)
machine_prim_stage.CreateAttribute("isaac:namespace", Sdf.ValueTypeNames.Token).Set("mxi_m001")

machine_prim = XFormPrim(machine_prim_path)
machine_prim.set_world_poses(orientations=np.array([[np.deg2rad(90), 0.0, 0.0, np.deg2rad(90)]]))
print("Loading stage...")

while is_stage_loading():
    simulation_app.update()
print("Loading Complete")

# Reset and run the simulation
world.reset()
simulation_app.update()
try:
    while simulation_app.is_running():
        world.step(render=True)
except KeyboardInterrupt:
    simulation_app.close()
    exit()

adding the following seems to correct the scaling:

machine_prim.set_local_scales(np.array([[1., 1., 1.]]))

I just cant understand how duplicate scaling makes sense; why do I have to manualy set the scale to 1? unitsResolve = 0.0254 makes sense due to source file units
 why apply it twice?

Thank you for posting this. The double scaling issue you encounter when adding a USD reference via Python—where both xformOp:scale = 0.0254 and xformOp:scale:unitsResolve = 0.0254 are applied—results in the reference being scaled twice, making it much smaller than intended. This typically happens because the units translation (unitsResolve) is meant to handle the conversion from the referenced file’s units (inches) to the stage’s default units (meters), but then an additional scale is wrongly applied when scripting, which is not how the Isaac Sim GUI handles drag-and-drop. When drag-and-dropping, only unitsResolve is applied, so the object’s scale remains correct.

Why The Double Scaling Occurs

  • unitsResolve: This operation is automatically added to compensate for the file’s units (inches) versus the stage’s units (meters)—0.0254 is precisely the meters-to-inches conversion factor.
  • Manual/Scripting Addition: When using Python to add the reference, if the code or API unintentionally sets an explicit scale of 0.0254 in addition to unitsResolve, then both are applied multiplicatively, shrinking the object even further.
  • Drag-and-Drop Behavior: The GUI route ensures only the unitsResolve is applied, so scale stays at 1, and the reference appears at proper size. You only get a “mismatched units” warning, not a double scaling.

Solution and Correct Approach

When using Python to add references in Isaac Sim or Omniverse, let the system handle unit conversion with unitsResolve; do not also set the scale unless you are correcting for something other than units. To fix this:

  1. Avoid Setting Explicit Scale: Do not set xformOp:scale = 0.0254 if using references from inch-based USDs; let the unitsResolve handle it.
  2. Correct Scale Programmatically: If your script or API forcibly sets the scale, immediately reset to [1, 1, 1] as you described.

I encountered a similar problem in my related post. I think this should be a simple bug related to IsaacSim-Omni communications. It’s better to identify the exact code that causes this double scaling bug.

I don’t think LLM knows the detail of omniverse.

yes, the final outcome is clearly a result of duplicate scaling. a teeny tiny object is the expected outcome from applying 0.0254 twice.

The question is
 when/where/how did 2 distinct scales get applied?

I have not manually applied any scale. I converted the STEP file, selected ‘Use Model Units’ during STEP>USD conversion. After that, I did not manipulate the scale and yet the result is duplicate scale.

Thank you for following up. If you can document a bug, please post it in Isaac Sim’s GitHub repository. We will need clear steps to reproduce it. Thank you.

happy to submit a bug, but your post above is not a solution. your post above seems to presume that an additional 0.0254 scaling was applied in the python script, which it wasnt. You can see the script above.

1 Like