3D modeling size strange after Isaac Sim 2022.1.0 update

Hello
I updated Isaac Sim 2021.2.1 to Isaac Sim 2022.1.0.
After the update, the size of the previous .usd has become strange.
I definitely calculated it in meters when modeling using 3D modeling tools.
What’s the problem?

Hi @toni.sm
I did 3D modeling in meters in a 3D modeling tool. And I brought it to Omniverse as it is in size, and there was no problem with the previous version.

As you advised, I know that the new version uses merter units, but there is no problem with my 3D modeling in the previous version, and there is a problem if I bring it to the latest version as it is.

So I created a basic cube in the latest version, and I don’t think the cube size fits better than the basic grid in Omniverse.
Let me know what I’m missing.
I will attach the video.

Hi @gudwnzm

Yes, in Isaac Sim 2022.1.0 the default distance unit is a meter.
When you create a Cube (from the Shape submenu) its Size property is set as default to 100.
Then, and attending to the distance units, the Cube is 100 x 100 x 100 meters…

In the case, of your model, you can use the Isaac Utils > USD Unit Converter extension to fix the dimensions if it is necessary

Hi @toni.sm

Thank you so much for your quick response.

I have a question.
I am doing 3D modeling using 3ds max. I modeled in meters just like the actual design at 3ds max.
As you can see in the video above, when I bring the 3D modeled file to Isaac sim, it gets really big even though I did it in meters in the modeling tool.
So should I always use Isaac Utils > USD Unit Converter extension in Isaac sim?

Then should I use Isaac Utils > USD Unit Converter extension or reduce the scale to 0.01?

I created a basic cube in Isaac sim, made the size 1 and moved the usd file to Omniverse create.
And I created a basic cube from Omniverse Create and compared the cube from Isaacsim, the cube size created by Omniverse Create was larger, so I reduced the scale to 0.01 and they were the same size.

Is this the right way?
This is very important to me because I have a real design drawing and connect the 3D modeling tool with the Omniverse.

Hi @toni.sm

I’m so sorry. I need your help again today.
I’m trying out my robot for testing following the Multiple Tasks example.
https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_core_multiple_tasks.html

As you said, wheel_radius and base are not exactly right, but I am doing my best for the test.
I have a problem copying the Multiple Tasks example.
My robot only moves backwards. I want the robot to move forward.
I tried changing np.array or self.offset in _jetbot_goal_position.position.
Then my robot will spin in place, but it won’t be able to start hard.

What’s the problem?
I want to solve basic problems and move forward.
I will attach the video and code. I’d appreciate it if you could help me.

from omni.isaac.examples.base_sample import BaseSample
from omni.isaac.franka.tasks import PickPlace
from omni.isaac.wheeled_robots.robots import WheeledRobot
from omni.isaac.core.utils.nucleus import get_assets_root_path
from omni.isaac.core.tasks import BaseTask
from omni.isaac.motion_generation import WheelBasePoseController
from omni.isaac.wheeled_robots.controllers.differential_controller import DifferentialController
import numpy as np

class RobotsPlaying(BaseTask):
    def __init__(
        self,
        name
    ):
        super().__init__(name=name, offset=None)
        self._jetbot_goal_position = np.array([130, 30, 0])
        # Add a subtask of pick and place instead
        # of writing the same task again
        # we just need to add a jetbot and change the positions of the assets and
        # the cube target position
        self._pick_place_task = PickPlace(cube_initial_position=np.array([0.1, 0.3, 0.05]),
                                        target_position=np.array([0.7, -0.3, 0.0515 / 2.0]))
        return

    def set_up_scene(self, scene):
        super().set_up_scene(scene)
        self._pick_place_task.set_up_scene(scene)
        assets_root_path = get_assets_root_path()
        # jetbot_asset_path = assets_root_path + "/Isaac/Robots/Jetbot/jetbot.usd"
        jetbot_asset_path = "omniverse://localhost/Projects/test/mk3_third.usd"
        
        self._jetbot = scene.add(
            WheeledRobot(
                prim_path="/World/Fancy_Robot",
                name="fancy_robot",
                wheel_dof_names=["left_wheel_joint", "right_wheel_joint"],
                create_robot=True,
                usd_path=jetbot_asset_path,
                position=np.array([-1.23578, 0.3, 0]))
        )
        
        self._AMR = scene.add(
            WheeledRobot(
                prim_path="/World/AMR_Robot",
                name="AMR_robot",
                wheel_dof_names=["left_wheel_joint", "right_wheel_joint"],
                create_robot=True,
                usd_path=jetbot_asset_path,
                position=np.array([-1.23578, -0.81915, 0]))
        )
        
        self._AMR_02 = scene.add(
            WheeledRobot(
                prim_path="/World/AMR_Robot_02",
                name="AMR_robot_02",
                wheel_dof_names=["left_wheel_joint", "right_wheel_joint"],
                create_robot=True,
                usd_path=jetbot_asset_path,
                position=np.array([-1.23578, -2.03484, 0]))
        )
        
        pick_place_params = self._pick_place_task.get_params()
        self._franka = scene.get_object(pick_place_params["robot_name"]["value"])
        # Changes Franka's default position
        # so that it is set at this position after reset
        self._franka.set_world_pose(position=np.array([1.0, 0, 0]))
        self._franka.set_default_state(position=np.array([1.0, 0, 0]))
        return

    def get_observations(self):
        current_jetbot_position, current_jetbot_orientation = self._jetbot.get_world_pose()
        # Observations needed to drive the jetbot to push the cube
        observations= {
            self._jetbot.name: {
                "position": current_jetbot_position,
                "orientation": current_jetbot_orientation,
                "goal_position": self._jetbot_goal_position
            }
        }
        return observations

    def get_params(self):
        # To avoid hard coding names..etc.
        pick_place_params = self._pick_place_task.get_params()
        params_representation = pick_place_params
        params_representation["jetbot_name"] = {"value": self._jetbot.name, "modifiable": False}
        params_representation["franka_name"] = pick_place_params["robot_name"]
        return params_representation


