This page covers the SDK interface for hand model calibration. To run the same calibration with Wuji CLI, see Hand Model Calibration. The other calibration—Tactile Calibration—trains a tactile contact detection model, runs through Wuji CLI or the SDK calibration API, and is independent of hand model calibration.
When to Calibrate
- The first time an SDK user uses a glove on a given side
- A new wearer, calibrated under their own user
SDK User Requirement
Calibration output belongs to a named SDK user. The default user neither stores calibration output nor loads it — real-time IK always uses the built-in default model. Create and switch to a named user before calibrating:create_user and switch_user first.
Calibration Flow
Calibration asks the wearer to follow a set of guided poses while the SDK captures EMF data and solves the matching URDF.During calibration capture, the SDK runs the EMF chain at full speed and restores the previous output rate when capture ends — whether it succeeds, fails, or is canceled. Lowering the
emf_poses rate with set_rate() beforehand doesn’t stretch the calibration time. See Output Rate Tuning.Synchronous Blocking Call
Best for scripts and command-line tools:calibrate_blocking() does not return until calibration finishes or times out, and Ctrl+C is deferred until the call returns.
Asynchronous Call
asyncio programs use the async API, which supports standard cancellation:
Parameters
Real-Time Feedback
Use theon_feedback callback to track calibration state:
fb dict carries the current pose index, state, progress, captured frame count, pose-deviation diagnostics (metrics), and hint text (hints).
Exceptions raised inside the callback are logged by the SDK and do not interrupt calibration.
Custom URDF Override
glove.hand_model_path().set(path) points to a user-supplied external URDF file. It’s the canonical accessor for the calibration.hand_model_path resource and has the highest priority in the URDF lookup order:
hand_joint_angles, tip_poses, hand_skeleton) against the custom URDF. Set an empty path to fall back to the current user’s calibrated model. Only paths outside the SDK-managed directory count as an external override — a path inside the managed directory has no effect.
The custom URDF override is available only to a named SDK user. Calling set() under the default user is rejected, so switch to a named user first, matching the user isolation of calibration output.
URDF Lookup Order
Priority for real-time IK andtf_static when loading the hand URDF:
- External custom path:
calibration.hand_model_pathpointing to a file outside the SDK-managed directory - Current user’s calibrated model: the stable per-side files
left_hand.urdf/right_hand.urdffor that SDK user - Built-in default URDF: the SDK’s own model per hand side
The SDK loads no legacy output — old profile paths, managed
hand_model_path values written by older versions, and per-serial-number calibration files are no longer loaded at runtime, and there’s no automatic migration. Recalibrate to regenerate. The offline pipeline API also accepts an explicit urdf_path, which takes priority over all of the above when passed.Return Fields
Summary returned bycalibrate() / calibrate_blocking():
Where Calibration Is Stored
The stable files are named by SDK user and hand side. All same-side gloves under one user share the same model:
Uniqueness comes from the
(user_id, hand_side) pair and no longer binds to a device serial number. Switching the SDK user reloads the matching model for connected devices automatically, no reconnect required. Writes use an atomic replace, so a failed calibration never corrupts existing output.
Calibration bundles use a new format: hand models are user-level, tactile data stays per serial number. Importing a bundle from an older SDK version keeps the tactile data but skips the old per-serial-number calibration (no longer loaded, no migration). Bundles exported by this version require an up-to-date SDK to import.
Upgrading From Older Versions
- The
calibration.hand_profileandcalibration.hand_model_paths.*parameters (including thehand_1/hand_2aliases) were removed. Setting these paths fails withPathNotFound. Values left on disk stay readable but are ignored at runtime. - The calibration result no longer includes
device_sn,hand_profile,active_hand_profile,generated_hand_profiles, orcalibrated_urdfs. Usehandednessandcalibrated_urdfinstead.
Error Handling
Every failure path keeps the last successful calibration. A failed run never corrupts the existing model, so you can retry directly.
Resource Path Reference
- Python
- C
Python: See the Python API examples earlier on this page.