{"id":37654094,"url":"https://github.com/thanhndv212/figaroh-plus","last_synced_at":"2026-01-16T11:39:21.283Z","repository":{"id":223770956,"uuid":"758723494","full_name":"thanhndv212/figaroh-plus","owner":"thanhndv212","description":"A comprehensive framework for robot parameteric model identification and calibration","archived":false,"fork":false,"pushed_at":"2025-12-31T11:47:42.000Z","size":93706,"stargazers_count":19,"open_issues_count":2,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-01T16:17:37.922Z","etag":null,"topics":["calibration","humanoid","identification","manipulator","mobile-manipulator","sysid","systemidentification"],"latest_commit_sha":null,"homepage":"https://thanhndv212.github.io/figaroh-plus/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thanhndv212.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-16T23:24:11.000Z","updated_at":"2025-12-27T06:51:36.000Z","dependencies_parsed_at":"2025-08-23T00:15:33.677Z","dependency_job_id":"d76f0fa1-0f99-4a29-95f5-6a11b0292d82","html_url":"https://github.com/thanhndv212/figaroh-plus","commit_stats":null,"previous_names":["thanhndv212/figaroh-plus"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/thanhndv212/figaroh-plus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thanhndv212%2Ffigaroh-plus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thanhndv212%2Ffigaroh-plus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thanhndv212%2Ffigaroh-plus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thanhndv212%2Ffigaroh-plus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thanhndv212","download_url":"https://codeload.github.com/thanhndv212/figaroh-plus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thanhndv212%2Ffigaroh-plus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calibration","humanoid","identification","manipulator","mobile-manipulator","sysid","systemidentification"],"created_at":"2026-01-16T11:39:17.059Z","updated_at":"2026-01-16T11:39:21.278Z","avatar_url":"https://github.com/thanhndv212.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FIGAROH\n**F**ree dynamics **I**dentification and **G**eometrical c**A**libration of **RO**bot and **H**uman\n\nFIGAROH is a Python toolbox providing efficient and highly flexible frameworks for dynamics identification and geometric calibration of rigid multi-body systems based on the URDF modeling convention. It supports both serial (industrial manipulators) and tree-structure systems (humanoids, mobile manipulators).\n\n**📦 Available on PyPI:** `pip install figaroh`  \n**📖 Version:** 0.3.0\n\n\u003e Note: This repo is a fork from [gitlab repo](https://gitlab.laas.fr/gepetto/figaroh) of which the author is no longer a contributor.\n\n---\n\n## Installation\n\n### Quick Installation (Recommended)\n\nInstall the core FIGAROH package with all dependencies (except for cyipopt):\n\n```bash\npip install figaroh\n```\n\n### Development Installation\n\nFor development or local installation from source, choose one of these methods:\n\n**Method 1: Direct pip installation (Simple)**\n```bash\ngit clone https://github.com/thanhndv212/figaroh-plus.git\ncd figaroh\npip install -e .\n```\n\n**Method 2: Conda environment (Recommended for the use of cyipopt)**\n```bash\ngit clone https://github.com/thanhndv212/figaroh-plus.git\ncd figaroh\n# Create conda environment with optimization libraries\nconda env create -f environment.yml\nconda activate figaroh-dev\n```\n\n### Examples Repository\n```bash\ngit clone https://github.com/thanhndv212/figaroh-examples.git\ncd figaroh-examples \u0026\u0026 pip install -r requirements.txt\n```\n\n---\n\n## Package Structure\n\n```\nfigaroh/\n├── calibration/          # Geometric calibration framework\n│   ├── BaseCalibration       # Abstract base class for kinematic calibration\n│   ├── calibration_tools     # Parameter parsing, regressor computation\n│   ├── config                # Configuration loading and validation\n│   ├── data_loader           # CSV data loading utilities\n│   └── parameter             # Kinematic parameter management\n│\n├── identification/       # Dynamic parameter identification\n│   ├── BaseIdentification    # Abstract base class for dynamic identification\n│   ├── identification_tools  # Regressor utilities, parameter extraction\n│   ├── config                # Identification configuration parsing\n│   └── parameter             # Inertial parameter management (friction, inertia)\n│\n├── optimal/              # Optimization-based trajectory \u0026 configuration\n│   ├── BaseOptimalTrajectory     # IPOPT-based trajectory optimization\n│   ├── BaseOptimalCalibration    # Optimal calibration posture selection\n│   ├── BaseParameterComputer     # Base parameter computation utilities\n│   ├── TrajectoryConstraintManager # Constraint handling for optimization\n│   └── config                    # Optimization configuration management\n│\n├── tools/                # Core robotics utilities\n│   ├── RegressorBuilder      # Object-oriented regressor computation\n│   ├── LinearSolver          # Advanced linear solver (LS, Ridge, Lasso, etc.)\n│   ├── QRDecomposer          # QR decomposition for base parameters\n│   ├── CollisionManager      # Collision detection and visualization\n│   ├── RobotIPOPTSolver      # IPOPT optimization wrapper\n│   └── CubicSpline           # Trajectory interpolation utilities\n│\n├── utils/                # Helper utilities\n│   ├── UnifiedConfigParser   # YAML config with inheritance support\n│   ├── ResultsManager        # Unified plotting and result export\n│   ├── error_handling        # Custom exceptions and validation\n│   └── cubic_spline          # Spline trajectory generation\n│\n├── measurements/         # Data acquisition and processing\n└── visualisation/        # Meshcat-based 3D visualization\n```\n\n---\n\n## Core Modules\n\n### `figaroh.calibration` — Geometric Calibration\n\n**BaseCalibration** provides a complete framework for kinematic parameter calibration:\n\n- **Automatic parameter identification** using QR decomposition\n- **Robust optimization** with iterative outlier removal (Levenberg-Marquardt)\n- **Unit-aware weighting** for position/orientation measurements\n- **Multiple calibration models**: full kinematic parameters, joint offsets\n- **Sensor support**: cameras, motion capture, planar constraints\n\n### `figaroh.identification` — Dynamic Identification\n\n**BaseIdentification** implements the complete dynamic parameter identification workflow:\n\n- **Standard + extended parameters**: inertial parameters, friction (viscous/Coulomb), actuator inertia, joint offsets\n- **Regressor-based identification** with base parameter reduction\n- **Multiple solvers**: Least Squares, Weighted LS, Ridge, Lasso, Elastic Net\n- **Decimation and filtering** for signal processing\n- **Quality metrics**: RMSE, correlation, condition number\n\n### `figaroh.optimal` — Trajectory \u0026 Configuration Optimization\n\n**BaseOptimalTrajectory** generates exciting trajectories for dynamic identification:\n\n- **IPOPT-based nonlinear optimization** with cyipopt\n- **Cubic spline parameterization** for C² continuous trajectories\n- **Constraint handling**: joint limits, velocity limits, torque limits, self-collision\n- **Cost functions**: condition number minimization, excitation maximization\n\n**BaseOptimalCalibration** selects optimal calibration configurations:\n\n- **Combinatorial optimization** from feasible posture pool\n- **Observability-based selection** for maximum information gain\n\n### `figaroh.tools` — Robotics Utilities\n\n| Class | Description |\n|-------|-------------|\n| `RegressorBuilder` | Object-oriented regressor computation with configurable parameters |\n| `LinearSolver` | Advanced solver supporting 10+ methods (lstsq, QR, SVD, Ridge, Lasso, etc.) |\n| `QRDecomposer` | QR decomposition with column pivoting for base parameter identification |\n| `CollisionManager` | Pinocchio-based collision detection with visualization |\n| `RobotIPOPTSolver` | High-level IPOPT interface with automatic differentiation |\n\n### `figaroh.utils` — Configuration \u0026 Results\n\n| Class | Description |\n|-------|-------------|\n| `UnifiedConfigParser` | YAML parsing with template inheritance and variable expansion |\n| `ResultsManager` | Unified plotting for calibration/identification results |\n| `CubicSpline` | C² continuous spline trajectory generation |\n\n---\n\n## Key Features\n\n### 🔧 Dynamic Identification\n- Extended dynamic models: friction, actuator inertia, joint offsets\n- Optimal exciting trajectory generation (IPOPT)\n- Multiple parameter estimation algorithms\n- Physically consistent parameters for URDF updates\n\n### 📐 Geometric Calibration\n- Full kinematic parameter estimation (6 DOF per joint)\n- Optimal posture selection via combinatorial optimization\n- Support for cameras, motion capture, planar constraints\n- Direct URDF model updates\n\n### ⚙️ Configuration System\n- **Unified YAML format** with template inheritance\n- **Automatic format detection** (legacy compatibility)\n- **Variable expansion** and validation\n- **Task-specific configs**: calibration, identification, optimal trajectory\n\n### 🛠️ Modern Architecture\n- **Proper logging** (NullHandler pattern for libraries)\n- **Abstract base classes** for extensibility\n- **Pinocchio 3.x compatibility**\n- **Cross-platform**: Linux, macOS, Windows\n---\n\n## Methodology\n\nFIGAROH implements a systematic workflow for robot calibration and identification:\n\n### Step 1: Configuration Setup\nDefine robot parameters, sensor configurations, and task-specific settings in YAML:\n\n```yaml\n# config/robot_config.yaml\nrobot:\n  name: \"my_robot\"\n  urdf_path: \"models/robot.urdf\"\n\ncalibration:\n  start_frame: \"base_link\"\n  end_frame: \"tool0\"\n  method: \"full_params\"\n  \nidentification:\n  has_friction: true\n  has_actuator_inertia: true\n  active_joints: [\"joint1\", \"joint2\", \"joint3\"]\n```\n\n### Step 2: Optimal Experiment Design\nGenerate exciting trajectories or calibration postures:\n\n- **For identification**: Solve IPOPT optimization to find trajectories maximizing regressor condition\n- **For calibration**: Combinatorial selection of postures maximizing observability\n\n### Step 3: Data Collection \u0026 Processing\nLoad experimental data with automatic validation:\n\n```python\nfrom figaroh.calibration import BaseCalibration\n\ncalibrator = MyCalibration(robot, \"config/robot_config.yaml\")\ncalibrator.load_data(\"data/measurements.csv\")\n```\n\n### Step 4: Parameter Estimation\nRun identification/calibration with quality metrics:\n\n```python\n# Calibration\ncalibrator.solve()\nprint(f\"RMSE: {calibrator.evaluation_metrics['rmse']:.6f}\")\n\n# Identification  \nidentifier.solve(decimate=True, decimation_factor=10)\nprint(f\"Correlation: {identifier.correlation:.4f}\")\n```\n\n### Step 5: Model Update\nExport calibrated/identified parameters to URDF or YAML.\n\n---\n\n## Dependencies\n\n| Category | Packages |\n|----------|----------|\n| **Scientific** | numpy, scipy, matplotlib, pandas, numdifftools |\n| **Robotics** | pinocchio (pin), ndcurves, meshcat |\n| **Config** | pyyaml, rospkg |\n| **Optimization** | cyipopt (conda), picos |\n\n---\n\n## Examples\n\nComplete working examples are available in [figaroh-examples](https://github.com/thanhndv212/figaroh-examples):\n\n| Robot | Tasks |\n|-------|-------|\n| **Staubli TX40** | Dynamic identification |\n| **Universal UR10** | Geometric calibration (RealSense camera) |\n| **TIAGo** | Full workflow: identification + calibration |\n| **TALOS Humanoid** | Torso-arm calibration, whole-body calibration |\n\n---\n## Citations\n\nIf you use FIGAROH in your research, please cite the following papers:\n\n### Main Reference\n```bibtex\n@inproceedings{nguyen2023figaroh,\n  title={FIGAROH: a Python toolbox for dynamic identification and geometric calibration of robots and humans},\n  author={Nguyen, Dinh Vinh Thanh and Bonnet, Vincent and Maxime, Sabbah and Gautier, Maxime and Fernbach, Pierre and others},\n  booktitle={IEEE-RAS International Conference on Humanoid Robots},\n  pages={1--8},\n  year={2023},\n  address={Austin, TX, United States},\n  doi={10.1109/Humanoids57100.2023.10375232},\n  url={https://hal.science/hal-04234676v2}\n}\n```\n\n### Related Work\n```bibtex\n@inproceedings{nguyen2024improving,\n  title={Improving Operational Accuracy of a Mobile Manipulator by Modeling Geometric and Non-Geometric Parameters},\n  author={Nguyen, Thanh D. V. and Bonnet, V. and Fernbach, P. and Flayols, T. and Lamiraux, F.},\n  booktitle={2024 IEEE-RAS 23rd International Conference on Humanoid Robots (Humanoids)},\n  pages={965--972},\n  year={2024},\n  address={Nancy, France},\n  doi={10.1109/Humanoids58906.2024.10769790}\n}\n\n@techreport{nguyen2025humanoid,\n  title={Humanoid Robot Whole-body Geometric Calibration with Embedded Sensors and a Single Plane},\n  author={Nguyen, Thanh D V and Bonnet, Vincent and Fernbach, Pierre and Daney, David and Lamiraux, Florent},\n  year={2025},\n  institution={HAL},\n  url={https://hal.science/hal-05169055}\n}\n```\n\n## License\n\nPlease refer to the [LICENSE](LICENSE) file for licensing information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthanhndv212%2Ffigaroh-plus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthanhndv212%2Ffigaroh-plus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthanhndv212%2Ffigaroh-plus/lists"}