class HelloWorld(BaseSample):
    def __init__(self) -> None:
        super().__init__()
        return

    def setup_scene(self):
        world = self.get_world()
        # Add task here
        world.add_task(RobotsPlaying(name="awesome_task"))
        return

    async def setup_post_load(self):
        self._world = self.get_world()
        task_params = self._world.get_task("awesome_task").get_params()
        self._jetbot = self._world.scene.get_object(task_params["jetbot_name"]["value"])
        self._cube_name = task_params["cube_name"]["value"]
        self._jetbot_controller = WheelBasePoseController(name="cool_controller",
                                                        open_loop_wheel_controller=
                                                            DifferentialController(name="simple_control",
                                                                                wheel_radius=0.02, wheel_base=0.5))
                                                                                # wheel_radius=0.07, wheel_base=0.1125))
        self._world.add_physics_callback("sim_step", callback_fn=self.physics_step)
        await self._world.play_async()
        return

    async def setup_post_reset(self):
        self._jetbot_controller.reset()
        await self._world.play_async()
        return

    def physics_step(self, step_size):        
        current_observations = self._world.get_observations()
        
        self._jetbot.apply_action(
            self._jetbot_controller.forward(
                start_position=current_observations[self._jetbot.name]["position"],
                start_orientation=current_observations[self._jetbot.name]["orientation"],
                goal_position = current_observations[self._jetbot.name]["goal_position"]))
        
        print("AMR position is : " + str(current_observations[self._jetbot.name]["position"]))
        print("AMR orientation is : " + str(current_observations[self._jetbot.name]["orientation"]))
        print("AMR goal position is : " + str(current_observations[self._jetbot.name]["goal_position"]))
        
        return

Hello @gudwnzm! Thank you for your interest in Isaac Sim.
The problem here is that even though Isaac sim was defined to default to meters, the Create App and extensions built for Create as a whole still defaults to cm, which is the case for the 3ds max importer, so you’d still need to run it through the unit converter to convert it back to meters.

Regarding your code, it’s hard to clearly understand where is the issue without the full stack trace. would it be possible to paste the entire log of where its failing?

The reason for that is that the errors we can see in the video are possible due to some error that happened before, which prevented the attributes to be created, cascading on additional errors ahead in the code.

Hello @rgasoto

Thank you for your kind reply.
I did 3D modeling at 3ds max in meters size and then called to Omniverse Create using Omniverse 3ds max importer.
Do you mean that my 3D modeling was converted to cm which is the default of Omniverse Create when importing in the above process?

The error content in the video above.
[Error] [carb.physx.python] AttributeError: ‘NoneType’ object has no attribute ‘positions’

If I load using Hello World extension of Isaac Exams where I put my robot in, there will be no error, but if I stop and press Play again, there will be an error above.
However, if I use the Reset button in Hello World extension without pressing play, the error will come out, but the robot will move.

The really hard part for me is why my robot can’t go forward, as shown in two videos.
There is also a problem of my lack of knowledge, but I don’t know which part to modify.

I would like to ask an additional question.
Is there any way to know wheel_radius and base on my customized robot in Omniverse?

Right. That error happens at every time step and floods the console, and is likely due to some other error that caused the initialization of the Pick and Place task to halt and not get created. (hence nonetype). I’d need the stack from the very first error if possible. You can do it from the terminal that opens with Isaac sim.

Renato G.

Hi @rgasoto
Thank you so much for your kind and quick reply.

