Start simulating with Omniservice API
After you have successfully set up a cell with NOVA API or in settings, you are now ready to access the Omniservice API. How you access the Omniservice API depends on the location of your NVIDIA Isaac Sim™ installation:
Local installation
If you installed the Isaac Sim™ extension (Omniservice) locally, access the API via http://localhost:8211/omniservice/api
.
Remote installation
If you installed NVIDIA Isaac Sim™ on a remote machine, the Omniservice API needs to be exposed by a remotly accessible URL. We recommend Microsoft DevTunnel (opens in a new tab) for this purpose. The following steps are required to configure a DevTunnel:
Install DevTunnel
Install the DevTunnel via the winget
package manager:
winget install Microsoft.DevTunnel
Login with Microsoft account
Log into your Microsoft or GitHub account via the command line:
devtunnel login
Create a DevTunnel
Create a DevTunnel via the command line:
devtunnel host -a --port 8211
Access the API via the URL that is returned by the command, for example
https://<tunnel-id>-8211.euw.devtunnels.ms/omniservice/api
.
Authenticate with Wandelbots NOVA
Skip this step if you're using a physical instance or a virtual machine as no authentication is required for those instance types.
If you want to connect NVIDIA Isaac Sim™ to a Wandelbots NOVA cloud instance, you need to authenticate with credentials provided when creating a cloud instance.
To authenticate with Wandelbots NOVA, use the POST /omniservice/authenticate
endpoint.
The request body should contain the following information:
{
"host": string, // The hostname of your NOVA instance without the protocol, e.g. `<instance-id>.instance.wandelbots.io`
"is_secured: boolean, // Set to true if your NOVA instance uses HTTPS
"access_token": string, // The access token of your NOVA instance
}
The information is cached by the Isaac Sim™ extension (Omniservice), thus you only need to authenticate once per session. When you restart Isaac Sim™ or the extension and thus terminate the session, you need to authenticate again.
Connect a robot
Currently, the following robot brands are supported by Wandelbots NOVA and can be simulated in an Isaac Sim™ scene: KUKA, ABB, FANUC, UniversalRobots and Yaskawa.
Set up a connection to one of the supported robots by completing the following steps. In this example, we use a UR5e with a parallel gripper attached to the robot flange as fixed joint.
Open or create a scene with robots
The Wandelbots NOVA extension (Omniservice) requires you to have a cell set up and robots configured on your Wandelbots NOVA instance.
After you have successfully set up a cell on Wandelbots NOVA, add the desired robot to your scene. Your scene must contain at least one robot that the physical robot can be connected to.
Connect your robot
The interactive Omniservice API provides endpoints to connect your robot with ease: Use POST /robot/create_robot
.
This endpoint requires some information you entered during the cell setup for NOVA:
{
identifier: string, // Name your robot
host: string, // The IP address of your NOVA instance
cell: string, // The name of your NOVA cell
controller_id: string, // The controller name of your physical robot, e.g. ur5e
motion_group_id: integer, // The motion group of your robot instance, usually 0
prim_path: string, // The prim path of the robot (articulation) in the Isaac Sim™ ccene
}
Looking for the robot's prim path?
-
Get the correct
prim_path
via the endpointGET /robot/get_robot_data_from_scene
. It returns a list of prim paths of all existing robots in your scene. Copy and paste the desired one into your request. -
Send your request and ensure that the robot was successfully created with
GET /robot/get_all_robots
.
Receive robot state data
To replicate the robot's movements and actions within the simulation, you need to establish a RobotStateStream
with
POST /streams/create_streams
. This endpoint requires the following information:
{
identifier: string, // Choose a name, e.g. `ur5e_state_stream`
type: string, // The type of the stream, in this case RobotStateConnector
robot: string, // The identifier of your created robot, e.g. `ur5e`
robot_state: string // The update rate in ms
}
Start stream
- Start the simulation either via
POST /scene/play_simulation
or via the Isaac Sim™ interface. - Start the RobotConnectorStream, e.g.
ur5e_state_stream
viaPOST /streams/start_stream
with the query parameter?stream_name=ur5e_state_stream
.
Et voilà, the robot should now receive data from groundcontrol aka Wandelbots NOVA.
Periphery
With the Isaac Sim™ extension (Omniservice) you can also connect to tools controlled by the robot controller or by API calls via I/Os.
Currently, three types of periphery are supported:
- Surface grippers
- Parallel grippers
- Conveyor belts
Add periphery
Add a tool to an existing robot with POST /tool/create_tools
.
This endpoint allows for multiple tools to be added at once. In each of the provided examples, one of the periphery types is added.
Any object in the scene can be used as surface gripper.
{
identifier: string, // This is an unique identifier, `e.g. ur5e_gripper`.
type: string, // This is in our case `GenericSurfaceGripper`.
prim_path: string, // The prim path of the desired object in the scene, usually a surface gripper like tool
robot: string, // This is the identifier of the created robot, e.g. `ur5e`
signals: string[], // This is a list of signals, that means a list of controller IOs, e.g. ["tool_out[0]", "tool_out[1]"]
translate: number, // This is the offset in the direction you specified, default: 0.01
direction: string, // The direction of the surface, default: x
grip_threshold: number, // This defines the threshold limit for gripping an object, default: 0
force_limit: number, // This defines the limit under which force the grip lasts, default: 1000000
torque_limit: number, // This defines the limit for the torque of the surface gripper, default: 100000
bend_angle: number, // This is the angle of the surface bend, default: 0.1308996938995747
kp: number, // default: 100000
kd: number, // Damping value, default: 100000
disable_gravity: boolean // Gravity is only applied when activated. When deactivated and the object is released from the gripper, gravity is not applied, default: false
}
You successfully added a tool to your robot.
Receive controller data
Finalize the attachment by creating the I/O stream. Use the same as for the robot state stream and change the type:
POST /streams/create_streams
{
identifier: string, // Choose a name, e.g. ur5e_io_stream
type: string, // The type of the stream, in this case IOStateConnector
robot: string, // The identifier of your created robot, e.g. `ur5e`
}
Only one I/O state connector per robot is required, it automatically collects all I/Os for every attached periphery.
Try opening and closing the gripper via the I/Os tool_out[0]
and tool_out[1]
.
Simultaneous configuration of robot and tools
When using the Omniservice API for configuration of the simulation environment, you can simultaneously configure the robot and tools. This allows for more complex custom configurations.
Use the endpoint Configuration > Load Configuration POST /configuration/load_configuration
and use a .yaml file like the omniservice_config.yaml
:
This API endpoint is what's used in the Robot Pad so the required information might seem familiar: instance's IP address, the objects prim paths etc.
robots:
0@ur10e:
configuration:
host: <my.instance.wandelbots.io>
cell: cell
controller_id: ur10e
motion_group_id: 0
prim_path: /World/cell/universalrobots_ur10e/universalrobots_ur10e
is_secured: true
streams:
0@ur10e_state_stream:
configuration:
type: RobotStateConnector
robot: 0@ur10e
robot_state: 50
0@ur10e_io_stream:
configuration:
type: IOStateConnector
robot: 0@ur10e
tools:
gripper:
configuration:
type: GenericParallelGripper
prim_path: /World/cell/universalrobots_ur10e/universalrobots_ur10e
robot: 0@ur10e
signals:
- tool_out[0]
- tool_out[1]
open_position:
- 0
- 0
close_position:
- -0.03
- 0.03
default_DOF: 6
scene:
uri:
Export and import configuration file
Closing the Isaac Sim™ extension (Omniservice) or changing the Isaac Sim™ scene results in loss of the configuration.
To avoid the loss of your configuration, regularly export the configuration via Omniservice API's provided export and import functionality.
Once you've completed the Omniservice configuration, export the .yaml
file:
curl --request POST \
--url http://localhost:8211/omniservice/configuration/export_configuration \
--header 'Accept: application/json' \
--header 'Content-Type: application/json'
The exported file contains configured robots, periphery and streams.