Welcome to teleoperation, the Fourier Advanced Robot Teleoperation System (F.A.R.T.S.)! This system enables real-time humanoid robot control using a VR headset and hand tracking. While primarily designed for Fourier GRX series robots, it's adaptable for other robots too. It supports various cameras like Depthai Oak, Intel RealSense, and generic USB cameras, and includes data collection features for imitation learning and VLA.
- Add more documentation for the data collection and docker installation.
- Support Fourier 12 DOFhand with tactile sensors.
- Add tutorial for adding new emobiments, and general development guide.
- Switch to structured configs.
- Use
evdevfor keyboard input instead ofpynputto avoid Wayland issues. - Add instructions for applying udev rules for the stereo camera on
GR2robots.
- Robot: Fourier GRX series robots (GR1T1, GR1T2, GR2.)
- Dexterous Hand: Fourier 6 DOF dexterous hand, Fourier 12 DOF dexterous hand, or Inspire hand.
- Camera: Depthai Oak, Intel RealSense D435, or generic USB camera.
- VR Headset: Apple Vision Pro or Meta Quest 3.
- Host Computer: Ubuntu 20.04 or later with a decent CPU.
- Network: Ensure the host computer and VR headset are on the same network. If you are using Apple Vision Pro, you need a stable Wi-Fi connection. If you are using Meta Quest 3, you can use a USB-C cable to connect the headset to the host computer.
Important
For other hardware related issues, especially if your are setting up the robot for the first time, we stringly encourage you to contact Fourier support team for help first. Setting up the robot and dealing with the quirks of each generation of Fourier robots can be a bit tricky, and they are out of the scope of this tutorial. For the rest of the tutorial, we will assume you are moderately familiar with the hardware setup and the robot is already set up and working properly.
Apple restricts WebXR access on non-HTTPS connections. To test the application locally, you need to set up a self-signed certificate and install it on the client device.
Note
Please ensure that both the VisionPro and the Ubuntu machine are on the same network.
-
Enable WebXR related features in Safari: Make sure you have the latest version of VisionOS installed on your VisionPro device. Then go to Safarai advanced settings
Settings > Apps > Safari > Advanced > Feature Flagsand enable the WebXR related features, they may be named differently in different versions of VisionOS. -
Install a Self-Signed Certificate: We'll be using
mkcertto create a self-signed certificate. andmkcertis a simple tool for making locally-trusted development certificates. It requires no configuration. Here's how to set it up:-
Please follow the instructions on the official website to install
mkcert. -
Creating the certificate with
mkcert, make sure to put the IP address of your computer in the command
mkcert -install && mkcert -cert-file cert.pem -key-file key.pem {Your IP address} localhost 127.0.0.1[!IMPORTANT] Make sure to replace
{Your IP address}with the actual IP address of your Ubuntu machine. You can find your IP address by runningifconfigin the terminal. The IP address is usually in the format192.168.x.xor10.0.x.x.[!TIP] For Ubuntu machines, you can use the zeroconf address instead of the IP address for additional convenience. The zeroconf address is usually
$(hostname).local. You can find it by runningecho "$(hostname).local"in the terminal.-
Firewall settings
sudo iptables -A INPUT -p tcp --dport 8012 -j ACCEPT sudo iptables-save sudo iptables -L
or setup firewall with
ufwsudo ufw allow 8012
-
install ca-certificates on VisionPro
mkcert -CAROOT
Copy the
rootCA.pemfile to the VisionPro device through the Airdrop. Alternatively, you can zip the file and start a local server on your Ubuntu machine and download the file from the VisionPro device.Settings > General > About > Certificate Trust Settings. Under "Enable full trust for root certificates", turn on trust for the certificate.
-
Place
key.pemandcert.peminto thecertsfolder to make sure the certificates are accessible by scripts.
-
-
Enable developer mode on the Meta Quest device following the official instructions.
-
Install adb on your host machine (We are assuming you are using Ubuntu). You can install adb with the following command:
sudo apt install android-tools-adb
Then launch the adb server with
adb start-server
-
Connect the Meta Quest device to your computer using a USB-C cable. Allow USB debugging when prompted on the device.
-
Before running the program every time, forward the port with the following command:
adb reverse tcp:8012 tcp:8012
Note
Only realsense D435 and oak-d-w-97 are extensively tested. If you are using other cameras, you may need to modify some configs.
Install the DepthAI library with the following command:
sudo wget -qO- https://docs.luxonis.com/install_dependencies.sh | bashNote
Please make sure to update the oak_multi.yaml file with the serial numbers of each camera if you are using the multi-camera setup.
Install the librealsense library following the official instructions
Note
Please make sure to update the realsense_multi.yaml or realsense.yaml file with the serial numbers of each camera.
Install the ZED SDK following the official instructions.
FARTS supports multiple versions of SDKs for Fourier robots.
If you are using GR1T1 ir GR1T2 robot, we recommend the grx backend for now. While it is being phasing out in favor of the hardware backend, it is still the most stable and well-tested version.
The recommended setup is to use the grx backend is through the docker container. We provide a convenient script to run the docker container with the grx backend. You can run the following command to start the docker container:
cd ./server_config # You need to be in the server_config directory for the directory to be mounted correctly to the docker container
./run_server.sh gr1t1This will mount the server_config directory to the docker container and start the GRX server. You can also use the gr1t2 or gr1t2 as the argument to run the docker container with different robot versions.
Important
If this is the first time you are running the grx backend, you need to calibrate the robot first. You can do this by running the following command in another terminal once the grx docker container is running and you have put the robot in its initial position:
./scripts/grx_calibrate.shThis script will trigger the calibration process and save the calibration data to the sensor_offset.json file in the server_config directory.
Once the calibration script is finished, you can terminate the grx docker container and start it again. This will make sure the calibration is correctly loaded.
First, clone the repo:
git clone https://github.com/FFTAI/teleoperation.gitWe use uv to manage our dependencies, (and you should too). You can follow the official instruction to install uv on your machine.
Then, you can create a new virtual environment with the following command:
# create a 3.11 virtual environment using uv
uv venv -p 3.11or if you want to use conda to manage your python versions, you can:
# create a 3.11 virtual environment using conda
conda create -n teleop python=3.11 ffmpeg==7.1.1
conda activate teleop
uv venv -p $(which python)Then, you can install the dependencies with the following command:
# resolve the dependencies
uv sync --extra depthai # if you are using Oak camera
# OR
uv sync --extra realsense # if you are using realsense camera
# activate the virtual environment
source .venv/bin/activateThen you can try to run the demo script with the following command:
Tip
If you are on Ubuntu 22.04 or later, we recommend using the Hyper terminal or the built-in terminal of VSCode to run the script. This is because the pynput library has some limitations on Wayland, which may cause issues when monitoring keyboard events.
# if you are using Apple Vision Pro:
python -m teleoperation --config-name teleop robot=gr1t1_legacy hand=fourier_dexpilot_dhx camera=oak_97 robot.visualize=true mocap=avp sim=true
# OR if you are using Meta Quest 3
python -m teleoperation --config-name teleop robot=gr1t1_legacy hand=fourier_dexpilot_dhx camera=oak_97 robot.visualize=true mocap=quest sim=trueThen you can see a visualization of the robot if you go to http://127.0.0.1:7000/static/ on your host machine.
In the browser on your headset, go to https://your-hostname.local:8012?ws=wss://your-hostname.local:8012 if you are using Apple Vision Pro.
Or http://localhost:8012?ws=ws://localhost:8012 if you are using Meta Quest 3. Then you should be able to see the camera image on the browser page.
Finally, Click the Enter VR button on the web page and give necessary permissions to start the VR session.
If your hands appear not aligned in the visualization๏ผyou can reset the Vision Pro tracking by long pressing the crown button on the Vision Pro device until you hear a ding sound.
We manage the config with Hydra. You can select config files and override with hydra's override syntax.
By default, the script uses the teleop config file and you must specify the hand, camera, and robot configs to use.
python -m teleoperation --config-name teleop robot=??? hand=??? camera=??? robot.visualize=true mocap=avpThe available options for the robot, hand, and camera parameters are listed below:
- robot:
gr1t1_legacy: gr1t1 robot with legacygrxSDKgr1t2_legacy: gr1t2 robot with legacygrxSDKgr2_hardware: gr2 robot with the new experimental SDK
- hand:
fourier_dexpilot_dhx: Fourier 6 DOF dexterous handfourier_12dof_dexpilot: Fourier 12 DOF dexterous handinspire_dexpilot: Inspire hand
- camera:
oak_97: Depthai Oak-D-W-97 camerarealsense: Intel RealSense D435 camera, you need to specify the serial number in the config filerealsense_multi: Intel RealSense D435 multi-camera setupopencv: Generic USB camera with OpenCV, you need to specify the port by addingcamera=opencv camera.instance.port=/dev/video0to the command line.
Some other usefaul options are:
robot.visualize: Whether to visualize the robot in the browser. Default isfalse.mocap: The type of motion capture system to use. Options areavpfor Apple Vision Pro andquestfor Meta Quest 3. Default isavp.sim: Whether to run the simulation mode. Default isfalse. If you are using the real robot, please set this tofalse. If you are using the simulation mode, please set this totrue.debug_hand: Whether to visualize the hand tracking data in the browser. Default isfalse.use_depth: Whether to collect depth data. Default isfalse.use_head: Whether to enable head tracking. Default isfalse. If this is set totrue, the robot will mimic the head movements of the operator. This is useful for applications where the operator needs to look around while teleoperating the robot.use_waist: Whether to enable waist tracking. Default isfalse. If this is set totrue, the robot will mimic the waist movements of the operator.[!CAUTION] Please make sure that your robot is properly calibrated, and all pins are taken out before running the script. Otherwise, this could damage the robot or result in unexpected behavior. Please contact the Fourier support team for more details if you plan to use it.
gravity_compensation: Whether to enable gravity compensation. Default isfalse. If this is set totrue, the robot will compensate for the gravity when moving.[!CAUTION] This is an experimental feature and is very sensitive to network latency. Please contact the Fourier support team for more details if you plan to use it.
Tip
You can check the config in the configs directory for more details. There are several examples for how to use other cameras and robots.
To record data, use the daq config file and specify the task name, the syntax is the same as the teleoperation config file but using different config file:
python -m teleoperation --config-name daq robot=gr1t2_legacy camera=oak task_name=${task_name}For more config options, please refer to the configs/daq.yaml file or see the scripts/data_collection.sh file.
Caution
If you are using the real robot, please make sure to leave enough empty space around the robot before starting the script, as the robot will move to its start position automatically.
We recommend doing the teleoperation, especially the data collection, with two people. One person is the pilot who wears the VR headset and controls the robot, and the other person is the operator who monitors the robot's position and helps the pilot to start the teleoperation.
After launching the program, you can open the browser on the Apple VisionPro device and go to https://your-hostname.local:8012?ws=wss://your-hostname.local:8012, or http://localhost:8012?ws=ws://localhost:8012 if you are using Meta Quest 3.
If you already in this website, you can refresh the page and click until see the camera image in the VR session.
Then click the Enter VR button and give necessary permissions to start the VR session. Make sure to reset the Vision Pro tracking by long press the crown button on the Vision Pro device until you hear a sound.
The VR session will show the FOV camera image in the headset. At this time the pilot is not yet engaged in the teleoperation.
The pilot should put their hands in the same start position as the robot, and then ask the operator to hit the Space key on the host machine to start the teleoperation.
It is a good practice to also ask the operator to check the robot's position in the browser visualization to make sure the robot is in the same position as the pilot's hands.
Afterwards, the pilot can start the teleoperation by moving their hands in the VR session. The robot will follow the pilot's hand movements in real-time.
To stop the teleoperation, the operator can hit the Space key again or just ctrl+c the script in the terminal.
For data collection, the process is largely the same. After hitting the Space key, for the first time to engage the teleoperation, the operator can hit the Space key again to start the data collection.
When the data collection is started, the pilot should see a red dot in their VR session. This indicates that the data collection is in progress.
The operator can then hit the Space key again to stop the data collection, or x key to discard the current episode.
The data will be saved in the data directory with the task name specified in the command line.รฅ
You may watch the video to see how to access the VR session inside the VisionPro device: VisionPro operation video
Here are the steps to run data collection on a GR1pro (GR1T2) robot with our provided docker container.
First start the run_server.sh script in the server_config directory. Be sure to follow the instructions to calibrate the robot first.
Then you can run our provided script:
mkdir -p ./outputs
mkdir -p ./data
./scripts/run_daq_docker.sh gr1t2 oak_97 daq_testTODO
This is because we are using a self-signed certificate. Click "Advanced" and then "proceed to website". You will be prompted to accept the certificate.
THe keyboard input is not working or you get AttributeError: record_create_context when you run the script
This is due to limitations of the pynput library. Because Ubuntu 22.04 and later has switched to Wayland, which poses more restrictions on monitoring keyboard events.
These issues usualy arise when you are either running the script over SSHor a pure wayland terminal.
To resolve this, the easiest solution is to run the script in a terminal that supports X11. Like the built-in terminal of VSCode or the Hyper terminal, which we internally use.
We are working on a solution to switch to a evdev based solution.
To reset the tracking, long press the crown button on the Vision Pro device until you hear a sound. This will reset the tracking origin to the current position of the device.
This project is based on the amazing OpenTeleVision project. We would like to thank the original authors for their contributions.
If you find this project useful, please consider citing it:
@misc{teleoperation,
author = {Yuxiang Gao, Shuo Hu, Fourier Co Ltd},
title = {teleoperation},
year = {2024},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/FFTAI/teleoperation}}
}

