From 262f5be05c5b4aaac622ef026ab3d583fc911a5b Mon Sep 17 00:00:00 2001 From: Yuming-Lee24 Date: Fri, 7 Aug 2026 14:45:54 +0200 Subject: [PATCH 1/3] Expose load_params Refs learnsyslab/crazyflow#92 --- crazyflow/control/__init__.py | 4 ++-- crazyflow/dynamics/__init__.py | 4 ++-- docs/user-guide/control/parametrize.md | 4 ++-- docs/user-guide/dynamics/parametrize.md | 4 ++-- tests/integration/test_interfaces.py | 3 +-- tests/unit/control/test_core.py | 2 +- tests/unit/control/test_mellinger.py | 3 +-- tests/unit/dynamics/test_parametrization.py | 11 +++++++++-- 8 files changed, 20 insertions(+), 15 deletions(-) diff --git a/crazyflow/control/__init__.py b/crazyflow/control/__init__.py index 90ebc9e..bb651c4 100644 --- a/crazyflow/control/__init__.py +++ b/crazyflow/control/__init__.py @@ -14,7 +14,7 @@ __all__ = [] -from crazyflow.control.core import Control, parametrize +from crazyflow.control.core import Control, load_params, parametrize from crazyflow.control.mellinger import attitude2force_torque as mellinger_attitude2force_torque from crazyflow.control.mellinger import state2attitude as mellinger_state2attitude @@ -23,4 +23,4 @@ "mellinger_attitude2force_torque": mellinger_attitude2force_torque, } -__all__ = ["Control", "parametrize"] +__all__ = ["Control", "load_params", "parametrize"] diff --git a/crazyflow/dynamics/__init__.py b/crazyflow/dynamics/__init__.py index bd90eed..3c45088 100644 --- a/crazyflow/dynamics/__init__.py +++ b/crazyflow/dynamics/__init__.py @@ -14,13 +14,13 @@ from typing import Callable -from crazyflow.dynamics.core import Dynamics, parametrize +from crazyflow.dynamics.core import Dynamics, load_params, parametrize from crazyflow.dynamics.first_principles import dynamics as _first_principles_dynamics from crazyflow.dynamics.so_rpy import dynamics as _so_rpy_dynamics from crazyflow.dynamics.so_rpy_rotor import dynamics as _so_rpy_rotor_dynamics from crazyflow.dynamics.so_rpy_rotor_drag import dynamics as _so_rpy_rotor_drag_dynamics -__all__ = ["parametrize", "available_dynamics", "dynamics_features", "Dynamics"] +__all__ = ["parametrize", "load_params", "available_dynamics", "dynamics_features", "Dynamics"] available_dynamics: dict[str, Callable] = { diff --git a/docs/user-guide/control/parametrize.md b/docs/user-guide/control/parametrize.md index 4742a7a..0795cea 100644 --- a/docs/user-guide/control/parametrize.md +++ b/docs/user-guide/control/parametrize.md @@ -77,10 +77,10 @@ rpyt, _ = ctrl(pos, quat, vel, cmd) ## Loading raw parameters -Use [`load_params`][crazyflow.control.core.load_params] to inspect or override the values that `parametrize` would bind for a specific controller function: +Use [`load_params`][crazyflow.control.load_params] to inspect or override the values that `parametrize` would bind for a specific controller function: ```python -from crazyflow.control.core import load_params +from crazyflow.control import load_params from crazyflow.control.mellinger import state2attitude params = load_params(state2attitude, "cf2x_L250") diff --git a/docs/user-guide/dynamics/parametrize.md b/docs/user-guide/dynamics/parametrize.md index 59e549f..1b7a2ec 100644 --- a/docs/user-guide/dynamics/parametrize.md +++ b/docs/user-guide/dynamics/parametrize.md @@ -114,10 +114,10 @@ parametrized_dynamics = parametrize(dynamics, drone="cf2x_T350") ## Loading raw parameters -If you need the parameter values directly, for example, to pass them to [`symbolic_dynamics`](symbolic.md), use [`load_params`][crazyflow.dynamics.core.load_params]: +If you need the parameter values directly, for example, to pass them to [`symbolic_dynamics`](symbolic.md), use [`load_params`][crazyflow.dynamics.load_params]: ```python { .python continuation } -from crazyflow.dynamics.core import load_params +from crazyflow.dynamics import load_params params = load_params(dynamics, "cf2x_L250") params["mass"] # 0.0319 diff --git a/tests/integration/test_interfaces.py b/tests/integration/test_interfaces.py index a2cbc9d..34b1036 100644 --- a/tests/integration/test_interfaces.py +++ b/tests/integration/test_interfaces.py @@ -3,8 +3,7 @@ import pytest from scipy.spatial.transform import Rotation as R -from crazyflow.control import Control, parametrize -from crazyflow.control.core import load_params +from crazyflow.control import Control, load_params, parametrize from crazyflow.control.mellinger import force_torque2rotor_vel, state2attitude from crazyflow.control.transform import motor_force2rotor_vel from crazyflow.sim import Dynamics, Sim diff --git a/tests/unit/control/test_core.py b/tests/unit/control/test_core.py index c8e7743..1fd698c 100644 --- a/tests/unit/control/test_core.py +++ b/tests/unit/control/test_core.py @@ -6,7 +6,7 @@ import array_api_strict import pytest -from crazyflow.control.core import load_params, parametrize +from crazyflow.control import load_params, parametrize from crazyflow.control.mellinger import ( attitude2force_torque, force_torque2rotor_vel, diff --git a/tests/unit/control/test_mellinger.py b/tests/unit/control/test_mellinger.py index 0876cc7..adb96f5 100644 --- a/tests/unit/control/test_mellinger.py +++ b/tests/unit/control/test_mellinger.py @@ -5,8 +5,7 @@ import numpy as np import pytest -from crazyflow.control import parametrize -from crazyflow.control.core import load_params +from crazyflow.control import load_params, parametrize from crazyflow.control.mellinger import ( attitude2force_torque, force_torque2rotor_vel, diff --git a/tests/unit/dynamics/test_parametrization.py b/tests/unit/dynamics/test_parametrization.py index 1472a22..e2f87c7 100644 --- a/tests/unit/dynamics/test_parametrization.py +++ b/tests/unit/dynamics/test_parametrization.py @@ -7,8 +7,15 @@ import pytest from crazyflow.drones import available_drones -from crazyflow.dynamics import available_dynamics -from crazyflow.dynamics.core import parametrize +from crazyflow.dynamics import available_dynamics, load_params, parametrize + + +@pytest.mark.unit +@pytest.mark.parametrize("dynamics_name, dynamics", available_dynamics.items()) +@pytest.mark.parametrize("drone", available_drones) +def test_dynamics_parameter_loading(dynamics_name: str, dynamics: Callable, drone: str) -> None: + """Check that parameters can be loaded for all available dynamics and drones.""" + load_params(dynamics, drone) @pytest.mark.unit From ffe50d9757891377469dacdf274453e05d36e3f9 Mon Sep 17 00:00:00 2001 From: Yuming-Lee24 Date: Fri, 7 Aug 2026 16:03:35 +0200 Subject: [PATCH 2/3] Use hardware params for action space --- crazyflow/envs/drone_env.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crazyflow/envs/drone_env.py b/crazyflow/envs/drone_env.py index c5ed6ab..dbf5730 100644 --- a/crazyflow/envs/drone_env.py +++ b/crazyflow/envs/drone_env.py @@ -12,8 +12,7 @@ from numpy.typing import NDArray from crazyflow.control import Control -from crazyflow.control.core import load_params -from crazyflow.control.mellinger import force_torque2rotor_vel +from crazyflow.drones import load_params as load_hardware_params from crazyflow.dynamics import Dynamics from crazyflow.sim import Sim from crazyflow.sim.data import SimData @@ -33,7 +32,7 @@ def action_space(control_type: Control, drone: str) -> spaces.Box: """ match control_type: case Control.attitude: - params = load_params(force_torque2rotor_vel, drone) + params = load_hardware_params(drone) thrust_min, thrust_max = params["thrust_min"] * 4, params["thrust_max"] * 4 return spaces.Box( np.array([-np.pi / 2, -np.pi / 2, -np.pi / 2, thrust_min], dtype=np.float32), From 299b75e88f2dc6e6eedde2d60e4f89a819b30d9f Mon Sep 17 00:00:00 2001 From: Martin Schuck <57562633+amacati@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:05:35 +0200 Subject: [PATCH 3/3] Refactor import for load_params in drone_env.py --- crazyflow/envs/drone_env.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crazyflow/envs/drone_env.py b/crazyflow/envs/drone_env.py index dbf5730..12930a5 100644 --- a/crazyflow/envs/drone_env.py +++ b/crazyflow/envs/drone_env.py @@ -12,7 +12,7 @@ from numpy.typing import NDArray from crazyflow.control import Control -from crazyflow.drones import load_params as load_hardware_params +from crazyflow.drones import load_params from crazyflow.dynamics import Dynamics from crazyflow.sim import Sim from crazyflow.sim.data import SimData @@ -32,7 +32,7 @@ def action_space(control_type: Control, drone: str) -> spaces.Box: """ match control_type: case Control.attitude: - params = load_hardware_params(drone) + params = load_params(drone) thrust_min, thrust_max = params["thrust_min"] * 4, params["thrust_max"] * 4 return spaces.Box( np.array([-np.pi / 2, -np.pi / 2, -np.pi / 2, thrust_min], dtype=np.float32),