Mulit-arm robot assembly

Hello,

I have a robot arm that I have imported into Isaac sim and would like to create scenarios where I insert and control multiple instances of it in a scene. For example I have a mobile base that I am installing two arm on and would like to control them via joint names like left_arm_joint_X and right_arm_joint_Y. I am trying to use what I have learned about Open USD to utilize the single instance of the arm and create a Variant or Layer that allows me to “name” the manipulators joints so that I can easily refer to the arm that I would like to control. Do you have any suggestions on how I should go about naming the arms in the whole robot assembly?

Here is what I have so far…
In the robot arm’s USD file it has the following layout with joint_names that do not contain a prefix

I tried to add a Variant to the joints but changing the name does not appear to be an option.

My mobile robot has the base and two arm’s inserted as Payloads and looks great

If I try to rename the joints in the assembly layer I get the error saying I cant rename the prim
[Error] [omni.usd.commands.usd_commands] Cannot move/rename ancestral prim

When I try to add articulation control of it the system it reports multiple joints with the same name.

- drivewhl_l_joint
- drivewhl_r_joint
- joint_1
- joint_1
- joint_2
- joint_2
- joint_3
- joint_3
- joint_4
- joint_4
- joint_5
- joint_5
- joint_6
- joint_6
- mimic_gripper_joint
- gripper_joint
- mimic_gripper_joint
- gripper_joint

So I did some more experiments and the reason I can’t rename the joints is because Prim names are not a property you can override, it is how you reference the object. If the joints were to get their name from a property instead of the Prim definition name then it would be possible to do what I want. For example

over "joint_1"
{
     string joint_name = "right_arm_joint_1"
}

Next I tried to move the joints into their own layer and make different layers for each prefix.

The problem is when I pull the arm into the mobile manipulator assembly it does not include any layers I defined in arms usd file. If I load the arm and its joint usd file as Payloads they appear in the tree as expected

but because the joints.usd file refers to the links as if it were the defaultPrim in the scene it cant find the correct bodies to connect.

def PhysicsRevoluteJoint "right_arm_joint_1" (
        apiSchemas = ["PhysxJointAPI", "PhysicsJointStateAPI:angular", "PhysicsDriveAPI:angular"]
    )
    {
        rel physics:body0 = </piper/base_link>
        rel physics:body1 = </piper/link_1>
    }

I am also running into this same issue with my wrist cameras. I created a single model for the camera with the sensor defined in the usd file. When I put them in the assembly I can’t rename the sensor Prim so I get two cameras with the same name.