How to get the world/local poses of Prims in an Articulation?

In Articulation API, we can do get_local_pose() or get_world_pose() to query the root Prim pose. But for other Prims like all the joints/links in that Articulation, how can we get their poses in local or world?

This could help you: Reference document: Core [omni.isaac.core] — isaac_sim mr3140 documentation

However, that get_local_poses() is querying the local pose of the Articulation, i.e., the root link of the Articulation in its parent’s frame. The argument indices means the index of the Articulation in the view. For example, if I have 1 robot (Articulation), there are only 1 Articulation. I can only do get_local_poses(indices=[0]). But what I need is get the poses of other Prims of the Articulation, e.g., link_2, link_4, joint_3. This allows users to query the pose rather than having a separate kinematics model.

I think you want to get the list of children of the articulation root prim, and then query indvidual poses.

https://docs.omniverse.nvidia.com/py/isaacsim/source/extensions/omni.isaac.core/docs/index.html#module-omni.isaac.core.prims

You can get the names of all the link prims through the DOF calls, I believe:

https://docs.omniverse.nvidia.com/py/isaacsim/source/extensions/omni.isaac.core/docs/index.html

The links of the Articulation are considered RigidPrims so you can use the RigidPrim class api or the XFormPrim api to query information regarding them. We do that in current Robot classes like Franka class where the end effector prim is parsed as a RigidPrim so that a user can query its velocity information as well.

You can check the link prim paths using the UI stage window or by getting the list of children of the articulation root prim as @MikePhysX suggested, and then get access to its RigidPrim api by passing the prim path to the RigidPrim class as outlined here: Core [omni.isaac.core] — isaac_sim 2022.2.1-beta.29 documentation

Please let us know if you have more questions.

For the Franka class definition you can check: Franka Robot [omni.isaac.franka] — isaac_sim 2022.2.1-beta.29 documentation

Thanks, @MikePhysX and @oahmed ! However, the queried child links are of Prim type instead of RigidPrim. Is there an extra step needed to wrap the Prim or some extra step is needed when constructing the Articulation?

    from omni.isaac.core.utils.prims import get_all_matching_child_prims
    all_prims = get_all_matching_child_prims("/World/kuka_allegro", lambda _: True)
    print(type(all_prims[10]))

<class 'pxr.Usd.Prim'>   

The links are RigidPrims which is indicated by the scheme applied. Any prim path that corresponds to a prim that is rigid can be used with the RigidPrim api. In USD they are all prims which are considered of type <class ‘pxr.Usd.Prim’> (even the articulation) , you can use some of the utils we provide in omni.isaac.core.utils to get a type that considers to the schema applied like here: Core [omni.isaac.core] — isaac_sim 2022.2.1-beta.29 documentation

You can wrap it directly using RigidPrim(prim_path=“/World/kuka_allegro/kuka_allegro/thumb_link_3”) even without constructing the Articulaiton object.

You can also directly use Manipulators [omni.isaac.manipulators] — isaac_sim 2022.2.1-beta.29 documentation if what you are looking at is to query info on the end effector only.

1 Like

Thanks! Wrapping the Prim as a RigidPrim works.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.