I tried running the standalone workflow script from section 5.7.4. Controlling the Gripper
It said
2024-01-17 06:33:22 [13,190ms] [Warning] [omni.isaac.dynamic_control.plugin] Failed to find articulation at ‘/World/cobotta’
2024-01-17 06:33:22 [13,190ms] [Error] [omni.isaac.dynamic_control.plugin] DcGetArticulationRootBody: Invalid or expired articulation handle
2024-01-17 06:33:22 [13,191ms] [Warning] [omni.physx.tensors.plugin] Failed to find articulation at ‘/World/cobotta’
2024-01-17 06:33:22 [13,191ms] [Error] [omni.physx.tensors.plugin] Pattern ‘/World/cobotta’ did not match any articulations
I checked it in GUI by the Articulation Inspector through Isaac Utils > Workflows > Articulation Inspector and found the prim_path that corresponds to the articulation should be ‘/World/cobotta/world’
Exception: Prim path expression /World/cobotta/world/onrobot_rg6_base_link is invalid, a prim matching the expression needs to created before wrapping it as view
It work correctly. And for this offical USD, the articulation prim path can be found as '/World/cobotta". So how to add articulation correctly? If I put select and right click on the ‘’/World/cobotta" Xform and “Add → Physics”, there is no “Articulation Root” option, for the origin USD builded from urdf as in 5.7.3.1 section
So the problem is with the URDF importer, which makes incorrect USD model, right? I need this URDF importer to import another manipulator, and I got the same problem, only this time there is no “correct” USD model to work with, so do we have any ideas how to make correct USD models out of URDF?
If using version 2022.2.1, the usd created from urdf importer is correct. So the upgrade of the URDF importer from version 2022.2.1 to version 2023.1.1 introduced a bug?
2023 versions of urdf importer introduced some new features. The one that often causes confusion is that there is now an option to use tendons to implement mimic joints. So if you have a mimic joint in your urdf, and previously you treated it like just another independently activated joint and you want the same behavior, then you need to make sure the option to use mimic joints are off (in the importer GUI).
If that’s not your problem, then it would be very helpful to get more details about the bug you are seeing.
Hello!
I believe we are not talking about new features here. We are trying to deal with inconsistency in the certain tutorial.
I confirm the same bug when Articulation Inspector detects articulations in ‘/World/cobotta/world’ instead of ‘/World/cobotta’ if you try to import manipulator from sample URDF.
Therefore all the manipulator sample scripts fail to work with this “custom” usd. And yes “mimic joints are off” when we import URDF.
Can I ask you to address the very first message in this thread and confirm whether tutorial 5.7 is valid for ver. 2023.1.1 and there are no poorly explained or hidden steps?
you can remove “articulation root” from “/World/cobotta/world” property page, and then add “articulation root” on “/World/cobotta” property page by right click on prim “add->physics->articulation root”. It works correctly.
Thanks! I hope your answer will help to all beginners, who face this issue. Now I understand that the question is a kind of primitive, but for myself 3 months ago it definitely wasn’t. :)
Prior to 2023.1.1, the Articulation Root was set to /World/cobotta. However, this has changed since 2023.1.1, including 4.0.0.
I think the SingleManipulator class is not supported to the change.
Another approach is setting “end_effector_prim_path” directly.
Example:
from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": False})
from omni.isaac.core import World
from omni.isaac.manipulators import SingleManipulator
from omni.isaac.manipulators.grippers import ParallelGripper
from omni.isaac.core.utils.stage import add_reference_to_stage
from omni.isaac.core.utils.types import ArticulationAction
import numpy as np
my_world = World(stage_units_in_meters=1.0)
#TODO: change this to your own path
asset_path = "/root/colcon_ws/cobotta_pro_900/cobotta_pro_900/cobotta_pro_900.usd"
add_reference_to_stage(usd_path=asset_path, prim_path="/World/cobotta")
#define the gripper
gripper = ParallelGripper(
#We chose the following values while inspecting the articulation
end_effector_prim_path="/World/cobotta/onrobot_rg6_base_link",
joint_prim_names=["finger_joint", "right_outer_knuckle_joint"],
joint_opened_positions=np.array([0, 0]),
joint_closed_positions=np.array([0.628, -0.628]),
action_deltas=np.array([-0.628, 0.628]),
)
#define the manipulator
my_denso = my_world.scene.add(SingleManipulator(prim_path="/World/cobotta", name="cobotta_robot",
end_effector_prim_path="/World/cobotta/onrobot_rg6_base_link", gripper=gripper))
#set the default positions of the other gripper joints to be opened so
#that its out of the way of the joints we want to control when gripping an object for instance.
joints_default_positions = np.zeros(12)
joints_default_positions[7] = 0.628
joints_default_positions[8] = 0.628
my_denso.set_joints_default_state(positions=joints_default_positions)
my_world.scene.add_default_ground_plane()
my_world.reset()
i = 0
while simulation_app.is_running():
my_world.step(render=True)
if my_world.is_playing():
if my_world.current_time_step_index == 0:
my_world.reset()
i += 1
gripper_positions = my_denso.gripper.get_joint_positions()
if i < 500:
#close the gripper slowly
my_denso.gripper.apply_action(
ArticulationAction(joint_positions=[gripper_positions[0] + 0.1, gripper_positions[1] - 0.1]))
if i > 500:
#open the gripper slowly
my_denso.gripper.apply_action(
ArticulationAction(joint_positions=[gripper_positions[0] - 0.1, gripper_positions[1] + 0.1]))
if i == 1000:
i = 0
simulation_app.close()
I just have a question. I followed the same process for my another robot of panda arm and robotiq_140 gripper. for me when i use this same code, its showing
s = my_denso.gripper.get_joint_positions()
File “/home/deku/.local/share/ov/pkg/isaac-sim-4.0.0/exts/omni.isaac.manipulators/omni/isaac/manipulators/grippers/parallel_gripper.py”, line 191, in get_joint_positions
return self._get_joint_positions_func(joint_indices=[self._joint_dof_indicies[0], self._joint_dof_indicies[1]])
TypeError: ‘NoneType’ object is not callable
I did this robot by adding panda arm and robotiq gripper from isaac sim assests in 4.0.0. I joined both robots by following proper articulation, i think here i used “robotiq_2f_140_physics_edit” asset.
Here I cant able to see few things in gripper links, so I think its not detecting the prim for calling the function. for this prim is not good i think but I am not sure. If that is not the issue, why it is not able to call the joint_positions function. Please let me know and help me here.
here i gave prim path of end_effector_base, but it is telling invalid prim path. But it can able to send action commands with articulation action but when using parallel gripper, it is not detecting the prim path. What is the issue and how to solve this one?
I might be a bit late and you might have already solved this. This could happen if the world is not reset right after loading all the assets. This initialises the manipulator and gripper class. It is in the initialise function that the joint prims are assigned the correct dofs indices. Hope this helps.