Skip to main content

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

  1. Das, Martin, Kontodinas, Hinkkanen, "Direct force control of six-phase bearingless synchronous machines," Proc. ICEM, 2026, https://doi.org/10.1109/ICEM68283.2026.11757980
  2. Li, Foissner, Martin, Piippo, Hinkkanen, "Gradient networks for universal magnetic modeling of synchronous machines," 2026, https://arxiv.org/abs/2602.14947

Contributors

Nirangkush Das
Nirangkush Das

🤔 🔬
Eleftherios Kontodinas
Eleftherios Kontodinas

🤔 🔬
Floran Martin
Floran Martin

🤔 🔬
jacopogertod
jacopogertod

🤔 🔬
Junyi Li
Junyi Li

🤔 🔬
Marko Hinkkanen
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)

Source distribution for motulator-bearingless 0.1.0
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)

Table of built distributions (wheels) for motulator-bearingless 0.1.0
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page