motulator-bearingless
Six-phase bearingless machine drives for motulator
Documentation: https://aalto-electric-drives.github.io/motulator-bearingless/
This package extends motulator with the continuous-time model of a symmetrical six-phase bearingless synchronous machine drive, a direct radial force controller based on feedback linearization, and a levitation controller [1]. The two three-phase sets of the winding produce both the torque and the radial force. The winding is described by means of the vector-space decomposition, and the magnetic model is a gradient of a magnetic energy function, which represents magnetic saturation and rotor eccentricity in a consistent manner. The six-phase converter model comes from motulator-multiphase.
The magnetic models follow motulator: constant parameters, or gradient networks [2] trained on the finite-element data of a 2.6-kW machine. The machine model uses an energy-based current map, with or without the spatial harmonics, and the controller a co-energy-based flux map without the rotor angle.
For comparison, a current-based force controller is included as well: the four-pole plane is controlled by a vector controller of motulator, and the force reference is converted to the current reference of the two-pole plane, in the manner of the common and differential modes of motulator-multiphase, see the relation between the packages.
Installation
Install the package in a virtual environment (motulator and motulator-multiphase are installed as dependencies). On Linux and macOS:
python3 -m venv .venv
source .venv/bin/activate
pip install motulator-bearingless
On Windows, the environment is created and activated with py -m venv .venv and .venv\Scripts\activate.
For development, and for the examples with the gradient networks, which load the networks and the dataset from examples/, clone the repository and install the package with pip install -e ".[dev]".
Usage
A sensorless direct-force-controlled 2.6-kW bearingless SyRM drive, whose rotor is held at a fixed radial position by external bearings:
from math import pi
from motulator_bearingless import control, model, utils
# System model: L_1 is the two-pole inductance, and m_d and m_q are the radial force
# constants of the d and q axes
par = model.BearinglessSynchronousMachinePars(
R_s=0.215, L_1=0.03, L_d=0.03, L_q=0.01, m_d=10.0, m_q=0.2
)
machine = model.BearinglessSynchronousMachine(par)
radial = model.ExternalRotorPosition() # Fixed radial position
converter = model.MultiThreePhaseConverter(u_dc=540) # Two sets by default
mdl = model.BearinglessDrive(machine, model.MechanicalSystem(J=0.15), radial, converter)
# Control system: the direct force controller and the speed controller
cfg = control.DirectForceControllerCfg(i_s_max=25, psi_s_min=0.3, sensorless=True)
force_ctrl = control.DirectForceController(par, cfg)
speed_ctrl = control.SpeedController(J=0.15, alpha_s=2 * pi * 8)
ctrl = control.DirectForceControlSystem(force_ctrl, speed_ctrl)
# Speed and force references and the load torque
ctrl.set_speed_ref(lambda t: min(t / 1.2, 1) * 2 * pi * 1700 / 60)
ctrl.set_force_ref(lambda t: (t > 1.6) * 100 + 1j * (t > 1.9) * 150)
mdl.mechanics.set_external_load_torque(lambda t: (t > 2) * 10)
res = model.Simulation(mdl, ctrl).simulate(t_stop=3)
utils.plot(res)
The gradient-network maps replace the constant parameters in the same manner as in motulator:
import motulator_bearingless.gradnet as gn
models = "examples/trained_models/"
current_map = gn.CurrentMapWithHarmonics(
gn.load_gradnet(models + "bsyrm_fem_curr_map_harm_softmax_d128.npz")
)
par = model.SpatialSaturatedBearinglessSynchronousMachinePars(0.215, current_map)
machine = model.BearinglessSynchronousMachine(par)
flux_map = gn.FluxMap(gn.load_gradnet(models + "bsyrm_fem_flux_map_softmax_d128.npz"))
est_par = control.SaturatedBearinglessSynchronousMachinePars(0.215, psi_s_fcn=flux_map)
force_ctrl = control.DirectForceController(est_par, cfg)
Complete examples, including current-based force control, levitation control, and the magnetic maps, are in the example gallery.
Scope
- Symmetrical six-phase machines with two identical three-phase sets, without zero-sequence currents.
- The radial motion of the rotor is modeled as a point mass, or the rotor is held at a given radial position. The tilting and axial motion are not modeled.
- The constant machine parameters of the examples are illustrative.
- The trained networks describe a 2.6-kW bearingless synchronous reluctance machine, based on a finite-element model that has not been validated against measurements.
- The control methods do not use the spatial harmonics.
References
- Das, Martin, Kontodinas, Hinkkanen, "Direct force control of six-phase bearingless synchronous machines," Proc. ICEM, 2026, https://doi.org/10.1109/ICEM68283.2026.11757980
- Li, Foissner, Martin, Piippo, Hinkkanen, "Gradient networks for universal magnetic modeling of synchronous machines," 2026, https://arxiv.org/abs/2602.14947
Contributors
Nirangkush Das 🤔 🔬 |
Eleftherios Kontodinas 🤔 🔬 |
Floran Martin 🤔 🔬 |
jacopogertod 🤔 🔬 |
Junyi Li 🤔 🔬 |
Marko Hinkkanen 💻 💡 |
Metadata
Release files for motulator-bearingless 0.1.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 | Provenance | Actions |
|---|---|---|---|---|
| motulator_bearingless-0.1.0.tar.gz | 3.7 MB | Without provenance | Details for motulator_bearingless-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| motulator_bearingless-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for motulator_bearingless-0.1.0-py3-none-any.whl |
Total release size: 3.7 MB
Release files / motulator_bearingless-0.1.0.tar.gz
| Download URL | motulator_bearingless-0.1.0.tar.gz |
|---|---|
| Size | 3.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d943529b1123ecd6e5f4a33f5d16b1c0951639c6fb5b0d98006b56a41dcf7d86
|
|
BLAKE2b-256 checksum How to use checksums |
3f9b910a2efdb00134c1340a3d8ad5dbf3b08ec91934d219c57a94d4104a5441
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / motulator_bearingless-0.1.0-py3-none-any.whl
| Download URL | motulator_bearingless-0.1.0-py3-none-any.whl |
|---|---|
| Size | 36.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7eff521a9c95fe00e4fba40e3fc11d9aacdc6f0ef0b837d89e63c69fd2fa496e
|
|
BLAKE2b-256 checksum How to use checksums |
e1d95d0892124295025eacdafee22cc44e383a51eaf36076e8ac06b6a272a5e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for motulator-bearingless 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.