isaac_ros_teleop#
Source code available on GitHub.
Quickstart#
Prerequisites#
This quickstart has been tested and qualified on Jetson AGX Thor and x86_64.
PICO 4 Ultra or Meta Quest 3 headset
If no XR headset is available, the emulator provided by Isaac Teleop Core can be used instead
A stable network connection meeting the CloudXR network requirements
Set Up Development Environment#
Set up your development environment by following the instructions in getting started.
(Optional) Install dependencies for any sensors you want to use by following the sensor-specific guides.
Note
We strongly recommend installing all sensor dependencies before starting any quickstarts. Some sensor dependencies require restarting the development environment during installation, which will interrupt the quickstart process.
Build isaac_ros_teleop#
Install and build
isaac_ros_teleop:Activate the Isaac ROS environment:
isaac-ros activateInstall the prebuilt Debian package:
sudo apt-get update
sudo apt-get install -y ros-jazzy-isaac-ros-teleop
Install Git LFS:
sudo apt-get install -y git-lfs && git lfs install
Clone this repository under
${ISAAC_ROS_WS}/src:cd ${ISAAC_ROS_WS}/src && \ git clone --recurse-submodules -b release-4.6 https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_teleop.git isaac_ros_teleop
Activate the Isaac ROS environment:
isaac-ros activateUse
rosdepto install the package’s dependencies:sudo apt-get update
rosdep update && rosdep install --from-paths ${ISAAC_ROS_WS}/src/isaac_ros_teleop/isaac_ros_teleop --ignore-src -y
Build the package from source:
cd ${ISAAC_ROS_WS}/ && \ colcon build --symlink-install --packages-up-to isaac_ros_teleop --base-paths ${ISAAC_ROS_WS}/src/isaac_ros_teleop/isaac_ros_teleop
Source the ROS workspace:
Note
Repeat this step in every terminal created inside the Isaac ROS environment. Because you built this package from source, you must source the enclosing workspace for ROS to find the package’s contents.
source install/setup.bash
Prepare CloudXR#
Whitelist firewall ports for CloudXR.
CloudXR requires certain network ports to be open. Depending on your firewall configuration, you may need to open them manually. For Quest and PICO headsets (WebXR Client), at the minimum, the CloudXR runtime and WebSocket Secure proxy ports must be open. If
ufwis enabled, run:sudo ufw allow 47998/udp sudo ufw allow 49100,48322/tcp
If you are running the WebXR client from source and
ufwis enabled, also open the web server ports:sudo ufw allow 8080,8443/tcp
Run Launch File#
Run the following launch file to spin up a demo of this package:
ros2 launch isaac_ros_teleop isaac_ros_teleop.launch.py \ cloudxr_accept_eula:=true
After the ROS launch command is running, connect the XR headset to the teleop server. In your headset’s browser, open the CloudXR web client and follow the headset connection guide.
Note
If the CloudXR runtime is running on Jetson, make sure to set the
Video CodectoH.264, otherwise the headset will fail to connect.Warning
The world frame of the headset is defined as the position of the headset and controllers at the moment of connection. Stand still and face the robot before connecting to establish a consistent world frame. To reset the world frame, disconnect and reconnect the headset while stationary.
Visualize Results#
Open a new terminal and activate the Isaac ROS environment:
isaac-ros activateInstall
RViz:sudo apt install -y ros-jazzy-rviz2 source /opt/ros/jazzy/setup.bash
Open
RViz:rviz2
Then set the
Fixed Frametoworld. Then click on theAddbutton, selectBy display type, and chooseTFunderrviz_default_plugins.With the controllers in your hands, start moving them. You should see the frames track your movements:
Note
The frames are converted to match ROS frame convention. Therefore, the poses are re-oriented from Right-Up-Back orientation to Forward-Left-Up for the x, y and z axes respectively.
Controller Reference#
The PICO 4 Ultra headset and Meta Quest 3 include two handheld controllers. The following table summarizes what each input does during teleoperation:
Input |
Action |
|---|---|
Left joystick |
Move the robot: up = forward, down = backward, left = strafe left, right = strafe right |
Right joystick — left / right |
Rotate the robot in place (yaw) |
Controller motion (6-DOF) |
The end-effector pose tracks the physical controller; moving and rotating the controller moves the robot’s hand correspondingly |
Triggers (each controller has two) |
Open and close the finger joints of the tri-finger hand |
Troubleshooting#
Isaac ROS Troubleshooting#
For solutions to problems with Isaac ROS, see troubleshooting.
API#
Usage#
ros2 launch isaac_ros_teleop isaac_ros_teleop.launch.py \
cloudxr_accept_eula:=true
Launch Arguments#
Launch Argument |
Type |
Default |
Description |
|---|---|---|---|
|
|
|
Topic name for published end-effector poses ( |
|
|
|
Topic name for published root velocity command ( |
|
|
|
Topic name for published root pose command ( |
|
|
|
Topic name for published head pose command ( |
|
|
|
Topic name for retargeted G1 TriHand finger joints ( |
|
|
|
Topic name for raw msgpack-encoded controller state ( |
|
|
|
The publishing rate in Hz. |
|
|
|
World frame for message headers and TF parent frame. |
|
|
|
TF child frame name for the right wrist. |
|
|
|
TF child frame name for the left wrist. |
|
|
|
TF child frame name for the head. |
|
|
|
Left-hand finger joint names in TriHand retargeter order: thumb_rotation, thumb_proximal, thumb_distal, index_proximal, index_distal, middle_proximal, middle_distal. |
|
|
|
Right-hand finger joint names in TriHand retargeter order: thumb_rotation, thumb_proximal, thumb_distal, index_proximal, index_distal, middle_proximal, middle_distal. |
|
|
|
Quaternion |
|
|
|
Translation |
|
|
|
CloudXR runtime directory used by the in-process launcher. |
|
|
empty |
Optional CloudXR environment config file passed to the in-process launcher. |
|
|
|
Accept the NVIDIA CloudXR EULA non-interactively. |
|
|
|
Enable the CloudXR out-of-band teleop control hub. |
|
|
|
Route teleop traffic over USB through |
ROS Topics Published#
ROS Topic |
Interface |
Description |
|---|---|---|
|
The poses of the wrists or end-effectors, given in order of left wrist and then right wrist. |
|
|
The root twist command. |
|
|
The root pose command. |
|
|
The headset pose in the configured world frame. |
|
|
The retargeted finger joint angles for the robot. |
|
|
Raw controller state encoded as msgpack. Contains button, trigger, thumbstick, and pose data for each controller. |
|
|
Poses of the wrists and head with respect to the world frame |