RealHand Teleop
RealHand Teleop is an Isaac Sim, Isaac Lab, and Isaac Teleop integration for teleoperating a RealHand P7 bimanual robot equipped with RealHand L6, O6, or L20 dexterous hands from a PICO 4 Ultra headset.
This repository is a robotics software and asset bundle. It does not contain pretrained model weights, NVIDIA runtimes, or the external FFG SDK.
Contents
The package contains:
- RealHand P7 bimanual robot assets.
- RealHand L6, O6, and L20 hand URDF and mesh assets.
- PICO 4 Ultra OpenXR controller teleoperation.
- PICO 4 Ultra OpenXR hand-tracking teleoperation.
- FFG / RealForce glove teleoperation for L6, O6, and L20 hands.
- Controller-driven arm poses with FFG-driven hand joints.
- A 3D-printable PICO controller mount for FFG glove setups.
- Pink-based dual-arm inverse kinematics.
- A self-contained inspection and kitting workcell.
- Runtime and offline FFG calibration tools.
Supported Modes
Select the hand with P7_REALHAND_HAND_MODEL=l6|o6|l20 and the input mode with
P7_REALHAND_INPUT_MODE=controller|handtracking|controller_ffg.
| Input mode | Arm pose | Hand joints |
|---|---|---|
controller |
Left/right PICO controllers | Matching controller trigger |
handtracking |
Left/right OpenXR wrists | OpenXR 26-joint hand skeleton |
controller_ffg |
Left/right PICO controllers | Left/right FFG gloves |
All three hands support all three modes. Gravity and hand self-collision are enabled by default for the inspection scene.
Tested Compatibility
| Component | Tested version |
|---|---|
| Operating system | Ubuntu 24.04.4 LTS |
| Python | 3.12.3 |
| Isaac Sim | 6.0.0.1 |
| Isaac Lab source | release/3.0.0-beta2 |
| Isaac Lab commit | 1a88953ca1cd246feebb9e33b8d381c2c0b4736d |
| Isaac Lab package metadata | 6.1.5 |
| Isaac Teleop | 1.3.105rc1 |
| XR device | PICO 4 Ultra |
| XR interface | OpenXR |
See COMPATIBILITY.md for the tested environment.
Prerequisites
Install the workstation, XR, and glove runtimes separately before using this bundle. This repository only contains RealHand-owned integration code, robot assets, hand assets, scene assets, and launch/calibration scripts.
| Component | Required for | Source / notes |
|---|---|---|
| NVIDIA GPU driver | All modes | Install a recent NVIDIA Linux driver supported by Isaac Sim. Validate with nvidia-smi. |
| Isaac Sim | All modes | Install the tested NVIDIA Isaac Sim version listed above. |
| Isaac Lab | All modes | Use an Isaac Lab checkout at the tested branch/commit listed above. Set ISAACLAB_ROOT and ISAACLAB_ENV when they are not in the default locations. |
| Isaac Teleop | All modes | Install NVIDIA Isaac Teleop at the tested version. The launcher uses Isaac Teleop's OpenXR and CloudXR entry points. |
| PICO 4 Ultra OpenXR tracking | controller, handtracking, controller_ffg |
Use the PICO 4 Ultra headset/controllers with the OpenXR path exposed through Isaac Teleop. |
| CloudXR runtime | Current wireless XR path | Required for the current PICO streaming workflow. Accept the NVIDIA CloudXR EULA once before first use. |
| FFG / RealForce pure Python SDK | controller_ffg only |
Clone and install FFG_realhand_pure_python. It provides the realhand_pure_python package used for RealForce glove serial reading, calibration loading, and retarget input. |
CloudXR, Isaac Sim, Isaac Lab, Isaac Teleop, the PICO runtime/client, NVIDIA drivers, and the FFG SDK are not redistributed in this repository. Their upstream license terms apply independently.
Workspace Paths
The commands below use a configurable workspace instead of a machine-specific
path. Replace $HOME/realhand with any local directory you prefer:
export REALHAND_WORKSPACE="$HOME/realhand"
export REALHAND_TELEOP_ROOT="$REALHAND_WORKSPACE/realhand-teleop"
export ISAACLAB_ROOT="$REALHAND_WORKSPACE/IsaacLab"
export ISAACLAB_ENV="$REALHAND_WORKSPACE/env_isaaclab"
FFG SDK Setup
controller and handtracking modes do not need the FFG SDK. Install it only
when using P7_REALHAND_INPUT_MODE=controller_ffg.
The launcher looks for the SDK at P7_REALHAND_FFG_SDK_PATH. The recommended
layout places the FFG SDK as a sibling of the downloaded RealHand Teleop repo:
$REALHAND_WORKSPACE/FFG_realhand_pure_python-main
Recommended install after creating the Isaac Lab Python environment:
mkdir -p "$REALHAND_WORKSPACE"
cd "$REALHAND_WORKSPACE"
git clone https://github.com/RealHand-Robotics/FFG_realhand_pure_python.git \
FFG_realhand_pure_python-main
source "$ISAACLAB_ENV/bin/activate"
python -m pip install -e "$REALHAND_WORKSPACE/FFG_realhand_pure_python-main"
export P7_REALHAND_FFG_SDK_PATH="$REALHAND_WORKSPACE/FFG_realhand_pure_python-main"
The upstream FFG SDK also documents a standalone Conda environment. For this
Isaac Teleop bundle, install the SDK into the Isaac Lab Python environment or
make it visible through P7_REALHAND_FFG_SDK_PATH/PYTHONPATH.
After downloading this repository, verify that the package is importable and that the gloves are visible from the repository root:
python -c "import realhand_pure_python; print('realhand_pure_python ok')"
python scripts/teleop/scan_ffg_gloves.py
If Linux reports permission denied for /dev/ttyUSB*, add the user to
dialout, then log out and back in:
sudo usermod -aG dialout "$USER"
Download
Set the workspace variables above, install or invoke the Hugging Face CLI, then download the package:
mkdir -p "$REALHAND_WORKSPACE"
cd "$REALHAND_WORKSPACE"
uvx hf download realhandinc/realhand-teleop \
--revision v0.2.0 \
--local-dir realhand-teleop
cd "$REALHAND_TELEOP_ROOT"
Point the launcher to the Isaac Lab checkout and Python environment when they are not in the default locations:
export ISAACLAB_ROOT="$REALHAND_WORKSPACE/IsaacLab"
export ISAACLAB_ENV="$REALHAND_WORKSPACE/env_isaaclab"
Install And Validate
source "$ISAACLAB_ENV/bin/activate"
python -m pip install -e \
examples/isaac_lab/p7_realhand_bimanual/source
python scripts/teleop/check_install.py
python scripts/teleop/test_retargeters.py
The editable install is convenient but not required by the launcher because it
also adds the extension and shared retargeter paths to PYTHONPATH.
First-Time CloudXR Setup
Accept the NVIDIA CloudXR EULA once before the first XR session:
source "$ISAACLAB_ENV/bin/activate"
python -m isaacteleop.cloudxr --accept-eula
After the runtime reports that it is running, press Ctrl+C. The regular
launcher starts CloudXR automatically, so a separate CloudXR terminal is not
required for normal use.
Run
Activate the environment and enter the downloaded repository:
source "$ISAACLAB_ENV/bin/activate"
cd "$REALHAND_TELEOP_ROOT"
L6 controller mode:
P7_REALHAND_HAND_MODEL=l6 \
P7_REALHAND_INPUT_MODE=controller \
PICO4U_DEVICE=cpu \
bash scripts/teleop/run_pico4u_teleop.sh
O6 hand-tracking mode:
P7_REALHAND_HAND_MODEL=o6 \
P7_REALHAND_INPUT_MODE=handtracking \
PICO4U_DEVICE=cpu \
bash scripts/teleop/run_pico4u_teleop.sh
L20 controller arms plus FFG hands:
P7_REALHAND_HAND_MODEL=l20 \
P7_REALHAND_INPUT_MODE=controller_ffg \
P7_REALHAND_FFG_SDK_PATH="$REALHAND_WORKSPACE/FFG_realhand_pure_python-main" \
PICO4U_DEVICE=cpu \
bash scripts/teleop/run_pico4u_teleop.sh
Use P7_REALHAND_HAND_MODEL=l6, o6, or l20 with any of the three supported
input modes.
FFG USB Discovery
The FFG reader auto-discovers USB serial devices and uses the glove-reported
side byte (left/right) from the RealForce version query. Set
P7_REALHAND_FFG_LEFT_PORT and P7_REALHAND_FFG_RIGHT_PORT only when explicit
assignment is needed. Leaving them unset, empty, or set to auto uses
discovery.
Check USB access before launching Isaac:
python scripts/teleop/scan_ffg_gloves.py
If Linux reports permission denied for /dev/ttyUSB*, add the user to
dialout and log out and back in:
sudo usermod -aG dialout "$USER"
For the current terminal only, use sg dialout -c '<command>' after group
membership is updated.
FFG PICO Controller Mount
The package includes a 3D-printable PICO controller holder for FFG glove use:
hardware/ffg_pico_controller_mount/finalpico2.3mf
Print two copies for each hand. Assemble the two printed parts symmetrically
around the PICO controller, then mount the assembled holder on the back of the
FFG glove. With the controller fixed on the glove back, controller_ffg mode
can use the PICO controller pose for the P7 arm while the FFG glove controls
the RealHand joints.
FFG Calibration
You can calibrate FFG gloves from the Isaac desktop UI in controller_ffg mode
or from the offline script:
P7_REALHAND_HAND_MODEL=l20 \
python scripts/teleop/calibrate_ffg_gloves.py --model l20 --force
The output is written to:
calibration/ffg_calibration_<model>_dual.yml
The launcher automatically uses this file when it exists. To override it:
export P7_REALHAND_FFG_RAW_CALIBRATION_PATH=/path/to/ffg_calibration_l20_dual.yml
L6/O6 Calibration Poses
L6 and O6 use a short five-pose calibration because their thumbs do not need the full L20 opposition workspace.
Open palm:
- Fully open the hand.
- Keep all five fingers naturally straight.
- Keep the thumb relaxed and away from the palm.
- Do not hyperextend or force the fingers backward.
Full fist:
- Curl index, middle, ring, and pinky as far as comfortably possible.
- Curl the thumb naturally across the front of the fingers.
- Hold a normal fist, not a squeezed or strained fist.
Thumb-only full curl:
- Keep index, middle, ring, and pinky open.
- Curl only the thumb inward across the palm.
- Move the thumb to its comfortable closed limit.
- Avoid bending the other fingers while holding this pose.
Thumb to index fingertip:
- Touch the thumb tip lightly to the index fingertip.
- Use fingertip-to-fingertip contact, not thumb pad to finger side.
- Keep middle, ring, and pinky mostly open and relaxed.
- The contact should be gentle; do not squeeze.
Thumb to middle fingertip:
- Touch the thumb tip lightly to the middle fingertip.
- Keep the index, ring, and pinky mostly open.
- Keep the palm relaxed and avoid twisting the wrist to compensate.
- This pose gives L6/O6 a second thumb-opposition reference without asking for unreachable ring or pinky opposition.
L20 Calibration Poses
L20 uses a richer seven-pose calibration because its thumb has a larger lateral workspace.
Open palm:
- Fully open all fingers.
- Keep the palm relaxed.
- Keep the thumb away from the palm in a natural open-hand posture.
Full fist:
- Curl all four fingers fully.
- Curl the thumb naturally across the palm/fingers.
- Use the most comfortable full fist you can repeat consistently.
Thumb-only full curl:
- Keep the four non-thumb fingers open.
- Curl only the thumb across the palm to its comfortable limit.
- This pose teaches thumb curl without letting other fingers influence it.
Thumb to index fingertip:
- Touch thumb tip to index fingertip.
- Keep the other three fingers relaxed and mostly open.
Thumb to middle fingertip:
- Touch thumb tip to middle fingertip.
- Keep index, ring, and pinky relaxed and mostly open.
Thumb to ring fingertip:
- Touch thumb tip to ring fingertip.
- Keep index, middle, and pinky relaxed.
- Let the thumb move laterally; avoid forcing the wrist to create the contact.
Thumb to pinky fingertip:
- Touch thumb tip to pinky fingertip.
- Keep the contact light and repeatable.
- This pose is the far lateral boundary for L20 thumb opposition.
For every pose, hold still during the sampling countdown. If a pose feels ambiguous, prefer a relaxed, repeatable posture over an extreme one.
Default Scene
The bundled inspection_kitting scene contains:
- A compact inspection table.
- Two reachable sorting baskets.
- A thin cube-frame grasp object.
- Collision and rigid-body settings tuned for the P7 and RealHand setup.
The scene is self-contained and does not require external robot assets or an NVIDIA Nucleus asset server.
Project Layout
src/plugins/realforce_glove/
FFG / RealForce glove input plugin.
src/retargeters/realhand/
Shared RealHand L6/O6/L20 retargeting code.
examples/teleop/python/config/realhand/
Retargeting URDF and DexPilot configuration files.
examples/isaac_lab/p7_realhand_bimanual/
P7 + RealHand assets, Isaac Lab task, scene, scripts, and documentation.
hardware/ffg_pico_controller_mount/
3D-printable PICO controller holder for FFG glove mounting.
scripts/teleop/
Stable root launch, FFG calibration, USB scan, and validation entry points.
Useful Runtime Settings
P7_REALHAND_HAND_MODEL=o6
P7_REALHAND_INPUT_MODE=controller_ffg
P7_REALHAND_SCENE_MODE=inspection_kitting
P7_REALHAND_SELF_COLLISION=1
P7_REALHAND_L20_SELF_COLLISION_FILTERS=1
P7_REALHAND_ROBOT_YAW_DEG=90
P7_REALHAND_WORKSPACE_CENTER_Z=0.82
P7_REALHAND_CONTROLLER_POSITION_SMOOTHING_ALPHA=1.0
P7_REALHAND_CONTROLLER_ORIENTATION_SMOOTHING_ALPHA=0.85
P7_REALHAND_CONTROLLER_MAX_ORIENTATION_STEP_DEG=90.0
P7_REALHAND_HAND_CURL_SMOOTHING_ALPHA=0.65
P7_REALHAND_HAND_THUMB_FLEX_SCALE=1.15
P7_REALHAND_HAND_THUMB_CLOSE_GAIN=1.80
P7_REALHAND_HAND_THUMB_OPPOSITION_GAIN=1.80
P7_REALHAND_IK_POSITION_COST=42.0
P7_REALHAND_IK_ORIENTATION_COST=2.0
P7_REALHAND_IK_LM_DAMPING=3.0
P7_REALHAND_IK_GAIN=0.85
P7_REALHAND_FFG_SDK_PATH=$REALHAND_WORKSPACE/FFG_realhand_pure_python-main
P7_REALHAND_FFG_LEFT_PORT=auto
P7_REALHAND_FFG_RIGHT_PORT=auto
P7_REALHAND_FFG_BAUDRATE=0
P7_REALHAND_FFG_RAW_CALIBRATION_PATH=calibration/ffg_calibration_o6_dual.yml
Legacy P7L6_* spellings remain accepted for existing scripts.
More PICO and OpenXR notes are available in
examples/isaac_lab/p7_realhand_bimanual/docs/OPENXR_PICO4U.md.
Scope And Safety
This package controls the simulated P7 and RealHand system. It is not a certified real-robot safety controller. Validate workspace limits, collision behavior, emergency stops, and command transport before adapting it to physical hardware.
License
RealHand-owned code, P7/L6/O6/L20 assets, and the inspection scene are released
under Apache-2.0. Files derived from Isaac Lab retain their BSD-3-Clause
headers and terms. See LICENSE, NOTICE, and
LICENSES/ for details.