Introductory

Assemble a Simple Robot

Omniverse Isaac Sim’s GUI interface features are the same ones used in NVIDIA Omniverse™ USD Composer, an application dedicated to world-building
Focus on the GUI functions that are most relevant to robotic uses
Omniverse Composer shows more sophisticated general world creation
Rig a simple “robot” with three links and two revolute joints to introduce the basic concepts of joints and articulations
(1)Take the objects that were added to the stage in Add Simple Objects
(2)Turn them into a mock mobile robot with rectangular body and two cylindrical wheels
The step is not needed for robots that are imported from Importing your Onshape Document or URDF Importer
These are important concepts to understand for tuning your robots and assembling objects with articulations

Learning Objectives

How to rig a two-wheel mobile robot
Organize stage tree hierarchy
Add joints between two rigid bodies
Add joint drives and joint properties
Add articulations

Getting Started

Prerequisites
Please complete all Introductory Tutorials => All Done

Add Joints

(1)Load mock robot
Load the asset provided in Isaac/Samples/Rigging/MockRobot/mock_robot_no_joints.usd: (Do not load it as a reference since you will need to make permanent modifications to the file)
Assemble_A_Simple_Robot1
Isaac Assets(Beta) > Samples > Rigging > MOCKROBOT > mock_robot_no_joints
(2)Add a joint between two bodies
(2)-1 Click on the parent body and then the child body
Assemble_A_Simple_Robot2
Select body, while holding Ctrl + Shift, Select wheel_left
(2)-2 With both bodies highlighted, right-click and then select Create > Physics > Joints > Revolute Joint
Assemble_A_Simple_Robot3
RevoluteJoint will appear under wheel_left on the stage tree
(2)-3 Rename it to wheel_joint_left
Assemble_A_Simple_Robot4
(2)-4 Double check in the Property tab that body0 is /mock_robot/body (the cube), and body1 is /mock_robot/wheel_left (the cylinder)
Assemble_A_Simple_Robot5
(2)-5 Change the Axis of the joint to Y
Assemble_A_Simple_Robot6
(2)-6 Change Local Rotation
If you look closely, the joint’s two local frames are misaligned
Go to Local Rotation 0 and make x = 0 degrees
Go to Local Rotation 1 and make x = -90 degrees
(Besides orientation misalignment, Translational misalignment could be shown depending on your robot)
Assemble_A_Simple_Robot7
(2)-7 Repeat steps 1-4 for the right wheel joint
Assemble_A_Simple_Robot8
Add revolute joint and rename it to wheel_joint_right
Assemble_A_Simple_Robot9
Double check in the Property tab that body0 is /mock_robot/body(the cube), and body1 is /mock_robot/wheel_right(the cylinder)
Assemble_A_Simple_Robot10
(2)-8 Press Play
Before the joints were added, the three rigid bodies fell to the ground separately
Now that there are joints attached, the bodies will fall as if they are connected
https://drive.google.com/file/d/121tsHuF9xnBlMWz9Nc5gF4up1HwqWSqf/view?usp=sharing
Drag the robot around by holding down the Shift key and clicking and dragging on any part of the robot in the viewport
They move together like they are connected via revolute joints

Add Joint Drive

Adding the joint is only adding the mechanical connection

Add a joint drive API to be able to control and drive the joints
Assemble_A_Simple_Robot11
Select both joints and click the + Add button in the Property tab, and select Physics > Angular Drive to add drive to both joints simultaneously
Position Control:
For position controlled joints, set a high stiffness and relatively low or zero damping
-When controlling a joint based on its position
joint will resist changes to its position strongly
Keep the damping low or even at zero
Damping is like a kind of resistance that slows down movement, so keeping it low means the joint can move more freely Velocity Control:
For velocity controller joints, set a high damping and zero stiffness.
When controlling a joint based on its speed (velocity), the opposite should be done
Set the damping high, which means the joint will have a lot of resistance to speed changes, making it move more smoothly
Set the stiffness to zero, as you don’t need the joint to resist changes in its position, just control its speed
(1) Velocity control
For joints on a wheel, it makes more sense to be velocity controlled
Set both wheels’ Damping to 1e4(high damping) and Target Velocity to 200
If working with joints with limited range, those can be set in the Property tab, under the Raw USD Properties > Lower (Upper) Limit
Assemble_A_Simple_Robot12
(2) Play
Press Play to see our mock mobile robot drive off
https://drive.google.com/file/d/1ieWpsPcj4B25fXVbJVDo7oBWMBb-DBOJ/view?usp=drive_link

Add Articulation

Directly driving the joints can move the robot, it is not the most computationally efficient way
Making things into articulations can achieve higher simulation fidelity, fewer joint errors, and can handle larger mass ratios between the jointed bodies
(Read more regarding the physics simulation behind it in Physics Core: Articulation)
Set an articulation root to anchor the articulation tree to turn a series of connected rigid bodies and joints into articulation
Instructions:
For a fixed-base articulation
Add the Articulation Root Component either to:
1) Fixed joint that connects the articulation base to the world
2) Ancestor of the fixed joint in the USD hierarchy
-Second option allows creating multiple articulations from a single root component added to the scene
-Each descendant fixed joint will be defining an articulation base link
For a floating-base articulation
Add the Articulation Root Component either to:
1) Root rigid-body link
2) Ancestor of the root link in the USD hierarchy
In our case, the articulation root to the robot body will be added
Select body on the tree > open + Add in the Property tab > add Physics > Articulation Root
Assemble_A_Simple_Robot13
Resulting robot matches the asset provided in Isaac/Samples/Rigging/MockRobot/mock_robot_rigged.usd

Results:
https://drive.google.com/drive/folders/13Z6HrSOikkMJ7FfcapG9c56VJOr6fxu1?usp=sharing

Reference:
https://docs.omniverse.nvidia.com/isaacsim/latest/gui_tutorials/tutorial_gui_simple_robot.html