FIGAROH
Free dynamics Identification and Geometrical cAlibration of RObot and Human
FIGAROH is a Python toolbox for geometric calibration and dynamic parameter identification of rigid multi-body systems described by a URDF. It handles serial manipulators and tree-structured systems such as humanoids and mobile manipulators, and covers the whole loop: design the experiment, fit the parameters, validate them on held-out data, and export an updated model.
Install
pip install figaroh
Optimal trajectory generation also needs cyipopt, which is not
pip-installable. Use the conda environment for that, or for development:
git clone https://github.com/thanhndv212/figaroh-plus.git
cd figaroh-plus
conda env create -f environment.yml
conda activate figaroh-dev
pip install -e .
Quickstart
FIGAROH's workflow classes are subclassed once per robot. The figaroh-examples repository ships those subclasses, configs and data for each supported robot. The fastest way to see a complete run is its UR10 identification reference, which takes a few seconds:
git clone https://github.com/thanhndv212/figaroh-examples.git
cd figaroh-examples/examples/ur10
python identification_reference.py
It fits the UR10 dynamic parameters on a simulated training log, checks the
prediction error on a separate held-out log, computes a physically consistent
estimate, exports an identified URDF, and archives the run with its config,
revisions and an HTML report under results/runs/.
To use your own robot, follow the Getting Started guide and the Configuration System page; the examples repository has a new-example guide and a scaffold script.
What it does
Geometric calibration (figaroh.calibration) estimates joint offsets and
frame transforms from end-effector measurements: motion capture, cameras,
laser trackers, or contact with a plane when there is no external metrology.
Identifiable parameters are found by QR decomposition, and the fit is a
Levenberg–Marquardt solve with outlier removal.
Dynamic identification (figaroh.identification) fits masses, inertias,
friction and actuator inertia from joint positions and measured effort. A run
goes through up to three stages:
fit: base parameters by least squares, with optional weighted least squares and decimation. Base-parameter selection is deterministic across platforms.reconstruction: a full standard-parameter set recovered from the base fit.physical_fit: a direct LMI fit constrained to physically consistent inertias.
identification.select_stage chooses which stage is reported, validated and
exported; a requested stage that fails is rejected rather than replaced.
problem.torque_fit_joints restricts the fit to the joints whose effort you
trust.
Optimal experiment design (figaroh.optimal) selects well-conditioned
calibration postures and generates exciting identification trajectories
(cubic splines optimised with IPOPT under joint, velocity, torque and collision
limits).
Reporting and verification. Every run can write a self-contained HTML
report (solve(html_report=True)) and a machine-readable verdict
(verify()). The verdict states its scope: an execution PASS means the
numerics are sound, while a prediction PASS needs separate validation data
and per-joint limits that you declare. generate_compare_page() diffs two
archived runs offline. See
Reporting & Verification.
Backends. Pinocchio is the default dynamics backend; MuJoCo is available
as an optional backend (pip install mujoco). See
Backends.
Outputs
Both tasks write the result back into a copy of your URDF
(figaroh.tools.urdf_exporter.export_urdf), but they change different
parts of it:
| Written to the URDF | Not written to the URDF | |
|---|---|---|
| Calibration | Joint placements: corrected joint offsets and frame transforms | Metrology frames (base_*, pEE*, phiEE*): the pose of the measurement system and the marker or tool. These are returned separately; frame_settings_doc() explains them |
| Identification | Link mass, centre of mass and inertia, joint friction (BaseIdentification.export_urdf) |
The base-parameter fit, which has no per-link values: export needs select_stage: reconstruction or physical_fit |
The exporter refuses inertias that are not physically consistent unless you
pass allow_infeasible=True. Identification exports only an accepted
estimate and reloads the written URDF with Pinocchio as a check.
Every run can also write:
- the estimated parameters as YAML, CSV or NPZ (
save_results()); - a self-contained HTML report (
export_html_report()); - a JSON verdict with the scope, per-stage status and each check
(
export_verification_report()).
What's new in 0.7
- Choose which identification stage is reported and exported with
select_stage, and export the result withBaseIdentification.export_urdf. - Fit and score only the joints listed in
torque_fit_joints. - Base-parameter selection is reproducible across macOS, Linux and Pinocchio versions.
The full list, including fixes and behaviour changes, is in the CHANGELOG.
Supported platforms
| Tested | |
|---|---|
| Python | 3.12 |
| Pinocchio | 3.7 (with ndcurves 2.0.0.1) and 4.1 (with ndcurves 2.3.0) |
| OS | Linux (CI), macOS (maintainer). Windows is not tested. |
Install Pinocchio and ndcurves together so their native libraries match. Other
versions within pin>=3.7,<5 may work but have no CI profile; see the
version support decision.
Documentation
| Documentation site | Guides, tutorials, configuration reference, API reference |
| Tutorials | Calibration, identification and optimal design walkthroughs |
| ARCHITECTURE.md | Package layout and design |
| CHANGELOG.md | Changes by release |
| ROADMAP.md | Planned work |
| CONTRIBUTING.md | Branches, review, validation and release process |
Working with an AI coding agent? skills/ holds agent skills
that set up a calibration, identification, optimal-design or new-robot task
end to end. Start with figaroh-start, which
routes to the right one, and figaroh-setup-env,
whose doctor.sh checks your environment first.
Citation
If you use FIGAROH in your research, please cite:
@inproceedings{nguyen2023figaroh,
title={FIGAROH: a Python toolbox for dynamic identification and geometric calibration of robots and humans},
author={Nguyen, Dinh Vinh Thanh and Bonnet, Vincent and Maxime, Sabbah and Gautier, Maxime and Fernbach, Pierre and others},
booktitle={IEEE-RAS International Conference on Humanoid Robots},
pages={1--8},
year={2023},
address={Austin, TX, United States},
doi={10.1109/Humanoids57100.2023.10375232},
url={https://hal.science/hal-04234676v2}
}
Related work
@inproceedings{nguyen2024improving,
title={Improving Operational Accuracy of a Mobile Manipulator by Modeling Geometric and Non-Geometric Parameters},
author={Nguyen, Thanh D. V. and Bonnet, V. and Fernbach, P. and Flayols, T. and Lamiraux, F.},
booktitle={2024 IEEE-RAS 23rd International Conference on Humanoid Robots (Humanoids)},
pages={965--972},
year={2024},
address={Nancy, France},
doi={10.1109/Humanoids58906.2024.10769790}
}
@techreport{nguyen2025humanoid,
title={Humanoid Robot Whole-body Geometric Calibration with Embedded Sensors and a Single Plane},
author={Nguyen, Thanh D V and Bonnet, Vincent and Fernbach, Pierre and Daney, David and Lamiraux, Florent},
year={2025},
institution={HAL},
url={https://hal.science/hal-05169055}
}
License
Apache License 2.0; see LICENSE.
FIGAROH started at LAAS-CNRS (original GitLab repository); this repository is its maintained continuation.
Metadata
Release files for figaroh 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| figaroh-0.7.0.tar.gz | 5.0 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| figaroh-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 5.4 MB
Release files / figaroh-0.7.0.tar.gz
| Download URL | figaroh-0.7.0.tar.gz |
|---|---|
| Size | 5.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6cf9b0f27918c0e2fe7221f3389ecce5eac1d8abeb63244a398cce0af2e26eb2
|
|
BLAKE2b-256 checksum How to use checksums |
e2e3af83971912a6243376e2f38f859fcc4104f1209501b1749c33a35c1eddb1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.11
|
Release files / figaroh-0.7.0-py3-none-any.whl
| Download URL | figaroh-0.7.0-py3-none-any.whl |
|---|---|
| Size | 348.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f4983740d7f35117630ce5a93a5a1e43e5f75ff279b7c64310373a329134113e
|
|
BLAKE2b-256 checksum How to use checksums |
159e3c42af6b58033139f2a4ea3e0589a000244f585949fce4bab6aa88a70286
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.11
|