Yutong Li1*,
Jieyi Zhang1*,
Wenqiang Xu1,
Tutian Tang1,
Cewu Lu1†,
†Corresponding authors.
*Equal contribution.
1Shanghai Jiao Tong University
![]() |
![]() |
Accurate hand motion capture (MoCap) is critical for robotics, virtual reality, and biomechanics, yet existing systems often fail to capture high-degree-of-freedom (DoF) joint kinematics and personalized hand shapes. FSGlove addresses these limitations with an inertial-based system that tracks up to 48 DoFs and reconstructs hand shapes using DiffHCal, a novel calibration method. Equipped with IMUs on each finger joint and dorsum, FSGlove achieves high-resolution motion sensing. DiffHCal integrates with the MANO model via differentiable optimization, resolving joint kinematics, shape parameters, and sensor misalignment in a single step.
Note: The source code for FSGlove will be open-sourced after the reviewing process.
Please refer to the official website for the detailed hand assembly guide.
The hand server powers the SBC on the FSGlove. It is a standard Golang project that compiles into a single binary and can run on almost any platform. We have tested it on the Raspberry Pi 2W.
Please follow the instructions in the src/hand_server/README.md to build and run the hand server.
DiffHCal is developed using manotorch, which requires a PyTorch environment and the presence of the MANO model. To achieve real-time processing, a capable NVIDIA GPU (supporting CUDA 11) is recommended. The source code is organized as a standard Python project at src/hand_visualiser, with the main entry point located in src/hand_visualiser/main_gui_v2.py.
Given the complex dependencies of this project, we recommend setting up a virtual environment (e.g., a Conda environment) to avoid conflicts. The project also relies on common build tools such as Make.
-
Obtain the MANO model from here and extract it under
assets/mano. The directory structure should look like this:./assets/mano ├── LICENSE.txt ├── __init__.py ├── models ├── ... -
Create a virtual environment using
conda. The DiffHCal project is built withpython@3.10syntax (e.g., typing annotations) but will likely work on higher versions.conda create -n rfmocap python=3.10 conda activate rfmocap
-
Install the dependencies from
requirements.txt. A singlepip installcommand should suffice.pip install -r requirements.txt
This will install:
torch:2.3.0compiled withcuda:11.8runtime.numpy:1.22.4for compatibility reasons.manotorchfrom the latest GitHub master branch.polyscopefor visualization.pyrfuniverse, a binding for RFUniverse, used for simulation and tele-operation demo.grpcio-tools:1.60.0andgrpcio==1.60.0for gRPC communication.- Other utilities.
On some Linux systems, you might encounter a
libdl.somissing issue withrfuniverse, preventing it from loading URDF. In this case:- Install
libdl.so:sudo apt-get install libc6-dev
- Copy a working
libdl.soto your working directory. - Follow this post to create a soft-link:
sudo ln -s /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libdl.so sudo apt install minizip
Optional: Update the gRPC client. Run the make task.pb.python command to update the gRPC client code in src/api from the latest assets/pb/*.proto files.
$ make task.pb.python ===========> Generating protobuf files for python
/opt/conda/envs/test/lib/python3.10/site-packages/grpc_tools/protoc.py:21: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
import pkg_resources
- Finally, you can run the DiffHCal GUI:
python -m src
The DiffHCal GUI automatically detects its default configuration at $WORKING_DIRECTORY/config.json. If the file is absent, it will be created and populated with default values.
The project has a series of ansible playbooks, they require synchronize module, which can be installed via:
ansible-galaxy collection install ansible.posixThen you can deploy these playbooks:
ansible-playbook -i inventory.ini manifests/playbook/....yml --ask-become-passTBD.