So when I do 3D modeling in meters at 3ds max and bring it to Omniverse Create through Omniverse 3ds max, will 1M come out as 100cm or 1M comes out as 1cm in Omniverse Create?

For example, if I model a 1 meter cube at 3ds max and bring it using the Omniverse 3ds max importer, will it come out as a 100cm cube at Omniverse Create?
And if I take this cube to Isaac sim, will it be 1 meter cube again?

The very first error from the terminal you mentioned is as follows.

2022-06-28 05:21:14 [25,736ms] [Warning] [omni.client.python] Waiting for a request that has taken longer than 20ms to complete: 
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/kit/extscore/omni.kit.async_engine/omni/kit/async_engine/async_engine.py", line 74, in _on_update
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/kit/python/lib/python3.7/asyncio/base_events.py", line 541, in run_forever
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/kit/python/lib/python3.7/asyncio/base_events.py", line 1786, in _run_once
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/kit/python/lib/python3.7/asyncio/events.py", line 88, in _run
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.examples/omni/isaac/examples/base_sample/base_sample_extension.py", line 146, in _on_load_world_async
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.examples/omni/isaac/examples/base_sample/base_sample.py", line 47, in load_world_async
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/world/world.py", line 307, in reset_async
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.examples/omni/isaac/examples/hello_world/hello_world.py", line 68, in set_up_scene
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/tasks/pick_place.py", line 69, in set_up_scene
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/scenes/scene.py", line 184, in add_default_ground_plane
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/utils/nucleus.py", line 494, in get_assets_root_path
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/utils/nucleus.py", line 183, in check_server
  File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/kit/extscore/omni.client/omni/client/__init__.py", line 133, in stat

2022-06-28 05:21:15 [26,643ms] [Warning] [carb.flatcache.plugin] Type tag does not have a corresponding USD type
2022-06-28 05:21:16 [27,053ms] [Warning] [gpu.foundation.plugin] Requesting texture to use texture streaming, but the service isn't available.The texture will be created as a regular resource.

2022-06-28 05:24:36 [228,030ms] [Warning] [omni.isaac.core.articulations.articulation_view] Physics Simulation View is not created yet in order to use get_joints_state
2022-06-28 05:24:36 [228,030ms] [Error] [carb.physx.python] AttributeError: 'NoneType' object has no attribute 'positions'

At:
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/tasks/pick_place.py(133): get_observations
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.examples/omni/isaac/examples/hello_world/hello_world.py(107): get_observations
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.core/omni/isaac/core/world/world.py(197): get_observations
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.examples/omni/isaac/examples/hello_world/hello_world.py(192): physics_step

Hi @rgasoto

There is one more question in addition to the one mentioned above.

Following your advice, I am conducting unit converter in Isaac sim for 3D modeling.
However, the unit converter does not proceed due to the following error.

2022-06-29 06:19:55 [600,504ms] [Error] [omni.ui.python] ErrorException: 
	Error in 'pxrInternal_v0_20__pxrReserved__::SdfLayer::_WriteToFile' at line 4343 in file /buildAgent/work/ca6c508eae419cf8/USD/pxr/usd/sdf/layer.cpp : 'Cannot save layer @/home/tommy/.cache/ov/client/http/omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Skies/Sky_Elements/ArrowsNWSE.usd@, saving not allowed'

At:
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.unit_converter/omni/isaac/unit_converter/unit_conversion_utils.py(386): set_stage_meters_per_unit
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.unit_converter/omni/isaac/unit_converter/unit_conversion_utils.py(384): set_stage_meters_per_unit
  /home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.unit_converter/omni/isaac/unit_converter/extension.py(169): on_process_stages

The unit converter problem that I left recently was a problem with the sky asset path taken from Omniverse Create, so I deleted it and proceeded with the unit converter.
There was a strange phenomenon in which my 3D modeling was mixed in the unit converting process, but fortunately, there was no error.

I am very curious about the question above, not the unit converter question. I’d really appreciate your help.

Yes - The 3dsmax importer will convert the unit to cm and bring it with values 100x numerically.

I will file a bug for the Unit converter so it handles this kind of issues in the future.

Regarding your error, it seems it’s happening on this file :
File "/home/tommy/.local/share/ov/pkg/isaac_sim-2022.1.0/exts/omni.isaac.examples/omni/isaac/examples/hello_world/hello_world.py", line 68, in set_up_scene.

It’s really hard to repro your issue without having the same assets as you have, but a few things to look out are:

  1. Making sure the files and paths to references you are adding exist and are valid.
  2. making sure the prims you are referring when creating the Tasks and Robots exists and are not empty

You can add print commands in between lines to find the specific line where it crashes, but it seems like it’s crashing on set_up_scene, most likely due to self._pick_place_task being None (failed to initialize)