Robot Importing Error using python code

Hello, I am currently trying to save the Quanser QCar model as a USD file and import it using Python.

However, I encounter the following error whenever I try to import the USD file.

2024-04-20 05:03:16 [148,071ms] [Error] [omni.isaac.dynamic_control.plugin] DcGetArticulationRootBody: Invalid or expired articulation handle
2024-04-20 05:03:16 [148,071ms] [Warning] [omni.physx.tensors.plugin] Failed to find articulation at '/World/wecar'
2024-04-20 05:03:16 [148,071ms] [Error] [omni.physx.tensors.plugin] Pattern '/World/wecar' did not match any articulations

Traceback (most recent call last):
  File "/home/sulab/Desktop/Ubuntu_bruno/omni.isaac.bruno/code/wecar/tutorial/wecar_make.py", line 42, in <module>
    world.reset()
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/world/world.py", line 408, in reset
    self._scene._finalize(self.physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/scenes/scene.py", line 322, in _finalize
    robot.initialize(physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.wheeled_robots/omni/isaac/wheeled_robots/robots/wheeled_robot.py", line 152, in initialize
    super().initialize(physics_sim_view=physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/articulations/articulation.py", line 294, in initialize
    self._articulation_view.initialize(physics_sim_view=physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/articulations/articulation_view.py", line 349, in initialize
    assert self._physics_view.is_homogeneous
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/extsPhysics/omni.physics.tensors-105.1.12-5.1/omni/physics/tensors/impl/api.py", line 170, in is_homogeneous
    return self._backend.is_homogeneous
AttributeError: 'NoneType' object has no attribute 'is_homogeneous'
2024-04-20 05:03:16 [148,092ms] [Warning] [carb] [Plugin: omni.spectree.delegate.plugin] Module /home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/kit/exts/omni.usd_resolver/bin/libomni.spectree.delegate.plugin.so remained loaded after unload request
2024-04-20 05:03:16 [148,096ms] [Warning] [omni.stageupdate.plugin] Deprecated: direct use of IStageUpdate callbacks is deprecated. Use IStageUpdate::getStageUpdate instead.
2024-04-20 05:03:16 [148,098ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,098ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,098ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,098ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,098ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,098ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,099ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,099ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,099ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,099ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,099ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Annotators' for removal
2024-04-20 05:03:16 [148,099ms] [Warning] [omni.graph.core.plugin] Could not find category 'Replicator:Core' for removal
2024-04-20 05:03:16 [148,111ms] [Warning] [carb.audio.context] 1 contexts were leaked
2024-04-20 05:03:16 [148,200ms] [Warning] [carb] Recursive unloadAllPlugins() detected!
2024-04-20 05:03:16 [148,212ms] [Warning] [omni.core.ITypeFactory] Module /home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/kit/exts/omni.activity.core/bin/libomni.activity.core.plugin.so remained loaded after unload request.

How can I fix this problem? Here are my USD and URDF files for reference.
qcar_urdf.zip (3.1 MB)
QCar_usd.zip (835.7 KB)

And I have one more question. I would like to create an AckermannController similar to the DifferentialController class using Python. Do you have any resources that I can refer to for this?

@brunoleej i haven’t checked out your files yet, but i wonder if this post by the dev would point you in the right direction? Enhancements to URDF Importer Articulation in Version 2023.1.1 Ensure Consistent Root Link Designation for Improved Simulation Accuracy

First of all, thank you so much for your answer.

I will try to solve it through the links you provided and let you know if I have any further questions in the future. Thank you!!

From what I understand, when you import a robot in version 2023.1.1 , it automatically captures the ArticulationRoot . Is that correct?

My current situation is as follows.

  1. Load the Quanser QCar model through the URDF Importer. (Since it’s a mobile robot, remove the Fix Base Link and change the Joint Drive Type from Angular to Velocity.

  2. In the loaded picture of the robot, there are four PhysicsRevoluteJoints within the base_link: base_hubfl_joint, base_hubfr_joint, base_wheelrl_joint, and base_wheelrr_joint. However, there is another wheel joint in both hubfl and hubfr.

  3. When I load the robot with the script below, it does not load and I get a Pattern '/World/QCar' did not match any articulations error.

First of all, my code is as follows.

from omni.isaac.kit import SimulationApp

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

import os
import numpy as np
from omni.isaac.wheeled_robots.robots import WheeledRobot


usd_path = "/home/sulab/Desktop/QCar/wecar.usd"

import carb
from omni.isaac.core import World

my_world = World(stage_units_in_meters=1.0)
robot = my_world.scene.add(
            WheeledRobot(
            prim_path="/World/QCar",
            wheel_dof_names=["hubfl_wheelfl_joint", "hubfr_wheelfr_joint", "base_wheelrl_joint", "base_wheelrr_joint"],
            wheel_dof_indices=[1, 2, 3, 4],
            create_robot=True,
            usd_path=usd_path,
            position=np.array([0, 0.2, 0.1]),
            orientation=np.array([1.0, 0.0, 0.0, 0.0]),
        ))

my_world.reset()
for i in range(10000):
    my_world.step()

app.close()

When I call the robot using the code above, the following error occurs.

2024-05-08 15:43:49 [16,097ms] [Warning] [omni.isaac.dynamic_control.plugin] Failed to find articulation at '/World/QCar'
2024-05-08 15:43:49 [16,097ms] [Error] [omni.isaac.dynamic_control.plugin] DcGetArticulationRootBody: Invalid or expired articulation handle
2024-05-08 15:43:49 [16,097ms] [Warning] [omni.physx.tensors.plugin] Failed to find articulation at '/World/QCar'
2024-05-08 15:43:49 [16,097ms] [Error] [omni.physx.tensors.plugin] Pattern '/World/QCar' did not match any articulations

Traceback (most recent call last):
  File "/home/sulab/Desktop/Ubuntu_bruno/omni.isaac.bruno/code/wecar/test.py", line 29, in <module>
    my_world.reset()
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/world/world.py", line 408, in reset
    self._scene._finalize(self.physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/scenes/scene.py", line 322, in _finalize
    robot.initialize(physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.wheeled_robots/omni/isaac/wheeled_robots/robots/wheeled_robot.py", line 152, in initialize
    super().initialize(physics_sim_view=physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/articulations/articulation.py", line 294, in initialize
    self._articulation_view.initialize(physics_sim_view=physics_sim_view)
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/exts/omni.isaac.core/omni/isaac/core/articulations/articulation_view.py", line 349, in initialize
    assert self._physics_view.is_homogeneous
  File "/home/sulab/.local/share/ov/pkg/isaac_sim-2023.1.1/extsPhysics/omni.physics.tensors-105.1.12-5.1/omni/physics/tensors/impl/api.py", line 170, in is_homogeneous
    return self._backend.is_homogeneous
AttributeError: 'NoneType' object has no attribute 'is_homogeneous'

If you know any way to solve this problem, I would appreciate it if you could suggest it.

Hey @brunoleej,

Can I check if you have managed to find a solution to this problem? I’m facing the same error as well. Hope to hear from you soon.

1 Like

Surely Indeed:)

The problem of that is quite simple.

When you first import the specific robot, you have to decouple the articulation of different path.

After that, you might set the ArticulationRoot to the base of the robot.

e.g.) If the robot base prim is Husky, you have to set the ArticulationRoot to the base prim.