Getting Started¶
Installation¶
Install FIGAROH from PyPI:
pip install figaroh
For development with all dependencies:
conda env create -f environment.yml
conda activate figaroh-dev
pip install -e .
FIGAROH's configuration system (unified vs. legacy YAML format, template inheritance) is covered separately in Configuration System — read that before writing your first robot config.
Quick Start Examples¶
BaseCalibration and BaseIdentification are abstract base classes — each
robot example provides a concrete subclass (e.g. TiagoCalibration,
UR10Identification) that implements the robot-specific cost function. The
examples repository has a
complete, runnable subclass per supported robot; the snippets below show the
shape every subclass follows.
Basic Calibration¶
from examples.tiago.utils.tiago_tools import TiagoCalibration
from figaroh.tools.robot import load_robot
robot = load_robot("path/to/robot.urdf", load_by_urdf=True)
calibrator = TiagoCalibration(robot, "config/calibration_config.yaml")
calibrator.initialize()
result = calibrator.solve(plotting=False, html_report=True)
solve(html_report=True) also writes a self-contained HTML diagnostic
report alongside the terminal quality report that's always printed — see
Reporting & Verification for the
full report/verdict/compare-page suite.
Basic Identification¶
from examples.tiago.utils.tiago_tools import TiagoIdentification
from figaroh.tools.robot import load_robot
robot = load_robot("path/to/robot.urdf", load_by_urdf=True)
identifier = TiagoIdentification(robot, "config/identification_config.yaml")
identifier.initialize()
result = identifier.solve(decimate=True, html_report=True)
verdict = identifier.verify()
print("PASS" if verdict.passed else "FAIL")
Advanced Regressor Building¶
from figaroh.tools.regressor import RegressorBuilder, RegressorConfig
# Configure regressor
config = RegressorConfig(
has_friction=True,
has_actuator_inertia=True,
is_joint_torques=True
)
# Build regressor matrix
builder = RegressorBuilder(robot, config)
W = builder.build_basic_regressor(q, dq, ddq)
Advanced Linear Solver¶
from figaroh.tools.solver import LinearSolver, solve_linear_system
# Basic usage with convenience function
result = solve_linear_system(
A, b,
method='ridge',
alpha=0.01
)
x = result['solution']
# Advanced usage with constraints
solver = LinearSolver()
result = solver.solve(
A, b,
method='constrained',
bounds=(0, None), # Positive constraints
A_eq=A_eq, b_eq=b_eq, # Equality constraints
alpha=0.1 # Regularization
)
# Access quality metrics
print(f"RMSE: {result['rmse']:.4f}")
print(f"R²: {result['r_squared']:.4f}")
print(f"Condition number: {result['condition_number']:.2e}")
# Use in identification workflow
params = identifier.solve_with_custom_solver(
method='elastic_net',
alpha=0.01,
l1_ratio=0.5,
bounds=(0, None) # Physical constraints
)
Next Steps¶
- Follow the Tutorials for an end-to-end walkthrough of calibration, identification, and optimal experiment design.
- Read Reporting & Verification to turn a solved calibration/identification into a shareable report and a CI-gateable pass/fail check.
- Browse the Examples Gallery for complete, runnable workflows per robot (UR10, TIAGo, TALOS, Staubli TX40).
- Check the API Reference for detailed module information.
- Set up your own robot config from a template.