bam/docs/identification/fitting.rst
Upstream Snapshot 8be13016bc Import upstream snapshot 57d13ead53206a6bf0db3d66f86506ae8c2ce01a
Upstream: https://github.com/pollen-robotics/bam
Upstream-Commit: 57d13ead53206a6bf0db3d66f86506ae8c2ce01a
Upstream-Branch: mjlab_frictionloss
2026-08-28 15:42:08 +08:00

168 lines
4.5 KiB
ReStructuredText

Fitting
=======
The fitting step optimizes the friction model parameters so that the BAM
simulator reproduces the recorded trajectories as closely as possible. The
objective is the mean absolute error (MAE) between simulated and measured
joint positions, averaged across all logs.
Running the fit
---------------
.. code-block:: text
uv run python -m bam.fit \
--actuator xl330 \
--model m6 \
--logdir data_processed \
--output params/xl330/m6.json
``--actuator`` must match the motor name used during recording.
``--model`` selects the friction model variant (``m1`` through ``m6``).
The optimizer writes ``params.json`` every few seconds as it runs, so
progress can be monitored by inspecting the output file or running
``uv run python -m bam.plot`` in parallel.
Optimization options
--------------------
.. list-table::
:header-rows: 1
:widths: 25 15 60
* - Argument
- Default
- Description
* - ``--method``
- ``cmaes``
- Optimization algorithm: ``cmaes`` (CMA-ES with BIPOP restart),
``random``, or ``nsgaii``.
* - ``--trials``
- 100 000
- Number of evaluations. Increase for better convergence on complex
models (M5, M6).
* - ``--workers``
- 1
- Number of parallel workers. Uses a shared SQLite study database when
greater than 1.
* - ``--load-study``
- —
- Path to an existing Optuna study to resume optimization.
* - ``--reset_period``
- —
- Re-synchronize the simulator state to the log at this interval
[seconds]. Useful when accumulated error destabilizes long rollouts.
Validation split
----------------
To detect overfitting, hold out the logs recorded at one P-gain value and
use them as a validation set:
.. code-block:: text
uv run python -m bam.fit \
--actuator xl330 \
--model m6 \
--logdir data_processed \
--validation_kp 8 \
--output params/xl330/m6.json
Logs recorded with ``--kp 8`` are excluded from training and evaluated
separately. The best validation MAE is reported alongside the training score.
Fitting all models
------------------
It is recommended to fit all six models and compare their validation error:
.. code-block:: text
for model in m1 m2 m3 m4 m5 m6; do
uv run python -m bam.fit \
--actuator xl330 \
--model $model \
--logdir data_processed \
--validation_kp 8 \
--output params/xl330/$model.json \
--trials 100000
done
Simpler models (M1, M2) train faster; richer models (M5, M6) may need more
trials to converge but can capture directional and load-dependent effects
that simpler models miss. The model with the best validation MAE and
acceptable parameter count is typically the right choice.
Output file
-----------
The optimizer writes a JSON file containing the identified parameters and
metadata:
.. code-block:: json
{
"model": "m6",
"actuator": "xl330",
"kt": 2.21,
"R": 2.03,
"armature": 0.026,
"friction_base": 1.0e-05,
"friction_viscous": 0.051,
"friction_stribeck": 0.122,
"dtheta_stribeck": 1.75,
"alpha": 1.14,
"load_friction_motor": 0.198,
"load_friction_external": 0.022,
"load_friction_motor_stribeck": 0.199,
"load_friction_external_stribeck": 0.087,
"load_friction_motor_quad": 0.010,
"load_friction_external_quad": 7.3e-05,
"q_offset": 0.0
}
The file can be passed directly to :func:`bam.model.load_model` or used as
``json_path`` in :class:`bam.mjlab.BamActuatorCfg`.
Evaluating and visualizing results
-----------------------------------
To evaluate a parameter file on the recorded logs:
.. code-block:: text
uv run python -m bam.fit \
--actuator xl330 \
--model m6 \
--logdir data_processed \
--eval \
--output params/xl330/m6.json
To plot measured versus simulated trajectories:
.. code-block:: text
uv run python -m bam.plot \
--actuator xl330 \
--logdir data_processed \
--sim \
--params params/xl330/m6.json
Several ``--params`` files can be given to overlay multiple models on the
same plot, which is useful for comparing M1 through M6 side by side.
Weights & Biases logging
------------------------
Pass ``--wandb`` to stream training and validation metrics to a W&B project:
.. code-block:: text
uv run python -m bam.fit \
--actuator xl330 \
--model m6 \
--logdir data_processed \
--wandb \
--output params/xl330/m6.json