Error in bounding box computation


I can’t get the correct values for the bounding box of an object imported with the urdf importer.

Here is an example code: (1.6 KB)
In this code, I tested to compute the bounding box using [Get Mesh Size] (Frequently Used Python Snippets — Omniverse Robotics documentation) as well as using directly the compute_object_AABB function from world.scene and using the function compute_aabb from omni.isaac.core.utils.bounds.
In the three cases, I got the same result for the dimensions of the bounding box: [0.0225 0.0016 0.0016] while it should give as a result [0.15 0.04 0.04]

Does someone have an idea of how to get the correct bounding box values?

1 Like

Hello, the bounding box computed is also incorrect if I use the cube defined in Isaac Sim with some scaling.

Here is an example in which the dimensions computed are [0.25, 0.25, 0.25] and it should be [0.5, 0.5, 0.5]

from omni.isaac.kit import SimulationApp

kit = SimulationApp({"headless": False})

from omni.kit.commands import execute
from omni.isaac.core import World
from omni.isaac.core.objects.cuboid import DynamicCuboid
import omni.isaac.core.utils.prims as ipr
from pxr import Usd, UsdGeom
import numpy as np
from omni.isaac.core.utils.bounds import compute_aabb, create_bbox_cache
import omni.timeline

if __name__ == "__main__":
    physics_dt = 1 / 240
    gravity_magnitude = 9.81

    world = World(physics_dt=physics_dt, rendering_dt=physics_dt, stage_units_in_meters=1.0)

    _, import_config = execute("URDFCreateImportConfig")
    # Set defaults
    import_config.merge_fixed_joints = False
    import_config.convex_decomp = False
    import_config.fix_base = False
    import_config.import_inertia_tensor = False

    prim_path = "/World/cube"
    name = "cube"
    prim = world.scene.add(
                    prim_path=prim_path, # The prim path of the cube in the USD stage
                    name=name, # The unique name used to retrieve the object from the scene later on
                    position=np.array([0, 0, 1.0]), # Using the current stage units which is in meters by default.
                    scale=np.array([0.5, 0.5, 0.5]), # most arguments accept mainly numpy arrays.
                    color=np.array([0, 0, 1.0]), # RGB channels, going from 0-1

    # TEST with compute_object_AABB from world.scene
    [pos_1, pos_2] = world.scene.compute_object_AABB(name)
    size = np.array(pos_2) - np.array(pos_1)
    print("Prim size obtained with compute_object_AABB: ", size)

    # TEST with Compute World Bound
    timeline = omni.timeline.get_timeline_interface()
    bbox_cache = UsdGeom.BBoxCache(timeline.get_current_time(), includedPurposes=[UsdGeom.Tokens.default_])
    prim = ipr.get_prim_at_path(prim_path)
    prim_bbox = bbox_cache.ComputeWorldBound(prim)
    prim_range = prim_bbox.ComputeAlignedRange()
    prim_size = prim_range.GetSize()
    print("Prim size obtained with ComputeWorldBound: ", list(prim_size))

    # Test with compute_aabb
    cache = create_bbox_cache(use_extents_hint=False)
    bb = compute_aabb(cache, prim_path, include_children=True)
    prim_size = np.array(bb[3:]) - np.array(bb[:3])
    print("Prim size obtained with compute_aabb: ", list(prim_size))

1 Like